热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

目标检测算法YOLOF:YouOnlyLookOnelevelFeature

文介绍CVPR2021接收的目标检测论文YouOnlyLookOne-levelFeature。 原论文作者来自:中科院自动化所、中科院大学人工智能学院、中国科学院脑科学与智能技术

文介绍 CVPR 2021 接收的目标检测论文 You Only Look One-level Feature。

 原论文作者来自:中科院自动化所、中科院大学人工智能学院、中国科学院脑科学与智能技术卓越创新中心、旷视科技。

0 动机 

在高性能的目标检测网络中,特征金字塔网络(Feature Pyramid Network,FPN)是一个不可或缺的组成部分。作者认为FPN主要有2个作用:

其一是多尺度特征融合,提高了特征的丰富程度;

其二是使用分治法(divide-and-conquer),将目标检测任务按照目标尺寸不同,分成若干个检测子任务。

为了探索FPN的上述2个作用对检测器性能的贡献程度,作者做了一个实验,作者将检测器抽象成如下图所示个3个组成部分


编码器(Encoder)处理Backbone提取的特征,将处理结果传输给解码器(Decoder)用于分类和回归。

FPN可以看作一个MiMo(Multiple-in-Multiple-out)编码器,作者还设计了SiMo(Single-in-Multiple-out)、MiSo(Multiple-in-Single-out)、SiSo(Single-in-Single-out)编码器,这4种编码器的结构如下图所示:


上图中图(a)就是RetinaNet中的FPN,方框左侧的C3、C4、C5代表Backbone输出的特征,方框右侧的P3~P7代表传入Decoder的特征。 

分别使用图(b)、(c)、(d)中的结构代替RetinaNet中的FPN,使用ResNet-50作为RetinaNet中的Backbone,分别训练4个网络并在COCO验证集上测试,结果如下图所示:
从上图中可以看出,使用MiMo和SiMo作为编码器,性能相近;使用MiSo和SiSo作为编码器,性能较差。这种现象说明了如下问题:

相比于MiMo,SiMo只使用Backbone输出的C5特征作为输入,使用SiMo作为编码器构建的网络性能基本与MiMo相当,说明Backbone输出的C5已经包含了足够的信息用于构建高性能检测器;

相比于MiMo和SiMo,使用单一输出的MiSo和SiSo作为编码器构建的网络性能较差,说明使用“分治法”将目标检测问题以目标尺寸为依据分解为多个子问题,对于构建高性能网络的贡献很大。

通过上述实验可知,使用Backbone输出的单一特征和分治法,即上图中图(b)的结构,就可以构建一个很好的检测网络。但是使用图(b)的结构会使得模型变庞大和复杂,因为编码器要输出多个特征。

基于上述发现,作者提出了YOLOF(You Only Look One-level Feature)网络,在YOLOF中,编码器只用到了Backbone输出的C5特征,同时避免使用上图中图(b)的SiMo复杂结构,而是使用了图(d)的SiSo结构以减少计算量。

使用MiMo(即FPN)的RetinaNet、使用SiSo的RetinaNet和使用SiSo的YOLOF的计算量、帧率和在COCO数据集上的精度如下图所示:


Decoder和Encoder是有强耦合关系的,因此Decoder的结构受Encoder输出特征的影响,所以作者将Decoder和Encoder的计算量叠加在一起显示。

上图中的4个模型均使用ResNet-50作为Backbone,FLOPs是在COCO验证集上前100张图片中将图片短边尺寸resize成800个像素计算得到,FPS是在2080Ti GPU上测量,设置batch size为1,使用Detectron2里面的测量工具,C表示Encoder和Decoder使用的通道数量。

从上图可以看出,使用SiSo的RetinaNet在运行速度上优于使用MiMo的RetinaNet,但是精度比较低;而作者提出的YOLOF网络同样使用了SiSo的Encoder,在保持高帧率的同时拥有高精度。


1 使用Dilated Encoder模块代替FPN 

依前文所述,使用SiSo替代MiMo会引起较大的性能损失,作者认为,SiSo Encoder只使用了Backbone中的C5特征作为输入,而C5特征的感受野所对应的目标尺寸范围是受限的,无法应对目标检测场景中变化剧烈的目标尺寸。如下图所示:


上图中绿色的点表示数据集中的多种目标尺寸,粉红色的区域代表特征能够有效表达的目标尺寸范围,使用C5特征作为输入的SiSo Encoder,会发生上图中图(a)所示的情况。

若使用空洞卷积(Dilated Convolution)操作以增大C5特征的感受野,则会发生上图中图(b)所示的情况,感受野变大,能够有效地表达尺寸较大的目标,但是对小目标表达能力变差。

作者提出了一个SiSo Encoder的新结构,将其称作Dilated Encoder,该结构能够融合多种尺寸的感受野,从而能检测尺寸变化范围大的多种目标,达到上图中图(c)所示的效果。

Dilated Encoder的结构如下图所示:


从上图中可以看出,Dilated Encoder将Backbone输出的C5特征作为输入,使用1x1卷积减少通道数目,接着使用3x3卷积精炼语义信息,紧接着是4个连续的空洞残差单元(Dilated Residual Block),这4个空洞残差单元中3x3卷积的dilation rate不一定相等。

使用4个连续的空洞残差单元可以在one-level feature中包含具有多种不同感受野的特征,以应对不同的目标尺寸。

2 解决positive anchor不均匀问题  

在RetinaNet中,如果某个anchor和目标的ground truth的最大IoU超过0.5,则该anchor为positive anchor,作者将这种选取positive anchor的方法称作Max-IoU Matching。

由于RetinaNet的Encoder使用了MiMo结构,预定义的anchor数量很多,使用Max-IoU可以在multi-level上选择和目标尺寸匹配的positive anchor,因而可以产生大量的positive anchor。

YOLOF的Encoder使用了SiSo结构,相比于使用MiMo结构的RetinaNet,预定义的anchor数量会少很多,若使用Max-IoU Matching选择positive anchor,ground truth尺寸大的目标产生的positive anchor要多于ground truth尺寸小的目标产生的positive anchor,如下图所示,这种现象会导致网络在训练时更关注大尺寸的目标,忽略小尺寸目标。


为了解决positive anchor对于目标尺寸分布不均匀的问题,作者提出了Uniform Matching方法:对于每个目标,都将和该目标ground truth最近的k个anchor作为该目标的positive anchor,从而保证每个目标都有相同数量的positive anchor,如上图所示,保证网络训练时能兼顾尺寸大小不同的目标。

在实际应用中,为了避免一些极端情况,忽略Uniform Matching方法中产生的与ground truth的IoU大于0.7的negative anchor和与ground truth的IoU小于0.15的positive anchor。


3  YOLOF网络结构 

基于上述方法,作者构建了YOLOF网络,其结构如下图所示:


下面依次介绍YOLOF网络的Backbone、Encoder和Decoder。


3.1 Backbone
作者分别使用了ResNet和ResNeXt这2种Backbone实现YOLOF,Backbone使用了在ImageNet数据集上预训练的模型。对于Backbone的输出,作者实现了2个版本,其一为相对于输入图像采样率为32、通道数2048的feature map,即网络结构图中的C5;

其二为相对于输入图像采样率为16、通道数为2048的feature map,即网络结构图中的DC5。


3.2 Encoder
使用上文介绍的Dilated Encoder作为YOLOF的Encoder。Dilated Encoder将Backbone输出的特征作为输入,首先使用1x1卷积和3x3卷积减少特征通道数至512,然后使用4个连续的残差模块提取特征。

在每个残差模块中,首先使用1x1卷积将特征通道数减少至原来1/4,然后使用3x3的空洞卷积增大感受野,最后使用1x1卷积将特征通道数扩充4倍。4个残差模块中空洞卷积的dilation rate分别为2、4、6、8。


3.3 Decoder
Decoder部分与RetinaNet中的设置类似,主要有如下2个区别:

在回归分支中包含4个Conv-BN-ReLU操作,在分类分支中包含2个Conv-BN-ReLU操作;

回归分支中的每个anchor都有一个objectness prediction,最终的分类得分由分类分支的输出乘以objectness prediction得到。


4  实验

YOLOF使用8个GPU在COCO训练集上训练,batch size为64,优化器为synchronized SGD,推理时使用的NMS阈值为0.6。

作者将YOLOF与RetinaNet进行对比,训练完成后,在COCO验证集下测试,结果如下图所示,图中schedule为“1x”的模型在训练时将输入图片的最短边设置为800个像素,且最长边不超过1333个像素。


上图中最上面一组为使用了Detectron2中的设置训练的RetinaNet;中间一组为使用了与YOLOF一致的设置训练的RetinaNet,比如使用generalized IoU去衡量回归损失,在检测头中使用GN替代BN等;

最后一组为YOLOF的测试结果,表中的YOLOF使用ResNet-50作为Backbone,YOLOF-R101使用ResNet-101作为Backbone,YOLOF-X101使用ResNeXt-101-64x4d作为Backbone。上图中的最后两行分别表示多尺度训练单尺度测试和多尺度训练多尺度测试的结果。

为了与DETR合理对比,YOLOF模型使用了多尺度训练方式,在COCO验证集上进行测试,与DETR对比的实验结果如下图所示:


由于YOLOv4在训练时使用了数据增强和3阶段的训练方法,为公平对比YOLOF同样使用了上述方法训练,并且将Dilated Encoder中残差模块的数量增加至8个,8个残差模块中空洞卷积的dilation rate为1、2、3、4、5、6、7、8。

使用CSPDarkNet-53作为Backbone,使用Backbone输出的DC5特征,使用LeakyReLU替代Encoder和Decoder中的ReLU,在COCO测试集上的实验结果如下图所示:


图中的FPS是按照YOLOv4的测试方法得到的,即将卷积层和BN层融合且将模型转换为半精度模型,进行FPS的测量。 

5  总结 

通过实验分析了FPN成功的最重要原因,即使用分治法(divide-and-conquer)解决目标检测问题;

提出Dilated Encoder结构用来提取多尺寸感受野的特征,替代了FPN,减小了模型复杂度和计算量;

使用Uniform Matching方法解决positive anchor在尺寸不同的目标上分布不均匀的问题;

以Dilated Encoder代替RetinaNet中的FPN模块,构建了YOLOF,并通过实验证明了YOLOF的高效性。

源码:https://github.com/megvii-model/YOLOF

论文:You Only Look One-level Feature



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
author-avatar
手机用户2502905381
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有