从17年开始接触object detection,到现在也差不多两年,算是做一个总结吧,纯属个人观点. 先Overview一下我认为较为重要的论文及其所代表的思想.然后大致按时间脉络理一下不同时期的思想与理解,这个日后可能再加了.最后稍微讨论一下一些细节性问题.
Overview
一张图按时间顺序梳理一下如下:
红线连接的一行算是一个思路. 虽然还有很多论文,但是于我自己看来比较有代表性的如上了(其中的IOU-Net和Scoring(Mask Scoring RCNN)只是我自己在地平线实习的时候做过一些工作,理解稍微深一点,所以加上去了).
在我看来对general object detection这阶段最为核心的问题,说是miss-alignment也好,scale与part formable也好,空间信息敏感的feature map也好,在RepPoint得到了较为完满的回答.剩下的例如un-balance,更好的rpn阶段,更细分的诸如遮挡,密集,few short,部分与整体,assign等问题,跟下游任务发展如3D,视频(防抖,利用时间信息),分割等, 是下一个阶段或者另外的领域要解决的了,也不是deep-based general object detection的核心范畴了.
当我17年听到检测的乐章而开始循声而往,殊不知舞池中央已经按下了终章的旋律。时至19年,于我也算终听完了这最后一曲。于这一时段的一街霓虹,惊叹与享受思维的花火之时,也不免高山仰止唯心向往之情了。
序章-框架建设
RCNN可以说是deep-based的开山之作了.从RCNN到Faster RCNN, 检测的整个框架建设就已经算是完成了.单论较为重要的理解与相关的问题而言.
- 对于feature map的理解.从RCNN单纯的将CNN看做一个简单的分类器.到Faster的feature map.具有空间结构的feature本身是与图片有着对应关系的. 从ROI pooling的单纯看做bin,到align做插值(实际看做连续的).而这种简单的将feature尺寸大小直接映射回图片本身引发的问题,ROI align实质上是某种sample feature策略的conv.在此不赘述,见RepPoints与ROIconv.
- anchor的分治.利用分类将回归问题简化:不同bbox的大小与ratio在当时不够强大的backbone条件下是难以直接回归的.并且handle当时feature map resolution的局限性(如一个feature bin里可能含有多个目标).
- ROI Pooling. 基于feature map的理解,ROI pooling实际上使得feature具有了空间位置敏感性.而这之后直接将feature整个连接到FC网络来做.首先FC网络较heavy便催生了诸如R-FCN与Light-head等文章.另外实质上它再次失去了空间信息(自身的相对位置关系).同时对分类与定位(精修)问题而言,一个是空间信息不敏感的,一个是敏感的,二者实质上是相互矛盾而会影响优化过程的,On awakening the classification power of faster rcnn 和 COCO18年的冠军有部分便是在讨论这个事情.
- Faster R-CNN整个框架的设计.如若想深入了解这个领域,代码是肯定要通读的了.其中诸多细节的设计与背后的考量都隐含着对于该框架在当时整个深度学习领域发展落后的妥协与对检测任务的理解.在17年后诸多论文便是在深挖其中某个细节,如Refine, NMS,sampling/assign Strategy等.好的便是Oral,一般的有丁点效果的便是poster了.
之后的R-FCN强化了关于空间敏感性的feature map的重要性.而Mask R-CNN便是与instance segmentation结合验证了相关多任务相互促进作用,在此引发的一些思考与问题暂且不表了. 至此,2-stage的目标检测的整个大框架便是搭建完成.而该领域内的核心问题也浮出水面了.之后的工作基本是逃不开这个框架了.
该部分参考:
RCNN:Rich feature hierarchies for accurate object detection and semantic segmentationTech report (v5)
Fast R-CNN:
Faster R-CNN:
R-FCN:
Mask R-CNN:
On awakening the classification power of faster rcnn :Revisiting RCNN: On Awakening the Classification Power of Faster RCNN
老调新唱-Scale
Scale,大中小的目标一直便是图片识别任务很trick的问题了.而一直以来传统的主要方法便是图像金字塔了.
SPP与FPN便是构建了对应的特征图金字塔.搭配上与尺度相匹配的预设anchor.可以认为让图片中不同尺寸的目标在检测时,通过取不同尺度feature map上的特征,使得对应的feature bin大小都是一样大的.
对这样的feature 金字塔而言,feature缩放的过程必是不尽如人意的.诸多魔改的融合,扩展策略由此而生.同时既然对于一个物体只有某个尺寸上的feature是有效的,kernel看见了太多其它的物体反而是某种噪声了.直接让网络看到的所有目标都是一个尺寸的便是SNIP与SNIPER所做的了.可以看做传统图像金字塔与网络的良好结合了.同时显示出RCNN较之Faster RCNN在提取一致的特征更加有效.
而Trident基于一个我想很多人都观察或者想到过的问题:感受野与目标尺寸的匹配:大目标感受野要大,小目标感受野要小.(实质上网络的感受野是呈根号增长的,见Understanding the effective receptive field in deep convolutional neural networks).之前的FPN也可以看做是在做同样的工作,但是其过程较为复杂.直接上大kernel对大目标,小kernel对小目标效果并不好(自己在简化FPN工作的时候做过). 而Trident将大kernel看做小kernel+dilation从而使得不同尺度特征kernel共享权重,而不是强行在FPN中memory一个特征的各个尺度.Naiyan大神的诸多文章与工作,沿着alignment这一线还有如ROIConv等文章都是很惊艳了.
该部分参考:
SPPNet: https://arxiv.org/abs/1406.4729
FPN https://arxiv.org/abs/1612.03144
SNIP https://arxiv.org/abs/1711.08189
SNIPER https://arxiv.org/abs/1805.09300
Trident https://arxiv.org/abs/1901.01892
Understanding the effective receptive field in deep convolutional neural networks: https://arxiv.org/abs/1701.04128
百川赴海-One Stage
在two-stage中的RPN阶段的整个框架加上分类分支便形成了one-stage的雏形: 直接在feature map上利用conv预测每一个bin中的目标.YOLOv1便是这样的框架了. 而后来的v2,v3便是吸纳了更好的backbone,全卷积,FPN等的思想了.
而没有多一个阶段来滤掉一些显著的噪声而要让一个简单的conv来判断有没有目标,这个更复杂的任务催生了Retina Net的Focal loss. 文章的insight与formulation都很好,但是用的话还是得视情况而定了.Focal loss本身带来的涨点并不算特别显著. 但就前景/背景不均衡而言问题并不算完满的解决了.
而没有ROI pooling来将每一个目标normalize成大小一致的feature再精修的过程,定位的准确性是要大打折扣的.而既然ROI pooling之后本身连得就是FC层,看做conv也没什么不好.如果没有anchor使得一个bin对应了多个Object那么直接每个bin预测的bbox ROI pooling之后flatten成一维特征再用conv来预测精修,这样所谓的One-stage与two-stage便是一个东西了:先提proposal然后精修. 如果我理解的不错Align Det便是这样的工作,不过将其与conv的im2col联系起来(我是在前段时间在看了Deformable的Cuda源代码之后才隐隐有这样的感觉)并将该idea能把故事讲清楚并高效做出来着实是很厉害了.
至此,所谓one-stage与two-stage算是殊途同归了.
SSD一线的工作我没有过多关注,但是应该没有其它新的思想在里面了.
Cornet与CenterNet(这里指object as points)这一线的anchor free的工作.Cornet我之前写过,便不赘述了,虽然这类思想运用在检测上早已有之,但是做的简洁有效的便是CornerNet了.而CenterNet算是得益于了backbone的发展与人们对检测任务的认识了.整个代码框架是极为漂亮与易用,其中包含诸多trick(augmentation,backbone design等),算是集大成者了.
DenseBox 这篇在16年便已发表的文章可以说蕴含着诸多极为超前的思想与考量.即使现在读起来也仍有许多有意思的细节.从中你可以看见Retina Net,SNIP(SNIPER),CenterNet…的影子,这里就不赘述了.如果说检测领域一定要精读的三篇文章的话,我可能会选FPN,DenseBox和接下来的RepPoints了.
YOLOv1: https://arxiv.org/abs/1506.02640
DenseBox https://arxiv.org/abs/1509.04874
SSD https://arxiv.org/abs/1512.02325
YOLOv2: https://arxiv.org/abs/1612.08242
Retina Net: https://arxiv.org/abs/1708.02002
YOLOv3 https://arxiv.org/abs/1804.02767
CornerNet https://arxiv.org/abs/1808.01244
CenterNet https://arxiv.org/abs/1904.07850
Align Det https://arxiv.org/abs/1908.01570
绝唱-Deformable
促使我写下总结的便是看见这一线的工作以RepPoints的成文为标志算是画上了现阶段的句号.这时我才发现,终章的音节在Deformable便按响了.
大致来说,Deformable将在feature map上的conv不再单纯看做grid而是不同location sample的结果. 那么较之直接认为feature map与原图在空间尺度上一一对应(ROI Align与ROI Conv的思想),让网络学习提取有效部分(实际上也进行了自适应的缩放),此时feature map不再在空间尺度上一一对应而是更加强调于较为抽象的语义信息(比如是否有目标).
Deformable可以说基本已经指明了这条线上要做的所有事情. V2的主要工作在于有效的可视化与探索如何结合更多的deformable了. 新提出的加了一个类似attention map的Deformable感觉着是效果不大. 感觉与直接预测一个等大的attention map然后相乘是一样的,而这个在之前attention火的时候就很多人做了,效果并不是很好.
RepPoints在我看来思想还是很简单的: 首先是Deformable ROI Pooling本身并没有取得应有的效果,在我看来它应该是带来很大涨点的一个部分,因为这里是很显示的嵌入deformable思想的一个block. 问题的话大致是在这种没有显示监督的学习offset对于精修定位而言还是太过粗糙了,而且其实本身还是用到了ROI align相当于多了一次精修的过程. 而既然你都预测了location然后抠图再回归,完全可以把预测的location就当做最终的bbox然后直接让gt bbox来监督它的学习了. RepPoints大体的思想就是这样.
当然之后的比如出的这些location是不是不单单出bbox,7x7的offset里面更多的点可以加更精细的监督使得直接能出轮廓,接着一步完成Instance segmentation呢? 便不再赘述. 在我看来,可以说RepPoints将deformable的思想在目前的检测阶段做到令人满意了. 除开对deformable一线工作的延伸,其本身也是anchor free, 基本融合了one/two stage,对各种变体与assign策略的研究等等都是极为出色的了。之前的v2的可视化也很不错。bolei zhou从CAM开始做的一线可视化工作推荐大家可以读一读,对理解cnn帮助还是挺大的。
Deformable https://arxiv.org/abs/1703.06211
Deformable v2 https://arxiv.org/abs/1811.11168
RepPoints https://arxiv.org/abs/1904.11490
余音-其它思想
Cascade 为界限可以看做是检测基本进入在原有framework上找一些小问题然后用精致的设计来解决的阶段了.或者是把之前的思路更加精细化,或者是将以往局限于算力的妥协解决.
Scoring Mask R-CNN是我自己在地平线实习的时候做过一些类似的工作,理解稍微深一点. 当时想的是尽可能将检测(回归)问题与分类问题分离开来. 现在的算力与优化技术是有能力在整个框架中替换更多分类的妥协设计到真正的回归问题的.
Relation Net 代表了当时随着attention is all you need一文带来的attention风潮了. 当时出了很多相关的文章,自己也稍微调了几篇细读了一下.回过头来看,一些文章所持的比如: 小目标检测需要引入周围的context, 物体之间的分类与定位是可以利用之间的联系,比如电脑旁的鼠标, 这些观点感觉都是为了讲故事造出来的了. 我自己一直觉得的话,检测器要足够robust,比如不出现elephant in the room 类似的情况,应该减少对这类context与relation的依赖,而让它花更多精力在前景之上了.
Non-local 虽然可以看做attention一类,也与deformable有着相似的结构.其在单帧检测领域的效果远没有在视频领域内好了.希望这一线工作可以早日完满而不再用什么光流,c3d了.
Cascade https://arxiv.org/abs/1712.00726
IOU-Net https://arxiv.org/abs/1807.11590
Scoring Mask R-CNN https://arxiv.org/abs/1903.00241
Relation Net https://arxiv.org/abs/1711.11575
Non-local https://arxiv.org/abs/1711.07971