RetinaNet:Focal Loss for Dense Object Detection(CVPR2018)


文章目录

  • Abstract
    • 北京
    • 发现问题并给出方法
    • 成果
  • Introduction
  • Related Work
    • Robust 评估
  • Focal Loss
    • Balanced Cross Entropy
    • Focal Loss Definition
    • Class Imbalance and Model Initialization
    • Class Imbalance and Two-stage Detectors
  • RetinaNet Detector
  • Experiments
  • Conclusion

hh
源代码

Abstract

北京

迄今为止,精度最高的目标检测器是基于R-CNN推广的两阶段方法,其中分类器应用于候选目标位置的稀疏集。相比之下,应用于对可能的目标位置进行常规、密集采样的单级探测器有可能更快、更简单,但到目前为止还不如两阶段检测器的准确性。

发现问题并给出方法

在本文中,我们调查了为什么会出现这种情况。我们发现,在密集检测器训练过程中遇到的极端前景-背景类不平衡是主要原因我们建议通过重塑标准交叉熵损失来解决这种类不平衡,从而降低分配给分类良好的示例的损失的权重。我们的新Focal Loss将训练集中在一组稀疏的困难示例上,并防止在训练期间大量的简单负样本让检测器失去应有的功效(1T,1000F,全F错误率1/1001)。

成果

为了评估损失的有效性,我们设计并训练了一个简单的密度检测器RetinaNet。我们的研究结果表明,当使用焦损进行训练时,RetinaNet能够匹配先前的一级检测器的速度,同时超过所有现有的最先进的两级检测器的精度。

Introduction

对于两阶段检测器,第一阶段生成候选目标位置的稀疏集第二阶段使用卷积神经网络对每个候选位置提取特征区分前景和背景
我们提出了一种单阶段目标检测器,首次与更复杂的两阶段检测器的最先进的COCO AP相匹配,例如特征金字塔网络(FPN)[20]或Faster R-CNN[28]的Mask R-CNN[14]变体。为了达到这个结果,我们确定训练过程中的类不平衡是阻碍单阶段检测器达到最先进精度的主要障碍,并提出了一个新的损失函数(Focal Loss)来消除这个障碍

(好吧,也没我以为的那么潇洒)类不平衡在类r - cnn检测器中通过两阶段级联和抽样启发式来解决。提案阶段(例如,Selective Search [35], EdgeBoxes [39], DeepMask [24,25], RPN[28])迅速将候选对象位置的数量缩小到少量(例如,1-2k),过滤掉大多数背景样本。在第二个分类阶段,进行抽样启发式,例如固定的前景与背景比例(1:3),或在线硬示例挖掘(OHEM)[31],以保持前景和背景之间可管理的平衡

相比之下,单阶段检测器必须处理更大的候选对象位置集,这些候选对象位置在图像上定期采样。在实践中,这通常相当于枚举密集覆盖空间位置、尺度和纵横比的约100k个位置。虽然也可以应用类似的抽样启发式,但它们效率低下,因为训练过程仍然由易于分类的背景样本主导。这种低效率是目标检测中的一个经典问题,通常通过bootstrapping[33,29]或硬例挖掘[37,8,31]等技术来解决

在本文中,我们提出了一个新的损失函数,作为一个更有效的替代以前的方法来处理类不平衡。损失函数是动态缩放的交叉熵损失,随着正确类别置信度的增加,比例因子衰减到零,见图1

设置γ > 0减少了分类良好的示例(p t > .5)的相对损失,把更多的注意力放在困难的、错误分类的例子上

直观地说,这个比例因子可以在训练过程中自动降低简单示例的权重,并迅速将模型集中在困难示例上。实验表明,我们提出的Focal Loss使我们能够训练一个高精度的单阶段检测器,其性能明显优于使用抽样启发式或硬示例挖掘训练的替代方案,这是先前用于训练单阶段检测器的最先进技术。最后,我们注意到焦点损失的确切形式并不重要,并且我们展示了其他实例可以实现类似的结果

为了证明所提出的焦点损失的有效性,我们设计了一个简单的单级目标检测器RetinaNet,因其在输入图像中对目标位置进行密集采样而命名。它的设计特点是高效的网络内特征金字塔和锚盒的使用。它借鉴了来自[22,6,28,20]的各种最新思想。RetinaNet高效、准确;我们基于ResNet-101- FPN骨干网的最佳模型,在以5 fps运行时实现了39.1的COCO测试开发AP,超过了之前发布的单级和两级检测器的最佳单模型结果,见图2。

Related Work

介绍了下以往的经典检测器、一阶段、二阶段检测器。指出RetinaNet的设计与以前的密集检测器有许多相似之处,特别是RPN[28]引入的“锚”概念以及SSD[22]和FPN[20]中使用的特征金字塔。强调RetinaNet获得的最佳结果不是基于网络设计的创新,而是由于我们的新颖Focal Loss损失

Robust 评估

人们对设计鲁棒损失函数(例如,Huber损失[13])非常感兴趣,该函数通过降低具有大误差的示例(硬示例)的损失权重来减少异常值的贡献。相比之下,我们的焦点损失不是解决异常值,而是通过降低内部值(简单的例子)的权重来解决类别不平衡,这样即使它们的数量很大,它们对总损失的贡献也很小。换句话说,焦点损失执行与鲁棒损失相反的角色:它将训练集中在一组稀疏的硬示例上

Focal Loss

焦点损失是为了解决在训练期间前景和背景类之间存在极端不平衡的单阶段对象检测场景(例如1:1000)。我们从二元分类的交叉熵(cross entropy, CE)损失入手,引入焦损:

在上面,y∈{±1}指定基真类,p∈[0,1]是模型对标签y = 1的类的估计概率。

为了表示方便,我们定义p t:
所以CE(p,y)可以表示为

CE损失如图1中的蓝色(顶部)曲线所示。从图中可以很容易地看出,这种损失的一个显著特性是,即使是容易分类的例子(p t 》0.5)也会带来巨大的损失。当对大量简单的例子求和时,这些小的损失值可能会压倒罕见的类。

Balanced Cross Entropy

解决类失衡的一个常用方法是为类1引入一个加权因子α∈[0,1],为类- 1引入1 - α。在实际应用中,α可以用逆类频率来设定,也可以作为一个超参数,通过交叉验证来设定。为了表示方便,我们像定义p t一样定义α t。我们将α-平衡CE损失写成:

Focal Loss Definition

正如我们的实验将显示的那样,密集检测器训练过程中遇到的大类不平衡压倒了交叉熵损失。容易分类的底片构成了大部分的损失,并主导了梯度。虽然α平衡了积极/消极例子的重要性,但它并不区分简单/困难的例子。因此,我们建议重塑损失函数以降低简单示例的权重,从而将训练重点放在困难的否定上。
我们建议在交叉熵损失中加入一个调制因子(1−p t) γ,可调聚焦参数γ≥0。我们将焦损定义为:
图1显示了γ∈[0,5]的几个值下的焦损。我们注意到焦损的两个特性。(1)当样本被误分类,且p t较小时,调制因子接近1,损失不受影响。当p t→1时,因子趋于0,并且对分类良好的示例的损失是下加权的。(2)聚焦参数γ平滑地调整了简单样例降权的速率。当γ = 0时,FL相当于CE,并且随着γ的增加,调制因子的效果也同样增加(我们发现γ = 2在我们的实验中效果最好)。
直观地,调制因子减少了简单示例的损失贡献,并扩展了示例接收低损失的范围。例如,当γ = 2时,一个分类为p t = 0.9的例子的损失比CE低100倍,当p t≈0.968时,其损失比CE低1000倍。这反过来又增加了纠正错误分类示例的重要性(当p t≤0.5且γ = 2时,其损失最多减少4倍)。
实践中使用α-平衡焦点损失,发现γ=2,α=0.25时效果最好

最后我们注意到损失层结合sigmoid操作实现用损失计算p,使数值稳定性更强

Class Imbalance and Model Initialization

默认情况下,二元分类模型初始化为输出y = - 1或1的概率相等。在这种初始化下,在类不平衡的情况下,由于类的频繁而造成的损失会超过总损失,导致早期训练不稳定为了解决这个问题,我们引入了“先验”的概念,用于在训练开始时对罕见类(前景)的模型估计p值。我们用π表示先验,并将其设置为模型的估计值p(对于该类的例子)慢,例如0.01。我们注意到这是模型初始化的变化(见§4.1),而不是损失函数的变化。我们发现,在严重类不平衡的情况下,这可以提高交叉熵和焦点损失的训练稳定性

Class Imbalance and Two-stage Detectors

两级检测器通常使用交叉熵损失进行训练,而不使用α-平衡或我们提出的损失。相反,他们通过两种机制来解决类别不平衡问题:(1)两阶段级联和(2)有偏差的小批量抽样。第一个级联阶段是一个对象提议机制[35,24,28],它将几乎无限的可能对象位置集减少到一到两千个。重要的是,所选择的建议不是随机的,而是可能对应于真实的对象位置,这消除了绝大多数容易的否定。当训练第二阶段时,偏抽样通常用于构建小批量,例如,包含1:3比例的正样例与负样例。这个比率就像一个隐式的通过抽样实现的α平衡因子。我们提出的焦损是为了在一级检测系统中直接通过损失函数来解决这些机制。

RetinaNet Detector

RetinaNet是由一个骨干网和两个任务子网组成的单一、统一的网络。主干负责计算整个输入图像上的卷积特征映射,是一个离自卷积网络。第一子网对主干网的输出执行卷积对象分类;第二个子网执行卷积边界盒回归。这两个子网的特点是我们专门为单阶段密集检测提出的简单设计,见图3。虽然这些组件的细节有许多可能的选择,但大多数设计参数对实验中显示的精确值并不特别敏感。接下来我们将描述RetinaNet的每个组成部分。
简单来说RetinaNet在ResNet架构上添加了FPN瓶颈,然后分别用分类子网和边界盒回归子网进行分类和回归
RetinaNet使用特征金字塔层p3到p7,其中p3到p5是从对应的ResNet剩余阶段(c3到c5)的输出中使用自上而下和横向连接计算的,p6通过对c5进行3×3步幅2转换获得,p7通过应用ReLU然后对p6进行3×3 stride-2转换来计算。
(1)由于计算原因,我们没有使用高分辨率金字塔级p2
(2) p6是通过跨行卷积而不是下采样计算的
(3)我们包括p7以改进大型目标检测。这些微小的修改提高了速度,同时保持了准确性。

Experiments


Conclusion

在这项工作中,我们认为类不平衡是阻碍单阶段目标检测器超越表现最好的两阶段方法的主要障碍。为了解决这个问题,我们提出了焦点损失,它将调制项(1−p t) γ应用于交叉熵损失,以便将学习集中在硬负例上。我们的方法简单而高效,我们通过设计一个全卷积单级检测器(RetinaNet)来证明其有效性,并报告了广泛的实验分析,表明它达到了最先进的精度和速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的桃花峪滑雪场租赁系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

WebAssembly 的魅力:高效、安全、跨平台(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

JUC并发编程 08——原子操作类

目录 一.原子更新基本类型类 实现原理 二.原子更新数组 三.原子更新引用类型 四.原子更新字段类 Java从JDK1.5开始提供了J.U.C下的atomic包,atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去更新基本类型变量&#xff0…

WebAssembly 的魅力:高效、安全、跨平台(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Unity中的导航系统

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。导航时,只需要给导航物体挂载导航组建,导航物体便…

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据,但还需要给用户去创建账号允许他们登录后才能看展示得数据,那有什么办法让非管理员更方便得去访问Grafana呢?下面介绍两个比较方便实现的: 在开始设置前&#xff…

显示器屏幕oled的性能、使用场景、维护

OLED显示器屏幕具有许多独特的性能和使用场景,以下是关于OLED显示器屏幕的性能、使用场景和维护的详细介绍: 一、性能 色彩鲜艳:OLED显示器屏幕能够呈现出更加鲜艳的色彩,色彩饱和度高,色彩还原性好,可以给…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》…

动物分类识别教程+分类释义+界面展示

1.项目简介 动物分类教程分类释义界面展示 动物分类是生物学中的一个基础知识,它是对动物进行分类、命名和描述的科学方法。本教程将向您介绍动物分类的基本原则和方法,并提供一些常见的动物分类释义。 动物分类的基本原则 动物分类根据动物的形态、…

vue3老项目如何引入vite

vue3老项目如何引入vite 安装 npm install vite vitejs/plugin-vue --save-dev Vite官方中文文档修改package.json文件 在 npm scripts 中使用 vite 执行文件 "scripts": {"serve": "vite","build": "vite build","pr…

听GPT 讲Rust源代码--src/tools(22)

File: rust/src/tools/tidy/src/lib.rs rust/src/tools/tidy/src/lib.rs是Rust编译器源代码中tidy工具的实现文件之一。tidy工具是Rust项目中的一项静态检查工具,用于确保代码质量和一致性。 tidy工具主要有以下几个作用: 格式化代码:tidy工具…

Rust报错:the msvc targets depend on the msvc linker but `link.exe` was not found

当我在我的 windows 电脑上安装 rust,然后用 cargo 新建了一个项目后,cargo run 会报错: error: linker link.exe not found| note: program not foundnote: the msvc targets depend on the msvc linker but link.exe was not foundnote: p…

css学习笔记6(盒子模型)

CSS盒子模型 五、CSS盒子模型1.CSS长度单位2.元素的显示模式3.总结各元素的显示模式4.修改元素显示模式5.盒子模型的组成6.盒子内容区(content)7.关于默认宽度8.盒子内边距(padding)9.盒子边框(border)10.盒…

Apache Flink 进阶教程(七):网络流控及反压剖析

目录 前言 网络流控的概念与背景 为什么需要网络流控 网络流控的实现:静态限速 网络流控的实现:动态反馈/自动反压 案例一:Storm 反压实现 案例二:Spark Streaming 反压实现 疑问:为什么 Flink(bef…

基于Netty构建Websocket服务端

除了构建TCP和UDP服务器和客户端,Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议,可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例,演示如何使用Netty构建一个WebSocket服务器。 项目…

深圳鼎信|输电线路防山火视频监控预警装置:森林火灾来袭,安全不留白!

受线路走廊制约和环保要求影响,输电线路大多建立在高山上,不仅可以减少地面障碍物和人类活动的干扰,还能提高线路的抗灾能力和可靠性。但同时也会面临其它的难题,例如森林火灾预防。今天,深圳鼎信智慧将从不同角度分析…

signaltap立即触发的错误解决方法

signaltap点下run analysis后没有等到触发条件满足就触发了,原因是触发方式设置错误,应修改触发方式: 将Trigger flow control 从State-based 改为Sequential。

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

Jmeter 性能测试 —— 评估一个系统TPS与并发数!

问题&#xff1a;性能压测&#xff0c;如何评估一个系统的TPS和并发数&#xff1f; 1、对于新系统 由业务部门或开发人员预估交易量和TPS指标 可以参考公式&#xff1a;并发用户 在线用户数 * 10%。 当一个系统还没有上线时&#xff0c;我们可以预判的是这个系统准备要给多…