简介
区域卷积神经网络(RCNN)系列模型为两阶段目标检测器。通过对图像生成候选区域,提取特征,判别特征类别并修正候选框位置。 RCNN系列目前包含两个代表模型:Faster RCNN,Mask RCNN
Faster RCNN 整体网络可以分为4个主要内容:
- 基础卷积层。作为一种卷积神经网络目标检测方法,Faster RCNN首先使用一组基础的卷积网络提取图像的特征图。特征图被后续RPN层和全连接层共享。本示例采用ResNet-50作为基础卷积层。
- 区域生成网络(RPN)。RPN网络用于生成候选区域(proposals)。该层通过一组固定的尺寸和比例得到一组锚点(anchors), 通过softmax判断锚点属于前景或者背景,再利用区域回归修正锚点从而获得精确的候选区域。
- RoI Align。该层收集输入的特征图和候选区域,将候选区域映射到特征图中并池化为统一大小的区域特征图,送入全连接层判定目标类别, 该层可选用RoIPool和RoIAlign两种方式,在config.py中设置roi_func。
- 检测层。利用区域特征图计算候选区域的类别,同时再次通过区域回归获得检测框最终的精确位置。
faster-rcnn模型结构图如下:
注:本例默认用GPU运行,也可通过设置--use_gpu=False使用CPU设备。
阅读本项目之前建议阅读faster-rcnn原版论文https://arxiv.org/abs/1506.01497 相关优秀博客https://www.cnblogs.com/chaofn/p/9310912.html ,https://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文件夹下查看数据集内容。
#解压数据集
!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
#训练,此处仅训练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
#固化模型
!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
#利用固化的模型进行预测,训练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 官网,了解更多相关内容。
来源:oschina
链接:https://my.oschina.net/u/4067628/blog/3226325