目标检测系列:
目标检测(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)系列(十四) FCOS:用图像分割处理目标检测
目标检测扩展系列:
目标检测(object detection)扩展系列(一) Selective Search:选择性搜索算法
目标检测(object detection)扩展系列(二) OHEM:在线难例挖掘
目标检测(object detection)扩展系列(三) Faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3在损失函数上的区别
简介
FCOS的paper是《FCOS: Fully Convolutional One-Stage Object Detection》,来自阿德莱德大学沈春华老师团队,作者是田植,同时也是在实例分割方向表现非常惊艳的BoxInst。
此外阿德莱德大学还有另外一个非常著名的工作就是AdelaiDet,是一个base在detectron2上的检测工具箱,AdelaiDet同样支持FCOS。
FCOS旨在利用全卷积的思路处理目标检测问题,它是一个anchor free的单阶段检测器,一个很有意思的地方是,FCOS和CenterNet都是在CornerNet之后,但是这它们几乎是同时挂到arxiv上,都在2019年的4月,且相差不到半个月。区别在于CornerNet是找目标的角点,而CenterNet是找目标的中心点,FCOS在找所有的点,CornerNet和CenterNet像是bottom-up的人体姿态估计任务,而FCOS像是一个实例分割任务。
我们在把FCOS作者的一系列工作串起来看,就不难发现这个问题,BoxInst与CondInst都是实例分割方向非常优秀的工作,同时,BoxInst更是在只有bbox的情况下做实例分割,单纯的从输入来看,这和FCOS就是一致的。
FCOS原理
Motivation
与其他anchor-free检测器类似,FCOS也是例行的说明anchor-base检测器的缺点,常规操作如下:
- 检测表现效果对于锚框的尺寸、长宽比、数目非常敏感,这些超参数依赖人工设计
- 锚框的尺寸和长宽比是固定的,因此,检测器在处理形变较大的候选对象时比较困难,尤其是对于小目标。预先定义的锚框还限制了检测器的泛化能力,因为,它们需要针对不同对象大小或长宽比进行设计。
- 为了提高召回率,需要在图像上放置密集的锚框。而这些锚框大多数属于负样本,这样造成了正负样本之间的不均衡。
Inference
- Classification: C × H × W Ctimes Htimes W C×H×W,C为要分类的类别数,每一个通道上都是一个二分类;
- Center-ness: 1 × H × W 1times Htimes W 1×H×W, 对距离中心很远的点的抑制
- Box size: 4 × H × W 4times Htimes W 4×H×W,对每个点针对于所在的目标回归边界
这样一来,FCOS执行inference的过程中,Headmap上的每一个点都会被划分类别,及其预测的与bbox的关系,并且由center-ness分支的分数,抑制那些与中心偏离太远的点,也就是输出结果很不可靠的点,那么同一个GT,会有多个预测值,最后一定要通过NMS得到最终输出。
这就是为什么CenterNet理论上不需要NMS,而FCOS是需要的。
样本标定
根据上面的介绍,FCOS在训练时需要给每一个点分配类别标签,同时还要之后每个点对应边界的关系,或者比较好计算,那么前者应该怎么做?
如果位置某个点落入任何真实边框,就认为它是一个正样本,它的类别标记为这个真实边框的类别。
这样会带来一个问题,如果标注的真实边框重叠,某个点映射到原图中落到多个真实边框,这个位置被认为是模糊样本,FCOS中使用了多级预测的方式处理模糊样本的问题,改善这种界定不清晰的情况,但是如果还有的话,那就直接用多个真实目标中最小的那个作为这个点的标定。
其实这个设置也很好理解,就拿下面这个图来说:
右侧的网球拍和人,有一部分交叠,但是起码网球拍嗨哟偶属于自己这部分的点,但是如果左侧的棒球棒也是一个类别的话,那它都在人的bbox里面,没有是完全只属于自己的点的,所以这个时候只能按照小的来。
当然上述两个种情况,都会在多级预测机制中被消除。
损失函数
损失函数就是分类和回归损失。
多级预测
多级预测就是之前目标检测领域多被用到的多尺度预测,同来捕捉不同size的object,但是FCOS中的多级预测形式有所区别,并且有更多的作用。FCOS通过直接限定不同特征级别的边界框的回归范围来进行分配,这个值由需要回归的 l, t, r 和 b中的最大的那个决定,这样一来,之前提到的模糊样本问题就大概率的被分到的不同的层级中预测,也就缓解了这个类别界定问题。
Center-ness
通过上述方法,作者实验后还是发现FCOS与主流anchor-base方法之前的效果存在不小的差距,分析后得出,是因为很多偏离目标中心点的框产生的预测结果差导致的。既然如此,那就需要抑制这些点。
上图反应的是越是红的地方,离中心点越近,越是蓝色的地方,离中心点越远。那么首先需要一个度量方式反应某个点与中心点的距离,这个值越大,与中心点的距离应该更近,相反的应该更远:
由于l, r, t 和b本身就是要预测的值,centerness可以作为一个约束参与训练,centerness是一个0-1之间的值,作者使用了二值交叉熵loss,不过感觉回归loss也是可以的。
可能是因为本身就是辅助作用,影响不大。
之前也提到了,FCOS一定需要NMS,而因为centerness的存在,用于排序的分数不能只是confidence,而是在confidence的基础上乘以centerness分数。
下采样倍率
最后是FCOS的下采样倍率,这个和centernet,cornernet是不同的,FCOS的下采样和anchor-base方法一直,比如在论文中的示例中,由于使用了FPN的方法,FCOS下采样倍率是8,16,32,64,128。
FCOS性能评价
从paper给出的结果看,FCOS的表现要好与CenterNet,但是需要注意的是,CenterNet的结构设计太过简洁了,它的最后输出只有一层,只下采样4倍,整个Head的部分非常干净,并且CenterNet的实验结果是在固定的512*512输入下跑出来的,FCOS虽然也是single scale结果,但是随即缩放短边到640-800之间。
此外,CenterNet的paper更像要表达一种思路是,anchor free的center思想去处理2D检测,3D检测,姿态估计等等任务,而FCOS只做了检测,它们都是在CornerNet之后非常优秀的anchor free方法,但是各有侧重。