写在前面:
免责声明
本文纯属个人对技术的探讨,欢迎大家讨论学习。具体引用和相关代码会在文章后面给出,不用做任何商用。
由于个人能力有限,存在诸多不足,欢迎指正。
目标检测------object detection
1. 简介
这篇文章并非纯技术向讨论,深入到文章中。笔者更想用通俗的白话语言将个人学习感悟和困惑记录下来,主要是把英文文献或者专业术语描述出来,增强个人理解,查漏补缺,适用于面试和技术讨论。
2.目标检测小知识
2.1 什么是目标检测
简单来说,给定一张图片,经过分析后,给出两个答复:what & where
图1.目标检测定义示例图
2.2 常用数据集
常用数据集有
VOC2007、VOC2012:20类,场景相对简单,11,530张图片,27,450物体,图像内容相对单一,图片遮挡较少,适合初学者。
COCO:91类,复杂场景,328,000图像,2,500,000物体,图像比较复杂,
图2:COCO数据集示例图
从个人的角度出发,现在不管是写论文,还是具体项目当中实测,都已经从VOC转向了COCO,这个数据集在当前时间来说,具有权威性(日期:2021年5月12日)
2.3. 目标检测流程
相对来说,目前已经比较固定
输入图像--->目标潜在位置筛选--->候选框提取--->候选区域分类--->结果
更加形象的例子如下图所示:
图3:目标识别流程
2.4. 目标检测分类
目前目标检测主要分为两类,two-stage和one-stage,根据个人项目经验,one-stage已经称为了主流,因为快。。。
图4:目标检测分类
目前来讲,two-stage精度高,速度慢
one-stage 速度快 精度略低,大势所趋
3.经典RCNN系列
3.1 R-CNN
图5: R-CNN
R-CNN使用传统的目标识别做法。
在第一步:候选区域提取这里,R-CNN把每一个候选区都抠出来,然后对每一个候选区域做特征提取,再使用SVM分类器做分类。
缺点:基本上每一张图片都会产生2000多个候选区域,一是工作量比较大,而是这两千多个区域的重叠度比较大。
有一说一环节:作为初代的R-CNN,在现在看起来有一些缺点,无可厚非。
3.2. Fast R-CNN
图6: Fast R-CNN
重点说一下fast R-CNN的改进
从图6当中也可以看出,不同于R-CNN,Fast R-CNN先对整副图片,使用CNN提取特征区域,然后在相对比较小的feature map上提取特征。
但是这样会产生一个问题,每一个候选区域大小不一样,提取出来的特征维度不一样。
Fast R-CNN做了一个特别天才的改动:
分类器换成全连接层,比如神经网络。因为全连接层的输入节点数是固定的。
具体实现:
Fast R-CNN将最后一个卷积层的SSP Layer改为 Roi Pooling Layer;另外提出了多任务损失函数(Multi-task Loss),将边框回归直接加入到CNN网络中训练,同时包含了候选区域分类损失和位置回归损失。
Rol Pooling Layer: 实际上是SPP Layer的简化版,SPP Layer对每个候选区域使用了不同大小的金字塔映射,即SPP Layer采用多个尺度的池化层进行池化操作; 而Roi Pooling Layer只需要将不同尺度的特征图下采样到一个固定的尺度(例如7*7)。例如对于VGG16网络conv5_3有512个特征图,虽然输入图像的尺寸是任意的,但是通过Roi Pooling Layer 后,均会产生一个7*7*512维度的特征向量作为全连接层的输入,即Roi Pooling Layer 只采用单一尺度进行池化。如下图所示:
图7. RoI pooling操作
SPP层和RoI pooling层使得网络对输入图像的尺寸不再有限制,同时RoI pooling解决了SPP无法进行权值更新的问题。RoI pooling层有两个主要作用:第一个:将图像中的RoI区域定位到卷积特征中的对应位置;第二个:将这个对应后的卷积特征区域通过池化操作固定到特定长度的特征,然后将该特征送入全连接层。
3.3 Faster RCNN
图8 Faster R-CNN
没什么想说的,
RCNN作为比较早的技术,我们重点关注的是它定下来的框架和结构。
后续我会继续发文,主要研究anchor-free这方向。(因为今年比较热门)
参考引用
1.樱花书 & 西瓜书
2.https://blog.csdn.net/fengbingchun/article/details/87091740