今年的CVPR目标检测方向出现了很多类似anchor-free的工作, 先挑一篇看着比较新颖的文章读一下
arxiv地址: https://arxiv.org/abs/1904.01355
github地址: https://github.com/tianzhi0549/FCOS
既然是anchor-free, 那么就得说明白为啥要anchor-free. 文章列了几个anchor-based detector的不足之处:
- anchor-based detector的检测效果严重依赖于预先设定好的anchor类型. 对anchor进行微调, 可以在coco上得到将近4%左右的performance提升, 而这个微调过程又是特别麻烦.
- 因为anchor是预先设定好的, 所以它能检测到的object的尺度是固定的, 对于图像中尺度变化很大的object, 特别是small object很难检测到.
- 因为anchor的设计原则, 导致在训练时, 属于negative的anchor数量远远大于positive的anchor数量. 虽然这个问题可以通过类似focal loss, OHEM的方法抑制, 但问题仍然存在
- 同样是由于anchor的数量过多, 训练占用的内存就更大, 计算消耗也就更大.
基于以上的原因, 既然anchor-based detector有这样那样的局限性, 那为何不能直接抛弃anchor, 直接使用卷积网络, 得到最后的object bounding box? 文章就提出了FCOS, 抛弃anchor, 而是类似于关键点检测的方法, 最网络最后的featuremap上的每一个位置, 输出box的信息. 概括而言, 如下图所示:
FCOS对于输出的每一个位置, 都预测一个4D vector, 用来表示box的左右上下边界离这个位置的距离. 这个类似预测4D vector的anchor-free网络, 在FCOS之前就出现过, FCOS除了这个工作外, 真正的亮点是额外加了一个center-ness branch. 这个center-ness branch是用来辅助最后的inference的. 就和上图右边的图片展示的那样, 同一个位置, 可以用来表示两个不同的box, 那么用哪个比较合适呢? 很简单, 对这个位置进行打分, 这样远离需要检测的目标中心位置的位置, 分数会较低, 这样就把当前这个位置表示的box的分数降低, 在NMS的时候就可以把这个box抑制掉. 网络的整体结构如下:
可以看到网络最后一共有三个branch输出, 最终的结果是要先对表示该类的box和对应的center-ness score相乘再做NMS.
文章给出了大量的对比试验, 总结下就是如果没有center-ness这个branch, 模型效果不比同样的anchor-based detector效果好, 但加入了center-ness, 效果就好很多了. 因为center-ness可以过滤掉很多iou小但score很高的box, 文章也给出了个对比图:
可以看到加入center-ness后, 最终得到的box质量明显高了很多.
文章提及到其实center-ness这个branch可以单独训练, 额外用个网络来训练它而不是和classification branch和regression branch共享backbone, 可能效果比这个还要更好.