LargeFishPKU / paper_records

to record detect related papers
4 stars 0 forks source link

paper_records_11-20 #2

Open LargeFishPKU opened 5 years ago

LargeFishPKU commented 5 years ago

11.Feature Selective Anchor-Free Module for Single-Shot Object Detection

本片文章是围绕着Single-Shot Object Detection设计优化的anchor开展工作的。开篇一张图: image 从图片的对比中可以看到,先不论方法是具体是怎么样的,提升的部分估计是归功于小物体的检测,明显右图相比左图,小物体的检测更加的优秀。其实文章中确实对小物体检测做了优化。
当前对于检测器的anchor来说,存在着几个问题:1)密集采样 2)启发式选择。当前的有anchor的算法都是采用了特征金字塔的思想,说白了,就是将一张图中的所有物体全部离散化到不同特征金字塔上的anchor中,这些anchor的尺寸和长宽比都是人为定义好的。浅层的特征对于小的物体,深层的特征对于大的物体,这也是人为设定的,导致了一个物体对应的feature map的level只是依赖于人为的先验如下图Figure2,同样是车,有可能6060和5050分到不同的level,而4040和5050分到同一个level。显然不是很合理,效果也不是最优的。那么基于这个思想通过IoU得到的GT框显然也不是最优的。有可能一个anchor对应到n层的feature map才是最合适的,但是现在人为导致了分到了n+l层的feature map。这本来就是sub-optimal,那么之后的回归和分类再优秀,得到的结果也就不是最优的了。 image 既然anchor的先验知识存在这么多问题,那可以不使用anchor吗(不得不说作者的脑洞是挺大的)?作者提出了一个FSAF的模块,让每个物体自由选择最合适的feature level而且不受anchor boxes对于feature map选择的限制。FSAF的大体结构如下图Figure3: image

Feature Selective Anchor-Free Module

由上图可看到,有一个独立于anchor-based的anchor-free的分支连到了特征金字塔的每个level上,同样一个anchor-free的分支也包含两个部分:分类和回归。一个物体可以被分到任意level的anchor-free的分支上,在训练中,不仅仅基于物体的大小还会考虑物体的内容动态的选择最合适level的feature来预测这个物体; 接下来主要说明几个问题:
1)在网络中怎么设计anchor-free分支
2)怎么为anchor-free分支生成监督信号
3)怎么动态的为每个物体选择feature map的level
4)怎么联合的训练和测试anchor-free分支和anchor-based 分支

  1. 在网络中怎么设计anchor-free分支
    以FSAF和RetinaNet结合为例如图Figure4:
    image 可以看到在RetinaNet两个分支的头部分别各自增加了一个分支,在上面的分类分支上增加了一个3x3的卷积层,共有K个滤波器,所以生成了一个WxHxK的feature map,后面还有接一个sigmoid函数形成最后的概率。并行的回归分支也是同理,最终生成了一个WxHx4的feature map,后面接一个ReLU函数。

  2. 怎么为anchor-free分支生成监督信号 首先对于一个物体介绍几个概念:
    1) 类别:k
    2)坐标:b = [x, y, w, h], (x, y)是中心坐标
    3)映射到特征金字塔第l层的框坐标:bpl = [xpl, ypl, wpl, hpl]
    4)有效的框的坐标:bel = [xel, yel, wel, hel],缩放因子为0.2
    5)忽视的框的坐标: bil = [xil, yil, wil, hil],缩放因子为0.5
    如下图Figure5:
    image 其中白色的区域为有效区域,灰色的为忽略区域,黑色的为negative 分类:
    在分类的时候有个细节,如果两个物体的有效框在一个featuremap的level上重叠了,那么小的物体有优先级,这就保证了对于小物体检测的友好。另外,作者用了focal loss。 边框回归:
    做边框回归的时候只在bel上进行。对于有效框中的每个像素点(i, j),生成了一个4维张量,分别代表到bel上左下右边的距离。使用IoU loss。

  3. 怎么动态的为每个物体选择feature map的level
    FSAF是基于物体的内容而不是框的大小为其找到最优的一个feature level。首先对一个物体,定义两个loss函数如下列公式,上面的是分类loss,下面的是回归loss:
    image 首先,一个物体会经过特征金字塔所有的特征层,由上图的公式计算两个loss,然后挑选出总loss最小的特征层作为该物体的特征层。 对比之前选择的特征层的公式:
    image

  4. 怎么联合的训练和测试anchor-free分支和anchor-based 分支
    联合训练的时候比较简单,就把所有的分支的loss加起来就好了,两种分支的loss,作者取了权重0.5 。

实验结果

首先是Ablation Studies:
主要是两个重要的部分: anchor-free branches, online feature selection
image 可以看出只用anchor-free branches+Heuristic feature,精度只下降了1个点;anchor-free branches+Online feature,精度对比提高了1个点,说明选择合适的feature map层很重要。最终的联合训练精度最高,因为两种分支互补。

然后是不同backbone对结果的影响:
image 可以看出,随着backbone的复杂提出的特征越好,效果也是越好的;同时也说明了作者提出的模块是独立于backbone的。

最后给出对比可视化:
image 对比可以发现,FSAF模块对于之前网络的提升主要就是在小物体上的提升。

LargeFishPKU commented 5 years ago

12.Segmentation Is All You Need

这篇论文是当前anchor-free热潮中比较新颖的一片论文,方法就如文章的题目,只用了分割的方法来解决目标检测的问题。基于anchor的检测器有以下几个问题:(1)密集提取anchor会造成耗费大量的时间和空间,并且大部分的anchor都是没用的(包含了背景类或者一小部分的物体)(2)最终要经历NMS阶段,NMS由于自身的缺陷并不会过滤掉分类不好的背景框
分析:如果整个检测的框架都是基于分割的话,就很好的避开了上述两个问题:首先是不需要预定义anchor;其次由于分割是instance-aware的,通过分割的结果可以唯一确定一个框,不需要NMS来过滤掉多余的框。另外分割是像素级的分类,不再需要回归更高语义的框的偏移量,而是通过每个物体分割的轮廓作为最终的检测框,那么框的质量应该是更好的(如果分割效果不错的话)。同时,还可以顺便解决掉传统目标检测潜在的几个比较关键的问题:(1)遮挡问题(2)光照问题(3)小物体问题具体可见下图Figure1:
image

产生监督信息

首先,要训练一个网络首先要处理训练的数据,那么现有的分割的GT显然是不行的,因为分割的信息要明确到每个物体。文中作为将这种监督信息称为(Multimodal Annotations)。整个GT的监督信息是三通道的,分别是内切圆(the interior)、轮廓(the boundary)和几何内部的边界(the boundary on the interior of geometries)。具体见图Figure 2所示:
image
值得注意的是产生边界的时候需要一个厚度值w,原因如下几点:单独产生宽为1像素的点,那么同一张图中,负样本过多;其次,由于这些GT是完全通过检测框来产生的,所以不能保证所有的内切圆就完整的包含了该物体。不过第一个原因更重要一点。

训练网络

整个网络结构是Hourglass的改进版本,主要的改进是增加了一个模块——multi-scale block。整体架构如Figure4所示:
image 其中multi-scale block分别通过1x1,3x3,5x5和7x7对feature map进行average pooling,然后把得到的新的featrue map进行连接形成一个整体的feature map,如图Figure 5:
image

使用分割的结果形成检测结果

通过上面得到的三通道的特征如果形成最终的检测结果如下图所示:
image 由上图可知,最重要的就是contour tracing算法,它是将分割结果转化成检测结果的关键,具体操作如下:首先遍历整个feature map,并且初始化两个变量:ledge和redge,对于整个feature map从上到下,从左到右来寻找物体边缘,如果一个像素的值为1,并且左边的像素值为0,那么就是左边缘,反之就是右边缘。接下来就是找和这些边缘点属于同一个物体的边缘点,在上一行,如果存在l1edge和r1edge的x坐标跟当前的相差1个像素或者相等,那就是属于同一个物体,具体算法流程如下: image 找到了边缘点之后,就可以找到相应的外切矩形了,最终的检测框也就形成了。

试验结果

这里就只贴出在COCO上的结果了,其他的几个小实验可以参考原文: image table2和table3分别是precision和recall的实验结果,可以看出,在mAP上,该方法确实对于小物体的提高比较明显,毕竟分割是直接对像素进行分类,而不用小物体自己的特征去分类和做回归。

LargeFishPKU commented 5 years ago

13.Bottom-up Object Detection by Grouping Extreme and Center Points

这篇论文也是基于关键点来做的anchor-free的检测工作,不同于centerNet的地方是,该方法是检测4个极端点(最上、最下、最左、最右)和一个中心点,然后将检测到的5个点分组,分到同一个组的表示属于同一个物体,进而确定一个完整的框。另外,作为锦上添花的一笔,文中还将检测到的这5个点进而扩充为八边形作为物体的mask,比普通的框作为mask效果要好,并且以此为指导,最终的Mask AP为34.6%。整体的效果图如下:
image 首先,因为自己看过的检测文章也算是比较多了,看到这篇文章的idea时候,我首先是想到了两点:(1)4个极端点就可以确定了整个框,中心点的引入是为了更好的校正4个极端点的,那具体是怎么校正的;(2)极端点显然对于大多数物体是不唯一的,比如一个汽车,这种物体的左边缘可能就是一条线,那么在这条线上,用哪一个点来作为这个物体的极端点呢?并且,这种情况还导致了对于极端点,一条线上的响应应该是都很高的,最后做group操作的时候怎么去重也是个问题。幸运的是,文中作者都给出了答案,我想这也是本篇论文的比较大的亮点。

网络结构

先看一下网络结构,如下图所示: image 这个应该都能想的到,最起码有5类feature map,分别来预测4个极端点和一个中心点,同时还有4个偏移量的featrure map,这个是来校正feature map的坐标映射到原图坐标的时候来弥补误差的。很好理解,因为原图的坐标映射到feature map上必然会出现小数,但是feature map映射到原图是不会出现小数的,那么这个误差就由这四个featrue map来预测。网络是hourglass,是关键点中很经典的网络结构,原理跟FPN差不多。

grouping

这个环节是本篇论文工作中非常重要的,因为检测关键点很好检测,但是把它们归类就很难了,centerNet中用的是embedding来做的这个工作,但是在这里不需要这么麻烦,因为相对centerNet,这个方法有个天然的优势就是可以通过几何关系来确定是不是属于同一个物体。首先暴力枚举4个极端点的组合,通过4个极端点很容易确定中心点,中心点的x坐标可以通过最左和最右的点的x坐标加和除以2来获得,同理中心点的y坐标可以通过最上和最下的y坐标来获得。那么确定来中心点之后,就可以用这个中心点对应到检测中心点的feature map上看这个点的响应是不是超过了阈值,如果是的话,说明这4个极端点的组合是合法的,框是有效的。所以可以看出,这个方法除了枚举比较费时之外[O(n^3)],还是很简单暴力的,不过作者提出了,一般来说n是小于40的,所以是完全可以接受的。伪代码如下:
image

Edge aggregation

这个方法部分解决了我之前提出的第二个问题,那就是如果一个物体的上下左右的一端是一条线的话,那么多响应问题怎么解决,因为这种情况很容易出现的,比如汽车、桌子、电视等等。这个时候,极端点的确定就比较难,理论上是我只需要一个点就好,不需要这条边上的所有的点都响应很高,这样就会产生很多冗余的点,显然是不好的,而且太多多余的点会使得group算法耗时增加。所以作者为了解决这个问题,提出了edge aggregation方法。对于左右极端点是从竖直方向来聚合得到一个较大的响应,对于上下极端点是从水平方向来聚合得到一个较大的响应。怎么聚合就是加权竖直(水平)方向单调递减的响应值,直到遇到一个局部最小值。这个思想很容易理解,目的就是将极端点的响应变的更高,但是有个问题很不理解,就是万一不单调的呢,,,这个不还是会产生很多响应的点吗?当然,,这好像也不是很大的问题,无非就是产生更多的冗余的框,最后的NMS应该会去掉大部分的冗余框。 效果图如下:
image

实验结果

在coco上的实验结果如下:
image 检测的效果图如下:
image 同时,之前说过,可以扩展去得到物体的mask,那么跟mask rcnn对比的实例分割的结果对比如下:
image