目标检测:RCNN 系列解读

RCNN 系列解读

先放一个大神博客吧,膜拜~
http://www.rossgirshick.info/
有空还需要把细节和补充材料review一下!

参考:
https://cloud.tencent.com/developer/news/281788
其他人的博文整理:
https://www.cnblogs.com/yhyue/p/9247962.html
https://blog.csdn.net/briblue/article/details/82012575

目标检测前沿及回顾(2018)
脉络清晰,有延伸

关于目标检测的论文集锦参看下面这个GitHub:
https://github.com/hoya012/deep_learning_object_detection

零、R-CNN之前的故事

  1. HoG特征 梯度直方图
    参考:HoG特征
    ① 对图像进行预处理,主要是伽马矫正和灰度化,尽量去除光照的影响
    ② 对原图中的每一点,计算其梯度值,得到其梯度的大小和方向
    例如,水平方向梯度gx:做水平差分;竖直方向梯度gy:做竖直差分。
    总的梯度大小g = sqrt(gx2+gy2)
    总的梯度方向θ = arctan(gx/gy)
    ③ 计算梯度直方图
    将8x8大小的区域划分为一个cell,其元素共有8x8x2=128个关于梯度的值,将其按角度分到9个bin中,这9个bin是将180度划分为9份得到。这样,就得到一个长度为9的数组(梯度的直方图)。一般来说,观察梯度方向的主要分布范围,就可以大致认为该8x8区域的具有某个方向的边缘。HoG是对边界敏感,对灰度变化平坦的区域不敏感。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvMmOvNR-1586676325899)(en-resource://database/2775:1)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJhlpGAa-1586676325901)(en-resource://database/2777:1)]
    ④ 以4个cell为一个block进行归一化,进一步降低光照影响。
    一个block事实上对应16x16的区域。4个cell,每个cell经过梯度直方图计算已经转化为一个长度为9的vector,现在一个block相当于包含一个长度为4x9=36的vector。这里的归一化,就是对这个长度为36的向量进行归一化。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wJ9nQW6-1586676325906)(en-resource://database/2773:1)]
    ⑤ 得到HoG特征向量
    注意block是在整张图上滑动的,因此对于64x128的图像,共7x15个block。
    因此一张图像的HoG向量为7x15x36 = 3780
    得到HoG特征向量之后,一般用svm进行分类。

  2. sift特征
    包含了候选特征提取、特征描述两个部分。其中特征描述为重点,因为特征提取可以用很多方法实现,并不是sift的核心。
    ① 特征提取
    a 候选关键点
    通过高斯尺度差分(DoG)实现,DoG是高斯金字塔和差分金字塔的结合。所谓高斯金字塔,是多组图像金字塔,在每组金字塔中,图像尺寸不变,也就是分辨率相同,但高斯核的方差按一定比例增长,也就是模糊程度不同。在不同组之间,尺寸每次减半,也就是进行步长为2的下采样。而差分金字塔,就是高斯金字塔中,同一组内的相邻图像两两差分形成。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4RNPCrI-1586676325909)(en-resource://database/2779:1)]
    对DoG的图像进行归一化,可以看到差分图像所蕴含的特征。并且有的特征是在不同模糊程度、不同尺度下都存在的,这些特征正是sift要提取的特征。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTUaXhdp-1586676325911)(en-resource://database/2781:1)]
    b 关键点定位
    通过DoG筛选出候选关键点后,对这些关键点进行精确的拟合,来进一步确定位置和尺度

② 特征描述
类似简易版hog
https://www.cnblogs.com/wangguchangqing/p/4853263.html

  1. selective search
    ① 分割
    先按一定方法将图像分割为许多小快,然后使用贪心策略,计算每两个相邻区域的相似度,然后每次合并最相似的两块,将这其中每次产生的图像块都保留下来,这样就得到了图像的分层表示。
    ② 区域合并-如何检测相似性
    采样三种多样性策略来增加候选区域,避免并不相似区域被错误合并,或者相似区域没有被合并到。
  • 多种颜色空间
  • 多种相似度度量,如颜色、纹理、大小、重叠
  • 通过改变阈值初始化原始的区域,阈值大,则分割的区域少
    ③ 给区域打分
    给定权重,相同区域多次出现权重叠加,计算所有目标区域的分数,排序。
    ④ 性能评估
    通过算法计算得到的包含物体的Bounding Boxes与真实情况(ground truth)的窗口重叠越多,那么算法性能就越好。

一、R-CNN

Rich feature hierarchies for accurate object detection and semantic segmentation | [CVPR’ 14] |
参考:
https://blog.csdn.net/wopawn/article/details/52133338(非常详细的解读了rcnn各个部分是如何训练,如何选择和构造样本,以及输入输出形式。(重点关注bbox回归的部分))

创新点:
1.采用CNN网络提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力;
2.采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题。

编辑于2019/12/26
**在AlexNet在ImageNet上获得成功之后,R-CNN作者思考是否能将其用到目标检测领域的Pascal VOC数据集上来。由于目标检测的数据集较少,采用了迁移学习的方法,即对ImageNet上的预训练模型进行fine-tune。于是R-CNN的基本思路为:

  1. 通过selective research在图片上生成2k个region proposal
  2. 将所有proposal缩放(warp)到227x227,依次送入特征提取网络获得一个4096维特征(细节:warp时对各区域进行膨胀,也就是人为添加了边框,每个box向外扩张了16个像素)
  3. 将特征输入每个类别的SVM进行分类,每个类别的SVM给所有特征向量进行单独打分。也就是说,现在的每个region proposal都有针对每个类别的分数;而每****一类别,在每个region proposal上都有一个得分
  4. 对每个类别,分别使用NMS进行候选框筛选,拒绝掉一些和高分区域IOU大于阈值的候选框
  5. 分类完毕,进行bbox regression **

CNN和SVM各自的训练策略:

  1. 特征提取网络是AlexNet(5个卷积,3个全连接)的迁移学习;
    特征提取器CNN训练时,输入网络的proposal(bbox参数,xywh),如果其和真实标注的框IoU>0.5就认为时positive,否则认为是negtive;学习率设维初始化训练时的1/10;每轮SGD迭代,使用正负例样本数维32:96
  2. 分类器SVM训练时,完全重合的认为是groudtruth,IoU<0.3的认为是背景,其余丢弃(注意这个0.3的阈值选择很重要,是在[0.1,0.2,0.3,0.4,0.5]中网格搜索得到的;训练时采用hard negtive mining策略,也就是每次迭代时,将损失函数最高的。
    关于为什么CNN和SVM训练时使用正负样本比例不同的一个讨论:
    (简而言之就是CNN需要大样本来避免过拟合,而阈值宽松一点能提供更多样本;而svm适合小样本学习,故使用更严格的阈值)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-juxNzikf-1586676325914)(en-resource://database/1263:1)]

此外,作者还讨论了为什么单独训练一个svm分类器,而不是使用cnn层的fc层(见补充材料):
阈值0.3,导致cnn效果不好,改为0.5后,导致定位不准确,所以干脆分开CNN和svm?

在完成这部分工作后,作者进行了一个误差分析(3.4节),分析在false positive增多时,各种错误情况所占百分比。见下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLk2js2n-1586676325916)(en-resource://database/1264:1)]
作者发现最大的分类错误来源于定位误差,也就是图中的Loc项。于是基于这个误差分析,作者进一步进行了bbox回归来减小定位误差。这通过训练一个线性回归模型来对region porposal的pool5数据预测一个新的bbox位置(见补充材料)
**

2019/12/18
下面是详细介绍。

1. Introduction

1.1 传统的特征提取方法:

SIFT与HOG

1.2 目标检测的主要问题:

①需要对同一张图中的多个物体进行localizing
②常规的目标检测中难以获得大量有标注的训练数据集

the labeled data is scarce and the amount currently available is insufficient for traning a large CNN

1.3 常规的解决思路:

针对问题①:
[31] 用回归的方法去解决
[28,29,33] sliding-window detector (为了保证高分辨率,这类网络往往只有两个卷积和池化层,但是本文所用的卷积核很大,195x195,步长也很长,32,这就很难用滑动窗口去进行精准定位了)
针对问题②:
无监督的预训练+有监督的fine-tuning

1.4 本文选用的解决方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbMWJXdC-1586676325918)(en-resource://database/962:1)]
问题①:
[18] 基于区域提议的识别
具体为:
在测试阶段,为每张图像生成2000个提议区域,输入到CNN网络中进行特征提取,然后将每个区域的特征用线性SVM进行分类。这些区域在输入到CNN之前,都会进行简单的仿射变形(affine image warping),以适配网络的输入尺寸。
因此本文事实上是将region proposal和CNN结合在了一起,作者将其称之为R-CNN。
问题②:
有监督预训+小数据集上fine-tuning

supervised pre-traning on large auxiliary dataset, followed by domain-specific fine-tuning on a small dataset, is an effective paradigm for leaning high-capacity CNNs when data is scarce.
此外,本工作中class-specific的计算仅仅在于最后的矩阵向量积和贪心非极大值抑制。即便如此,用CNN提取到的特征数量还是比人工构造的区域特征少了2个数量级。

1.5 其他亮点工作

① CNN内容可视化,发现绝大多数多余的参数是可以被remove掉的,而accuracy却不会下降多少,并且在CNN中提取到了丰富的特征信息(rich features)
② failure分析
results from detection analysis tool [20]
发现如果加上一个简单的bounding box回归就能极大的降低mislocalization
③ 该网络很容易迁移到语义分割上,也可以实现效果的提升

2. Object detection with R-CNN

总体思路分为3个module:
生成无标签的区域提议→CNN特征提取→特定分类的线性SVM

2.1 module design

① 提议区域
生成region proposal的方法包括:
objectness
selective search (本文选用此种方法)
参考:Selective Search for Object Recognition解读
category-independent object proposals
constrained parametric min-cuts
multi-scale combinatorial grouping
② 特征提取
采用alexnet作为base model, 提取4096维特征;输入的是去均值的RGB图像,大小277x277;网络结构为5个卷积层和2个全连接层。
image warping:本文采用的最简单的方法,也就是直接将bbox中的图像变形到指定尺寸。注意先将回归框往外扩展16个像素(也就是回归框的宽度)。其他变换方法可参考本文的supplementary material。(各向异性缩放,作者还将其与各向同性缩放做了对比)

2.2 test-time detection

对每张图片提取提议区域后,将每个提议区域输入到CNN获得特征向量,然后用训练好的各个class的SVM分类器对每个区域进行打分。对打分后的区域,采用贪心非极大值抑制来剔除那些和打分更高的区域重合程度超过一定阈值的回归框。下图是计算IoU的例子。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEBWqAG6-1586676325919)(en-resource://database/963:1)]
参考:IoU,IU
运行时间分析:
CNN权值共享,特征维数下降,都显著降低了单幅图片的处理时间。
class-specific的计算主要是特征向量和SVM权重之间的点积运算和非极大值抑制。这事实上被转换为了矩阵乘积。
特征矩阵:2000x4096
SVM weights:4096xN
这意味着,RCNN完全可以拓展到更多类别的检测上。即使类别数达到了100k,这里的矩阵乘法耗时也不过10s左右(CPU)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0luXbRd-1586676325921)(en-resource://database/1262:1)]

2.3 training

① 有监督预训练
在ILSVRC 2012数据集上,图片级的标注(也就是没有标注回归框)。top 1 error比[22]要高2.2个百分点,主要是因为本文对训练过程进行了一些简化。
② fine-tuning
用region proposals 继续对CNN进行训练,将原本对imagenet的1000个类别输出替换为voc的20+1(background),其他网络结构不变。
将和groud truth的IoU>=0.5的bb标注为positive,其他为negative。
同时将学习率调至与训练时的1/10,保证网络能够得到训练,但是不至于完全改变预训练的权重。
在每个SDG迭代中,采用32个positive window和96个background组成一个batch。
③ 训练分类器
为每个类别都训练一个分类器。采取standard hard negative mining method来避免OOM (详见补充材料)
补充材料中还讨论了训练分类器的必要性。

2.4 results

对比UVA,mAP提升了接近20个百分点。

3. visualization,ablation and modes of error

3.1 特征可视化

反卷积方法:[36]
本文所用:
将某个特定卷积核作为一个detector,如pool5的256个卷积核。用10million个region proposal去激活它,提取其打分最高的那个区域。
结果表明这些卷积核都能识别到一定的特征(rich features),而后续的fc层能很好的利用这些特征来compose各种类别。

3.2 模型简化测试

实验发现:
① 无fine-tune时,卷积层效果比fc层好,预示着以后可以采用dense feature map
② 有fine-tune时,fc层提升非常明显,这说明卷积层学到的是非常general的特征,mAP的提升主要在于fc层学到了具体到各个类别的特征(依靠分类器)

3.3 误差模式分析

工具: [20]
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuV6AKTu-1586676325922)(en-resource://database/964:1)]
经分析,主要误差来源为定位误差,而不是和其他类别发送混淆,这驱使作者考虑加入一个bbox回归,来降低错误率。

3.4 bbox回归

在原来的pool5之后,对每个region proposal拿到的feature,都做一个bbox回归,来重新定位。详见补充材料。

参考:
https://blog.csdn.net/wopawn/article/details/52133338
详述了一些结果分析以及问题

二、 SPP-Net (spatial pyramid pooling)

official implementation:https://github.com/ShaoqingRen/SPP_net
紧随r-cnn之后出现在2014年ECCV的工作,by何恺铭大神。论文
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
两个主要工作:

  1. 传统的CNN输入维度是固定的,因为fc层的限制。这样就只能把输入图片crop或者warp成固定size,然而crop造成信息损失,warp造成几何畸变,都不太好。
    这里考虑在卷积层和fc层之间引入一个金字塔池化层,这个层的作用在于,使得不论卷积层输出feature map的形状如何,都能被池化为统一长度的特征向量。这里借鉴了词袋模型的思想(Bag of Words),将特征层的每一层划分为一系列网格(如16、4、1),对每个格子做池化(max or average,这里是max),这样就得到一个维数固定的feature vector,然后再在深度通道上拼接起来(filters数也是固定的)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3AeEYc1-1586676325923)(en-resource://database/1265:1)]
  2. 速度比R-CNN快了许多,主要是因为
    R-CNN:先将图片crop成许多window,再送入CNN,相当于对同一个图像多个区域重复进行了特征提取,耗时
    SPP-Net:只进行一遍使用CNN的特征提取,通过将window映射到feature map上,对feature map的指定区域进行金字塔池化,来得到每个window的 feature vector。(具体方法见文末appendix)

三、 Fast R-CNN

很好的博客:
https://blog.csdn.net/WoPawn/article/details/52463853

1. introduction

R-CNN的问题:
对一张图像中的每个提议区域都用CNN进行一次特征提取,相当于对图像各区域进行了大量的重复计算,导致时间和空间消耗非常大。
解决:
借鉴SPPnet [11]的空间金字塔池化,其为整张图片计算一个特征map,然后在分类时采用从特征map上抽取得到的各个区域的特征向量。
抽取各个proposal的特征向量,通过一系列不同大小的最大池化来实现,池化结果形成一个空间金字塔。

SPP也依然不是端到端的,它后面还是用的svm(同rcnn),边框回归也是单独做的。SPP还有一个问题,它在sp之前的卷积层都不能进行fine-tune?

原R-CNN和SPP-Net的共同点:

  1. 训练过程是分阶段的。第一阶段,用log loss训练cnn作为特征提取器;第二阶段,用cnn得到的特征向量训练SVM;第三阶段,训练一个bbox的回归器
  2. 提取完特征向量需要存到硬盘里再给svm,耗空间;训练本身也耗时
  3. 慢。 几十秒处理一张。

Fast R-CNN实际上提出了一种single stage的目标检测pipeline,并且训练中所有层都是可以更新的

2. architecture and training

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JxbOh3GI-1586676325924)(en-resource://database/1266:1)]
网络结构如上。输入图像经过DNN后,成为特征图,然后将region proposal的ROI投影到feature map上,找到这个投影区域后,对其进行ROI pooling,然后经过fc后,分为两路,一路经过fc和softmax用于k+1(background)分类,另一路作为bbox的回归器(4xk个实数),这样将分类预测和边框回归统一到一起,而无需分阶段训练。

1. RoI池化

RoI区域用(r,c,h,w)来描述,其中r、c为top-left值,h、w为高度和宽度。RoI池化使用的是最大池化。它将边长为h×w的RoI区域用H×W的池化算子划分为许多的子窗口,这些子窗口的size为h/H×w/W,然后对每个子窗口使用最大池化。这种RoI池化事实上是SPPnet中金字塔池化的一种特例,这里只有一个金字塔层,其池化计算方法同SPPNet中的描述。

注意,在这种池化操作后,各个特征框被池化到同一大小,也就是HxW的大小,对VGG来说是7x7。
其实现方法是:
将hxw的特征框划分为h/H×w/W个子窗口,在每个子窗口里面做最大池化,最后就得到一个HxW大小的池化结果。

2. 从其他预训练网络上迁移过来

  • 将最后一个max pooling替换为RoI pooling(注意适应后接的fc)
  • 将最后一个fc改为sibling layers,也就是一路用于分类,一路用于bbox回归
  • 网络接收两个输入,一个是图片列表,一个是RoI列表

3. fine-tune为检测网络

作者在这里解释了SPPNet在SP之前的层为什么不可以fine-tune的原因:是由于SP本身结构所致。
在SPPNet和R-CNN中,训练时,是用的SGD,一个batch中,输入的ROIs通常是随机crop自不同图像,这就导致,在一个batch中,对每个RoI来自的图像,都要计算一次forward propagation,计算效率很低;而在fast R-CNN中,提出一种分层采样的思想,也就是先从总数据集中抽取N张图片,然后再从每幅图像中各抽取R/N个RoI作为这个batch的训练样本。可以把N取小一点,R取大一点,这样每个batch的运算效率会更高,这能大大缩短运算时间、减少运算消耗。
有一个担心是,每个batch中都是用来自同样几张图像的RoI,会不会导致收敛变慢?作者实验发现并不会。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GN4HyTli-1586676325926)(en-resource://database/1267:1)]

4. 多任务损失

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ov9O3QTG-1586676325928)(en-resource://database/1272:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KsjKJxpg-1586676325929)(en-resource://database/1273:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtIBI9QT-1586676325930)(en-resource://database/1268:1)]
包括分类损失和bbox回归损失两个部分。分类损失是log损失;回归损失采用的是smooth L1
注意λ在背景的时候是0,不是背景的时候是1。

smooth L1的定义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oa07ueXl-1586676325932)(en-resource://database/1269:1)]
这种损失函数与l1相比,在原点处更平滑,无突变,参见这个知乎解释:请问 faster RCNN 和 SSD 中为什么用smooth L1 loss,和L2有什么区别?
这里从L1、L2、smooth L1的梯度出发来讨论,认为L2在初期网络预测值和真实值差异很大时,损失函数梯度也很大,导致训练初期非常不稳定;而L1在差异很大时虽然是1的上限,但是在差异很小时,也就是训练后期,还是保持着较大的梯度(-1),这就导致训练后期loss可能无法很好收敛,而是稳定在某个值;而smooth L1很好的解决了了这个问题,能够规避二者的缺点,因此说它的鲁棒性更好。

相比R-CNN和spp-net,他们用分阶段的方式,但是fast rcnn是直接一步到位的。

5. mini-batch sampling

SGD中,每个batch的128个ROI只来自2张图像,每张图采64个proposal。
这些proposal中,有25%和GroundTruth的IoU>0.5,这些RoI的label是u>=1,也就是前景,是有具体类别的;而剩下的RoI和GT的IoU[0.1, 0.5),标记为背景,u=0;IoU低于0.1的,好像被用在了困难样本挖掘?

6. RoI pooling层的反向传播

一般的maxpooling层:最大位置的神经元偏导数为1,其他为0,因此将梯度反向传播会上一层时,是传到对应原最大像素的位置上,而其他位置为0(保持总梯度值不变,平均池化同理)
RoI pooling:因为RoI区域是高度重叠的,可能很多输出节点反向计算回去是在同一像素位置上,这样就要把所有该位置上的梯度求和
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dGW9uCa-1586676325933)(en-resource://database/1270:1)]
https://blog.csdn.net/xunan003/article/details/86597954

另:CNN中卷积层,池化层的反向传播 https://www.cnblogs.com/WSX1994/p/11230121.html

7. 尺度不变性问题

也就是大小目标具有相近的检测性能,两种方法

  • brute force,也就是固定单一尺度进行训练和测试
  • 和sppnet一样的图像金字塔
    作者实验证明了深度神经网络善于直接学习尺度不变形,对目标的scale不敏感

问题:非极大值抑制,窗口得分是怎么计算的?应该是算的和ground truth的 IoU,或者GIoU

3. 对全连接层进行SVD,提升检测速度

一般的图像分类,卷积层耗时比全连接层多;但是目标检测中,特别是这种region proposal型的,每一个proposal都需要经过一次fc层,如果有2k个proposal就要经过2k次,因此非常耗时。
思路是对全连接层的参数矩阵进行特征值分解,取部分特征值进行代替,减少计算量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0yupjRr-1586676325934)(en-resource://database/1271:1)]

其他解析

  • 为什么用softmax而不是svm?实验发现,前者mAP更高,这是因为其引入了类间竞争,效果更好
  • 作者还实验证明了,更多的proposal或更多的训练数据并不能带来有效的mAP的提升
  • 仍存在的问题:selective search仍然存在,非常耗时

三、 Faster R-CNN

这个系列博文每篇都写的不错,很清晰:
https://blog.csdn.net/WoPawn/article/details/52223282

关于anchor的理解

faster r-cnn中的region proposal network(RPN),作者说其实是相当于将一个small network在深度网络提取出来的**特征图(大小为H×W)**上滑动。。这个小网络将featuremap上的一个nxn窗口作为输入,将其映射成低维特征向量(256d、512d)。这个小网络的组成包括一个nxn的卷积层,和两个孪生的1x1卷积层,分别接bbox regression(4参数)、类别评分(2参数)
作者在RPN所取的滑窗大小3x3,因为是在特征图上进行,特征图是多次采样得来,在原图中的感受野其实很大。
而Anchor,可以做如下理解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pzIVvYz-1586676325936)(en-resource://database/1274:1)]
首先,我们从深层网络获取到了特征图,然后我们用3x3的窗口在上面滑动。窗口中心每次停留在特征图的一个像素上,这个特征图上的像素对应的原image位置就是anchor。而文中提到的边长128、256、512和长宽比1:1、1:2、2:1的9种anchor,是指在原image上的尺寸。
训练RPN的时候,假设每个feature map种的像素可能是由9个anchor区域池化得到的,因此这些区域的位置和坐标都是可以反向计算得到的(这里理解为spp的逆过程),得到proposal的位置和坐标后,一方面和gt类别标签计算前景、背景概率;另一方面和gt的bbox位置比较,得到平移和缩放参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RSUFMAp-1586676325937)(en-resource://database/1275:1)]

  • anchor数目:对于1000x600的图像,如果得到一个60x40的特征图,就有大约20000(~60×40×9)个anchors,忽略超出边界的,剩下6000个,nms去掉重叠的剩2000个用于训练;测试时,选top-300个用于检测

  • 作者认为multibox方法不能保证平移不变性,而这里的anchor是可以保证的,这同时还减小了模型的size

  • 这里只使用了单一尺度的图像、特征图、filter,而采用了anchor金字塔,计算效率更高

使用anchor后,关于bbox的回归所用loss函数也有所不同,分别是计算预测值与anchor的平移缩放量(t_x,t_y,t_w,t_h),GT与anchor的平移缩放量(t*_x,t_y,t*_w,t_h),然后在这两组量之间计算回归loss

  • RPN的训练:
    SGD,image-centric的采样策略,即每个batch只对同一张图像采样(分层采样),每个batch共256个proposal,正负样本1:1

RPN和Fast R-CNN的sharing features

如果单独训练二者,他们对网络的调整是不一样的,因此有必要找一个合适的训练策略:

  • 交替训练alternating training。先训练一个RPN,然后用它训练fast rcnn,然后其结果用来初始化RPN,如此迭代进行。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwiOby8t-1586676325940)(en-resource://database/1276:1)]
  • 近似联合训练:有待理解

仍然存在的问题:实时性有待提高,这在yolo种得到了改进

该系列的一个参考RCNN, Fast-RCNN, Faster-RCNN的一些事

faster r-cnn的训练

这里先讨论,不管用selective research还是rpn方法获得proposal后,怎么对rcnn网络进行训练,也就是对proposal进行修正,分为assign和sample两个步骤:

assign

首先把gt bbox assign给每个候选框,每个框将被赋值为-1, 0 或正值。-1代表忽略, 0是负样本,正数是匹配上的gt的编号。
流程:

  • 每个候选框赋值为-1;
  • 如果某个候选框和所有的gt的IOU都小于neg_threshold, 则赋值为0;
  • 对每个候选框,如果和他最大IOU的gt框大于正阈值,则把这个候选框赋值为这个gt框的编号(1为基准);
  • 上面的步骤是对每个候选框进行判断是否与gt匹配上,但是有的gt可能没有被匹配上,则对所有的gt再判断一次,与之IOU最大的候选框也赋值为正,即成为匹配上的候选框(可能有多个)
    This method assign a gt bbox to every bbox (proposal/anchor), each bbox will be assigned with -1, 0, or a positive number. -1 means don’t care,
    0 means negative sample, positive number is the index (1-based) of assigned gt. The assignment is done in following steps, the order matters.
  1. assign every bbox to -1
  2. assign proposals whose iou with all gts < neg_iou_thr to 0
  3. for each bbox, if the iou with its nearest gt >= pos_iou_thr, assign it to that bbox
  4. for each gt bbox, assign its nearest proposals (may be more than one) to itself

sample

匹配完事了就开始采样,因为一般情况下负样本比正样本多得多,所以为了避免一个batch 里面绝大多数都是负样本,会设置一个正样本的比例,尽可能采样正样本,先满足正样本的需求。

faster RCNN缺点

对于Faster RCNN来讲,与RCNN和Fast RCNN最大的区别就是,目标检测所需要的四个步骤,即候选区域生成,特征提取,分类器分类,回归器回归,这四步全都交给深度神经网络来做,并且全部运行在 GPU上,这大大提高了操作的效率。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDS1OQHa-1586676325943)(en-resource://database/1281:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjBoHyvC-1586676325943)(en-resource://database/1282:1)]

关于RPN和anchor的另外几点理解

如果没有用到FPN,一般输入到RPN的featuremap都很小了,相当于整个特征图上每个像素点,都产生9个anchor,也就是都会产生cls(2x9)+reg(4x9)个输出,所有像素产生的proposal加在一起为这个RPN阶段产生的所有proposal,然后经过上面的assign和sample送入到主干网络中。

另外,个人理解,训练时为了提高效率应该是需要对rpn的proposal进行nms和sample的,然后取top300这样,但是测试时,应该取更多,也就是放松proposal的限制,这样有利于更多目标的检出。(又是recall和precision的balance问题)

四、FPN

论文:feature pyramid networks for object detection 2017
博文:https://blog.csdn.net/u014380165/article/details/72890275
作者提出的多尺度的object detection算法:FPN(feature pyramid networks)。原来多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。

1. 金字塔结构

下图FIg1展示了4种利用特征的形式:
(a)图像金字塔,即将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征。这种方法的缺点在于增加了时间成本。有些算法会在测试时候采用图像金字塔。
(b)像SPP net,Fast RCNN,Faster RCNN是采用这种方式,即仅采用网络最后一层的特征。
(c)像SSD(Single Shot Detector)采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。
(d)本文作者是采用这种方式,顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmVII4Nk-1586676325945)(en-resource://database/1278:1)]

2.FPN

作者的主网络采用ResNet。
作者的算法大致结构如下:一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-76NHJwkm-1586676325946)(en-resource://database/1279:1)]

自底向上其实就是网络的前向过程。在前向过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。
自顶向下的过程采用上采样(upsampling)进行,而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。并假设生成的feature map结果是P2,P3,P4,P5,和原来自底向上的卷积结果C2,C3,C4,C5一一对应。

3. FPN结合RPN

作者一方面将FPN放在RPN网络中用于生成proposal,原来的RPN网络是以主网络的某个卷积层输出的feature map作为输入,简单讲就是只用这一个尺度的feature map。但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入。在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为322,642,1282,2562,512^2,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。

4. FPN结合faster RCNN

如上图所示,FPN能够很好地处理小目标的主要原因是:

  • FPN可以利用经过top-down模型后的那些上下文信息(高层语义信息);
  • 对于小目标而言,FPN增加了特征映射的分辨率(即在更大的feature map上面进行操作,这样可以获得更多关于小目标的有用信息),如图中所示;

tf源码解析:
https://zhuanlan.zhihu.com/p/35854548

Faster R-CNN+FPN细节图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XqquPItl-1586676325948)(en-resource://database/1280:1)]

你可能感兴趣的:(目标检测)