【目标检测】18、RetinaNet:Focal Loss for Dense Object Detection

2023-11-04

在这里插入图片描述

论文:Focal Loss for Dense Object Detection

代码:https://github.com/facebookresearch/Detectron

出处:原始论文出自 ICCV2017

贡献:

  • 发现了单阶段和双阶段目标检测器的效果差距所在,即正负样本不平衡
  • 提出了 Focal loss 来解决样本不平衡的问题
  • 在 COCO test 上使用 ResNet-101-FPN 达到了 39.1 AP,5fps,是第一个超越双阶段检测器的单阶段检测器

一、背景

在当时的情况下,两阶段检测器处于统治地位,两阶段检测器是由两部分构成,第一阶段是 RPN 网络,进行候选框的生成,第二阶段输出检测结果。

作者提出了一个问题:单阶段目标检测器能否达到类似的效果?

YOLO、SSD 等方法是属于单阶段目标检测的方法,虽然很快,但效果不尽如意

本文作者就想寻找一个单阶段目标检测器,能够又快又好的解决目标检测任务

作者提出单阶段目标检测器和两阶段目标检测器效果差异的最重要原因:正负样本不平衡

  • 两阶段检测器:使用 RPN 网络来生成候选框,大约保留 1-2k,该网络能区分正负样本,保留下更多的正样本,过滤掉大量的背景样本,来保持前景和背景的样本均衡(如 1:3)
  • 单阶段检测器:在特征图上均匀的部署很多 anchor,大约 100k 左右,大量的都是负样本

二、方法

为了解决上述正负样本不平衡问题,作者提出了一个新的 loss 函数——focal loss,来处理样本不平衡问题,曲线如图 1 所示。

2.1 Focal loss

在one-stage检测算法中,目标检测器通常会产生 10k 数量级的框,但只有极少数是正样本,会导致正负样本数量不平衡以及难易样本数量不平衡的情况,为了解决这一问题提出了focal loss。

Focal Loss是为one-stage的检测器的分类分支服务的,它支持 0 或者 1 这样的离散类别label。

目的是解决样本数量不平衡的情况:

  • 正样本loss增加,负样本loss减小
  • 难样本loss增加,简单样本loss减小

一般分类时候通常使用交叉熵损失:

C r o s s _ E n t r o p y ( p , y ) = { − l o g ( p ) , y = 1 − l o g ( 1 − p ) , y = 0 Cross\_Entropy(p,y)= \begin{cases} -log(p), & y=1 \\ -log(1-p), & y=0 \end{cases} Cross_Entropy(p,y)={log(p),log(1p),y=1y=0

为了解决正负样本数量不平衡的问题,我们经常在二元交叉熵损失前面加一个参数 α \alpha α。负样本出现的频次多,那么就降低负样本的权重,正样本数量少,就相对提高正样本的权重。因此可以通过设定 α \alpha α的值来控制正负样本对总的loss的共享权重。 α \alpha α取比较小的值来降低负样本(多的那类样本)的权重。即:

C r o s s _ E n t r o p y ( p , y ) = { − α l o g ( p ) , y = 1 − ( 1 − α ) l o g ( 1 − p ) , y = 0 Cross\_Entropy(p,y)= \begin{cases} -\alpha log(p), & y=1 \\ -(1-\alpha) log(1-p), & y=0 \end{cases} Cross_Entropy(p,y)={αlog(p),(1α)log(1p),y=1y=0

虽然平衡了正负样本的数量,但实际上,目标检测中大量的候选目标都是易分样本。这些样本的损失很低,但是由于数量极不平衡,易分样本的数量相对来讲太多,最终主导了总的损失。

因此,这篇论文认为易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本 。一个简单的想法就是只要我们将高置信度样本的损失降低一些, 也即是下面的公式:
F o c a l _ L o s s = { − ( 1 − p ) γ l o g ( p ) , y = 1 − p γ l o g ( 1 − p ) , y = 0 Focal\_Loss = \begin{cases} -(1-p)^ \gamma log(p), & y=1 \\ -p^\gamma log(1-p), & y=0 \end{cases} Focal_Loss={(1p)γlog(p),pγlog(1p),y=1y=0

γ = 0 \gamma=0 γ=0 时,即为交叉熵损失函数,当其增加时,调整因子的影响也在增加,实验发现为2时效果最优。

假设取 γ = 2 \gamma=2 γ=2,如果某个目标置信得分p=0.9,即该样本学的非常好,那么这个样本的权重为 ( 1 − 0.9 ) 2 = 0.001 (1-0.9)^2=0.001 (10.9)2=0.001,损失贡献降低了1000倍。

为了同时平衡正负样本问题,Focal loss还结合了加权的交叉熵loss,所以两者结合后得到了最终的Focal loss:

F o c a l _ L o s s = { − α ( 1 − p ) γ l o g ( p ) , y = 1 − ( 1 − α ) p γ l o g ( 1 − p ) , y = 0 Focal\_Loss = \begin{cases} -\alpha (1-p)^\gamma log(p), & y=1 \\ -(1-\alpha) p^\gamma log(1-p), & y=0 \end{cases} Focal_Loss={α(1p)γlog(p),(1α)pγlog(1p),y=1y=0

α = 0.25 \alpha=0.25 α=0.25 在文中,即正样本要比负样本占比小,这是因为负样本易分。

单单考虑alpha的话,alpha=0.75时是最优的。但是将gamma考虑进来后,因为已经降低了简单负样本的权重,gamma越大,越小的alpha结果越好。最后取的是alpha=0.25,gamma=2.0

在这里插入图片描述
在这里插入图片描述

2.2 RetinaNet 网络结构

RetinaNet 是一个由 backbone + subnetworks 构成的统一的网络结构,如图 3 所示,backbone 后面跟了一个 neck 网络 FPN,然后后面跟了两个并行子网络,分别用于分类和回归。

在这里插入图片描述
1、FPN 网络

如图 3 b,作者在 ResNet 结构的后面增加了 FPN 结构,每个 level 用于检测不同尺度的目标。

2、Anchors

从 P3 到 P7,anchor 的大小也从 3 2 2 32^2 322 51 2 2 512^2 5122,在每个 level 使用三种纵横比 { 1 : 2 , 1 : 1 , 2 : 1 } \{1:2, 1:1, 2:1\} {1:2,1:1,2:1},大小为 2 0 , 2 1 3 , 2 2 3 {2^0, 2^{\frac{1}{3}}, 2^{\frac{2}{3}}} 20,231,232,每个 level 共 9 种 anchor,可以覆盖像素范围是 23~813。

每个 anchor 分配一个长度为 K 的 one-hot 编码特征存储类别信息,一个 4D 向量存储回归特征。

anchor 是如何寻找自己对应的真值框呢?

如果某个 anchor 和某个真值框的 IoU>0.5,则将其分配给对应的真值框进行学习,IoU 为 [0, 0.4] 的 anchor 被分配给背景,其他 anchor 被定义为 ignore。

3、分类子网络

分类子网络在每个空间位置分别预测这 A 个 anchor 对应的 K 个类别。

在 FPN 的每一层上,都接一个分类子网络,且是参数共享的小型 FCN 网络,输入 C 通道特征,使用 4 个 3x3 conv 提取特征,1 个 3x3 conv ,通过 sigmoid 后,输出 KA 个二值结果,如图 3c。

4、回归子网络

对于每个位置上的 A 个 anchor,输出 4 个偏移。

三、效果

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【目标检测】18、RetinaNet:Focal Loss for Dense Object Detection 的相关文章

  • SLAM实战项目(1) — ORB-SLAM2稠密地图重建

    目录 1 整体思路 2 功能实现 3 结果运行 1 TUM数据集下载 2 associate py用于RGB和Depth匹配 3 运行数据集 4 CMakeLists txt文件修改 5 完整PointCloudMapping h和Poin
  • 关于GPT-3和GPT-4,你需要知道都在这里

    友情提示 提示 本文约3500个文字 字数较长 可直接点击序号进入相关目录阅读字数 文章目录 友情提示 前言 一 什么是 GPT 3 GPT 4 和 ChatGPT 二 对未来的担忧 三 什么时候可以用GPT4 四 GPT 4用在什么地方
  • 漏洞扫描工具Goby的安装和使用(新一代网络安全技术)

    简介 Goby使用新一代网络安全技术 通过为目标建立完整的资产数据库 实现快速的安全应急 Goby有哪些优势呢 最丰富的设备规则集 Goby预置了超过10万种规则识别引擎 能针对硬件设备和软件业务系统进行自动化识别和分类 全面的分析出网络中

随机推荐

  • 大一上学期c语言PTA错题总结(自用)(02)

    1 下列程序段的输出结果是 C int main void int a 2 b 1 c 2 if a lt b if b lt 0 c 0 else c printf d n c return 0 A 0 B 1 C 2 D 3 else与
  • 运行维护巡检流程及内容

    运维人员着工装 佩戴工作牌按照程序进入企业 并与企业环保专员联系共同进入基 站 运维人员观察基站站房外部卫生 管路 电气电路是否异常 运维人员进入站房 检查数据采集传输是否正常 各监测设备运行是否正常 历史数 据完整性 检查采样系统是否正常
  • 使用element -ui 遇到的坑

    1 使用el dialog 遮罩层把显示内容遮住了 原因 Dialog 的外层布局的 position 值为 fixed absolute relative 三者之一时 就会出现被蒙板遮住的情况 解决方法 参考链接 https blog c
  • SpringCloudAlibaba实战入门之Dubbo(基于Nacos注册中心)(七)

    一 Dubbo介绍 Dubbo是阿里巴巴公司开源的一个高性能 轻量级的 Java RPC 框架 致力于提供高性能和透明化的 RPC 远程服务调用方案 以及 SOA 服务治理方案 官网 http dubbo apache org 服务提供者在
  • C++11数组了解

    原文链接 C 11数组 array 的使用 码到城攻使用 std array 能够让代码变得更加 现代化 而且封装了一些操作函 数 比如获取数组大小以及检查是否非空https www codecomeon com posts 221 数组介
  • Hadoop NameNode和DataNode只能启动一个问题

    DataNode和NameNode进程不能共存 启动NameNode可以正常启动 但是启动DataNode时发现 NameNode进程不存在了 导致两个无法共存 问题原因 NameNode在format初始化后会生成claserId 集群i
  • Java Web项目部署到Linux后的中文乱码问题

    问题描述 项目通过Maven打成war包传输到Linux上 SQL导出数据和结构后在Linux上的Mysql执行 数据都能正常显示 项目也是正常的访问到了index html 一切显得毫无问题 开始测试项目各个功能是否有异常 当我检查到我的
  • python练习.求s=a+aa+aaa+aaaa+aa...a的值

    题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加由键盘控制 from functools import reduce n 0 s n int
  • SegFormer 代码详解+数据流分析

    目录 代码详解 数据流分析 数据流及尺寸变化 输入为512x512x3的图片 使用b0主干网络 Encoder mit backbone Transformer Block 解码头 Head 代码详解 import torch 导入PyTo
  • java内存模型的角度分析volatile关键字

    多任务处理 多任务处理的背景 计算机的运算能力增强 计算机的运算速度与它的存储和通信子系统的速度差距太大 大量的时间都花费在磁盘I O 网络通信或者数据库访问中上 我们不希望处理器在大部分时间里都处于等待其他资源的空闲状态 计算机多任务处理
  • Thymeleaf的常用表达式及简单使用实例

    什么是Thymelaf 它是非常可拓展的 允许自定义名字来定义一组模板属性 或者甚至是标签 它还带有一些称为标准方言的东西 它们定义了一组功能 这些功能满足大多数情况 标准表达式五种类型 变量表达式 选择表达式 消息表达式 i18n 链接表
  • 不使用PCL库,C++保存PLY文件

    输入文件名和TriangulatePoints的结果 void savePLY const std string ply3D filename cv Mat pnts time t t time 0 char tmp1 64 strftim
  • 三因素方差分析_多因变量方差分析和方差成分分析

    点击蓝字关注我们 什么是多因变量方差分析 1 SPSS的一般线性模型中的多变量过程提供多因变量的方差分析 多因变量方差分析模型的因变量是尺度变量 连续变量 分类变量作为固定因素变量 协变量必须是尺度变量 该模型是基于尺度因变量与作为预测因子
  • gre报文长度解析

    pTemp为GRE报文头指针 unsigned char getGreHdrLen unsigned char pTemp unsigned char greflags1 pTemp unsigned char greflags2 pTem
  • poj 3280 Cheapest Palindrome(区间DP)[增删改变简单回文串]

    题目大意 给出一个由n个小写字母组成的 长度为m的字符串字符串来 对这个字符串进行删除字母或者添加字母 使得该字符串是一个回文串 每一步删除和添加每个字母都有对应的代价 求将该字符串转成回文串的最小代价 对于一个串来说在一端删除一个字母和再
  • dy之__ac_signature

    文章目录 目标网站 参数定位 补环境代码 python 测试 往期逆向文章推荐 JS逆向之今日头条signature JS逆向之淘宝sign JS逆向之知乎jsvmp算法 JS逆向之艺恩数据 JS逆向之网易云音乐 JS逆向之巨量星图sign
  • 如何去实践一个完整的数据挖掘项目?

    每日一问 如何去实践一个完整的数据挖掘项目 机器学习项目 1 抽象成数学问题 明确问题 2 获取数据 3 特征预处理与特征选择 4 训练模型与调优 5 模型诊断 6 模型融合 非必须 7 上线运行 大部分机器学习项目死在第1步和第2步 平时
  • Python删除缺失值所在行

    转载 https blog csdn net qq 35843543 article details 106471278 关键内容 data dropna how all 传入这个参数后将只丢弃全为缺失值的那些行 data dropna a
  • python+webdriver解决:web页面大小调整和滚动

    因为页面显示不全导致页面的元素定位失败 可以缩小 滚动web页面把想要定位的元素显示出来 原地址连接 https www cnblogs com wdana p 12037567 html
  • 【目标检测】18、RetinaNet:Focal Loss for Dense Object Detection

    文章目录 一 背景 二 方法 2 1 Focal loss 2 2 RetinaNet 网络结构 三 效果 论文 Focal Loss for Dense Object Detection 代码 https github com faceb