系列文章目录
前言
注:本系列文章为本人学习目标检测阶段的读书总结,详细参考书目会在文末说明。
一、RCNN
RCNN 是Ross Girshick团队在2014年提出来的目标检测算法,被誉为该领域的开山之作。主要的思想是将检测问题当做分类问题处理。
检测过程分为四个步骤:
- 候选区域生成:使用 Resion Proposal 提取候选区域,约1k~2k个候选区域,然后合并包含同一物体可能性高的区域。提取完后,对每一个区域进行归一化,统一图像大小。
- 特征提取:将上一步骤归一化的图像输入CNN网络,得到固定维度的特征输出。
- SVM分类:对上一步骤输出的特征进行分类,得到分类结果。
- 位置修正:通过回归器对特征边界进行回归以得到更精确的目标区域。
详细解说推荐视频:深度学习目标检测篇
二、Fast RCNN
RCNN 虽然实现了物体检测,但是需要进行多步训练,步骤繁琐且识别速度非常慢,同时需要进行归一化处理得到相同尺寸的特征图像。为了进一步提升效果,Ross Girshick 在2015年提出了 Fast RCNN。算法基于VGG16网络,在训练速度上比RCNN快了近9倍,在测试速度上快了213倍,并在VOC 2012数据集上达到了68.4%的检测率。
主要的改进有以下三点:
- 共享卷积:在RCNN中输入卷积操作的是一个个生成的候选区域,而Fast RCNN 直接将整张图像输入卷积,避免了大量的重复卷积操作,节省了计算资源。
- RoI Pooling:利用特征池化操作进行尺度变换,使得输入可以是任意大小的图片。
- 多任务损失:将最后的分类和回归网络一起训练,同时为了避免SVM单独训练和速度慢的问题,引入Softmax函数进行分类。
Fast RCNN大大提升了检测速度,但是在实际过程中,候选区域生成阶段始终占据大部分时间开销(2~3秒),远比识别阶段(0.2秒)要慢。
三、Faster RCNN
为了解决候选区域生成占据大量时间开销的问题,2015年的NIPS出现了Faster RCNN。该算法提出了RPN(Region Proposal Network)网络,利用Anchor机制将区域生成与卷积网络联系到一起,将检测速度一举提升到了17 FPS(Frames Per Second),并在VOC 2012测试集上实现了70.4%的检测结果。
区别于候选区域随机生成,基于Anchor机制的区域生成直接默认生成一系列固定大小宽高的矩形框,后续只需要对框进行微调。
下图展示的是Faster RCNN 的框架图:从功能模块来讲,主要包括4部分:特征提取网络、RPN模块、RoI Pooling(Region of Interest)模块与RCNN模块。
这里主要介绍RPN模块(区域生成模块):其作用是生成较好的建议框,即Proposal,这里用到了强先验的Anchor。RPN包含5个子模块:
- Anchor生成:RPN对feature map上的每一个点都对应了9个Anchors,这9个Anchors大小宽高不同,对应到原图基本可以覆盖所有可能出现的物体。因此,有了数量庞大的Anchors,RPN接下来的工作就是从中筛选,并调整出更好的位置,得到Proposal。
- RPN卷积网络:与上面的Anchor对应,由于feature map上每个点对应了9个Anchors,因此可以利用1×1的卷积在feature map上得到每一个Anchor的预测得分与预测偏移值。
- 计算RPN loss:这一步只在训练中,将所有的Anchors与标签进行匹配,匹配程度较好的Anchors赋予正样本,较差的赋予负样本,得到分类与偏移的真值,与第二步中的预测得分与预测偏移值进行loss的计算。
- 生成Proposal:利用第二步中每一个Anchor预测的得分与偏移量,可以进一步得到一组较好的Proposal,送到后续网络中。
- 筛选Proposal得到RoI:在训练时,由于Proposal数量还是太多(默认是2000),需要进一步筛选Proposal得到RoI(默认数量是256)。在测试阶段,则不需要此模块,Proposal可以直接作为RoI,默认数量为300。
3.1 不同库源码对比
GitHub 上面复现Faster RCNN的源码评分较高的有大概五六份,这里进行一些对比:
github 地址 | 环境配置 | 硬件配置 | Star | 模型性能 |
---|---|---|---|---|
(官方Python版本) rbgirshick/py-faster-rcnn | Python Caffe CUDA | 3G 内存 | 7.1k | VOC 2017 测试时间 220ms/image(VGG16) mAP 和 Matlab 版 Faster RCNN 训练结果 相近 |
jwyang/faster-rcnn.pytorch | Python Pytorch CUDA | NVIDIA TITAN XP*8 | 6.8k | VOC 2007 mAP: 69.4(VGG16) 75.2(Res-101) |
smallcorgi/Faster-RCNN_TF | TensorFlow Python | 3G GPU | 2.4k | VOC 2007 mAP: 68.1 (VGG16) |
endernewton/tf-faster-rcnn | TensorFlow Caffe | 多块 GPU | 3.6k | VOC 2007 mAP: 70.8 (VGG16) 75.7(ResNet101) COCO 2014 mAP: 30.2 (VGGNet) 35.4 (ResNet101) 36.1 (MobileNet) |
(官方Maltab版本) ShaoqingRen/faster_rcnn | Matlab Caffe | Titan, Titan Black, Titan X, K20, K40, K80 5GB GPU(RPN) 8GB GPU(Fast RCNN) | 3.5k | 具体结果见下图 |
longcw/faster_rcnn_pytorch | 不支持Pytorch 0.4.0 及以上 | 可以CPU/GPU | 1.6k | 没有达到官方mAP |
MATLAB 版 Faster RCNN 实验结果:
参考文献
[1]. 董洪义.深度学习之Pytorch物体检测实战[M].北京:机械工业出版社, 2019.