Anchor-free目标检测
基于关键点
<<CornerNet: Detecting Objects as Paired Keypoints>>
目标框由左上角点和右下角点确定,所以要预测一个目标框的位置大小,可转换为生成两个角点的热力图。对于多个目标,会有多个角点对,如何区分?添加一个embedding预测项!如果一个左上角点和一个右下角点的embedding相近,表示两个点“对上眼了”,可以组成一个目标框。为了使得预测的框的坐标更为准确,添加一个offset预测项,对于预测的角点进行坐标修正。
角点有什么特征呢?人呢,自然知道——矩形框的一横一竖相交处就是角点嘛,然而网络不容易知道啊,教教它吧!引入corner pooling。
前向推理:
1、在角点热力图中,使用3*3的池化层做了个NMS。
2、取出top-100个左上,右下点,通过offset调整角点位置。
3、计算左上,右下角点embedding的L1距离,距离小的,类别一样的构成目标框。角点得分的平均作为置信度。
<<Bottom-up Object Detection by Grouping Extreme and Center Points>>
一个目标框可以用左上右下角点组成,还可以用左下右上角点极左、极右,极上,极下四个点组成,比如一个菱形,过左右极点做竖线,过上下极点做横线,这样一个外接矩形框就出来了。
这么多极点的预测结果,怎么组合?慢慢遍历吧。。。同时添加目标中心点热力图的预测,根据极点构成的框框的中心点在中心点热力图的得分情况,对预测结果进行过滤。
一般没有数据集标注极点,所以只能自己动手,丰衣足食,使用extreme click annotations或者通过算法对已有标签进行处理来生成真值标签。
<<CenterNet: Keypoint Triplets for Object Detection>>
首先“diss”一下cornerNet——你固然是好,然而不够好。为何不再加个中心点热力图预测呢?
前向推理:
1、由CornerNet提出的方法选择top-k的目标框
2、选择分数为top-k的中心关键点,结合offset,remap到输入图像大小
3、对于每个目标框,定义一块中心区域,检查一下中心点是不是在中心区域内,且类别是否一致。(中心区域选择:根据目标尺度来,对于小目标,选大点,对于大目标,选小点。比如目标框大于150像素,5 * 5划分,目标小于150像素,3 * 3划分,选中间1 * 1的格子。)
4、如果中心点和中心区域匹配上了,置信度值是左上角,右下角,中心点三者平均;没有匹配,则删除
既然cornerNet搞了个corner pooling,顺势而为,center pooling水到渠成。顺便帮corner pooling再改进下——cascade corner pooling。
<<Objects as Points>>
大家用(x,y,w,h)训练darknet是那么的熟练,然而现在,角点,极点,一堆“花里胡哨”的,回归初心吧——中心点热力图预测+中心点offset回归+框的宽高回归。
密集预测
既然不用anchor,那么可以对于特征图上的每个点都产生一个预测嘛。咦,yolov1不就是这么做的,当然分成7 * 7的区域有点粗糙。。。
<<Feature Selective Anchor-Free Module for Single-Shot Object Detection>>
在Retinanet基础上,fpn的每层输出加两个分支用于anchor-free预测。
真值生成:原图目标框b投影到特征图中,大小为,定义effective box为(正样本),定义 ignoring box为(梯度不回传),宽高分别为的0.2和0.5倍。
对分类输出,白色区域表示目标所在区域,灰色区域为忽略区域,黑色为负样本区域。计算focal loss。
对于坐标输出,对于里面所有的pixel(i,j),预测四个坐标,分别是(i,j)与的上下左右边的偏移。effective box外面不计算loss。
在线特征选择:FSAF module对于每个实例,根据其特征,选择该在哪个特征层进行预测,而不是像anchor-based方法只用目标的大小。
<<FCOS: Fully Convolutional One-Stage Object Detection>>
对于特征图上的一个像素点 (x, y),反投影到输入图像上,坐标为(xs+s/2,ys+s/2)(s为当前特征图的stride)。如果落在gt框中,那么该点为正样本。
但是如果用所有的这些“正样本点”进行loss计算,会带来2个问题:第一个,如果这个点是两个目标框相交区域内的点,那么这个点该预测哪一个目标呢?第二个,如果这个点在目标角落处,其需要预测的(t,b,l,r)值相差很大,预测的框不靠谱。
针对第一个问题,利用多尺度预测,将不同目标分配给不同层进行预测,消除歧义性。尺度m2, m3, m4, m5, m6 m7 设置为 0, 64, 128, 256, 512 和无穷;如果要回归的真值,最大值大于,或者小于,那么这个点为负样本,不需要回归框。如果一个点还是关联多个目标框,选择面积较小的那个框作为这个点的真值。
针对第二个问题,使用 Center-ness得分,表示目标框内的像素点距离中心的偏移程度,真值计算如下式所示。在推理时,目标框的得分是Center-ness得分乘以类别得分,因此距离中心点较远的点的预测结果置信度会被拉低,去除这些低质量的预测结果。