性能超FPN!北大、阿里等提多层特征金字塔网络
作者 | Qijie Zhao等
编译 | 李杰
出品 | AI科技大本营(ID:rgznai100)
特征金字塔网络具有处理不同物体尺度变化的能力,因此被广泛应用到one-stage目标检测网络(如DSSD,RetinaNet,RefineDet)和two-stage 目标检测器(如Mask R-CNN,DetNet)中并取得了很好的性能提升。
尽管这些嵌入了特征金字塔的目标检测网络取得了很好的效果,但它们有一些局限性,因为它们只是根据主干网固有的多尺度结构来构造特征金字塔,而主干网最初是为目标分类任务而设计的。
在目标分类和检测任务上是存在差别的。最明显的,分类任务要求平移不变性,即使目标位置发生移动,输出的类别依然不能变化;检测任务需要平移可变性,当目标位置发生变化时,输出的boundingbox位置也要相应发生变化。
北大、阿里等研究者提出了多层特征金字塔网络(Multi-Level FeaturePyramid Network MLFPN)旨在构造更有效的特征金字塔来检测不同尺度的目标。首先,将主干网络提取的多层特征进行融合,作为基础特征。其次,将基础特征输入到一个交替连接的u型模块和特征融合模块中,并利用每个U型模块的解码器层的输出作为目标检测的特征。最后,将具有相同尺度的解码器层集合起来,构造一个用于目标检测的特征金字塔,其中每个特征图由多个层次的特征组成。
在实验部分,作者将提出的MLFPN嵌入到SSD中,构建了一个新的端到端one-stage目标检测网络M2Det。在COCO数据集上,采用单尺度推理策略,以11.8FPS的速度实现了41.0的AP,多尺度推理策略的AP为44.2,这是one-stage探测器中最佳表现。
引言
不同目标之间的尺度变化是检测任务的一大挑战,通常有两种解决方案供选择:第一种是图像金字塔,为输入图像设置不同尺度的副本,共同输入训练,但是这种设计方式的缺点也显而易见,将会显著增加内存和算力消耗,因此效率不高。第二种是特征金字塔,旨在通过不同尺度的特征融合,得到分辨率和语义信息兼得的特征,与图像金字塔相比,对存储空间和算力的要求更低,而且更容易嵌入到主流的目标检测网络中去。但是特征金字塔网络仍然有自身的不足之处,特征金字塔的设计是根据主干网络结构中的多尺度结构,而这些主干网络实际上是用来进行分类任务的。
如下图所示,SSD直接利用主干网络的两层卷积以及四层经过步长为2的池化后的特征提取层构成,FPN利用由上到下的通路融合深层特征和浅层特征。总体来讲,以上的特征金字塔网络的构造方式存在两个不足。
首先,特征金字塔中的特征层对于目标检测任务来说不够有代表性,因为它们只是简单的根据主干网络的结构而构成,而这些主干网络本身是为目标识别设计的。其次,特征金字塔中的网络,大多数由主干网络中的单一某层提取得到,也就是说,该层特征仅仅包括单层的信息。目标检测包含识别和定位两个子任务,通常来说,深层特征感受野更大,语义信息更丰富,更有利于物体的分类,而浅层特征分辨率更高,更有助于边缘信息的获取,有利于物体的定位。
此外,底层特征更适合描述具有简单外观的物体,而深层特征更适合描述具有复杂外观的物体。在实际生活中,具有相似大小的目标实例的外观可能非常不同。例如,交通灯和远处的人可能有相似的大小,而人的外观要复杂得多。因此,如果金字塔中的每个特征图主要或仅由单层特征组成,将导致检测性能不佳。
本文的目标是构造一个更有效的特征金字塔来检测不同尺度的目标,同时避免现有方法的局限性。首先利用主干网络提取的特征进行融合作为基础特征,然后将其送入一个交替连接的u型模块(TUM)和融合模块(FFM)中提取更具代表性、多层次、多尺度的特征。需要注意的是,在每一个U形模块的解码器部分,特征的深度都是相同的。最后,将相同尺度的特征组合起来,得到最终用于目标检测的特征金字塔。
很显然,形成最终特征金字塔的解码器层比主干中的层要深得多,即更具有代表性。此外,最后的特征金字塔中的每个特征映射由多个层次的解码器层组成。因此,我们称之为多级特征金字塔网络(MLFPN)。
相关工作
为了提升不同尺度目标检测的正确率,有两大类方法。第一类是图像金字塔,即输入图像通过一系列调整大小产生多个副本,以产生语义上具有代表性的多尺度特征。来自不同尺度的输入图像的特征独立的进行预测,最后再进行预测结果的融合,得到最终的结果。尽管获得了性能的提升,但是这种方法是耗时且对存储,算力要求很高,无法做到实时检测。
第二类是从网络的固有层中提取特征构成金字塔来检测目标,此时的输入是一个单尺度的图像。与第一类方法相比,该方法需要的额外内存和计算成本要少得多,因此可以在实时网络的训练和测试阶段进行部署。
本文方法
为了验证本文提出的MLFPN的有效性,作者通过将MLFPN结构嵌入SSD中,设计了一个端到端的one-stage目标检测器M2Det,整体结构如下图所示。M2Det利用主干网络和MLFPN进行特征提取,然后与SSD类似,根据学到的特征,产生密集的bounding box和类别得分,再利用NMS产生最后的位置和类别预测结果。MLFPN包括三个模块:FFM(特征融合模块),TUM(瘦U型模块),SFAM(尺度特征聚合模块)。
总体流程为:FFMv1通过融合主干的特征图将语义信息扩充成基本特征。每一个TUM模块生成一组多尺度的特征,然后通过交替连接的多个TUM和FFMv2模块提取多层次多尺度特征。最后,SFAM模块通过一个尺度级联的特征操作和一个自适应的注意机制将特征聚集到多层次的特征金字塔中。
接下来看每一部分的详细解读:
MLFPN包含三部分,首先,FFMv1融合浅层特征和深层特征,构造出基础特征。其次,几个不同的TUM模块和FFMv2结构交替连接。每个TUM结构产生针对不同尺度的特征图,FFMv2模块将基础特征和上一个TUM输出的最大特征图融合,得到的新的特征作为输入送到下一个TUM模块中去。需要注意的是,由于第一个TUM模块没有先验知识,所以直接学习基础特征。最终输出的多层次多尺度特征通过下式计算得到:
其中Xbase表示基础特征,Xil表示第i个尺度下第l个TUM模块得到的特征,L表示TUM模块的数量,F表示FFM模块。最后,SFAM模块通过尺度级联操作和基于通道域的注意机制来聚合多级多尺度特征。
FFMs(Feature Fusion Module):
在M2Det中,FFM模块融合来自不同层的特征,使用1x1卷积层来压缩输入特征的通道,并使用维度相加操作来聚合这些特征。特别的,FFMv1将主干网络提取的两个不同尺度的特征作为输入,因此需要将深层次的特征先进行上采样,再进行维度的相加,同时,FFMv2模块接收基础特征和上一个TUM模块中的最大特征作为输入,这两个特征尺度是一致的,产生送入下一个TUM模块的融合特征。下图的(a)就是FFMv1操作,(b)是FFMv2操作。
TUMs(Thinned U-shape Module)
与FPN和RetinaNet不同,TUM是利用一个瘦长U型网络构建的,我们知道,U型网络分为编码器和解码器部分,在编码器部分,进行的是一系列步长为2的3x3卷积;解码器部分进行上采样和特征元素求和操作后,添加1x1卷积层,以增强学习能力,保持特征的平滑。每个TUM中解码器部分的输出构成了当前层的多尺度特征。从整体上看,堆叠TUM模块的输出形成了多层次、多尺度的特征,而前面的主要是浅层特征,中向的主要是中层特征,后向的主要是深层特征。
SFAM(Scale-wise Feature Aggregation Module)
SFAM模块的目标是将TUMs生成的多层次多尺度特征聚合成多层次的特征金字塔。第一个步骤就是将不同TUM产生的相同尺度的特征进行通道叠加,叠加后的通道可以表示为:
其中,X表示不同尺度下的特征图,具体表示为:
在这里,聚合特征金字塔的每一个尺度都包含来自不同层的相同尺度特征。
第二个步骤是引入了一个基于通道域的注意力机制来激励特征聚焦在对检测帮助最大的通道,这里引入了SENet的block,在挤压阶段,利用全局池化生成通道信息Z,为了完全捕获信道依赖,下面的激励步骤通过两个全连接层来学习注意力机制:
其中, σ 表示ReLU操作,δ表示Sigmoid。
最后,将得到的激励s与输入X中的通道相乘,得到最终的输出:
SFAM总体结构为下图:
M2Det配置
在训练M2Det网络前,主干网络需要经过ImageNet预训练。MLFPN的所有默认配置包含8个TUM模块,每个TUM有5个卷积块和5个上采样操作,所以它将输出6个尺度的特征。为了减少网络的参数,每个尺度的特征只用256维度,这样也有利于GPUs的训练。在检测阶段,对6个金字塔特征分别添加两个卷积层,分别实现位置回归和分类。在每个像素点设置三种比例,六个anchor,阈值设置为0.05来筛选bounding box。最后利用NMS最小值抑制,进一步筛选。
实验
在MS COCO数据集上的实验
消融实验
由于M2Det是由多个子组件组成的,设计消融实验验证每一个的有效性,以获得最终的性能。基线是一个基于原始SSD的简单检测器,输入尺寸为320×320,实验结果表明,TUM和SFAM均能获得性能提升。
结论
为了提升检测不同尺度的目标的正确率,本文提出了一种多级特征金字塔网络(MLFPN)来构造有效的特征金字塔。MLFPN由几个新的模块组成。首先,采用特征融合模块(FFMv1)作为基本特征,将主干网提取的多层次特征进行融合。然后将基本特征输入交替连接的瘦长u型模组(TUMs)和Fature融合模组(FFMv2s),提取多级多尺度特征。最后,将提取出的具有相同尺度的多层次多尺度特征进行聚合,构建一个特征金字塔,通过一个尺度级特征聚合模块(scale-wise feature Aggregation Module, SFAM)进行目标检测。
论文链接:
https://arxiv.org/abs/1811.04533
GitHub链接:
https://github.com/qijiezhao/M2Det
(*本文为AI科技大本营编译文章,转载请微信联系 1092722531)
◆
精彩公开课
◆
推荐阅读
滴滴开源在2019:十大重点项目盘点,DoKit客户端研发助手首破1万Star
你的 App 在 iOS 13 上被卡死了吗
Hinton、吴恩达们也“吹牛”炒作?媒体和研究人员共谋,AI圈误导信息泛滥
通向人工智能产业落地化的道路在哪?
为什么我们最终抛弃 Chromium 选择了 Firefox ?
如何用Redis实现微博关注关系?
扎心了!互联网公司福利缩水指南
“对不起,我们只招有出色背景的技术人员!”
不用失去控制权和所有权,也能在区块链中通过数据共享获得奖励?
你点的每个“在看”,我都认真当成了AI
相关文章:

什么是WIFI
WIFI全称Wireless Fidelity,又称802.11b标准,它的最大优点就是传输速度较高,可以达到11Mbps,另外它的有效距离也很长,同时也与已有的各种802.11DSSS设备兼容。 WIFI是由AP(Access Point)和无线网卡组成的无线网络。…
Android入门——电话拨号器和4种点击事件
关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路。大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1. 理解需求: *一个文本框——用来接收电话号码 *一个button——用来触发事…

DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2
本文介绍使用Windbg去验证《DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子》中的结论,调试对象是文中刚开始那个例子。(转载请指明出于breaksoftware的csdn博客) 1 g 让程序运行起来 2 ctrlbreak 中断程序 3 ~ 查看…
从入门到深入:移动平台模型裁剪与优化的技术探索与工程实践
可以看到,通过机器学习技术,软件或服务的功能和体验得到了质的提升。比如,我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力,以此改善服务的弹性和稳定性,这是多么美妙。而对移动平台来说&#…

我在不炎熱也不抑鬱的秋天,依然不抽煙
写过几次电影的观后感,挺过瘾.最近看到my little airport的那张新唱片,再也没有办法保持沉默了 为什么人家的唱片名都起的和小说一样,难得是为了证明听歌的人们都不喜欢动笔吗? 于是,我建了个类别,叫 我也会听歌.很明显,这里面会塞一些和歌相关的东西 这是第一篇

ubuntu安装redis的方法以及PHP安装redis扩展、CI框架sess使用redis的方法
为什么80%的码农都做不了架构师?>>> 再一次被网上那些教程误导后决定自己写一个。真心被那些奇怪的教程误导了好几次,之前研究其它东西的时候也是。蛋疼啊。 安装redis 直接用apt-get命令即可 sudo apt-get install redis-server 安装的时候…

浅谈数据库设计技巧
说到数据库,我认为不能不先谈数据结构。1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法。尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,…
避免神经网络过拟合的5种技术(附链接) | CSDN博文精选
作者 | Abhinav Sagar翻译 | 陈超校对 | 王琦来源 | 数据派THU(ID:DatapiTHU)(*点击阅读原文,查看作者更多精彩文章)本文介绍了5种在训练神经网络中避免过拟合的技术。 最近一年我一直致力于深度学习领域。这段时间里,我使用过很多神经网络&a…

DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区。这个论证非常重要,因为它是使其他线程不能进入临界区从而导致死锁的关键。我构造了在DLL被映射到进程地址空间的场景,请看死锁时加载DL…

LinearLayout增加divider分割线
2019独角兽企业重金招聘Python工程师标准>>> 在android3.0及后面的版本在LinearLayout里增加了个分割线 android:divider"drawable/shape"<!--分割线图片--> android:showDividers"middle|beginning|end" <!--分割线位置--> 分割线…

JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇
作者:雷神 QQ:38929568 QQ群:28048051JAVA游戏编程(满) 28047782(将满) 与前一款扫雷比较,这个游戏多了一个 类,用来显示动画,也是蛇要吃的物品类, 也有了代码…

DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因。是否还记得,我们分析了半天汇编才知道在线程中的死锁位置。如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦。那么本文就介绍几个例子,它们会在线程明显的位置…
如何从菜鸡变成收割机,大厂面试的算法,你懂了吗?
是什么?让大厂面试显得逼格很高,是算法和数据结构吗?是的!!!Google工程师曾总结过,大厂之所以爱考察算法和数据结构是因为:算法能力能够准确辨别一个程序员的技术功底是否扎实&#…

Ejabberd源码解析前奏--配置
一、基本配置 配置文件将在你第一次启动ejabberd时加载,从该文件中获得的内容将被解析并存储到内部的ejabberd数据库中,以后的配置将从数据库加载,并且任何配置文件里的命令都会被添加到数据库里。 需要注意的是:ejabberd从不编辑…

DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因。本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题。(转载请指明出于breaksoftware的csdn博客) DllMain的相关特性 首先列出…
滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019
出品 | AI科技大本营(ID:rgznai100)“如果把北京一天滴滴的轨迹数据放在一起,要覆盖北京所有道路差不多四百次,数据非常大、非常完整。”超5.5亿用户,年运送乘客100亿人次,除了中国地区,滴滴也在…

分析部署无线局域网的关键要素
在部署无线局域网时需要考虑的关键问题包括:确定单个接入点的RF覆盖,保证足够的支持所有用户的容量,以及考虑RF信号损耗因素。 单个AP的覆盖 网络设计师必须通过研究AP的服务范围来决定单个AP的覆盖。数据速率是一种距离函数ÿ…

Delphi调用java开发的WebService,传入参数出错
http://www.cnblogs.com/zhangzhifeng/p/3397053.html 调用没有参数的服务正常,当调用有参数的服务出现以下错误java.util.concurrent.ExecutionException: java.lang.NullPointerException 另外加了RIO.HTTPWebNode.UseUTF8InHeader : True;InvRegistry.RegisterInvokeOptions…
B站收藏6.1w+!这门课拯救你薄弱的计算机基础
作者 | Rocky0429来源 | Python空间大家好,我是 Rocky0429,一个对计算机基础一无所知的蒟蒻...作为一个所谓的计算机科班出身的人来说,特别难为情的是自己的计算机基础很差,比如计算机网络当年一度差点挂掉,多亏当时…

一种不会导致资源泄露的“终止”线程的方法
在项目工程中,我们可能会使用第三方开发的模块。该模块提供一个接口用于完成非常复杂和耗时的工作。我们一般不会将该API放在UI线程中执行,而是启动一个线程,用工作线程去执行这个耗时的操作。(转载请指明出于breaksoftware的csdn…

TCP/IP详解学习笔记(9)-TCP协议概述
终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读。前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西。TCP和UDP处在同一层---运输层,但是TCP和UDP最不同的地方是&…

在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎
前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件。同事完成这个逻辑的方案便是在我们程序中加入了一个很“独立”的业务逻辑:检索和删除某个程序产生的废弃文件。试想,该“独立”的逻辑之后会如何?被删掉&a…
优酷智能档在大型直播场景下的技术实践
作者 | 阿里文娱高级技术专家 肖文良 本文为阿里文娱高级技术专家肖文良在【阿里文娱2019双11猫晚技术沙龙】中的演讲,主要内容为如何通过优酷智能档,降低用户卡顿尤其是双11直播场景下,提升用户观看体验。具体包括智能档的落地挑战、算法架…

主题:CS0016: 未能写入输出文件“c:#92;WINDOWS#92;Microsoft.NET#92;***.dll”错误处理...
刚装完.NET环境,在编译时出现了如下错误: 编译器错误信息:CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\***\*****.dll”--“拒绝访问。” 错误的处理: 出现CS0016的原因一般是…

关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片
2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap bm BitmapFactory.decodeResourceStream(res, value, is, pad, opts); 来加载图片,不同他一般不会释放,如果图片太多就崩溃了 不过解决方法就更简…
近期必读的6篇NeurIPS 2019零样本学习论文
来源 | 专知(ID:Quan_Zhuanzhi) 【导读】NeurIPS 是全球最受瞩目的AI、机器学习顶级学术会议之一,每年全球的人工智能爱好者和科学家都会在这里聚集,发布最新研究。NIPS 2019大会已经在12月8日-14日在加拿大温哥华举行,…

在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统
在《在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎》开始处,我提到某公司被指责使用“云命令”暗杀一些软件。本文将讲述如何去模拟一个简易的“云指令”执行系统。(转载请指明出于breaksoftware的csdn博客) 首先我们思考下…

oracle9i.rar下载
甲骨文数据库9I转载于:https://blog.51cto.com/263054/46968

每天一道算法题(24)——自定义幂函数pow
double myPower(double base, int exponent){if(exponent0)return 1;if(exponent1)return base;if(exponent-1)//当为是负数的情况return 1.0/base;double result1.0;resultmyPower(base,exponent>>1);result*result;if(exponent&1)//绝对值为奇数result*base;return…
在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在《在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统》一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序。这是个非常令我们这些C程序员激动的事。但是我们使用ffi库写出来的程序往往比较大,因为我们可…