基于Faster RCNN的螺丝螺母的检测

佐手、 提交于 2020-04-09 19:19:54

简介

区域卷积神经网络(RCNN)系列模型为两阶段目标检测器。通过对图像生成候选区域,提取特征,判别特征类别并修正候选框位置。 RCNN系列目前包含两个代表模型:Faster RCNN,Mask RCNN

Faster RCNN 整体网络可以分为4个主要内容:

  1. 基础卷积层。作为一种卷积神经网络目标检测方法,Faster RCNN首先使用一组基础的卷积网络提取图像的特征图。特征图被后续RPN层和全连接层共享。本示例采用ResNet-50作为基础卷积层。
  2. 区域生成网络(RPN)。RPN网络用于生成候选区域(proposals)。该层通过一组固定的尺寸和比例得到一组锚点(anchors), 通过softmax判断锚点属于前景或者背景,再利用区域回归修正锚点从而获得精确的候选区域。
  3. RoI Align。该层收集输入的特征图和候选区域,将候选区域映射到特征图中并池化为统一大小的区域特征图,送入全连接层判定目标类别, 该层可选用RoIPool和RoIAlign两种方式,在config.py中设置roi_func。
  4. 检测层。利用区域特征图计算候选区域的类别,同时再次通过区域回归获得检测框最终的精确位置。

faster-rcnn模型结构图如下:

注:本例默认用GPU运行,也可通过设置--use_gpu=False使用CPU设备。

 

阅读本项目之前建议阅读faster-rcnn原版论文https://arxiv.org/abs/1506.01497 相关优秀博客https://www.cnblogs.com/chaofn/p/9310912.htmlhttps://zhuanlan.zhihu.com/p/31426458

文件夹介绍:

1.models:构造模型主体的函数

2.data: 训练数据集

3.output: 保存训练模型

4:imagenet_resnet50_fusebn: 存放预训练模型

所有执行文件均在faster-rcnn文件夹内,在了解faster-rcnn基本原理的基础上,建议阅读顺序:

1.models文件夹:存放模型主体构造以及loss构造相关文件。

2.utility.py、config.py: 训练相关参数设置。

3.readers.py: 训练数据格式构造。

4.train_own_date.py:训练主体程序。

5.其他相关辅助函数

 

本例采用螺丝螺母目标检测数据集,背景非常干净小巧的目标检测数据集

里面仅仅包含螺丝和螺母两种类别的目标,背景为干净的培养皿。图片数量约420张,train.txt 文件描述每个图片中的目标,label_list 文件描述类别

另附一个验证集合,有10张图片,eval.txt 描述图片中目标,格式和 train.txt 相同

运行以下代码解压数据集并做相应预处理,可在data/data6045文件夹下查看数据集内容。

In[1]
#解压数据集
!cd data/data6045/ && unzip -qo lslm.zip && unzip -qo lslm-test.zip

#####预处理
import os
import shutil
import codecs


train_path = 'data/data6045/lslm'
with codecs.open('data/data6045/train.txt', 'w') as f:
    with codecs.open('data/data6045/lslm/train.txt') as r:
        for line in r:
            f.write(train_path + '/' + line)


eval_path = 'data/data6045/lslm-test'
with codecs.open('data/data6045/eval.txt', 'w') as f:
    with codecs.open('data/data6045/lslm-test/eval.txt') as r:
        for line in r:
            f.write(eval_path + '/' + line)

if os.path.exists('data/data6045/lslm/label_list.txt'):
    shutil.move('data/data6045/lslm/label_list.txt', 'data/data6045/label_list.txt')
if os.path.exists('data/data6045/lslm/label_list'):
    shutil.move('data/data6045/lslm/label_list', 'data/data6045/label_list')
    
# label_list.txt 每一行一个类别,类别编号\t类别名字
# train.txt 每一行一个样本,图片路径\t{"bbox":{"value":"bolt","coordinate":[[1014.261,424],[1181.218,707.826]]}\t{...}... 注意,每个字段值之间用\t分割。坐标中有两组坐标,分别表示左上角和右下角
# eval.txt 格式通 train.txt
In[2]
#训练,此处仅训练1个epoch用以演示
!python faster-rcnn/train_own_data.py --use_gpu True \
                                      --data_dir='data/data6045/train.txt' \
                                      --class_num=3 \
                                      --epoch=1 \

-----------  Configuration Arguments -----------
MASK_ON: False
anchor_sizes: [32, 64, 128, 256, 512]
aspect_ratios: [0.5, 1.0, 2.0]
batch_size_per_im: 256
class_num: 3
data_dir: data/data6045/train.txt
draw_threshold: 0.8
enable_ce: False
epoch: 1
freeze_model_save_dir: freeze_model
im_per_batch: 1
image_path: dataset/coco/val2017
learning_rate: 0.001
log_window: 20
max_iter: 180000
max_size: 1333
model_save_dir: output
nms_thresh: 0.5
parallel: False
pixel_means: [102.9801, 115.9465, 122.7717]
pretrained_model: imagenet_resnet50_fusebn
rpn_nms_thresh: 0.7
rpn_stride: [16.0, 16.0]
scales: [800]
score_thresh: 0.05
snapshot_stride: 10000
use_gpu: 1
variance: [1.0, 1.0, 1.0, 1.0]
------------------------------------------------
W1227 10:19:27.374378    94 device_context.cc:235] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W1227 10:19:27.378685    94 device_context.cc:243] device: 0, cuDNN Version: 7.3.
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py:790: UserWarning: The current program is empty.
  warnings.warn(error_info)
2019-12-27 10:19:28.907831,epoch: 0, iter: 0, lr: 0.00033, 'loss': 17636.19, 'loss_cls': 636.661, 'loss_bbox': 15547.477, 'loss_rpn_cls': 978.198, 'loss_rpn_bbox': 473.854, time: 0.068
2019-12-27 10:19:53.723113,epoch: 0, iter: 100, lr: 0.00047, 'loss': 2.051, 'loss_cls': 0.896, 'loss_bbox': 0.391, 'loss_rpn_cls': 0.685, 'loss_rpn_bbox': 0.028, time: 0.250
2019-12-27 10:20:18.862529,epoch: 0, iter: 200, lr: 0.00060, 'loss': 1.731, 'loss_cls': 0.699, 'loss_bbox': 0.319, 'loss_rpn_cls': 0.67, 'loss_rpn_bbox': 0.038, time: 0.259
2019-12-27 10:20:44.095547,epoch: 0, iter: 300, lr: 0.00073, 'loss': 1.597, 'loss_cls': 0.597, 'loss_bbox': 0.312, 'loss_rpn_cls': 0.652, 'loss_rpn_bbox': 0.041, time: 0.249
2019-12-27 10:21:09.311920,epoch: 0, iter: 400, lr: 0.00087, 'loss': 1.483, 'loss_cls': 0.546, 'loss_bbox': 0.28, 'loss_rpn_cls': 0.633, 'loss_rpn_bbox': 0.029, time: 0.244
In[3]
#固化模型
!cd faster-rcnn && python freeze_model.py \
                   --pretrained_model=output/model_final \
                   --freeze_model_save_dir=freeze_model \
                   --use_gpu=1
W1227 10:23:30.996722   177 device_context.cc:235] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W1227 10:23:31.000236   177 device_context.cc:243] device: 0, cuDNN Version: 7.3.
freeze succeed
In[4]
#利用固化的模型进行预测,训练20个epoch的预测结果如下
!python faster-rcnn/infer.py \
                  --image_path=data/data6045/lslm-test/4.jpg  \
                  --draw_threshold=0.2 \
                  --use_gpu=1

######检测结果可视化
%matplotlib inline   
import matplotlib.pyplot as plt  
import numpy as np
import cv2

detect_img= cv2.imread('4.jpg')

plt.imshow(detect_img)
plt.show()
W1227 10:23:40.926337   237 device_context.cc:235] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W1227 10:23:40.930347   237 device_context.cc:243] device: 0, cuDNN Version: 7.3.
image with bbox drawed saved as 4.jpg
 

使用AI Studio一键上手实践项目吧:https://aistudio.baidu.com/aistudio/projectdetail/122275 

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

>> 访问 PaddlePaddle 官网,了解更多相关内容 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!