Single Shot Detection 的前世今生

版权声明:本文系原创,转发请注明出处,商业用途联系作者 https://blog.csdn.net/m0_38024332


最近独自编写Fast-RCNN的代码,最后卡在如何把run出来的proposal以tensor形式返回给模型,上网我发现仍然有人还是把映射完的proposal保存再训练,心里感到好!难!过!这不是我想要的目标检测!

然而一篇YOLO简直亮瞎我的眼,今天就来讲讲我内心里的Subject Detection。

这里罗列出我看的论文和一些感悟当作这暑假来的汇报吧。( 题目有点大可是题目亮才能吸引读者呀!:)

  1. OVERFEAT
  2. YOLO
  3. YOLOV2
  4. YOLOV3
  5. SSD
  6. Multibox(这篇被SSD多次引用,但是我没有看过)

OK!进入正文!


首先说说我

  读了上述几篇文章,其实一直有一个信念,在我心里是认为可以直接冲击整个Detection的。为什么SS(Single Shot)能成功?在上述几篇论文中似乎还没有提到过这点,我也是有了这个想法然后看到SS网络的实现所以万分激动:

所以,为什么SS网络会成功?

因为CNN自己其实学会了位置检测啊!我们假设CNN每一层都作为特征的提取层,那么顶层只是比底层所载有的信息更加抽象而已,可是在位置上来说,右下角的信息即使在顶层的2*2map中仍然是在右下角。根据此点,与其说CNN学会了位置检测,更可以说CNN本身就具有位置的概念,我们所做的只要把它提取出来就好了。

这么想着,看到SS网络的大肆道行真的想早生几年,嘿嘿。

以上都是我对SS怀着巨大信心的原因,下面我将讲述论文里提出的结构。某些网络可以在各种源头找到系统的阐述我就跳过不讲,大家可以搜索相应的网络名称就有巨大的内容,有时候多看看重复的内容未必是坏事,可能今天就比明天更看的更深透了,我这里指出几个我自己遇到的问题或者想法供各位一起讨论。

正正正文真的要开始了

1.overfeat

1.1 feature extractor

这篇我认为是SS网络的开山之作了,鉴于年代的久远,没有R-CNN网络的比较,他没有明确提出single-shot的具体概念,但令作者骄傲的是利用一个网络就实现了 Recognition、Localization、Detection的任务。当然从现在角度在看这篇论文,会突然发现更多有意思的东西。

3.2 Feature Extractor
Along with this paper, we release a feature extractor named “OverFeat” 1 in order to provide powerful features for computer vision research.

上述描述了本论文取名‘OverFeat’的原因,是因为作者将特征提取器命名为此。这里也就是应该就是我们经常看到的一种说法:前五层的CONV层起到了提取特征的作用。这就是来源啦!

3.5 ConvNets and Sliding Window Efficiency
In contrast to many sliding-window approaches that compute an entire pipeline for each window of
the input one at a time, ConvNets are inherently efficient when applied in a sliding fashion because
they naturally share computations common to overlapping regions

以上,作者还阐述了卷积网络的滑动窗口的优越性,当时相比各种特征提取方法林立-->每个窗口只计算一次的流程<--,卷积神经网络采用滑窗以及共享参数的思想使得卷积神经网络在检测江湖中名声越来越大,导致我现在也找不到像论文里说的不采用滑窗机制的方法。

-> _->(可能是我太懒了)

1.2  多尺寸输入与offset pooling 

1.2.1 多尺寸输入

overfeat在处理多角度问题时,不仅采用卷基层替代全连接层,多尺寸输入以实现预测 ----> 有没有很眼熟!在faster-rcnn中出现anchor,采取了三种方框面积,三种长宽比,并且在论文提出这是SPP-net的逆思维,不同大小认为了这是从不同输入尺寸所获得的定位框,而在overfeat中则直接采用了多输入。两者对比,faster-rcnn显然加快了运算过程,但是个人认为faster-rcnn人工选择的anchor大小又不如overfeat这种直接暴力输入,所以之后!YOLOv2的anchor操作!辛苦往下拉,就在下面

1.2.2 offset pooling 

上个论文的图

Single Shot Detection 的前世今生_第1张图片

这里不再过多描述offset的整体流程,论文是以一维解释延伸到二维,以上述流程作用于最后的conv5层,得到9倍于采用max pooling的feature map以此完成了一个目的:

讲真,我没想明白,只能试图翻译论文原文给诸君借鉴。

论文中提出,如果考虑了Alexnet的网络结构,那么在pool5得到的特征图每个像素点跨越了32个像素(所有stride的乘积),那么这样的结果导致了粗粒度、过范围的表示是难以对准实例的。提出这样的观点是由于作者认为,越好的对准实例,那么就网络响应的置信度也就越高。

上述所述,令人费解的是为什么类似感受野过大反而对准实例更不好?个人觉得是作者认为一个顶层的像素包含信息太多,那么除了实例的信息以外,同时包含着其他相当于噪声的信息。于是作者引用了offset pooling。

更更更更让人费解的东西来了 -_=

观察 offset pooling的整体流程,你会发现这样采样不就是多点信息(九倍信息)么,可是像素确实被pool掉了呀。(难道我对pool理解有错误?)但是作者就说了,这样子!很好!stride的计算就少了三倍,变成了12倍!

所以。。。。就完成了信息增多还没有增多跨度,完成了作者提出的问题。

作者解释说,offset pooling 可以被认为是采用了skip-kernel放弃了subsampling,将分类器的窗口以每次一个像素的步长移动观察输入或者又可以等价地认为,对最后一层的卷积层(即conv5)添加全连接形式应用于每一个可能的偏移量,最终再以集成交叉的方式得到输出。(这句话我是直译了,实在是没明白其意思),原文如下:

These operations can be viewed as shifting the classifier’s viewing window by 1 pixel through pooling layers without subsampling and using skip-kernels in the following layer (where values in the neighborhood are non-adjacent). Or equivalently, as applying the final pooling layer and fullyconnected stack at every possible offset, and assembling the results by interleaving the outputs.

1.3 Combining Predictions

这里引用他人的解释[https://blog.csdn.net/whiteinblue/article/details/43374195]

a)在6个缩放比例上运行分类网络,在每个比例上选取top-k个类别,就是给每个图片进行类别标定Cs

b)在每个比例上运行预测boundingbox网络,产生每个类别对应的bounding box集合Bs

c)各个比例的Bs到放到一个大集合B

d)融合bounding box。具体过程应该是选取两个bounding box b1,b2;计算b1和b2的匹配分式,如果匹配分数大于一个阈值,就结束,如果小于阈值就在B中删除b1,b2,然后把b1和b2的融合放入B中,在进行循环计算。

说明这个是因为作者认为此种方法比传统的NMS要好的多,但是在后期的ss中,如YOLO是将整个模型看成了回归问题,不再如这里所示,以种类为限制而进行预测。直接接受NMS的思想进行比较。提出此点也是算localization的分支吧。

1.4 conculusion

1.overfeat对于卷积层特征提取的概念是十分重要的。我只能说十分重要,因为这个概念在我脑子里已经好久了,如果失去这个概念我也不知道对于CNN网络又是怎么样的一个看法。

2.正篇论文可见,overfeat直接采用了提取到的特征像素点进行了多层预测,与后来的ss网络不同在于其对于定位框没有进行人工先验的干预,同时在定位上没有如YOLO一般坚定地把定位作为回归问题来解决。

3.overfeat在回归中对于每一类训练了一个回归器,在论文中提出采用一个回归器与采用1000个回归器(Imagenet数据)相比较,准确率未有明显差异,作者认为了这是数量过多导致影响训练的困难所致,而在YOLO系列以及SSD中则都是采用相同的参数进行回归。

4.overfeat在回归距离计算上,文中才用L2loss,而后来人则才用smooth l1 loss。

5.overfeat的多尺寸被anchor思想所代替。

综上便是我对overfeat的心得,你可以看出他利用特征提取的概念实现了多任务同一模型的理念,但是某一些概念又被后人所改进,某些方法也被弃用了吧。所以历史真的很有意思。

 

2.YOLOv1~YOLOv3

YOLO的作者很有意思大家可以去pjreddie的官网的官网看看。

而且YOLO对于看一眼检测网络做出了巨大贡献,对于基于proposal的RCNN网络产生了很大冲击,在保持目标检测率的同时在速度上得到了巨大提升(这才是我心中真正的目标检测)

网上已经有许多关于YOLO的介绍我这里不系统地阐述整个YOLO模型。

2.1 关于中心落在cell就认为其负责判断的说法。

If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object.

这句话出自YOLOv1的论文,讲述了当物体中心落到CELL时,那么这个CELL负责检测目标。这句话困扰了我许久,如何去判断一个物体的中心是否落在某个CELL中?其实不然,实际上每个CELL将预测一个CLASS概率以及两个方框的(4个坐标信息+1个confidence)而在完成预测后,将利用GT信息计算IOU,当IOU大于阈值时则说明了CELL包含物体即这个CELL负责了预测物体。这里再引用loss函数加以说明:

Single Shot Detection 的前世今生_第2张图片

where 1 obj i denotes if object appears in cell i and 1 obj ij denotes that the jth bounding box predictor in cell i is “responsible” for that prediction.

很明显了吧!其实不用去判断物体中心是否落在CELL中,利用CELL本身的预测结果与GT的对比即可以判断中心是否落在CELL中。

2.2 YOLO一张图片检测目标的限制?

我认为YOLOv1的对于一张图片实例的预测数目是受限的,YOLOv1的最后大小为7*7那么一张图片最多应只检测出98个目标(考虑多标签)。这里在引用YOLOv3的内容:

Each box predicts the classes the bounding box may contain using multilabel classification. We do not use a softmax as we have found it is unnecessary for good performance, instead we simply use independent logistic classifiers

但是在YOLOv2~YOLOv3中,引入anchor的思想,赋予CELL更多的空间去预测,同时在YOLOv3中说明了在面对multilabel classification的问题中使用logistic分类代替softmax,想必是在之前就已经考虑了此类问题。

2.3 YOLOv2中关于anchor与聚类

anchor的思想源于Faster-RCNN,其做法的主要原因是源于多尺度输入单尺度输出的逆思维,即以固定的不同大小不同长宽比做法实现了多角度的观察。作者则在原文里引用anchor思想的同时对anchor进行了K-means聚类算法,原因在于作者认为适合的人工先验给定的框框自然有助于目标识别,但是 基于经验不 良 好 ,于是利用聚类算法使计算机自行提取了9种anchor(即每一个cell有了九种anchor)。这就是使用聚类算法的主要原因。

当然了,不管是在Faster-RCNN还是各种引用了anchor的检测算法中,不一定非得是九个,自己想用多少就用,但是前人之所以给定了面积以及长宽比必定是同时考虑了准确率以及运算成本的。

3.SSD(Single Shot MultiBox Detector)

写在前面:

我不得不承认,这么几篇论文读下来,读的我是有点眼花了,所以才有写下来与诸君分享的冲动。可是我必须承认我的想法是都有存在的漏洞的,很明显到就是对于SS网络我没有进行一个代码化,对于其中的细节我是无法仔细阐述的,尤其是到了SSD中,我总觉得某些东西是我论文里所没有看到的,所以把这段话留在了这里。

3.1 Default Box

3.1.1 固定的Default

当我读完SSD的论文,我对于人工预选的定位框更加多想了几分。而这一切又是从我翻到论文最后的Related Work[sec.4]才突然感觉到迎头一棒。

Our SSD method falls in this category because we do not have the proposal step but use the default boxes.
 

 哎?SSD和YOLO原来这么不一样?

首先要明白,SSD是在YOLOv1之后文章,上述文段说明了SSD网络在选框阶段是利用了固定的框,而在论文中其加以说明,并利用公式变换搞定了感受野不一致的问题,并提供了不同宽高比以及面积共六种的形式。

我想明白的是,突然确定了anchor还是Default Box一个很重要的概念。

固定!固定!固定!

3.1.2 固定的含义

而固定有什么好处?人工先验的提供物体可能存在的比例啊!这对毫无先验知识预测定位框的网络可能是及其重要的!

而SSD则是对其进行更加的发扬光大,不再局限于某一个维度特征,而是对于多特征图进行可能存在的预测。

用论文的话说,根据语义分割提供的浅层卷积层可以提供更多的细粒度信息,由此使用此等方法。

用我的话说,顶层的感受野太大容易包含过多信息,而底层较小的感受野就可以给与更多的细节了。

3.1.3 后话

当然在SSD信誓旦旦说自己绝不是YOLOv1时,也没有想到后来的YOLO放弃了直接预测方框的思想,而也是借鉴了anchor的思想,采用了多尺度的定位框进行定位。不过YOLO不说借鉴Default Box的思想,恶意地揣测,可能SSD与YOLO确实某种程度的较劲吧,权当野史带过。

3.2 结尾

对于SSD,虽然对此大家推崇过多,可是对于我来说又觉得不如之前看到YOLOv1一般如此经验,可能是潜意识有了CNN学习到位置的潜力,当SSD提出多feature_map提取信息时反而觉得是顺理成章的事。(CNN学习到位置的潜力是我个人的一个认识,可能概念是错误的,诸君借鉴就好。)

但SSD确实做出了卓越的贡献,在这里罗列出他的强大之处以及注意的点:

  1. 采用了更多的scales 与 aspect ratio。
  2. 提取了多特征图信息以实现细粒度的信息提取。
  3. 对于感受野不同,对于不同的特征图选用相同大小的定位框显然是不合理的,于是采用了如下的变换公式:

    Single Shot Detection 的前世今生_第3张图片

    smax为scale最大值(文中0.9),smin为sclae最小值(文中0.2)
  4. SSD对于选定要提取的特征图是对于其每一个像素都进行检测,所以一张MXN的特征途,输出将为MXNXChannles。
  5. 文中提到了Jaccard Overlap个人查到其实就是IOU...

上述就是三类网络本人共读4篇文章,结合着有道词典和各大论坛的创作将就着所感受出来的。受自身能力的问题,英语阅读在论文里确实不够啊,有时候感觉有道翻译的都比自己想的好多了。
自然所有论文不是每个节都看完了,大有囫囵吞枣之势,接下来要做的就是实现论文,再在其中钻研琢磨吧。

好。就是这样,各位江湖再见!

 

你可能感兴趣的:(Single Shot Detection 的前世今生)