《FCOS: Fully Convolutional One-Stage Object Detection》

  简单、鲁棒的Anchor free目标检测算法,核心思想 是利用FCNs-based的方式来做目标检测,对featureMap上的结果进行逐像素的预测回归,通过multi-level FPN的不同层选取预测不同尺度的目标解决重叠部分预测模糊的问题,对于低质量的目标框提出了center-ness分支来预测像素到相应目标框中心的得分并与分类的得分相乘得到最终的得分用于NMS,预测head的三个分支在不同特征层间是权重共享的,只是在每个特征层加了一个可学习的因子,用于适应每层预测不同尺度的目标。

Key Words:FCOS、逐像素预测、FCN-based

ICCV, 2019

作者:Zhi Tian、 Chunhua Shen et al.

Code:https://github.com/tianzhi0549/FCOS

Agile Pioneer  

  Can we solve object detection in the neat per-pixel prediction fashion, analogue to FCN for semantic segmentation, for example?


文章目录

  • 摘要
  • 介绍
  • 方法介绍
    • FCNs-based目标检测
      • 网络结构
      • 损失函数
      • 推理
    • FCNs-based两个可能的问题
    • FCOS存在的问题
    • FCOS的解决方案
    • FCOS
  • 结论
  • 三省

摘要

  我们提出了一个全卷积一阶段目标检测器,以逐像素预测的方式来解决目标检测问题,类似于语义分割。几乎目前所有的SOTA检测器比如RetinaNet,SSD,Yolov3,以及Faster R-CNN都依赖于预定义的锚点框。相反我们提出的目标检测器FCOS是anchor free的,也就是没有预先的建议框。因为消除了一系列预定义的锚点框,FCOS完全避开了关于锚点框的复杂计算,比如在训练期间为了挑选正负样本的交叠计算(IoU)。更重要的是,我们也避开了所有的关于锚点框的超参数,这些超参数经常对最终的模型效果很敏感。只用了NMS后处理,利用ResNeXt-64x4d-101作为主干网络的FCOS达到了44.7%的AP,单个模型且单个尺度测试,以更加简单的模型优势超过了之前一阶段的目标检测器。首先,我们证明了一个更简单更灵活的目标检测框架达到了更好的检测准确率。我们希望我们提出的FCOS框架能够被视为一个简单鲁棒的示例级别任务的替代方法。

图1 左边的图展示了FCOS的工作方式,通过预测一个4维的向量(l,t,r,b)在每个前景的位置来对目标框进行编码(在训练阶段通过目标框的真实值信息进行监督)。右边的图显示了当一个位置在多个目标框内的情况,对于这个位置应该回归哪个框存是不明确的。


介绍

   Anchor-based目标检测的四个主要缺点 :

  • 目标检测的效果对于anchor boxes的尺寸、比例以及数量是很敏感的,所以需要仔细的寻找最优超参数。

  • 尽管细心设计了anchor boxes的超参,但是尺寸、比例等仍旧是固定的,对于目标的大小变换跨度大,尤其是小目标仍旧难以解决。而且预定义的anchor boxes也束缚了目标检测器的泛化能力。在新的任务上可能需要重新设计这些超参数,在训练阶段选取正负样本的时候固定的IoU阈值也很有影响。

  • 为了增加召回率,anchor-based方法通常会需要在每个位置密集的布置锚点框,而大多数的这些锚点框都被标记为负样本,这导致了负样本的激增,从而正负样本在训练的时候是严重的不平衡的。

  • 在选择样本阶段需要复杂的IoU计算,导致计算量增加。

  我们能不能利用整洁的逐像素预测方法类似语义分割FCN的方式来解决目标检测问题呢?答案是肯定的。具体做法是在featureMap水平上每个空间位置点上预测一个4维的向量加一个类别。如图1所示,4维向量表示点到边界框四条边的偏移量。

  只做特定领域的目标检测是容易的,而通用目标检测需要面对的问题更多。如图1右侧所示在高重叠的目标检测场景,主要问题目标框重叠的位置到底回归哪个目标框是不明确的,对应的解决方案:

  • FPN能够消除大部分的这种情况,把大目标和小目标分在不同的金字塔层来预测。

  • 引入center-ness分支(Channel为1),用于预测该像素到目标框中心点的偏移,然后把对应像素点的该分数用于NMS后处理的框合并。

  所以FCOS框架有以下优点:

  • 目标检测现在和许多其他的FCN-解决任务统一了,比如语义分割,对于来自于其他任务的复用来说更容易。

  • 目标检测成了proposal free和anchor free明显减少了超参数。由于超参数的选择尤其需要启发式的方法和许多技巧来得到好的效果。因此我们的方法让目标检测变的相当简单。

  • 通过消除锚点框,我们的新检测器能够完全避开复杂的IoU运算,相比较anchor-based减少了训练阶段的内存占用。

  • 没有花哨的技巧,我在一阶段检测器中表现sota。而且FCOS也可以被当做两阶段目标检测器中的RPN,来代替anchor-based取得更好的结果。

  • 我们提出的目标检测器可以很快的延伸到其他视觉领域,只需要做很小的修改。包括实例分割和关键点检测。

图2 FCOS的网络结构,其中C3、C4和C5表示主干网络的特征映射图而且P3和P7是用于做最终预测的特征水平。H * W是特征映射图的高和宽。'/s'(s=8,16,...,128)是输入图像在不同水平的特征映射图的下采样倍数。上图是以800 * 1024的输入图像为例子


方法介绍

FCNs-based目标检测

网络结构

  如图1所示,网络预测类别和回归到边界框的四个距离(l, t, r, d)。设s表示相应的featureMap下采样的倍数,那么对于featureMap上的每个像素点(x,y)都可以通过公式([s2]+xs,[s2]+ys)([\frac{s}{2}] + xs, [\frac{s}{2}] + ys)([2s​]+xs,[2s​]+ys)映射到输入图像的坐标上,即最接近感受野的位置(x,y)的中心。

  背景的类别c∗=0c^*=0c∗=0,如果特征映射图上的一个位置(x,y)用于预测一个目标框,那么训练回归的目标(l, t, r, d)可以用如下公式表示,其中x0,y0x_0,y_0x0​,y0​是目标框的左上角点,x1,y1x_1, y_1x1​,y1​是目标框的右下角点。

公式一

  网络输出C维的类别向量和4维的目标位置向量t=(l,t,r,b)t=(l,t,r,b)t=(l,t,r,b),C个类别不是多类别分类任务,而是C个二分类

损失函数

  损失函数定义如下,其中LclsL_{cls}Lcls​是focal loss用于分类,而LregL_{reg}Lreg​是IOU loss用于回归,NposN_{pos}Npos​表示正样本的个数,λ\lambdaλ文中设置为1用于平衡权重。对特征金字塔所有层的loss进行求和。1ci∗>01_{c^{*}_{i} > 0}1ci∗​>0​是一个符号函数,ci∗>0c^{*}_{i} > 0ci∗​>0为1,其他为0。表示只对正样本进行回归。

公式二

推理

  通过FCOS的推理我们从FiF_iFi​层金字塔得到了分类的得分px,yp_{x,y}px,y​,和回归的结果tx,yt_{x,y}tx,y​,其中px,y>0.05p_{x,y} > 0.05px,y​>0.05作为正样本,通过公式一逆推得到目标框。


FCNs-based两个可能的问题

  • 过大的下采样步长会导致一些样本有低的best possible recall(BPR),因为在下采样的过程中有些小目标就消失了,导致无法召回,所以BPR很低。乍一看FCNs-based面对这个问题可能更加严重因为不可能召回一个在最终的特征图编码上找不到目标位置的目标。但是对于FCOS而言,实验显示,大的下采样步长下,FCNs-based仍旧能够产生很好的BPR,甚至比anchor-based更好。因此BPR实际上不是一个问题。

  • 真实目标框的交叠会造成 intractable ambiguity 样本,这种模糊的结果会导致目标检测器的效果下降。

FCOS存在的问题

  • 1、在目标框重叠的时候,一个像素预测哪个目标是不明确的。

  • 2、由于在目标框内的所有像素都进行逐像素预测,所以会预测很多的低质量目标框。

FCOS的解决方案

   Multi-level Prediction with FPN for FCOS 利用FPN的多尺度特征进行分层预测,具体的训练样本的选取遵循以下规则:

  • 1、FeatureMap上在目标框内的点作为正样本

  • 2、特征金字塔的不同层预测不用大小的目标,图2所示,0 < max(l, t, r, b) < 64,…

  • 3、如果通过第二步的结果还是存在交叠部分的像素,就把交叠部分像素对应的较小目标作为其回归目标

通过上面的第二、三条规则,就能够有效的解决ambiguous样本。

   center-ness分支 使用多尺度特征进行预测后,效果距离anchor-based的目标检测器仍旧有些距离。是由于产生了大量的低质量的检测结果产生的。所谓的 低质量结果 就是分类得分的正样本特别高,但是和真实结果的IOU特别小,如图3的左图中红色线下方的点所示。

  为了解决这个问题,提出了center-ness,公式如下,该公式描述了特征图上的点距离目标中心点的距离,center-ness的取值范围是0~1的,取值越大距离中心越近,考虑为高质量样本点。在测试的时候,最终用于预测框排序的得分是通过center-ness和相应的分类得分相乘得到的 。如图3右图所示center-ness能够有效的降低远离目标中心的样本点的得分,即减少低质量预测框。最终通过NMS过滤的效果有显著的提升。

  如何选择样本才能让目标检测有更好的效果,这个是值得探究的问题,如果在训练阶段的样本选择就能够做好,模型的效果就会更好,这个简单的道理就好像,你训练一个二分类模型,你精心挑选了数据和随意挑选了数据的区别是一样的。

公式三 图3

   下图4中越靠近红色的地方表示center-ness的数值接越近于1,而蓝色的地方表示center-ness接近于0,能够发现center-ness较大值的地方基本都位于图像前景上。

图4


FCOS

  最终的损失函数在公式二的基础之上又加了一项center-ness的损失项,由于center-ness的取值范围是0~1,所以使用了BCE loss进行的训练。

  为了提高效率,FCOS最终的预测Head在多个特征金字塔层是权值共享的,但是特征金子塔不同层是用于预测不同尺度的目标,所以权值共享不是很合理,所以在每层特征金字塔预测的时候加入了一个可学习的参数s,由于对回归部分使用exp进行了[0,+inf)[0, +inf)[0,+inf)的处理,所以加入可学习的参数后为exp(six)exp({s_i x})exp(si​x),对效果有很小的提升。


结论

  我们提出了一个anchor_free并且proposal-free的一阶段目标检测模型FCOS。FCOS超过了目前普遍的anchor-based一阶段检测模型,包括RetinaNet,YOLO和SSD,而且模型设计更加简单。FCOS完全避开了关于锚点框的计算和超参数的调参工作。通过逐像素预测的方式解决了目标检测的问题。类似于其他密集预测任务中的语义分割问题。FCOS在众多一阶段检测器中也到达了最好的效果。而且FCOS也可以用作两阶段目标检测器中Faster R-CNN中的RPN并大幅超过了原有的表现。由于FCOS的有效性和高效率,我们希望能够被看作一个鲁棒的且简单的能够替换目前主流anchor-based的目标检测器。我们也相信FCOS能够被扩展到许多其他的实例识别的任务中。


三省

Q:

  1. FCOS的中心思想是什么?
  2. FCOS设计过程有哪些问题,又是如何解决的?
  3. FCOS是如何选择样本的,这样做会有哪些问题?
  4. FCOS的head是怎么样的,损失函数是什么?
  5. BPR(best possible recall)的概念?

A:

  1. FCOS的中心思想是利用类似于图像语义分割的逐像素密集预测任务来解决目标检测的问题,这样做的好处有两点,一是为了减少和锚点框相关的复杂的IoU计算,二是不需要对锚点框的超参数进行调参。

  2. 主要问题有两点,
    1、由于FCOS是在featureMap上逐像素预测的,所以如果两个真是目标框间有重合的话就会产生intractable ambiguity样本,
    2、距离样本中心较远的像素点,往往会产很多低质量的框(score很高,但是和GT的IoU很小)影响模型效果。
    解决方法:
    1、针对第一个问题,利用多层FPN的结构,在不同的层设定预测目标的大小的范围即 0 < max(l, t, r, d) < 64 …如果通过这个过滤后还是存在那么就对重叠部分指定预测较小的目标。
    2、对于第二个问题FCOS引入center-ness的概念,即多加一个channel学习每个像素距离中心点的距离,center-ness的取值范围是0~1,所以用BCE loss来学习。
    在预测阶段使用center-ness和分类的得分进行乘积,用于NMS的最终得分,这样就会去掉很多低质量框的影响。

  3. FCOS选择样本的方式是通过两种限制:
    1、空间限制:只有在目标框内的特征图像素才是正样本
    2、尺寸限制:在特征金字塔的不同层,对max(l,t,r,d)设置了不同的范围,只有满足范围在该层才是正样本
    可能的弊端就是尺寸的范围值是固定的,对于过大的目标来说就会产生过多的正样本,而过小的目标来说相应的正样本就少一些,这样对于不同的目标的样本选择方式是不公平的。

  4. FCOS的head预测三个分支,分类,正样本回归,和center-ness。
    对应这三个分支的损失函数为:分类对应focal loss,回归使用IoU loss,而center-ness使用BCE loss,对所有层的这三项loss加在一起就是最终的loss。

  5. BPR(Best Possible Recalls) 只的是方法本身能够解决的所有情况的最好的召回,说的是某些模型由于自身的结构方法等导师一些样本根本无法召回的情况,比如CenterNet中目标中心点重合的情况。

孤读Paper——《FCOS: Fully Convolutional One-Stage Object Detection》相关推荐

  1. 孤读Paper——《Deep Snake for Real-Time Instance Segmentation》

    <Deep Snake for Real-Time Instance Segmentation>   论文借鉴了snake算法,将snake算法做成了轮廓结构化特征学习的方法.DeepSn ...

  2. 孤读Paper——《CenterNet:Objects as Points》

    点即是目标   建模对象为单个的点--即目标框的中心点.我们的检测器使用关键点估计来找到中心点并且回归出全部其他的目标属性,比如大小,3D位置,方向甚至姿势.我们基于中心点的方法称为CenterNet ...

  3. 孤读Paper——《ATSS:Adaptive Training Sample Selection》

    <ATSS:Adaptive Training Sample Selection>   此论文一出感觉是在告诉像我们这样的小朋友根本没有深入理解目标检测.论文醍醐灌顶的指出了影响Ancho ...

  4. 视频实例分割paper(一)《Video Instance Segmentation》

    [主要贡献] 1.视频实例分割第一次被正式定义和探索 2.创建了第一个大规模视频实例分割数据集 2.9k视频 40个目标类别 3.提出一种新的视频实例分割算法MaskTrack R-CNN,在Mask ...

  5. 【论文泛读】 Deep Learning 论文合集

    [论文泛读] Deep Learning 论文合集 文章目录 [论文泛读] Deep Learning 论文合集 Batch Normalization: Accelerating Deep Netw ...

  6. 【Deep Snake】DeepSnakeforReal-TimeInstanceSegmentation

    浙江大学 CVPR 2020 oral paper code 文章目录 overview Related work Detail Result 从论文题目就可以看出论文要做的事情:实时的实例分割.方法 ...

  7. 实时实例分割的Deep Snake:CVPR2020论文点评

    实时实例分割的Deep Snake:CVPR2020论文点评 Deep Snake for Real-Time Instance Segmentation 论文链接:https://arxiv.org ...

  8. 【论文阅读/翻译笔记】Deep Snake for Real-Time Instance Segmentation

    原论文标题:Deep Snake for Real-Time Instance Segmentation 原论文链接:https://arxiv.org/abs/2001.01629 翻译:张欢荣 用 ...

  9. 读Applying Deep Learning To Airbnb Search有感

    读Applying Deep Learning To Airbnb Search有感 介绍 Airbnb的房屋预订系统对于房主和租客来说是一个双向的平台,房主想出租他们的空间,租客想预订房间.airb ...

最新文章

  1. python逐行读取文件内容的三种方法
  2. centos 6.5升级openssl
  3. 虾皮如何注册店铺_虾皮跨境电商怎样注册店铺?做(shopee)虾皮电商靠谱吗
  4. 从源码深处体验Spring核心技术--基于注解的IOC初始化
  5. linux部署的java应用,浏览器访问时,报域名解析错误
  6. adnroid string拼接_Android开发中string.xml文件中字符串的拼接
  7. Docker使用Dockerfile构建镜像
  8. Builder内部类
  9. 发那科机器人点位编辑_FANUC机器人:参考位置功能介绍与设定方法
  10. 佩奇扑街、外星人疯狂!Python 告诉你大年初一应该看哪部电影?
  11. 第二十一天 认识一维数组part3
  12. linux 主机支持远程唤醒_linux 通过wol远程开机【转】
  13. 计算机网络tcp/ip协议,UDP,HTTP/HTTPS基础知识
  14. SpreadJS v14.1.5 Crack
  15. Python标准库32个模块的整理
  16. 阿里云搭建MQTT物联网服务器
  17. Android开发——监听Android手机的网络状态
  18. <img> 的 title 和 alt 有什么区别
  19. 减法器(差分放大器)
  20. WebView---android webview组件如何使用 Webview与js交互

热门文章

  1. scala设计模式_Scala中的工厂设计模式
  2. jms 教程_JMS教程–什么是JMS
  3. 想要学习C++,到底能从事哪种行业?
  4. React学习笔记2017-12-31
  5. 聊聊rocketmq的FileAppender
  6. 改变图片局部透明度,实现透明度根据位置不而渐变
  7. Nginx的rewrite模块疑问排查
  8. 乾颐堂军哥HCIE9-解决BGP路由黑洞、聚合的各种参数以及RR基础
  9. 《众妙之门——移动交互体验设计》—— 1.2 物物互联
  10. 最近工作上的两个问题的调查报告