目标检测中的分类和定位冲突问题
点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
作者:steven Li | 来源:知乎
https://zhuanlan.zhihu.com/p/150339896
本文仅做学术分享,如有侵权,请联系删除。
Object detection就是在回答where和what问题,对应的是定位和分类两个任务。拿大家耳熟能详的Faster RCNN为例,在RoI Pooling之后,通过两个shared fc layers得到1024-dim的feature vector,再送入两个sibling head,一个用于分类,另一个用于定位。
Faster RCNN结构
其实,分类和定位这两个task,对feature有着不同的要求,存在一定的冲突。这个特征冲突问题,有大佬在《目标检测中的特征冲突与不对齐问题》中已经很好地分析了。我再结合CVPR20的几篇工作,简述一下。
一. 特征冲突问题
在Faster RCNN中,可以从三个角度来分析分类和定位任务之间的冲突问题。
1.1 分类和定位对特征的要求
分类要求特征具有平移和尺度不变性(invariance),不管object在图片中是什么位置,是什么类别就是什么类别,学到的feature,不会因为尺度、旋转和位置等变换发生改变。而定位是一个position-sensitive的任务,object所在的位置不同,尺度不同,学到的feature肯定是不一样的。举一个例子,下图是RPN产生的两个Proposals,对于分类任务,它们都应该分类成person,应该产生相同的分类特征 ;但是对于定位任务,它们应该预测出不同的offset,所以应该有不同的定位特征
。
RPN产生的proposals
从这个角度考虑,送入两个sibling head的1024-dim feature vector,最好是不共享的。
1.2 分类和定位的sensitive map不同
根据文章TSD[1]的motivation,分类的sensitive区域是物体的salient areas,也就是最具有判别性的地方;而定位任务的sensitive区域是在物体的边缘区域。简而言之,这两个task响应的区域是不同的。
TSD的motivation
1.3 fc层不适合做localization
根据文章Double-Head[2]的分析,fc层具有spatially sensitive的特性,因为fc层对不同的输入元素,会连有不同的参数,所以更适合于,从part feature来分类出整个object。而conv层具有参数共享的特性,对输入的所有元素,用相同的conv kernel去卷积,这样卷积得到的feature,有更强的spatial correlation,更容易区分出哪些是pixel是object,哪些pixel是background.
二. 已有工作
下面简述一下CVPR20的三篇文章,都是在Faster RCNN的基础上,将分类和定位这两个任务解耦,但是具体解耦的方法又各有千秋。
2.1 Double-Head
印象里,这个工作在arxiv上挂了一些时日了。在这个工作中,给了很多insight,分析出了fc层比较spatially sensitive,更适合做分类;而conv层有更强的spatial correlation,更适合做定位,所以在RoI Pooling之后,没有再用shared fc layers,而是直接分出了两个分支,一个分支是接了2个fc层,用于分类;另一个是接了5个residual block,用于定位,结构图如下。这种用fc做分类,conv做定位的操作,在Grid RCNN中也被用到。
文章中,作者对两个task是否共享参数,以及每个task是使用fc还是conv,基本都做了一遍实验,结果见下表。此外,文章还尝试了unfocused task,也会带来一些性能提升,具体见文章。
2.2 Task-aware Spatial Disentanglement
商汤的Task-aware spatial disentanglement (TSD),分析了分类和定位这两个task对特征空间的敏感区域是不同的。分类对salient areas比较敏感,而定位对物体边缘比较敏感,所以这两个task需要解耦。解耦的方法和Double-Head不一样,在RoI Pooling之前就把两个分支解耦开了,每一个分支有各自的RoI Pooling。根据任务驱动的方式,两个分支对proposal进行了不同的特征变换,从而得到task-aware features,再分别送入分类和定位分支。对分类任务,使用Deformable RoI Pooling,对每一个grid都学了一个offset,是point-wise的变换,最终得到proposal的discriminative features,更适合于分类;而对于定位任务,采用了proposal-wise变换,从proposal的feature中,学到整个proposal的offset,从而修正proposal的位置,使得proposal覆盖的区域是更适合定位的,如覆盖更多的物体边缘区域。根据分类和定位这两个task的具体需要,对proposal进行了相应的特征变换,从而使得输入每个task的特征都是最优的。
2.3 D2Det
D2Det[3]受到Grid RCNN的启发,将分类和定位解耦,用全连接做分类,用全卷积结构来做定位,也是在RoI Pooling之前就将两个task解耦。文章发现Grid RCNN做定位的时候,只能在proposal内检测关键点,对于large scale object,有时候proposal不能覆盖住整个物体,所以这种在proposal内检测关键点的方法,会受到proposal region的约束,不是很有效。基于这个发现,作者提出了dense local regression,对proposal内的每个feature point,都回归一个box,是一种dense prediction;然后对所有回归出来的box取平均,得到最终的box结果。这种回归坐标的方式,和检测关键点相比,就不会受到proposal region的约束,回归的坐标可以在proposal外面,所以比Grid RCNN的检测关键点的方式有效。对于分类这个分支,也是通过Deformable RoI Pooling的方式,找到更加discriminative的features来进行分类。
上面三个工作都是在two-stage detector上做的,从RPN得到proposal之后,根据分类和定位两个任务的具体需求,对proposal做了相应的变换。在one-stage detector上,应该也同样存在两个task冲突的问题,目前我还没看到相关工作,欢迎补充。
参考
^https://arxiv.org/abs/2003.07540
^https://arxiv.org/abs/1904.06493
^http://openaccess.thecvf.com/content_CVPR_2020/html/Cao_D2Det_Towards_High_Quality_Object_Detection_and_Instance_Segmentation_CVPR_2020_paper.html