赞
踩
目标检测目前有 one-stage 和 two-stage 两种,two-stage 指的是检测算法需要分两步完成,首先需要获取候选区域,然后进行分类,比如R-CNN系列;与之相对的是 one-stage 检测,可以理解为一步到位,不需要单独寻找候选区域,典型的有SSD/YOLO。
本文为结合相关参考博客以及原始论文进行的整理总结,相关参考引用详见文末。
属于暴力方法,从上到下、从左到右,使用滑动窗口,并对窗口内图像进行特征提取,并使用SVM对窗口内物体进行分类,使用回归器预测边界框;
代表: OpenCV adaboost使用滑动窗口+图像金字塔生成检测框
实际上,更实用的方法是候选区域(Region Proposals) 方法来获取感兴趣的区域(ROI)。选择性搜索(Selective Search) 就是一种典型的候选区域方法。算法原理如下:
首先将每个像素作为一组。然后,计组的纹算每一理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的ROI。与寻找几乎个区域比起来,这种方法要高效的多。
具体方法:
作者还提出直接使用在ImageNet预训练的模型在少量标注数据上fine-tuning的策略,避免标注数据不够问题
R-CNN 将候选区域与 GroundTrue 中的 box 标签相比较,如果 IoU > 0.5,说明两个对象重叠的位置比较多,于是就可以认为这个候选区域是 Positive,否则就是 Negetive。
采用 SGD 训练,初始学习率为 0.001,mini-batch 大小为 128。
基础知识:IOU表示groud truth与预测的bounding box之间的差异:
动机: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实现训练
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
×
\times
× 3 卷积核进行卷积,并保证输出的维度不变;
(2)然后分为两条路:
注释:Anchor的定义和生成
因为原始图像经过第一层后维度降至为1/16,因此feature map的每个像素点可以对应原始图像的16 × \times × 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 × \times × 40,所以会一共生成 60 × \times × 40 × \times × 9 = 21600 个Anchor box。
理解:通过对feature map的每个像素点启发式地生成若干个anchor,这样就能几乎将整个原图的大多数区域覆盖住,只需要对这些区域进行二分类就可以知道那些anchor box是包含物体的,避免了Selective Search耗时的工作。由于启发式地anchor可能不能够适应到所有尺寸的物体,所以再通过回归来修正坐标。
由于模型需要训练anchor的分类和回归,因此需要对生成的anchor box进行筛选和标注。
4.3 ROI pooling
由于经过RPN模块获得的各个box大小是不同的,因此需要对所有box转换为统一的维度大小。对每个box的长宽平均划分多个子区域(例如feature map为100 × \times × 150,如果目标得到的维度是10 × \times × 10,则平均划分10 × \times × 15个子区域),每个子区域内使用最大池化,最终得到维度统一的feature map。这部分操作与Fast R-CNN一致
4.4 output
解决两个问题,一个是平移不变性,一个是进一步提升速度。
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算法还将会不断更新中…
YOLO直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。
基本流程(如上图所示):
思想:
网络结构如下所示:
目标损失函数如下:
two-stage算法还将会不断更新中…
参考:
【1】one-stage与two-stage的概述详见:https://blog.csdn.net/gaoyu1253401563/article/details/86485851
【2】Fast R-CNN讲解:https://blog.csdn.net/u014380165/article/details/72851319
【3】Faster R-CNN讲解:https://zhuanlan.zhihu.com/p/31426458
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。