FCOS:全卷积一阶段Anchor Free物体检测器,多种视觉任务的统一框架
作者 | ronghuaiyang
来源 | AI公园
导读:这是众多Anchor Free中比较有影响力的一篇文章,不光是效果好,而且思路清楚,简单,不需要任何trick,并将众多的视觉任务统一到了一个框架中,值得一看。
介绍
基于anchor的物体检测器的缺点,这个基本上每篇anchor free的文章都会列一遍。
检测性能依赖于anchor的尺寸,比例,数量,这些都需要非常精细的设计。
一旦anchor设计好了,尺寸,比例就固定了,在物体的尺寸和比例多样性非常大的时候会有困难,特别是小物体。预设的anchor的泛化能力也有限,对于新的任务,需要重新去设计anchor。
为了有高recall,需要设计非常密集的anchor,FPN中的anchor数量就超过了160k,而且大部分都是负样本,正负样本非常的不均衡。
在计算的时候需要计算IOU,非常的复杂。
现在的各种计算机视觉的任务,比如分割,深度预测,关键点加测,计数等等,都是全卷积的结构,就物体检测是个例外。那么,很自然的就有了一个问题:我们能不能把物体检测也变成类似分割那样的逐像素的预测问题呢?这样的话,这些视觉相关的任务就都统一成了一个架构了,所以说,这篇文章就是干了这么个事情。
之前也有过类似的尝试,直接再feature map的每个空间位置上回归出一个4D Vector,外加一个类别,不过这些方法在文本检测中用的较多,因为当物体间的包围框重叠比较多的时候,某一个点就不知道去回归哪一个了。如图1:
图1:左边是FCOS预测的4个向量,右边是当特征图的某个位置同时位于两个物体内部的时候,这个位置就不知道去回归哪个物体了。
我们仔细的研究了这个问题,发现使用全卷积的方案是可以很大程度上解决的,后面我们具体去看。我们的新框架的优点如下:
将物体检测和其他视觉任务的框架进行了统一
检测不需要建议区域,也不需要anchor了。
由于不需要anchor了,所以也没有了IOU之类的复杂计算了,训练更快了,所需要的的内存也更少了。
我们得到了STOA的结果,而且FCOS也可以用到二阶段的检测方案中,而且效果比基于anchor的方案更好。我们觉得可以重新考虑下anchor在物体检测中的必要性。
可以非常方便的将检测框架扩展到分割,关键点检测等其他视觉任务上。
方法
全卷积一阶段物体检测
我们把第i层的特征图记做Fi,它相对于输入图像的stride为s,输入图像的groundtruth bbox记为{Bi},Bi=(x0,y0,x1,y1,c),其中(x0,y0)和(x1,y1)分别为左上角和右下角的坐标,c为物体的类别。对于Fi的每个位置(x,y),我们可以映射会输入图像中,映射成一个范围(s/2+xs, s/2+ys),对于基于anchor的物体检测方法,我们把这个位置作为anchor box的中心点,然后去回归目标box相对于这些anchor box的偏差。而我们这里直接在这个位置上回归目标box,换句话说,我们在训练中是把这些位置当成是样本,而不是anchor box,这个和分割是一样。
如果位置(x,y)落入到某个groundtruth box中,而且类别也和groundtruth box的类别一样,那它就是正样本,否则就是负样本,而且c=0(背景)。除了类别标签之外,我们在这个位置上还会回归一个4D的向量,t=(l,t,r,b),其中,l,t,r,b分别是这个位置点到bbox的4个边的距离,如图1(左)所示。如果这个位置同时落入到好几个bbox中,那这种就认为是模糊样本。我们简单的选择一个面积最小的bbox作为它回归的目标。下面,我们会展示一个多level的预测方法,这种模糊样本的数量会大大的减少,这样几乎不会影响检测的性能。这样,如果位置(x,y)和一个bbox Bi相关联起来,那么在训练的时候,我们的回归目标可以这样来表示:
这里值得注意的是,FCOS可以利用任意多的前景样本来训练这个回归,而基于anchor的方法只选取哪些和groundtruth box的IOU大于一定阈值的anchor作为正样本进行训练。我们认为这也许是FCOS效果比anchor based的模型好的原因之一。
网络的输出 对于coco的数据集,有80个类,我们需要输出一个80维的分类向量和一个4维的t=(l,t,r,b),分类的时候,我们没有用多分类的方法,而是训练了C个二分类器,参考了RetinaNet,我们主干feature map后面对于分类和回归分别加了4个卷积层,作为两个不同分支。由于回归的目标值永远是正的,我们用exp(x)将输出映射到(0, ∞)。值得注意的是,FCOS的输出要比基于anchor的方法(使用9个anchor)小了9倍。
损失函数 定义如下:
其中Lcls是focal loss,Lreg是UnitBox中使用的IOU loss,Npos表示正样本的数量,λ用来做loss之间的平衡,文中用的值是1。
推理 推理的时候很直接,我们可以每个位置的类别预测pxy和每个位置的回归预测txy,我们选择p>0.05的作为正样本,将其回归值转化为bbox的预测。
使用FPN进行多level的预测
这里我们解决了FCOS的两个问题:
在最后的特征图中,大的stride,比如16,对于anchor based检测器,这样会导致较低的best possible recall(BPR),但是对于FCOS,大的stride不会降低BPR,而且,使用了multi-level FPN来预测的话,还可以进一步提升BPR。
重叠的物体会导致模糊匹配,这也可以通过multi-level FPN来很好的解决。
我们用FPN在不同的level上检测不同尺寸的物体,具体结构如图2,
和基于anchor的方法通过在不同的level上设置不同尺寸的anchor的方式,将不同尺寸的物体分配到不同level的特征图上去检测。我们这里更加直接一点,直接对每个level限制物体尺寸的范围。具体来说,我们首先在每个位置上都计算出目标的l,t,r,b,如果max(l,t,r,b) > mi,或者max(l, t, r, b) < mi-1的话,就将这个位置设置为负样本。这里mi是在第i个level上需要去回归的最大距离。这里,我们将m2,m3,m4,m5,m6,m7设置为0,64,128,256,512和∞。这样一来,不同尺寸的物体就被分配到了不同的level的特征图上去进行检测了,由于大部分overlap的都是不一样的尺寸,所以不会出现模糊匹配的问题。如果还是有某个位置匹配到多个groundtruth的情况,那么我们就匹配面积最小的那个。
最后,我们对于不同level的特征图,共享同一个检测头,如图2,但是,由于不同的level回归的是不同的尺寸,共享同一个检测头貌似不是很合理,所以我们又做了点修改,将exp(x)修改为exp(six),加入了一个可训练的尺度参数si,自动的调整exp的输出大小,这个改动对检测性能有小的提升。
FCOS的Center-ness
我们发现,在训练的时候,会出现大量的距离物体中心点很远的低质量的预测框。这会降低模型的性能。我们用了一个简单有效的方法来抑制这种低质量的预测框。我们加了一个分支来预测位置的center-ness,这个center-ness描述了负责检测这个物体的位置到这个物体的中心的归一化的距离,计算方式如下:
用sqrt来减慢center-ness的衰减,center-ness的范围是0~1,用二分类交叉熵来训练。测试的时候,通过它乘上类别得分来对检测出的bbox进行排序,这样,远离中心的那些预测框的分数会减小,这样做nms的时候,就可以去过滤掉这些检测框,显著提升检测性能。
还有种center-ness的替代方案,就是只使用中心区域作为groundtruth,但是这样需要一个超参数,将这两种方式结合起来,可以得到更好的结果。
实验
消融实验
使用FPN进行Multi-level的预测
对于BRP的效果:
对模糊样本的影响:
是否使用Center-ness
使用了Center-ness前后的效果:
anchor base的检测器RetinaNet使用了2个阈值来进行正负样本的选择,如果同时使用center-ness和阈值的话,还能提升性能,下面给出了一些额外的优化方法及其效果:
和anchor based的检测器的比较
和RetinaNet的比较见上面的图3。
和其他的检测器的比较
扩展到RPN上
用FCOS来代替FPN中的RPN网络的效果:
更多精彩推荐
自拍卡通化,拯救动画师,StyleGAN再次玩出新花样
秋天的第一杯奶茶该买哪家?Python 爬取美团网红奶茶店告诉你
Azure Arc 正式商用、Power Platform+GitHub 世纪牵手,一文看懂 Ignite 2020
起底 ARM:留给中国队的时间不多了
相关文章:

Learn Jenkins the hard way (0) - Jenkins的罪与罚
写在开头 Jenkins是非常流行的开源的持续交付平台,拥有丰富的插件、文档与良好的社区。是国内大多数公司私有持续集成方案CI/CD服务器的选型。开发者可以快速的通过Jenkins搭架符合自己业务场景的pipeline,结合大量的开源插件,可以轻松的满足…
python中的文档字符串(docString)
python中的文档字符串(docString) - 泥土 - 博客园python中的文档字符串(docString)Posted on 2009-02-19 15:27 泥土 阅读(2122) 评论(0) 编辑 收藏 Python有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings 。DocStrings是一个重要的工…

关于层的挡隔问题的探讨
原作者:我佛山人出处:5D多媒体1.被Flash挡住 设置Flash的参数:<param name"wmode" value"opaque"><object classid"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase"http://download.mac…
不是我放弃AI,是AI放弃了我!!
为什么程序员都觉得AI很难?Google 人工智能开发者专家彭靖田老师说——超90%的程序员在初学AI时,都会遇到下面3个问题:“应用方向太多了!不知从何学起,也不知道学完做什么”“Python语法、机器学习/深度学习基础都能看…

Qt中两种定时器用法
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器;一种是使用QTimer类。定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度。 1.QObject类的定时器 QObject是所有Qt对象的基类,它提供了一个基本的定时器。通…

有福了,J2EE面试题集锦(附答案)
一、基础问答 1.下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T) 2.抽象类和接口的区别 (1)接口可以被多重…

从零开始学ASP.NET(基础篇)
原作者:蓝鲸出处:5D多媒体 学ASPNET与ASP有区别,这种区别不是语言上的,而是思路上的区别。ASP是纯面向过程的,而ASPNET是完全面向对向的。这种区别使我们在编程的结构设计上要与ASP有很大的不同。 废话少说了ÿ…
2 行代码,将 .NET 执行时间降低 87%!
作者 | STEVE GORDON译者 | 弯月,责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)以下为译文:长期以来,我一直在致力于提高性能,并且努力避免在关键代码路径中进行内存分配。例如…

Ansible基础一Playbook(二)
摘自:http://www.ansible.com.cn/docs/playbooks_intro.htmlHandlers: 在发生改变时执行的操作(当发生改动时)’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions …

sendmail服务器案例配置
Linux/UNIX下的老牌邮件服务器。Sendmail作为一种免费的邮件服务器软件,已被广泛的应用于各种服务器中,它在稳定性、可移植性、及确保没有bug等方面具有一定的特色,且可以在网络中搜索到大量的使用资料。 实验拓扑图: 注ÿ…

网页制作的中的一些工具代码
1. οncοntextmenu"window.event.returnvaluefalse" 将彻底屏蔽鼠标右键 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table2. <body onselectstart"return false"> 取消选取、防止复制3. οnpaste"r…
神经网络其实和人一样懒惰,喜欢走捷径......
作者 | Jrn-Henrik Jacobsen, Robert Geirhos, Claudio Michaelis,深度学习研究专家译者 | Arvin,责编 | 夕颜出品 | CSDN(ID:CSDNnews)以下为译文:人工智能会很快取代放射科医生吗?最近,研究人…

nodejs获取ASP.Net WebAPI(IIS Windows验证)
处理了很多天,终于使用Nodejs可以发出请求至WebAPI,能够正常处理数据了 首先加入npm包 npm install httpntlm 在app.js中加入代码 var httpntlm require(httpntlm); var fs require(fs);var options {url: http://get001.mygroup.com/InstantNoodle_S…

ubb代码转化html代码
ubb代码转化html代码 public static string UbbDecode(string str){str HtmlEncode(str);str Regex.Replace(str, "/[url](?<url>.?)/[/url]", "<a href${url} target_blank>${url}</a>", RegexOptions.Compiled | RegexOptions.Ig…

如何定位EXC_BAD_ACCESS错误 (info malloc-history)
在 iphone 开发中使用内存时,我们经常会遇到 EXC_BAD_ACCESS 的错误。 出现这个错误的原因是我们访问了一个已经被释放掉的对象,如: implementation FeedbackViewController - (void)viewDidLoad {[super viewDidLoad];_scrollView [[UIScro…
一周内咸鱼疯转2.4W次,最终被所有大厂封杀!
(含答案)所有面试资料及技术好文精选文档都整理到网盘了。Java面试官手册需要加微信免费领取Java面试官手册需要加微信免费领取长按扫码或搜索微信号:gh16670101550,免费领取

java 基础知识三 java变量
1、作用域 {} 包围起来的代码称之为代码块,在块中声明的变量只能在块中使用 2、常量 就是固定不变的量,一旦被定义,它的值就不能再被改变。 3、变量 变量必须在程序中被定义(或声明)后才能使用,而且为每个变…
打通语言理论和统计NLP,Transformers/GNNs架构能做到吗?
作者 | Chaitanya K. Joshi译者 | 苏本如,责编 | 夕颜来源 | CSDN(ID:CSDNnews)我的工程师朋友经常问我:图深度学习听起来很棒,但是有没有实际应用呢?虽然图神经网络被用于Pinterest、阿里巴巴和推特的推荐…

艰辛的面向对象
为什么80%的码农都做不了架构师?>>> 所有的操作系统都不是面向对象的。 所有的操作系统都是基于函数的。ANDROID框架里面的好多类也是基于函数的。很多都是静态的方法。这个框架包括两个部分:一是JAVA部分,一是本地类。本地类不…

计算机网络第一课
1.IPv4与IPv6的区别是什么?在windows 7以上系统中,在设置本地IP地址的时候经常会看到同事含有IPV4协议项与IPV6协议项,并不同于以往windows xp系统中仅有TCP/IP协议项,不少朋友都觉得比较奇怪,询问编辑IPv4与IPv6的区别…

常用函数集农历函数
常用函数集农历函数原来是vb代码,重新整理为VB.NET版的,并在VS2003中编译通过Imports System.MathPublic Class UCnCalendarPrivate Structure SolarHolidayStructDim Month As IntegerDim Day As IntegerDim Recess As IntegerDim HolidayName As Strin…
微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣
来源 | 微软研究院AI头条编者按:代码智能(code intelligence)目的是让计算机具备理解和生成代码的能力,并利用编程语言知识和上下文进行推理,支持代码检索、补全、翻译、纠错、问答等场景。以深度学习为代表的人工智能…

Spring从菜鸟到高手(四)(上)使用JdbcTemplate类实现用户登陆验证、批量更新
标签:Spring java JdbcTemplate Spring从菜鸟到高手 绝缘材料原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tonyaction.blog.51cto.com/227462/42042看了我前面几篇文章的朋…

CSS盒模型及边距问题
盒模型是CSS的基石之一,页面的每一个元素都被看作一个矩形框,分别由外边距,边框,内边距,内容组成, 在CSS中,width和height的值指的是内容的宽高,增加外边距,边框…

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets
首先,这两个函数不是C标准库中的函数, int getch(void) //从标准输入读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符。也就是,不带回显。 int getche(void) //从标准输入读入一个字符&…
无限想象空间,用Python玩转3D人体姿态估计
前言姿态估计,一直是近几年的研究热点。它就是根据画面,捕捉人体的运动姿态,比如 2D 姿态估计:再比如 3D 姿态估计:看着好玩,那这玩应有啥用呢?自动驾驶,大家应该都不陌生࿰…

Mac中将delete键定义为删除键
在Mac中,delete键实际是退格键(Backspace),fndelete才是删除键。这也是从Windows转到Mac时不习惯的地方之一。 通过安装DoubleCommand软件可以解决这个问题。安装后,在System Preferences中找到DoubleCommand找打开在E…

CHIL-SQL-MIN() 函数
MIN() 函数 MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name 注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。 SQL MIN() 实例 我们拥有下面这个 "Orders&quo…
Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
毋庸置疑,Python越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员,还是年薪百万的 BATJ 的大牛都无可否认:Python的应用能力是成为一名码农大神的必要项。 所以,很多程序员把Python当做第一语言来学习。 但对于Python…

CSS滤镜详解
CSS滤镜详解 简介〓 设置文字透明层次,模糊效果,给文字加光晕等这些本来要靠图片才能处理的效果,现在CSS可以既简单又快速的把它实现了……接着往下看就知道了。 〓正文〓 语法:STYLE"filter:filtername(fparameter1, fpa…