我爱计算机视觉 标星,更快获取CVML新技术

本文转载自知乎,经作者授权转载,请勿二次转载。

https://zhuanlan.zhihu.com/p/68786098

Paper link:

http://openaccess.thecvf.com/content_iccv_2017/html/Lin_Focal_Loss_for_ICCV_2017_paper.html

Code link:

https://github.com/fizyr/keras-retinanet

2017的ICCV中,Kaiming He大神风光一时无两,Mask R-CNN是best paper,此外FAIR的RetinaNet拿下best student paper。纵观RetinaNet论文本身,在网络结构部分并没有颠覆,之所以能够拿到best student paper,可见在其他方面的过人之处,今天我们就较为详细的探讨一下这篇论文。文章中说, RetinaNet是第一次,有一个one-stage的目标检测框架,实现和FPN,Mask R-CNN匹敌的AP 。

以R-CNN系列为代表的two-stage目标检测方法在精度上已经表现很好,这类网络模型分两个步骤进行目标检测,首先选择出所有的候选区域,然后针对每个候选区域进行分类和回归。

但成也萧何败也萧何,在取得高精度的同时,two-stage的方法不能保证速度。于是另外一条道路one-stage被开辟出来,直接在原图上进行区域划分,暴力的进行分类和回归预测,这种更简单粗暴的办法在速度上加快了不少,但也正是因为不够精细,在最后的结果表现上一直落后于two-stage方法。

深究一下,到底是什么原因造成了这种精度的损失呢?一个主要原因是正负样本的不平衡,以YOLO为例,每个grid cell有5个预测,本来正负样本的数量就有差距,再相当于进行5倍放大后,这种数量上的差异更会被放大。

因此,本文基于交叉熵损失函数,提出了新的分类损失函数Focal loss,该损失函数通过抑制那些容易分类样本的权重,将注意力集中在那些难以区分的样本上,有效控制正负样本比例,防止失衡现象。

为了验证Focal loss的有效性,设计了一个叫RetinaNet的网络进行评估。实验结果表明,RetinaNet能够在实现和one-stage同等的速度基础上,在精度上超越所有(2017年)two-stage的检测器,如下图是在COCO数据集上的实验结果:

在two-stage的检测器中,为了实现正负样本的比例均衡,不至于整个训练过程被负样本“淹没”,一般采取抽样的方法,将正负样本比例控制在1:3,采用OHEM,在正负样本间保持合理的比例。

但是传统的one-stage不行,因为one-stage是暴力粗糙的,他只有一个阶段,产生的候选相比two-stage要大得多,在实践中,通常需要大约100K个位置,这么多的位置,想想就头疼,更让人抓狂的是,这里面你真正需要的样本,少之又少。

那么我们进行抽样不行吗?杯水车薪,因为即使你抽样了,最后在训练过程中,你会惊奇的发现,整个过程还是被大量容易区分的负样本,也就是背景主导。因此,本篇论文提出了一个新的损失函数来对付类别不平衡。

如下图所示,focal loss是一个动态缩放的交叉熵损失,一言以蔽之,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将loss的重心快速聚焦在那些难区分的样本上,而实验同样表明,相比较OHEM,sampling heuristics这些方法,focal loss更胜一筹,在以ResNet-101-FPN为backbone的RetinaNet中,AP达到了39.1,速度在5fps。

下面着重说一下Focal loss

Focal loss的起源是二分类交叉熵CE,它的形式是这样的:

关于交叉熵的解释,在我另一篇文章《关于faster r-cnn的一些思考》中有详细说明,如果你想了解更多,点我跳转

在(1)式中,y的取值有1和-1两种,代表前景和背景。p的取值范围是[0,1],是模型预测的属于前景的概率,为了表示方便,定义一个Pt,如下所示:

综合(1)(2)就可以得到:

CE曲线是下图中的蓝色曲线,可以看到,相比较其他曲线,蓝色线条是变化最平缓的,即使在p>0.5(已经属于很好区分的样本)的情况下,它的损失相对于其他曲线仍然是高的,也许你会说,它相对于自己前面的已经下降很多了,对,是下降很多了,然后呢?看似每一个是微不足道,但是当数量巨大的易区分样本损失相加,就会主导你的训练过程。

Balanced Cross Entropy

那怎么解决类不平衡呢?常见的思想是引入一个权重因子 α ,α ∈[0,1], 当类标签是1是,权重因子是 α ,当类标签是-1时,权重因子是1- α 。同样为了表示方便,用αt表示权重因子,那么此时的损失函数被改写为:

Focal Loss Definition

(3)式解决了正负样本的比例失衡问题(positive/negative examples),但是这种方法仅仅解决了正负样本之间的平衡问题,并没有区分简单还是难分样本(easy/hard examples),那么怎么去抑制容易区分的负样本的泛滥呢?不然整个训练过程都是围绕容易区分的样本进行,而被忽略的难区分的样本才是训练的重点。这时需要再引入一个调制因子,公式如下:

γ 也是一个参数,范围在[0,5],观察(4)式子可以发现,当Pt趋向于1时,说明该样本比较容易区分,整个调制因子是趋向于0的,也就是loss的贡献值会很小;如果某样本被错分,pt很小,那么此时调制因子是趋向1的,对loss没有大的影响(相对于基础的交叉熵),参数 γ 能够调整权重衰减的速率。还是下面这张图,当 γ =0的时候,FL就是原来的交叉熵CE,随着 γ 的增大,调整速率也在变化,实验表明,在 γ =2时,效果最佳

上述两小节分别解决了正负样本不平衡问题和易分,难分样本不平衡问题,那么将这两个损失函数组合起来,就是最终的Focal loss:

看一下(5)式,它的功能可以解释为:通过 αt 可以抑制正负样本的数量失衡,通过 γ 可以控制简单/难区分样本数量失衡。关于focal loss,有以下结论:

1、无论是前景类还是背景类, pt 越大,权重 (1-pt)r 就越小。也就是说easy example可以通过权重进行抑制;

2、 at 用于调节positive和negative的比例,前景类别使用 at 时,对应的背景类别使用 1-at ;

3、 r 和 at 的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。作者在论文中给出 r =2、 at =0.25时,ResNet-101+FPN作为backbone的结构有最优的性能。

介绍完focal loss,接下来再介绍一下验证focal loss的网络结构RetinaNet

首先,RetinaNet是一个由一个backbone和两个子网络组成的统一目标检测网络。backbone的主要作用是通过一系列卷积操作得到整张输入图像的feature map。两个子网分别基于输出的feature map进行目标分类和位置回归。整体网络结构如下图所示:

相比原版的FPN,RetinaNet的卷积过程用的是ResNet,上采样和侧边连接还是FPN结构。通过主干网络,产生了多尺度的特征金字塔。然后后面连接两个子网,分别进行分类和回归。总体来看,网络结构是非常简洁的,作者的重心并不是网路结构的创新,而是验证focal loss的有效性。

这里着重说一下anchor,这里anchor的设置类似于RPN中的结构,先看一下RPN是如何设置的:

anchor是在原图中的,对于feature map上的每一个点,利用滑窗,在原图上产生3种尺寸,每种尺寸3个长宽比的anchor,这样,一个点就会有9个anchor。对于每一个anchor,接入两个子网,分别进行1x1x18维卷积和1x1x36维卷积,这样,在分类子网,输出的是每一个anchor的前背景得分,一个点9个anchor,那么一个点就有18维度输出;

说回到RetinaNet中,在FPN的P3-P7中分别设置32x32-512x512尺寸不等的anchor,比例设置为{1:2, 1:1, 2:1}。每一层一共有9个anchor,不同层能覆盖的size范围为32-813。对每一个anchor,都对应一个K维的one-hot向量(K是类别数)和4维的位置回归向量。

与RPN相比,RetinaNet的anchor增加了多类别预测并且调整了相应的阈值。具体来说,如果一个anchor与某个GT的IOU>0.5,就认定为正样本,如果IOU在[0,0.4)之间,认定为背景。每个anchor至多用来检测一个GT,在K维标签中,将该GT对应的标签设置为1,其余归0。如果一个anchor的IOU在[0.4,0.5)之间,那么在训练时将会被忽略。位置回归计算的是anchor和某个对应GT的坐标偏移。接下来详细介绍一下两个子网:

Classification Subnet:

分类子网对A个anchor,每个anchor中的K个类别,都预测一个存在概率。如下图所示,对于FPN的每一层输出,对分类子网来说,加上四层3x3x256卷积的FCN网络,最后一层的卷积稍有不同,用3x3xKA,最后一层维度变为KA表示,对于每个anchor,都是一个K维向量,表示每一类的概率,然后因为one-hot属性,选取概率得分最高的设为1,其余k-1为归0。传统的RPN在分类子网用的是1x1x18,只有一层,而在RetinaNet中,用的是更深的卷积,总共有5层,实验证明,这种卷积层的加深,对结果有帮助。

Box Regression Subnet

与分类子网并行,对每一层FPN输出接上一个位置回归子网,该子网本质也是FCN网络,预测的是anchor和它对应的一个GT位置的偏移量。首先也是4层256维卷积,最后一层是4A维度,即对每一个anchor,回归一个(x,y,w,h)四维向量。注意,此时的位置回归是类别无关的。分类和回归子网虽然是相似的结构,但是参数是不共享的。

看一下实验部分

Focal loss的威力还是很大的,当然我觉得FPN+ResNet也有加成哦!

目标检测专业交流群

关注最新最前沿的目标检测技术,欢迎加入52CV-目标检测专业交流群,扫码添加CV君拉你入群(如已为CV君好友,请直接私信, 不必重复添加 ),

( 请务必注明:目标检测 ):

喜欢在QQ交流的童鞋可以加52CV官方QQ群: 702781905 。

(不会时时在线,如果没能及时通过还请见谅)

长按关注 我爱计算机视觉

retinanet 部署_再谈RetinaNet相关推荐

  1. 无处 不在的无线智能——6g 的关键驱动与研究挑战_再谈6G

    原标题:再谈6G 2020年行将结束,随着5G网络的建设推进,以及3GPP R16版本的冻结,越来越多的人将关注焦点转移到6G身上. 7月14日,韩国三星电子发布了白皮书<下一代超连接体验> ...

  2. 总线制和多线制示意图_再谈总线制与多线制的区别

    再谈总线制与多线制的区别 作者:大鹏 日期:2019-04-29 07:25:58 浏览:3007 关于火灾自动报警系统总线制与多线制的问题(其实就消防其他一些报警.预警系统也存在,本质是一样的),笔 ...

  3. 调用另一个cpp的变量_再谈条件变量—从入门到出家

    再谈条件变量-从入门到出家 C语言--条件变量 条件变量是在线程中以睡眠的方式等待某一条件的发生: 条件变量是利用线程间共享的全局变量进行同步的一种机制: 一个线程等待"条件变量的条件成立& ...

  4. java 修改源码_再谈给应用程序diy启动画面和java源代码补丁修改

    再谈给应用程序diy启动画面和java源代码补丁修改 2006-8-21 16:18 6365 再谈给应用程序diy启动画面和java源代码补丁修改 2006-8-21 16:18 6365 搞diy ...

  5. 再谈RetinaNet

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自知乎,经作者授权转载,请勿二次转载. https://zhuanlan.zhihu.com/p/68786098 Paper link: ht ...

  6. retinanet 部署_目标检测RetinaNet_飞桨-源于产业实践的开源深度学习平台

    目标检测-RetinaNet 类别 计算机视觉(PaddleCV) 应用 图像搜索 安防监控 自动驾驶 智慧城市 机器人视觉 模型概述 经典的一阶段框架,由ResNet主干网络.FPN结构.和两个分别 ...

  7. java数组去重_再谈JavaScript数组去重

    JavaScript的数组去重是一个老生常谈的话题了.随便搜一搜就能找到非常多不同版本的解法. 细想一下,这样一个看似简单的需求,如果要做到完备,涉及的知识和需要注意的地方着实不少. 定义重复(相等) ...

  8. pca 矩阵 迹_再谈协方差矩阵之主成分分析PCA

    上次那篇文章在理论层次介绍了下协方差矩阵,没准很多人觉得这东西用处不大,其实协方差矩阵在好多学科里都有很重要的作用,比如多维的正态分布,再比如今天我们今天的主角--主成分分析(Principal Co ...

  9. queryrunner带参数的构造函数和不带参数的构造函数有什么区别_再谈构造函数、原型、原型链之间的关系...

    前言 构造函数.原型.原型链作为ES5的内容,已经是老生常谈的问题了.首先说说为什么要再次拿起这个话题去说呢?这几天有空我会看一些源码,这些源码的底层实现考虑到兼容性还是来源于ES5,很多方法的封装以 ...

最新文章

  1. 数据流通实现“可用不可见”?腾讯巧夺“天工”
  2. Mysql主从和redis集群哪个好_Redis的三种模式:主从、哨兵、集群
  3. GCD dispatch_semaphore
  4. iframe去掉滚动条
  5. HYSBZ1061题解
  6. 空间说说html,适合发空间说说的经典心情短语
  7. 企业网络工程设计——局域网中的冗余链路
  8. html+默认ie11,IE11浏览器设置默认浏览器的方法
  9. IPC之消息队列(Message Queue)
  10. 【测试】转行软件测试没有项目经历怎么办
  11. 电脑声音图标显示正常却没有声音,扬声器显示未插入
  12. 电脑术语中:directory 和 folder 的区别
  13. java类的使用方法小结_JavaPoet的使用指南小结
  14. 电影级视觉特效插件:Red Giant VFX Suite for mac
  15. 计算机网络复习笔记 之协议相关
  16. 我的世界红石音乐高级教程 python辅助制作工具
  17. c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出
  18. SSL证书怎么购买?
  19. fabric-ca服务构建及证书生成
  20. 21句话入门机器学习

热门文章

  1. ubuntu服务器网站备份,用 Ubuntu 建立 Time Machine 备份服务器
  2. 【高校宿舍管理系统】第十一章 学生系统
  3. Mysql数据库-面试题
  4. iOS内存管理的知识梳理
  5. 【转】真正理解ViewState
  6. deepin Linux vscode 配置C++环境
  7. linux学习之路(1)
  8. Cas单点登录配置数据查询用户
  9. 控制台异常:Could not connection
  10. Zookeeper和etcd比较