目标检测经典论文集锦
目标检测目前有 one-stage 和 two-stage 两种,two-stage 指的是检测算法需要分两步完成,首先需要获取候选区域,然后进行分类,比如R-CNN系列;与之相对的是 one-stage 检测,可以理解为一步到位,不需要单独寻找候选区域,典型的有SSD/YOLO。
本文为结合相关参考博客以及原始论文进行的整理总结,相关参考引用详见文末。
一、two-stage 检测
1、基于滑动窗口的目标检测
属于暴力方法,从上到下、从左到右,使用滑动窗口,并对窗口内图像进行特征提取,并使用SVM对窗口内物体进行分类,使用回归器预测边界框;
代表: OpenCV adaboost使用滑动窗口+图像金字塔生成检测框
2、R-CNN
实际上,更实用的方法是候选区域(Region Proposals) 方法来获取感兴趣的区域(ROI)。选择性搜索(Selective Search) 就是一种典型的候选区域方法。算法原理如下:
首先将每个像素作为一组。然后,计组的纹算每一理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的ROI。与寻找几乎个区域比起来,这种方法要高效的多。
具体方法:
- 给定一张输入图片,使用Selective Search方法从图片中提取 2000 个类别独立的候选区域(ROI),并将不同的ROI通过图像伸缩变换为固定大小的图像。
- 对于每个区域利用 CNN 抽取一个固定长度的特征向量。
- 再对每个区域利用 SVM 进行目标分类。
作者还提出直接使用在ImageNet预训练的模型在少量标注数据上fine-tuning的策略,避免标注数据不够问题
R-CNN 将候选区域与 GroundTrue 中的 box 标签相比较,如果 IoU > 0.5,说明两个对象重叠的位置比较多,于是就可以认为这个候选区域是 Positive,否则就是 Negetive。
采用 SGD 训练,初始学习率为 0.001,mini-batch 大小为 128。
基础知识:IOU表示groud truth与预测的bounding box之间的差异:
3、Fast R-CNN
动机:R-CNN中提取的ROI大多数是重复的,其次不同的ROI独立地丢进CNN中提取特征,增加时间成本。
因此是否可以先对整个图像进行特征提取,在特征图上提取ROI
Fast R-CNN 使用CNN网络先提取整个图像的特征,而不是对每个图像块提取多次。然后,我们可以将创建候选区域的方法(Selective Search)直接应用到提取到的特征图上。例如,Fast R-CNN 选择了 VGG16 中的卷积层 conv5 来生成 ROI区域在对应的特征图上的映射特征图块,并用于目标检测任务中。
R-CNN直接将ROI区域的图像进行伸缩变换为统一大小的图像,而在特征图上则无法直接这么做,Fast R-CNN则使用 ROI 池化,将特征图块转换为固定的大小,并送到全连接层进行分类和定位。因为 Fast-RCNN 不会重复提取特征,所以它能显著地减少处理时间。
ROI池化:对于一个任意大小的特征图ROI,将其平均拆分为指定的维度(例如最终目标转换的我是2*2),每个拆分的区域内执行最大池化,如图:
Fast R-CNN不使用SVM等,而是直接使用softmax和回归,并定义multi-task loss实现训练
4、Faster R-CNN
Fast R-CNN 依赖于外部候选区域方法,如选择性搜索。但这些算法在 CPU 上运行且速度很慢。在测试中,Fast R-CNN 需要 2.3 秒来进行预测,其中 2 秒用于生成 2000 个 ROI。因此区域生成的计算成为整个检测网络的瓶颈。
与其使用固定的算法得到候选区域,不如让网络自己学习自己的候选区域应该是什么。因此,Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用 区域生成网络(Region Proposal Network,RPN) 代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像 10 毫秒的速度运行。
4.1 Conv Layer
Conv layers部分共有13个conv层,13个relu层,4个pooling层,每个卷积核为33,池化层为22。卷积时添加pad=1,保证卷积后维度不变; pooling层kernel_size=2,stride=2,维度减半
4.2 RPN layer
该层用于生成region proposal。
(1)首先,对获取到的feature map,使用 3 3 卷积核进行卷积,并保证输出的维度不变;
(2)然后分为两条路:
- 一条路使用全卷积( kernel_size=1 1,p=0,stride=1),对feature map的每个像素的9个anchor进行二分类(判断是否是object还是背景)。维度变换为 60 40 512-d ⊕ 1 1 512 18 ==> 60 40 9
- 另一条路使用全卷积,对feature map的每个像素的9个anchor box的四个坐标(左上角横纵坐标、右下角横纵坐标)进行回归。维度变换:60 40 512-d ⊕ 1 1 512 36==>60 40 9
注释:Anchor的定义和生成
因为原始图像经过第一层后维度降至为1/16,因此feature map的每个像素点可以对应原始图像的16 16的区域。
定义三种长宽比(ratio),分别是0.5、1.0、2.0,尺度(即16的倍数)分别为8、16、32,因此对于feature map的每一个像素点,都可以得到9个anchor。如图:
因此,假设feature map的第一个像素点对应原图的区域则是[0, 0, 15, 15] (左上角坐标为(0, 0),右下角坐标为(15, 15)),则其可以生成:
[[ -84. -40. 99. 55.] [-176. -88. 191. 103.] [-360. -184. 375. 199.] [ -56. -56. 71. 71.] [-120. -120. 135. 135.] [-248. -248. 263. 263.] [ -36. -80. 51. 95.] [ -80. -168. 95. 183.] [-168. -344. 183. 359.]]
特征图大小为 60
40,所以会一共生成 60
40
理解:通过对feature map的每个像素点启发式地生成若干个anchor,这样就能几乎将整个原图的大多数区域覆盖住,只需要对这些区域进行二分类就可以知道那些anchor box是包含物体的,避免了Selective Search耗时的工作。由于启发式地anchor可能不能够适应到所有尺寸的物体,所以再通过回归来修正坐标。
由于模型需要训练anchor的分类和回归,因此需要对生成的anchor box进行筛选和标注。
- 对anchor的分类,作者设置了标注的规则:
- 对anchor的回归(预测左上角和右下角坐标的值), 通过ground truth box与预测的anchor box之间的差异来进行学习,从而是RPN网络中的权重能够学习到预测box的能力
使用NMS算法,剔除掉重叠的框,设定LOU阈值筛选,最终获得大约300个box。
4.3 ROI pooling
150,如果目标得到的维度是10 10,则平均划分10
4.4 output
5、R-FCN
解决两个问题,一个是平移不变性,一个是进一步提升速度。
R-FCN框架的由来是由于,faster R-CNN对卷积层做了共享(RPN和Fast R-CNN),但是经过RoI pooling后,却没有共享,如果一副图片有500个region proposal,那么就得分别进行500次卷积,这样就太浪费时间了,于是作者猜想,能不能把RoI后面的几层建立共享卷积,只对一个feature map进行一次卷积,
算法步骤概述:
(1)平移不变性(位置不敏感性)
平移不变性则是针对分类任务的。对于分类任务,随着某个目标在图片中不断的移动,希望网络仍然可以准确的将目标区分为对应的类别。如上图左边所示,不管鸟在图片中如何移动,分类网络应将其准确分类为鸟。实验表明,深的全卷积网络能够具备这个特性,如ResNet-101等。举个例子,在用基础的分类结构比如ResNet、Inception给一只猫分类时,无论猫怎么扭曲、平移,最终识别出来的都是猫,输入怎么变形输出都不变这就是平移不变性,网络的层次越深这个特性会越明显。
(2)平移可变性(位置敏感性)
对于检测任务来说,我希望我的网络可以检测到物体微小的移动,并准确输入其位置坐标,所以这类网络对位置就很敏感,但很显然,深层网络不具有这种性质,微小的移动可能在高层特征体现不出来了。
基于ResNet的检测网络通常会使用RoI层将网络划分为共享卷积层和RoI-wise层,第一部分通过共享卷积层提取图像特征,第二部分一般为全连接层,分别对每一个RoI做分类和回归。此时,第二部分的计算并不是共享的。这也是R-FCN要改进的地方!
one-stage算法还将会不断更新中…
二、one-stage 检测
1、YOLO
YOLO直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。
基本流程(如上图所示):
- 输入图像,并转换为448
- 使用主体网络(CNN)进行卷积核池化;
- 回归得到bounding box坐标、bounding box置信度以及分类;
思想:
- 输入一张图像,并resize为448 448,然后将其均匀划分S
- 每个grid用来预测B个bounding box的坐标、长宽以及置信度,分别记作 。其中 是边界框的中心坐标,而 和 是边界框的宽与高。中心坐标的预测值 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 和 预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在
- 对于每个bounding box的置信度的预测公式为 。前者表示如果有object落在box内则取1,否则取0;后者表示box与groud truth的IOU值;
- 每个grid还要预测对应的类型(C个类);
- 最终模型的输出为维度大小为 S S ( 5 B + C ) 的张量,张量内的元素为对应的回归值或概率分布,一共有S S个grid格子,每个grid格子预测5
网络结构如下所示:
- 假设,对448 448的图像划分为7
- 输入448 448图像,使用64个7 7的卷积核进行卷积,并使用2 2进行池化,得到112 112
- 后面依次类推,最终得到7 7 30的张量,恰巧对应7 7个grid,每个grid对应30个预测值(2
目标损失函数如下:
two-stage算法还将会不断更新中…
参考:
Faster R-CNN讲解:https://zhuanlan.zhihu.com/p/31426458