深度学习500问——Chapter08:目标检测(6)

文章目录

8.3.7 RetinaNet


8.3.7 RetinaNet

研究背景

  • Two-Stage 检测器(如Faster R-CNN、FPN)效果好,但速度相对慢。
  • One-Stage 检测器(如YOLO、SSD)速度快,但效果一般。

作者对one-stage检测器准确率不高的问题进行探究,发现主要问题在于正负类别不平衡(简单-难分类别不均衡)。

We discover that the extreme foreground-background class imbalance encountered during training of dense detectors is the central cause

作者建议通过重新设计标准的交叉熵损失(cross entropy loss)来解决这种类别不平衡(class inbalance)问题,即提出Focal Loss。

We propose to address this class imbalance by reshaping the standard cross entropy loss such that it down-weights the loss assigned to well-classified examples. Our novel Focal Loss focuses training on a sparse set of hard examples and prevents the vast number of easy negatives from overwhelming the detector during training.

结合Focal Loss的one-stage检测器称为RetinaNet ,该检测器在COCO上mAP可以和特征金字塔网络(feature pyramid network,FPN)或者Mask R-CNN接近。

问:什么是类别不均衡(class inbanlance)?

答:负样本的数量大于正样本的数量,比如包含物体的区域(正样本)很少,而不包含物体的区域(负样本)很多。比如检测算法在早期会生成一大波的bbox。而一幅常规的图片中,顶多就那么几个object。这意味着,绝大多数的bbox属于background。

问:样本的类别不均衡会带来什么问题?

答:由于大多数都是简单易分的负样本(属于背景的样本),使得训练过程不能充分学习到属于那些有类别样本的信息;其次简单易分的负样本太多,可能掩盖了其他有类别样本的作用(这些简单易分的负样本仍产生一定幅度的loss,见下图蓝色曲线,数量多会对loss起主要贡献作用,因此就主导了梯度的更新方向,掩盖了重要的信息)。

This imbalance causes two problems: (1) training is inefficient as most locations are easy negatives that contribute no useful learning signal; (2) en masse, the easy negatives can overwhelm training and lead to degenerate models.

简单来说,因为bbox数量爆炸。正是因为bbox中属于background的bbox太多了,所以如果分类器无脑地把所有bbox统一归类为background,accuracy也可以刷的很高。于是乎,分类器的训练就失败了。分类器训练失败,检测精度自然就降低了。

问:为什么在two-stage检测器中,没有出现类别不平衡(class inbalance)问题?

答:因为通过RPN阶段可以减少候选目标区域,而在分类阶段,可以固定前景和背景比值(foreground-to-background ratio)为1:3,或者使用OHEM(online hard example mining)使得前景和背景的数量达到均衡。

RetinaNet 有哪些创新点

概述:

  • New Loss:提出Focal Loss函数解决class inbalance

FL(p_t) = -(1 - p_t)^\gamma \log(p_t)FL(t) = -(1 - pt)^\gamma \log(pt)

  • New detector:RetinaNet = ResNet + FPN + Two sub-networks + Focal Loss

Focal Loss更加聚焦在困难样本(hard examples)上的训练。

将Focal Loss与ResNet-101-FPN backbone结合提出RetinaNet(one-stage检测器),RetinaNet在COCO test-dev上达到39.1mAP,速度为5FPS。

RetinaNet检测器与当时最佳的其他检测器进行比较,无论是速度上还是准确率上都是最佳:

详解:

作者提出一种新的损失函数,思路是希望那些hard examples对损失的贡献变大,使网络更倾向于从这些样本上学习。

作者以二分类为例进行说明:

  • 交叉熵函数CE

首先我们常使用的交叉熵损失函数:

上式中,y=+1或者y=-1。p\in [0,1]是y=+1的概率。作者定义pt为:

注:对交叉熵函数不了解的,可以参考:https://blog.csdn.net/chaipp0607/article/details/73392175

  • 均衡交叉熵函数

要对类别不均衡问题对loss的贡献进行一个控制,即加上一个控制权重即可,最初作者的想法即如下这样,对于属于少数类别的样本,增大\alpha即可。

但这样有一个问题,它仅仅解决了正负样本之间的平衡问题,并没有区分易分/难分样本,按作者的话说:

While α balances the importance of positive/negative examples, it does not differentiate between easy/hard examples. Instead, we propose to reshape the loss function to down-weight easy examples and thus focus training on hard negatives.

问:为什么公式(3)只解决正负样本不均衡问题?

答:增加了一个系数\alpha t,跟pt的定义类似,当label=1的时候,\alpha t=a;当label=-1的时候,\alpha t=1-a,a的范围也是0到1。因此,可以通过设定a的值(一般而言加入1这个类的样本数比-1这个类的样本数多很多,那么a会取0到0.5来增加-1这个类的样本的权重)来控制正负样本对总的loss的共享权重。

  • Focal Loss

作者一开始给交叉熵损失函数添加modulating factor:(1-pt)^ \gamma (1-pt)\gamma

显然,样本越易分,pt就越大(pt→1),modulating factor趋近于0,则贡献的loss就越小,同样地,样本越难分,其pt就越小,modulating factor接近于1,则贡献的loss不受影响。

问:为什么pt越大,FL值越小?

答:根据公式(4)可知,FL与log(pt)中的pt成反比,与1-pt成正比,因此FL与pt的关系成反比。者是交叉熵的基本性质。当pt很大时(接近于1),FL值很小;而当pt很小时(接近于0),FL值会很大。

注:这里有个超参数-focusing parameter \gamma

\gamma放大了modulating factor的作用。

举原文中的一个例子,当pt=0.9时,带有modulating factor的focal loss是CE loss的100分之一,即进一步减小了正确分类的损失。

For instance, with \gamma= 2, an example classified with pt = 0.9 would have 100× lower loss compared with CE and with pt ≈ 0.968 it would have 1000× lower loss. This in turn increases the importance of correcting misclassified examples (whose loss is scaled down by at most 4× for pt ≤ .5 and \gamma = 2).

在实际中,作者采用如下公式,即综合了公式(3)和公式(4)的形状,这样既能调整正负样本的权重,又能控制难易分类样本的权重:

这里的两个参数\alpha\gamma来控制,在实验中a的选择范围也很广,一般而言,当\gamma增加的时,a需要减小一点,本文作者采用\alpha =0.25\gamma=2效果最好。

  • RetinaNet Detector

RetinaNet是由backbone网络和两个特殊任务的子网络(subnet)组成(属于one-stage检测器)。Backbone用来计算feature map;第一个子网络用来object classification,第二个子网络用来bounding box regression。

  • Feature Pyramid Network Backbone

Anchor

Classification Subnet

Box Regression Subnet

RetinaNet结构注意内容:

  1. 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
  2. 测试时FPN每一级只选取score最大的1000个example来做nms;
  3. 整个结构不同层的head部分(上图中的c和d部分)共享参数,但分类和回归之间的参数不共享;
  4. 分类分支的最后一级卷积的bias初始化成前面提到的-log(1-\pi )/\pi

作者:张磊_0503 链接:Focal Loss for Dense Object Detection解读 - 简书 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

实验结果

Tabel1 是关于 RetinaNet和Focal Loss的一些实验结果。

(a)是在交叉熵的基础上加上参数a,a=0.5就表示传统的交叉熵,可以看出当a=0.75的时候效果最好,AP值提升了0.9。

(b)是对比不同的参数\gammaa的实验结果,可以看出是随着\gamma的增加,AP提升比较明显。

(d)通过和OHEM的对比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。这里的OHME 1:3表示在通过OHEM得到的minibatch上强制positive和negative样本的比例为1:3,通过对比可以看出这种强制的操作并没有提升AP。

(e)加入了运算时间的对比,可以和前面的Figure2结合起来看,速度方面也有优势!注意这里RetinaNet-101-800的AP是37.8,当把训练时间扩大1.5倍同时采用scale jitter,AP可以提高到39.1.这就是全文和 table2中的最高的39.1AP的由来。

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

QT:label标签的使用

文章目录 设置不同格式的文本显示图片文本对齐/自动换行/缩进/边距 设置不同格式的文本 在文本格式中,存在富文本,makedown格式的文本,还有纯文本,下面就依据这三个进行举例 #include "widget.h" #include "ui_w…

缩小COCO数据集

在运行YOLOS模型的过程中,需要使用到COCO2017这个数据集,但从实验运行来看,其所需时间无疑是相当漫长,预计可能需要近几十天才能完成,因此便考虑缩小COCO数据集大小,即尽可能在遵循其分布的情况下&#xff…

导游讲解口才技巧心得体会总结(3篇)

导游讲解口才技巧心得体会总结(3篇) **篇:提升表达力,传递独特魅力 在导游工作中,口才技巧的重要性不言而喻。通过不断的实践和反思,我深刻体会到提升表达力对于导游工作的重要性。一个清晰、生动、有趣的…

【c++】继承学习(一):继承机制与基类派生类转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来学习继承部分 目录 1.继承的概念和定义继承的定义继承基类成员的访问方式变化 2.基类和派生类对象赋值转换3.继承中的作用域 1.继承的概念和定义 …

OSPF实验系列---3.综合实验

OSPF的综合实验 实验拓扑及要求如下 实验分析 1.R4为ISP,进行IP配置,区域0为公网区域,配置IP地址 2.做MGRE,R3为中心站点,形成Hub-Spoke 3.子网划分 4.私网互通,NAT转换 5.做特殊区域,修改hel…

【C++】STL简介

🔥个人主页: Forcible Bug Maker 🔥专栏: C 目录 前言什么是STL?STL的历史STL的版本STL六大组件STL的优缺点STL的优点:STL的缺点: 如何学习STL结语 前言 本篇博客主要内容:STL简介。…

01.本地工作目录、暂存区、本地仓库三者的工作关系

1.持续集成 1.持续集成CI 让产品可以快速迭代,同时还能保持高质量。 简化工作 2.持续交付 交付 3.持续部署 部署 4.持续集成实现的思路 gitjenkins 5.版本控制系统 1.版本控制系统概述2.Git基本概述3.Git基本命令 2.本地工作目录、暂存区、本地仓库三者的工作关系…

AD如何从外部导入外框或修改外框大小

一、从外部导入外框 1、从cad中导出dxf文件,从AD中导入导出的文件 2、可参考如下参数设置 3、导入确认后,选择外边框线(选择一条边的线然后按Tab键可快速选择) 4、到设计-板子形状中选择“按照选择对象定义” 5、板子外形已经出来…

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路,分别为5路呼叫显示电路和8路抢答器电路,包含Multisim仿真原文件,为掌握FPGA做个铺垫。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 一、5路呼叫显…

前端工程化05-初始前端工程化Node基本介绍安装配置基础知识

6、初始前端工程化 6.1、工程化概述 虽然前几篇我的目录标题写的前端工程化,但是那些东西并不属于前端工程化的内容,更倾向于是js、jq当中的东西,下面我们将接触真正的前端工程化。 前端工程化开发其实现在是离不开一个东西的,…

观察者模式实战:解密最热门的设计模式之一

文章目录 前言一、什么是观察者模式二、Java实现观察者模式2.1 观察者接口2.2 具体观察者2.3 基础发布者2.4 具体发布者2.5 消息发送 三、Spring实现观察者模式3.1 定义事件类3.2 具体观察者3.3 具体发布者3.4 消息发送 总结 前言 随着系统的复杂度变高,我们就会采…

文件与IO基础常识知识

在这里,只介绍理论知识,不介绍代码。 目录 1.IO 1.1.字面概念 1.2.输入输出模型 2.文件 2.1.文件目录 2.2.文件路径 2.3.文件分类 1.IO 为了我们接下来学习的文件IO,所以我们先来认识什么是IO。 1.1.字面概念 (1&#x…

本地基于知识库的大模型的使用教程

本地基于知识库的大模型的使用教程 启动 双击 大模型启动.bat文件,内容如下: cmd /k "cd /d G:\Anaconda3\Scripts && activate.bat && cd /d D:\docdb_llm && conda activate python3.11 && python startup.py…

MFC 列表控件删除实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例(源码下载) 》 2、程序功能选中列表控件某一项,删除按钮由禁止变为可用,点击删除按钮,选中的项将删除。 3、首先在主界面添加一个删除参数按钮。 4、在myDlg.cpp 文件…

STM32的TIM输入捕获和PWMI详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. IC输入捕获 2. 频率测量 3. 主模式、从模式、触发源选择 4. 输入捕获基本结构 5. PWMI模式 6. 代码示例 6.1 PWM.c 6.2 PWM.h 6.3 IC.c 6.4 IC.h 6.5 完整工程文件 输出比较可以看下面这篇…

python报错SyntaxError

如果报这个错, 在你的相应的demo.py文件首行输入下面的,可以多试一下,之后就好了。 这个解决方法也是参考其他大佬的做法,不知道为什么python中#是注释,这个也会起作用。 然后就神奇的发现问题解决了。发现下面的代码…

window系统安装MySQL

MySQL的安装和配置 根据不同的系统平台,MySQL由不同安装方式和安装包。 官方下载对应的安装包 官网:www.mysql.com 下载地址:MySQL :: Download MySQL Community Server (Archived Versions) window系统 一、安装包(Windows…

进位计数制

目录 前言 最古老的计数方法 十进制数 推广:r 进制计数法 任意进制->十进制 二进制<->八进制,十六进制 十进制->任意进制 真值和机器数 总结: 前言 本篇文章我们正式进入第二章:数据的表示和运算,通过第一章的学习我们知道了现代计算机的结构 那数据如何…

华为OD机试 - 会议室占用时间段(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

✔ ★Java项目——设计一个消息队列(五)【虚拟主机设计】

虚拟主机设计 创建 VirtualHost实现构造⽅法和 getter创建交换机删除交换机创建队列删除队列创建绑定删除绑定发布消息 ★路由规则1) 实现 route ⽅法2) 实现 checkRoutingKeyValid3) 实现 checkBindingKeyValid4) 实现 routeTopic5) 匹配规则测试⽤例6) 测试 Router 订阅消息1…