作者 | 图像所浩南哥

来源 | CSDN博客

论文名称:《 Focal Loss for Dense Object Detection 》

论文下载:https://arxiv.org/pdf/1708.02002.pdf

论文代码:

https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines

一、概述

本文的目的就是为了探讨为什么one-stage detector相比two-stage detector精度要差。

one-stage detector的准确率不如two-stage detector的原因,本文给出的结论是:由样本的 类别不均衡 导致。

在目标检测算法中,对于输入的一张图像,可能会生成成千上万的预选框(region proposal),但是其中只有很少一部分是包含真实目标的,这就带来了类别不均衡问题。

那么类别不均衡会带来两个后果:

(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal;

(2) the easy negatives can overwhelm training and lead to degenerate models.

总的来说,就是无用的易分反例样本会使得模型的整体学习方向跑偏,导致无效学习,即只能分辨出没有物体的背景,而无法分辨具体的物体。负样本数量太大,占总的loss函数输入参数的大部分,而且多是容易分类的,因此使得模型的优化方向(即loss函数的梯度下降方向)并不是我们所希望的那样。

先前也有一些算法来处理类别不均衡的问题,比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句话概括:In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples。OHEM算法虽然增加了错分类(正、负)样本的权重,但是OHEM算法忽略了容易分类的(正)样本。

因此针对类别不均衡问题,作者提出一种新的损失函数:focal loss。

这个损失函数是在标准交叉熵损失基础上修改得到的。这个函数可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本。为了证明focal loss的有效性,作者设计了一个dense detector:RetinaNet,并且在训练时采用focal loss训练。实验证明RetinaNet不仅可以达到one-stage detector的速度,也能有two-stage detector的准确率。

二、算法

首先回顾二分类交叉熵损失:

其中 y 是真实样本的标签(1正0负), y’ 是经过 sigmoid 激活函数的预测输出(数值在0-1之间)。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。

作者由此提出Focal loss函数:

首先在原有的基础上加了一个因子,其中Gamma>0使得减少易分类样本的损失,使得模型更关注于困难的、错分的样本。

例如:Gamma为2时,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍。所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。

在此基础上,再引入一个平衡因子 Alpha,用来平衡正负样本本身的数量比例不均(即类别不均衡):

只添加Alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题,因此针对难分样本的Gamma也必不可少。

这里的两个参数α和γ协调来控制,本文作者采用α=0.25,γ=2效果最好。

Gamma调节简单样本权重降低的速率,当Gamma为0时即为交叉熵损失函数,当Gamma增加时,调整因子的影响也在增加。

三、总结

作者认为one-stage和two-stage的表现差异主要原因是大量前景背景类别不平衡导致,以此提出Focal Loss函数。

作者设计了一个简单密集型网络RetinaNet,采用Focal Loss函数来训练,在保证速度的同时达到了精度最优,验证了效果。

Two-Stage算法,在产生region proposal阶段,通过score筛选和nms筛选过滤掉了大量的负样本,然后在分类、回归阶段又固定了正负样本比例(1:3),或者通过OHEM技巧使得前景和背景相对平衡。类别不平衡的问题并不明显,算法精度得以保证。

One-Stage算法需要产生超大量的预选框,训练被大量负样本所主导,Focal Loss对此种情况卓有成效。

扫码查看原文

▼▼▼

(*本文为AI科技大本营转载文章,转载联系原作者

精彩推荐

2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。6.6 折票限时特惠(立减1400元),学生票仅 599 元!

推荐阅读

  • 支撑亿级用户“刷手机”,百度Feed流背后的新技术装备有多牛?

  • 今日头条李磊等最新论文:用于文本生成的核化贝叶斯Softmax

  • 俄罗斯互联网的BAT

  • 谷歌“夜莺计划”秘密采集数百万美国人健康隐私;联发科首款7nm产能的5G芯片;2019年天猫双11落幕,最终成交额2684亿……

  • 云计算软件生态圈:摸到一把大牌

  • 女明星因自拍瞳孔倒影暴露住址惨遭跟踪,一张照片是怎么出卖你?

  • 90 后技术宅研发 Magi 一夜爆红,新一代知识化结构搜索新时代来了?

  • 我在做开源芯片 | 人物志

  • 你点的每个“在看”,我都认真当成了AI

剖析Focal Loss损失函数: 消除类别不平衡+挖掘难分样本 | CSDN博文精选相关推荐

  1. ECCV18 | 无监督难分样本挖掘改进目标检测

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 大量训练数据有助于目标检测系统性能的提升,对于已经训练好的系统而言,有研究发现,那些被系统误分类的少量" ...

  2. Focal Loss升级:让Focal Loss动态化,类别极端不平衡也可以轻松解决

    学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 尽管最近长尾目标检测取得了成功,但几乎所有的长尾目标检测器都是基于两阶段范式开发的.在实践中,一阶段检测器在行业中更为普遍 ...

  3. Focal Loss升级 E-Focal Loss让Focal Loss动态化,类别极端不平衡也得到提升

    尽管最近长尾目标检测取得了成功,但几乎所有的长尾目标检测器都是基于两阶段范式开发的.在实践中,一阶段检测器在行业中更为普遍,因为它们有一个简单和快速的Pipeline,易于部署.然而,在长尾情况下,这 ...

  4. Focal Loss损失函数(超级详细的解读)

     什么是损失函数?        1.什么是损失呢? 在机器学习模型中,对于每一个样本的预测值与真实值的差称为损失. 2.什么是损失函数呢? 显而易见,是一个用来计算损失的函数.它是一个非负实值函数, ...

  5. 深度学习难分样本挖掘(Hard Mining)

    来源:深度学习这件小事 本文约1500字,论文复现了一遍建议阅读5分钟 本文为你介绍关于难分样本的挖掘,如何将难分样本抽取出来. 最近看了几篇文章关于难分样本的挖掘,如何将难分样本抽取出来,通过训练, ...

  6. Focal loss 损失函数详解

    Focal loss 目前目标检测的算法大致分为两类,One Stage .Two Stage. One Stage:主要指类似YOLO.SGD等这样不需要region proposal,直接回归的检 ...

  7. Spring 框架之 AOP 原理深度剖析!|CSDN 博文精选

    作者 | GitChat 责编 | 郭芮 出品 | CSDN 博客 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构 ...

  8. 从 Android 6.0 源码的角度剖析 Binder 工作原理 | CSDN 博文精选

    在从Android 6.0源码的角度剖析Activity的启动过程一文(https://blog.csdn.net/AndrExpert/article/details/81488503)中,我们了解 ...

  9. boost any 实现万能容器_全面剖析 C++ Boost 智能指针!| CSDN 博文精选

    作者 | .NY&XX 责编 | 屠敏 出品 | CSDN 博客 为什么要使用智能指针 C++没有提供类似JAVA的垃圾回收机制,因此Boost可以通过智能指针来管理内存避免一些问题.C++继 ...

最新文章

  1. layui一个表格中怎么接两个接口的值_layer学习笔记之table表格引入数据实现分页...
  2. 鸿蒙系统手机mate40,鸿蒙系统来了!华为Mate40首批,2年前手机将被淘汰
  3. 解决mysqlAccess denied for user'root'@'IP地址'问题
  4. Minimize the Permutation CodeForces - 1256(贪心)
  5. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码
  6. [原创]K8_C段旁注工具6.0 新增SMB漏洞扫描
  7. mysql 5.5.22.tar.gz_MySQL 5.5.22源码编译安装
  8. 关于分辨率和地图打印的一些问题
  9. 学会java基础能找工作吗?
  10. vagrant 常用的几个命令
  11. 隔离 docker 容器中的用户-------分享链接
  12. 使用 AppFuse 的七个理由学习
  13. 手把手教你从AVI转RMVB的压制全程(转)
  14. 数字媒体概论——视频
  15. 模电实验报告:单级共射放大电路
  16. 多项式计算的Horner方法
  17. ionic 构建 Cannot load gulp tasks: Error: Error in module: .\gulpfile.js:
  18. 两台笔记本相连是不是计算机网络,打扰一下,如何将两台笔记本电脑的屏幕连接在一起?...
  19. setUp和tearDown
  20. windows10许可证即将过期怎么办_Windows 7 时代即将终结!

热门文章

  1. android TextView里边实现图文混配效果
  2. 怎样使一个Android应用不被杀死?(整理)
  3. 屏蔽“网页上有错误”提示,屏蔽java script 错误的代码
  4. mysql字段定义成text类型的严重影响查询性能
  5. Dubbo常见面试题及答案汇总1000道(春招+秋招+社招)
  6. 《数据科学家养成手册》第九章信息论
  7. python isdigit()
  8. mysql查看当前实时连接数
  9. 字符串类型String总结
  10. linux环境下搭建osm_web服务器一(Postgresql配置及osm2pgsql原始数据导入):