当前位置: 首页 > 编程日记 > 正文

丢弃Transformer,FCN也可以实现E2E检测

作者 | 王剑锋

来源 | 知乎CVer计算机视觉专栏

我们基于FCOS,首次在dense prediction上利用全卷积结构做到E2E,即无NMS后处理。我们首先分析了常见的dense prediction方法(如RetinaNet、FCOS、ATSS等),并且认为one-to-many的label assignment是依赖NMS的关键。受到DETR的启发,我们设计了一种prediction-aware one-to-one assignment方法。此外,我们还提出了3D Max Filtering以增强feature在local区域的表征能力,并提出用one-to-many auxiliary loss加速收敛。我们的方法基本不修改模型结构,不需要更长的训练时间,可以基于现有dense prediction方法平滑过渡。我们的方法在无NMS的情况下,在COCO数据集上达到了与有NMS的FCOS相当的性能;在代表了密集场景的CrowdHuman数据集上,我们的方法的recall超越了依赖NMS方法的理论上限。

整体方法流程如下图所示:

One-to-many vs. one-to-one

自anchor-free方法出现以来,NMS作为网络中最后一个heuristic环节,一直是实现E2E dense prediction的最大阻碍。但其实我们可以发现,从RPN、SSD、RetinaNet等开始,大家一直遵循着这样一个流程:先对每个目标生成多个预测(one-to-many),再将多个预测去重(many-to-one)。所以,如果不对前一步label assignment动刀,就必须要保留去重的环节,即便去重的方法不是NMS,也会是NMS的替代物(如RelationNet,如CenterNet的max pooling)。

那直接做one-to-one assignment的方法是否存在呢?其实是有的。上古时代有一个方法叫MultiBox,对每个目标和每个预测做了bipartite matching,DETR其实就是将该方法的网络换成了Transformer。此外还有一个大家熟知的方法:YOLO,YOLO也是对每个目标只匹配一个grid[1],只不过它是采用中心点做的匹配,而且有ignore区域。

Prediction-aware one-to-one

于是接下来的问题就是,在dense prediction上我们能不能只依赖one-to-one label assignment,比较完美地去掉NMS?我们首先基于去掉centerness分支的FCOS,统一网络结构和训练方法,用Focal Loss + GIoU Loss,做了如下分析实验:

我们设计了两种hand-crafted one-to-one assignment方法,分别模仿RetinaNet(基于anchor box)和FCOS(基于center点),尽可能做最小改动,发现已经可以将有无NMS的mAP差距缩小到4个点以内。

但我们认为手工设计的label assignment规则会较大地影响one-to-one的性能,比方说center规则对于一个偏心的物体就不够友好,而且在这种情况下one-to-one规则会比one-to-many规则的鲁棒性更差。所以我们认为规则应该是prediction-aware的。我们首先尝试了DETR的思路,直接采用loss做bipartite matching的cost[2],发现无论是绝对性能还是有无NMS的差距,都得到了进一步的改善。

但我们知道,loss和metrics往往并不一致,它常常要为优化问题做一些妥协(比如做一些加权等等)。也就是说,loss并不一定是bipartite matching的最佳cost。因而我们提出了一个非常简单的cost:

看起来稍微有点复杂,但其实就是用网络输出的prob代表分类,网络输出和gt的IoU代表回归,做了加权几何平均,再加一个类似于inside gt box的空间先验。加权几何平均和空间先验我们后面都分别做了ablation。

这就是我们提出的POTO策略,它进一步地提升了无NMS下的性能,也侧面验证了loss并不一定是最好的cost[3]。但从Table 1中我们也发现了,POTO的性能依旧不能匹敌one-to-many+NMS组合。我们认为问题出在两个方面:

  1. one-to-one需要网络输出的feature非常sharp,这对CNN提出了较严苛的要求(这也是Transformer的优势);

  2. one-to-many带来了更强的监督和更快的收敛速度。

我们分别用3D Max Filtering和one-to-many auxiliary loss缓解如上问题。


3D Max Filtering

针对第一点,我们提出了3D Max Filtering,这基于一个intuition(paper中没有提到):卷积是线性滤波器,学习max操作是比较困难的。此外,我们在FCOS上做了实验,发现duplicated predictions基本来自于5×5的邻域内,所以最简单的做法就是在网络中嵌入最常见的非线性滤波器max pooling。另外,NMS是所有feature map一起做的,但网络在结构上缺少层间的抑制,所以我们希望max pooling是跨层的。

如Figure 3所示,这个模块只采用了卷积、插值、max pooling 3d,速度非常快,也不需要写cuda kernel。

One-to-many auxiliary loss

针对第二点监督不够强、收敛速度慢,我们依旧采用one-to-many assignment设计了auxiliary loss做监督,该loss只包含分类loss,没有回归loss。assignment本身没什么可说的,appendix的实验也表明多种做法都可以work。这里想提醒大家的是注意看Figure 2的乘法,它是auxiliary loss可以work的关键。在乘法前的一路加上one-to-many auxiliary loss,乘法后是one-to-one的常规loss。由于1*0=0,1*1=1,我们只需要大致保证one-to-one assignment的正样本在one-to-many中依然是正样本即可。

实验

最主要的实验结果已经在Table 1中呈现了,此外还有一些ablation实验。

这里highlight几点:

  1. α越低,分类权重越大,有无NMS的差距越小,但绝对性能也会降低[4];α太高也不好,我们后续所有实验用α=0.8;

  2. 在α合理的情况下,空间先验不是必须的,但空间先验能够在匹配过程中帮助排除不好的区域,提升绝对性能;我们在COCO实验中采用center sampling radius=1.5,在CrowdHuman实验中采用inside gt box[5];

  3. 加权几何平均数(Mul)[6]比加权算术平均数(Add)[7]更好。

去掉NMS的最大收益其实是crowd场景,这在COCO上并不能很好地体现出来。所以我们又在CrowdHuman上做了实验如下:

请注意CrowdHuman的ground-truth做NMS threshold=0.6,只有95.1%的Recall,这也是NMS方法的理论上限。而我们的方法没有采用NMS,于是轻易超越了这一上限。

我们还做了其它一些实验和分析,欢迎看原文。


可视化

经过以上改进,我们成功把one-to-one的性能提升到了与one-to-many+NMS方法comparable的水平。我们可视化了score map,可以发现FCN是有能力学出非常sharp的表示的,这也是很让我们惊奇的一点。

结果图中比较明显的改善出现在多峰case上。比如两个物体有一定的overlap(但又没有特别重合),这个时候one-to-many+NMS方法经常出现的情况是,除了两个物体分别出了一个框之外,在两个物体中间也出了一个框,这个框与前两个框的IoU不足以达到NMS threshold,但置信度又比较高。这类典型的多峰问题在POTO中得到了较大的缓解。

Others

有些人可能比较关心训练时间,因为潜意识里在dense prediction上做bipartite matching应该是很慢的。然而实际上依赖于scipy对linear_sum_assignment的优化,实际训练时间仅仅下降了10%左右。

如果对这一时间依然敏感,可以用topk(k=1)代替bipartite matching;在dense prediction里top1实际上是bipartite matching的近似解[8]。相似地,k>1的情况对应了one-to-many的一种新做法,我们组也对此做了一些工作,后续可能会放出来。

顺便打一波广告:对旷视研究院BaseDetection组感兴趣的同学可以发简历到wangjianfeng@megvii.com,组里目前主要在做目标检测、自监督等方向。

参考

  1. 如果有人感兴趣的话,可以在YOLO上去掉NMS尝试一下,可以接近30mAP。

  2. 注意我们这里没有使用DETR的CE+GIoU+L1组合,而是直接采用loss本身(Focal+GIoU)。我们认为这样更符合DETR用loss做cost的原意。

  3. 其实这里可以有一个脑洞留给大家,因为cost是不需要求导的,所以甚至是可以直接算AP当cost的。

  4. 侧面印证了分类和回归的冲突在检测任务上是显著的。

  5. 理由很简单,CrowdHuman的遮挡问题太严重,center区域经常完全被遮挡。

  6. 事实上加权几何平均数的负对数就是CE+IoU Loss,加权算术平均数则没有明显的物理含义。

  7. NoisyAnchor在assign中采用了类似的公式,只不过采用的是anchor IoU。

  8. 更具体来讲,top1(即argmin)是Hugarian Algorithm只做第一次迭代的结果;由于在dense prediction下冲突会很少,一次迭代就已经逼近了最优匹配,这也是为什么Hungarian Algorithm这里实际运行很快。

链接:

https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2012.03544

代码:

github.com/Megvii-BaseD(内部代码迁移+审查中,后续放出)

更多精彩推荐

相关文章:

Linux命令基础--uname

uname 显示系统信息 语 法:uname [-amnrsvpio][--help][--version] 补充说明:uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。 参 数: -a或-all 详细输出所有信息,依次为内核名称,主机名&am…

FEC之我见一

顾名思义,FEC前向纠错,根据收到的包进行计算获取丢掉的包,而和大神沟通的结果就是 纠错神髓:收到的媒体包冗余包 > 原始媒体包数据 直到满足 收到的媒体包 冗余包 > 原始媒体包数据 则进入恢复模式,恢复出…

改变Repeater控件中按钮颜色

昨晚有在论坛看到一帖&#xff0c;手上的工作一直忙到现在&#xff0c;Insus.NET现在抽点时间尝试实现它。 Insus.NET没有使用数据库作为数据源&#xff0c;而是使用List<T>作为数据源。因此你在这篇博文中学到很多有关泛型的知识。另外Insus.NET使用CheckBoxList来替代多…

CSDN湘苗培优,遇见更好的自己

CSDN 湘苗培优报名火热进行中&#xff01;JOIN US号外&#xff01;号外&#xff01;“湘苗培优”报名火热进行中&#xff01;????????????????????????为什么要报名“湘苗培优”只要你想学&#xff0c;这里有CSDN技术认证、企业导师零距离技术交流求职…

两个无序单链表,排序后合并成一个有序链表

两个无序单链表&#xff0c;排序后合并成一个有序链表算法思想&#xff1a;用冒泡法&#xff0c;对链表1和2进行排序&#xff0c;对排序后的两个链表&#xff0c;从小到大进行循环&#xff0c;装入链表3中。#include<stdio.h>#include<stdlib.h>struct stud/*定义链…

FEC之我见三

继续上文讲解&#xff1a; 3&#xff09;标准的RTP头结构如下所示&#xff1a; 其中第一个字节中的x标志位是否扩展了RTP头&#xff0c;RTP协议允许用户自定义的扩展&#xff0c;扩展的字段紧挨上述RTP固定头。RTP扩展投中承载如下信息&#xff1a;1).当前包所在的Group组序号&…

集体智慧及其常用算法

集体智慧定义是指由许多的个体通过合作与竞争中所显现出来的智慧&#xff0c;集体智慧是一种共享的或者群体的智能。它是从许多个体的合作与竞争中涌现出来的。集体智慧在细菌、动物、人类以及计算机网络中形成&#xff0c;并以多种形式的协商一致的决策模式出现。常用算法如下…

带你「周游世界」的 MODNet 算法

来源 | Jack Cui责编 | 晋兆雨头图 | CSDN下载自视觉中国最近又有一个算法火了&#xff0c;不知道你们看到没&#xff1f;直接看效果&#xff01;效果这么稳定的人像 Image Matting 算法真的不多&#xff0c;并且还能进行实时处理&#xff01;处理视频、图像&#xff0c;不在话…

ASP.NET格式化日期

1.绑定时格式化日期方法: <ASP:BOUNDCOLUMN DATAFIELD "JoinTime " DATAFORMATSTRING "{0:yyyy-MM-dd} " > <ITEMSTYLE WIDTH "18% " > </ITEMSTYLE &g…

docker的网络架构配置

http://xiaorenwutest.blog.51cto.com docker 网络架构模默认情况下&#xff0c;容器可以建立到外部网络的连接&#xff0c;但是外部网络无法连接到容器。Docker 允许通过外部访问容器或容器互联的方式来提供网络服务外部访问容器:容器中可以运行一些网络应用&#xff0c;要让外…

【官方福利】CSDN内测师限时申请,参与赢年末礼包

各位程序猿们都下载CSDN官方出品的插件了吧&#xff1f;什么&#xff1f;还有不知道插件是什么的同学&#xff1f;&#xff1f;你错过了太多&#xff01;更酷更高效的浏览器插件&#xff0c;一键万能操作&#xff0c;新标签页极简个性&#xff0c;让你的工作效率UP UP UP&#…

Sql年月日计算方法

通常&#xff0c;你需要获得当前日期和计算一些其他的日期&#xff0c;例如&#xff0c;你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割&#xff08;年、月、日等&#xff09;&#xff0c;然后仅仅用分割出来的年、月、日等放在几…

读《每天懂一点成功概率学》

概率出现某种结果的数量/出现所有结果的数量 所谓“数学概率”&#xff0c;就是理论上计算出来的概率&#xff0c;例如抛硬币时&#xff0c;只有正面和反面两种结果&#xff0c;因此正面出现的概率就是1/2。 另一方面&#xff0c;我们反复抛硬币&#xff0c;根据实际结果计算出…

AV1时代要来了,超高清视频时代视频编码技术的机遇与挑战

近些年随着视频行业的迅猛发展&#xff0c;尤其像短视频、点播、直播、VR等领域的爆发&#xff0c;人们对于高清、超高清视频体验的追求越来越强烈&#xff0c;流媒体平台如何在提升观众观看体验&#xff0c;同时降低播放成本&#xff0c;利用技术降低带宽消耗的同时又能最大化…

敏捷软件开发(c#版)文摘

第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP 第9章 OCP 第10章 LSP 第11章 DIP 第12章 ISP 第13章 C#程序员UML概观 第三部分 薪水支付案例研究 第四部分 打…

asp.net 2.0 中GridView里设置日期格式

在asp.net 1.0 中的datagrid 中 设置日期字段格式时用 DataFormatString"{0:yyyy-MM-dd}"即可。在gridview 中设置短日期格式 使用<asp:BoundField HeaderText"发表时间" DataField"PostTime" DataFormatString"{0:yyyy-MM-dd}" &g…

springboot初学

首先苦于用ssh、ssm来搭建一个项目&#xff0c;这个基础搭建工作就大概要用半天的功夫才能弄好&#xff0c;想到就头疼&#xff0c;后面听了实验室一位大神的建议&#xff0c;用springboot啊&#xff0c;简单的不止一点点。就顺便学习了下这个神器&#xff0c;果然厉害。 有一次…

Exchange 2013与OWA13集成

好久没发新文章了&#xff0c;因为工作变动的原因&#xff0c;实在抱歉&#xff0c;今天给大家分享先office web app 2013怎么和最新的Exchange 2013进行集成使用吧&#xff0c;这点还是蛮有特色的&#xff0c;因为我们改变以往在OWA中预览Office的效果&#xff0c;我们先看看默…

判断一个string是否可以为数字

方案一&#xff1a;Try...Catch(执行效率不高)/// <summary>/// 名称&#xff1a;IsNumberic/// 功能&#xff1a;判断输入的是否是数字/// 参数&#xff1a;string oText&#xff1a;源文本/// 返回值&#xff1a; bool true:是 false:否/// </summary>/// <…

CSDN湘苗培优|火热报名中

湘苗培优火热报名中CSDN高校俱乐部在这里&#xff0c;你能获得CSDN技术认证与企业导师零距离技术交流参与线下技术沙龙活动求职简历指导参与项目交付并有机会企业内推现在报名即可选择由企业支付学费的订单式培养&#xff0c;或入职后再支付学费等多种付费模式&#xff0c;Z大程…

安装配置Emacs-rails

首先你的机器上肯定要安装emacs啦&#xff0c;此步略过不表。1、从 http://rubyforge.org/projects/emacs-rails 下载最新emacs-rails&#xff0c;解压文件到~/.emacs.d/rails 目录2、根据README&#xff0c;你需要下载三个依赖库&#xff1a;cd ~/.emacs.d/rails wget http://…

实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化

来源 | 早起Python大家好&#xff0c;在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序&#xff0c;很多本文将迎合热点&#xff0c;延续上次的NBA爬虫GUI&#xff0c;探讨如何爬取虎扑NBA官网数据&#xff0c;并且将数据写入Excel中同时自动生成折线图&#xff0c;主要…

删除SQL数据库中事务日志方法

DUMP TRANSACTION [数据库名] WITH NO_LOG BACKUP LOG [数据库名] WITH NO_LOG DBCC SHRINKDATABASE([数据库名])

新浪微博应用 IE下面框架嵌套框架的问题解决

新浪微博应用 IE下面框架嵌套框架的问题分为两种&#xff1a;1、回调的参数有误&#xff1b;2、session丢失&#xff1b;第一个问题&#xff0c;需要亲们仔细研读接口文档&#xff0c;App.AuthDialog.show({client_id : <?php echo $this->getParam(sub_appkey);?>,…

corosync+pacemaker+crm简单配置

# 系统 centos7.2 安装版本都是Yum源node1: 192.168.8.111 node2:192.168.8.112 vip :192.168.8.200nfs :192.168.8.113 # 互信~] ssh-keygen~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys~]# chmod go .ssh/authorized_keys~]# scp -p .ssh/i…

给AI系统做“安全体检”,阿里安全提出自动化AI对抗平台CAA | AAAI 2021

出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;安全人员曾为某车企自动驾驶系统做过一次安全测试&#xff0c;用物理对抗攻击欺骗Autopilot车道检测系统&#xff0c;导致汽车在Autopilot不发出警告的情况下驶入错误车道。假如这是一场真实的攻击&#xf…

linux新建文件权限问题

touch /etc/init.d/httpdchmod 755 /etc/init.d/httpdtouch可以新建一个空文件&#xff0c;可以修改文件的创建时间。比如&#xff1a;编译时看到提示文件的时间为将来的时间&#xff0c;可以使用touch命令来修改。Linux chmod 755和chmod 777 在linux终端先输入ls -al,可以看到…

基于MMSeg算法的中文分词类库

最近在实现基于lucene.net的搜索方案&#xff0c;涉及中文分词&#xff0c;找了很多&#xff0c;最终选择了MMSeg4j&#xff0c;但MMSeg4j只有Java版&#xff0c;在博客园上找到了*王员外*(http://www.cnblogs.com/land/archive/2011/07/19/mmseg4j.html )基于Java版的翻译代码…

关于git bush 中不能复制黏贴的问题

如果你是一个新手的话&#xff0c;在你使用个git的过程中&#xff0c;你会发现git 竟然不能复制黏贴&#xff0c;这简直是完全不能忍受的事&#xff0c;复制黏贴可以大大的节省了我们敲代码的时间&#xff0c;特别是在github中clone别人的仓库到本地&#xff0c;url地址需要一个…

linux系统proc目录进程信息详解

Proc 文件系统是一个实时的&#xff0c;常驻内存的文件系统&#xff0c;它跟踪进程在你机器上的运行情况和你系统的状态。/proc文件系统是常驻虚拟内存并且维持着操作系统的动态数据。大部分的 /proc文件系统信息被实时更新来与当前操作系统的状态一致。/proc文件系统的内容能被…