2018ECCV《CornerNet: Detecting Objects as Paired Keypoints》
CornerNet采取了类似检测关键点的方法,通过检测左上点和右下点来框出物体的位置。
网络结构如下:Hourglass Network是关键点检测中常用的网络,左上点和右下点分别进行预测
corner pooling module
对于一个物体的左上点,其右下区域包含了物体的特征信息,同样对于物体的右下点,其左上区域包含了物体的特征信息,这时角点的周围只有四分之一的区域包含了物体信息,其他区域都是背景,因此传统的池化方法就显然不适用了。以左上角为例,左上角需要的物体信息其实是在右下角,所以在进行pooling的时候,更应该关注将该点的右下角信息。下图是top-left corner pooling:
Heatmaps
这里预测的是每个物体的角点位置,值越高越可能是物体的左上/右下点。如果GT的角点只对应到Heatmap上一个点,由于人为主观标记的因素,这个点有可能不是最好的点,所以以GT这个点周围的一个范围会进行惩罚衰减(设置了一个半径为R的区域,也就是图中圆圈部分,物体越大R越大)。即预测到的虽然不是GT,但在这个圈里面基本就不会产生loss。惩罚衰减是按照2D Gaussian来分布的。(有点类似与Focal Loss)
Offsets
这里主要是对角点坐标在进一步的修正。因为网络下采样的时候,损失了小数部分,所以在Heatmaps中的位置并不能很好的映射回去,需要再偏移调整一下。
Embeddings
上面到多组角点的位置,如何将其两两对应?因此Embeddings 分支负责将左上角点的分支与右下角点的分支进行匹配,找到属于同一个物体的角点。属于同一个物体的角点,他们的Embeddings 应该相似。
训练Loss:从训练loss大概就能知道他们的编码方式
预测后处理:这里用最大池化取代了 NMS 操作
2019CVPR 《Objects as Points》主要讲这一篇
but,这里还有一篇《CenterNet: Keypoint Triplets for Object Detection》
“虽然根本上都是受到cornetnet的启发,但是一篇是corner-centernet,一篇是真centernet。centernet那篇最牛逼的(我认为的)就是在于不需要voting,也不需要nms。直接predict centers,然后(再)predict长宽。简单到可以直接用到3d detection上(虽然没有概念效果有多好)论文也是写的真的简单清晰直观明了,吹爆!(另外一篇瞄了一眼,主要是觉得跟我这么喜欢的paper居然抢了一个名字。。。所以我就没怎么看,所以我就不评价了。。。。)” — 知乎评价
CenterNet算CornerNet 的拓展版,其核心思想预测中心点和宽高。这样比预测角点更方便,省去了匹配的Embeddings。
整个网络结构也是比较简洁:backbone可以切换,这里Hourglass的效果最好
推理预测:
2019CVPR《Bottom-up Object Detection by Grouping Extreme and Center Points》
作者认为:绝大多数的目标都不是常规的矩形,如果我们强制用矩形表示目标,那么会包括除了目标本身外很多的背景像素,这些像素并不是我们需要的。此外,这种方法需要列举大量候选框可能存在的位置,而不是真正对图像的语义信息进行理解,这种方法的计算成本是非常庞大的。而且bounding box是远远不能和目标本身划等号的,在形状,姿态等方面有很大的差距。
ExtremeNet利用沙漏网络为每个类别的五个关键点(四个极值点和一个中心点)进行检测:
由于中心点是通过四个极值点的几何计算得到的,所以对于中心点并不进行偏移预测。因此,整个网络的输出:heatmaps(热点图) 5xC维,其中C为要分类的数目;4x2 偏移图(4个极值点,2个方向偏移值)。在损失函数设计和偏移预测上,遵循和CornerNet相同的策略。
预测的点如何进行匹配呢?极值点分组Center grouping (作者未使用向量嵌入方法将角点进行分组,认为这可能缺少足够的全局视图信息。个人觉得maybe)
首先通过检测峰值(peaks)将所有(大于阈值)关键点提取出来。枚举四个极值点热图的峰值的组合,并计算了组合边界框的几何中心,当且仅当其几何中心在中心热图中具有高响应时,才会生成边界框(返回一个最终得分,得分的计算方式是五个点得分的平均值)。
2019ICCV《FCOS: Fully Convolutional One-Stage Object Detection》
沿用FPN的思想,整体看下来并没有特别多的新颖的地方。分层的好处是不同的层可以预测不同大小的物体,因为物体中心重合的时候大多数都是尺度差异较大的物体相重合,比如一个人拿着球拍:能解决目标像素点重叠的问题
重叠的像素我们称为ambiguous,以图中空心橙色圈为例(ambiguous),选择最小的GT框,取出离小框边最长的距离d,如果d大于mi或小于mi-1就在第Pi层归为负样本,反之为正样本。即不同的层预测不同尺寸的物体。
在将分类分数乘以 centerness 分数后,低质量框(在 y = x 线下)被推到图的左侧。这表明这些框的分数大大降低了。
2019CVPR《FoveaBox: Beyond Anchor-based Object Detector》
其思想跟FCOS很相似,都是在RetinaNet的基础上,在不同stage输出的特征图上得到目标类别并回归出目标的位置。
由于目标尺寸变换范围较大,FoveaBox同样采用了不同的level预测不同尺寸的目标的方法(在FCOS中,使用多level预测的目的是为了解决anchor free的时候,目标重叠的问题),因为重叠就没有办法分配正负样本了,这样可以有效减少目标重合。
有所不同的是:分层的大小是可以通过η参数学习的,因为η是动态的,给出的范围是一个动态区间,一个物体的尺寸可能同时满足不同层的覆盖区域,也就会在不同的特征图上进行检测。这与传统FPN只在一个特征图上进行检测有所不同。
FoveaBox的class 子网络计算的是每个输出位置分别存在不同类别目标的置信度,box子网络则是直接计算每个输出位置的与类别无关的目标包围框(左上和右下顶点坐标)。
Object Fovea:与FCOS的Centerness不同,在Fovea中并不是ground-truth对应的区域均是正样本。如上图所示,狗虽然很大,但是真正的正样本,是中间红色区域部分,这里作者引入了个σ1参数,可以动态设置正样本范围。对于负样本,也设置了一个缩放因子σ2 ,用于生成负样本区域。如果一个cell没有被分配,那么就是ignore区域不参与反向传播。由于仍然存在正负样本不均的情况,所以作者在训练分类的时候仍然采用了Focal Loss。
Box Prediction:FoveaBox不是直接去学习中点与边框之间的距离,而是去学习一个预测坐标与真实坐标的映射关系,假如真实框为[x1,y1,x2,y2] ,我们目标就是学习一个映射关系 [tx1,ty2,tx2,ty2] ,这个关系是中心点cell [x,y]与边框坐标的关系,如下:
接着使用简单的L1损失来进行优化,其中为z是归一化因子,将输出空间映射到中心为1的空间,使得训练稳定。最后使用log空间函数进行正则化。
Inference:首先使用阈值0.05,过滤掉不靠谱的点,然后在剩下的点中选取得分排名前1000的点作为候选点,再然后,使用非极大值抑制,对1000个点进行过滤,最后留下top100个点作为最终的结果。
“其实看了这么多anchor-free的论文,应该心里都有个数,在这个阶段大家都是在不断提出各种head预测方法(各种keypoint的组合),而不是在刷点。每种方法最大的差别就是如何预测以及如何设置正负样本。 那段时间真的很多公司都在招实习生做这个,早期的时候大家很容易想出不同的范式,后面要想新的就没那么容易了,况且审稿人品味也会变高。”
2019ICCV《RepPoints: Point Set Representation for Object Detection》
CNN卷积神经网络之DCN
中心思想:利用3x3可变形卷积得到的9个点来进行定位。DCN是MSRA的传统艺能了
性能最优的目标检测器通常遵循一个 multi-stage 的识别范式,其中目标定位是逐步细化的。作者对定位进行了refine,他自称是1.5 stage。RepPoints使用了两次回归和一次分类,并且分类和最后一次回归使用的不是普通卷积,而是可形变卷积。
采用特征金字塔网络(FPN)作为主干,但为了清晰说明,只绘制了一种规模的 FPN 特征图的后续pipeline, FPN 特征图的所有尺度都共享相同的网络架构和相同的模型权重。
RepPoints其实是对可形变卷积进一步的改进,相比可形变卷积有两个优点:
第一组RepPoints通过回归中心点的偏移值获得。第二组RepPoints代表最终的目标位置,由第一组RepPoints优化调整得到。RepPoints的学习主要由两个目标驱动:
不同的阶段的正样本定义不同:
2020CVPR oral《Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection》
正如我前面提到的(那时我还没看过ATSS,oh我这敏锐的观察力,没赶上anchor free的风口),之前anchorfree每种方法最大的差别就是如何预测以及如何设置正负样本,作者开始思考anchor free和anchor based的性能差异的原因究竟是定义正负训练样本,还是如何预测回归或anchor的数量?
本文提出了自适应训练样本的选择方法(Adaptive Training Sample Selection, ATSS ),下面直接给出结论:
接下来就是实验证明:
作者通过实验分别考察这三点,最终发现(2)是问题核心所在,(1)和(3)无关痛痒。
FCOS的性能提升可能来自以下几点:添加GN、使用GIoU回归损失函数、限制gt box的正样本数量、在回归分支加入中心性信息、为每个层级特征金字塔添加可训练标量。其实这些tricks也可以用在anchor-based中,为了更公平的分析,作者给RetinaNet (Anchor=1)加入上述tricks后AP提升到37.0%。
可见剩下只有0.8%的差异可能来自于(1)定义正样本和负样本的方法;(2)预测锚框还是点?
Adaptive Training Sample Selection(ATSS):基于上述分析,如何更好地定义正负样本,对于目标检测的提升有着重要的意义,之前的FCOS、RetinaNet等都是属于hard型的定义方法,本文提出了自适应选择正负样本的方法。
算法流程:
2021CVPR Location-Sensitive Visual Recognition with Cross-IOU Loss
目标检测,实例分割和姿态估计本质上都是识别物体,只是表征物体的形式有所不同,目标检测用bbox,实例分割用mask,姿态估计用keypoint。既然都是识别物体,作者就准备使用一套方案来完成三个任务。
但是那么多点,怎么计算损失呢,作者还是想使用IOU但是进行了改进,有了Cross-IOU Loss:
建议参考知乎:https://zhuanlan.zhihu.com/p/366651996这里讲得很清楚,个人觉得这种统一并不是很实用。但是还是有一些启发: