目标检测系列:
目标检测(object detection)系列(一) R-CNN:CNN目标检测的开山之作
目标检测(object detection)系列(二) SPP-Net:让卷积计算可以共享
目标检测(object detection)系列(三) Fast R-CNN:end-to-end的愉快训练
目标检测(object detection)系列(四) Faster R-CNN:有RPN的Fast R-CNN
目标检测(object detection)系列(五) YOLO:目标检测的另一种打开方式
目标检测(object detection)系列(六) SSD:兼顾效率和准确性
目标检测(object detection)系列(七) R-FCN:位置敏感的Faster R-CNN
目标检测(object detection)系列(八) YOLOv2:更好,更快,更强
目标检测(object detection)系列(九) YOLOv3:取百家所长成一家之言
目标检测(object detection)系列(十) FPN:用特征金字塔引入多尺度
目标检测(object detection)系列(十一) RetinaNet:one-stage检测器巅峰之作
目标检测(object detection)系列(十二) CornerNet:anchor free的开端
目标检测(object detection)系列(十三) CenterNet:no Anchor,no NMS
目标检测扩展系列:
目标检测(object detection)扩展系列(一) Selective Search:选择性搜索算法
目标检测(object detection)扩展系列(二) OHEM:在线难例挖掘
目标检测(object detection)扩展系列(三) Faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3在损失函数上的区别
CenterNet的论文是《Objects as Points》,其实从名字就可以很直观的看出,CenterNet是将目标检测问题看做对于目标中心点的检测,它是继CornerNet之后的又一个Anchor-free方法,它们之间也有比较多的相似之处,区别在于CornerNet是找目标的角点,而CenterNet是找目标的中心点。
CenterNet的出发点和RetinaNet,CornerNet都是差不多的,对于one-stage的目标检测器,大量的anchor导致正负样本的不平衡,网络训练时loss会被大批量负样本所左右。同时又由于检测器是one-stage的,一旦预设了anchor,没办法二次筛选它。所以RetinaNet提出了Focal loss,在计算损失时弱化负样本的影响。而CornerNet和CenterNet则是直接弃用了anchor,除了上面的原因,还有一个就是anchor的设计是完全先验的,有大量的超参数,比如如何选择尺度,比例,多少个分支等等,每个层放几个等等,每个结构都不一样。
对于一个目标检测任务,一个backbone最后会输出三个分支,分别是Heatmap,Center offset和Box size,如下:
也可以表示为下图的过程,Heatmap作为最核心的输出,表示物体的中心点,而由于下采样造成的不对称,CenterNet使用中心点的offset来修正它,确定中心点后,根据size分支的输出最后确定bbox。
而上面的C,就是目标检测任务的类别数量了,对于COCO就是80,相当于把不同类别的目标放到不同的channel上做。但是除了Heatmap,其余两个分支不需要C倍的通道数量。
相比于CornerNet,CenterNet的中心点Heatmap极大的简化了算法的复杂程度,因为一个目标用一个heatmap就可以表示出来,不再需要左上角和右下角两张heatmap,也就不涉及判断哪两个角点属于一个目标的问题。
至于CornerNet认为的“目标的中心点不好定义,目标角点更为清晰明确”这个观点,在CNN的拟合能力面前,看起来是不成问题的。
CenterNet对于目标检测的分支有三个,所以对应的损失也是三个,分别是Heatmap损失,offset损失和size损失:
Heatmap loss:
offset and size loss:
其中CenterNet的Heatmap loss参考的是CornerNet,包括高斯映射,Focal loss的使用都是这样。大家可以直接看之前的文章,在这里就不重复了,而offset loss也是和CornerNet相似的,只是CornerNet使用的smoothL1,而CenterNet直接用了L1,CornerNet预测了左上角和左下角点,所以不需要再预测size,而CenterNet的size loss和offset loss是差不多的,也是L1。
CenterNet的结构是可以不做NMS的,本质上其实也是因为no Anchor,这意味着没有大量的先验预设框,不需要过NMS进行滤除,这让CenterNet的后处理变得比较简单,并且更加接近于end-to-end。
此外还有一个很有意思的地方,Anchor free方法的目标检测网络,主干网络的在设计的时候,下采样倍率普遍比较小,CenterNet的倍率是4,CornerNet的下采样倍率是5,而Anchor base的方法,下采样倍率就要大的多,比如YOLOv3是在16的基础上构建三个scale,分别是8,16,32。
也就是YOLOv3最小的倍率也是CenterNet的2倍,这说明Anchor Free方法越来越接近将目标检测任务抽象成类似图像分割(语义,实例),姿态估计,人脸对齐这样的对于点的回归任务来做,而不是像之前的对Anchor修正的方式。所以Anchor Free需要一个更大尺寸的feature map来支撑这个任务,反而feature map厚度变小了,而Anchor base方法的feature map厚度普遍都比较大。
CenterNet由于其简洁的结构,使它非常容易的扩展到其他任务上,比如人体姿态估计,也可以成为CenterPose,以coco的17点姿态估计为例,CenterPose的输出为:
CenterPose一共有六个分支的输出,前四个定义了单类的目标检测任务和17个点关于中心点的偏移,这是一套17个关键点的预测,后两个定义了17点的预测以及它们各自的offset,这又是一套17个关键点的预测,所以CenterPose一共预测了两套关键点,这样冗余的设计是有意义的:
首先直接对于点的预测可信度应该是更高的(分支5),但是它没办法关联成一个person,这个关联要考分支4,因为分支1、2、3定义了一个person,分支4的offset可以估计出17个点,这17个点可以根据距离关联到5、6预测的17个点上,而对于同样5、6没有预测到的点,可以使用4的点来输出。
当然CenterPose的损失就需要有6个了。
首先对于backbone的对比,CenterNet也使用了Hourglass-104,由于它比DLA-34大很多,所以效果也在变好,而这里提及的ResNet也不是原版的ResNet结果,而是带了转置卷积和可形变卷积的,这些主干网络其实是在参考语义分割和姿态估计任务。
最后这张表很有说服力,上面是two-stage方法,下面是one-stage方法,其中包括anchor base和anchor free,anchor base里的YOLOv3被拉开了一大截,而另一个Anchor Free的CornerNet,由于是Hourglass-104的backbone,效率也没办法了CenterNet比,所以综合效率和性能,CenterNet还是很不错的。