<Focal Loss for Dense Object Detection>论文解读

news2024/9/20 23:45:35

目录

  • 1.简介
  • 2.模型
    • 2.1 二阶段要比单阶段模型效果好本质原因
    • 2.2 模型结构
    • 2.3.focal loss
    • 2.3.1 公式说明
    • 2.3.2 其他
    • 2.4 消融实验
  • 3.源码详解

1.简介

目标识别有两大经典结构: 第一类是以Faster RCNN为代表的二阶段识别方法,这种结构的第一阶段专注于proposal的提取,第二阶段则对提取出的proposal进行分类和精确坐标回归。
二阶段结构准确度较高,但因为第二阶段需要单独对每个proposal进行分类/回归,速度就打了折扣;目标识别的第二类结构是以YOLO和SSD为代表的单阶段结构,它们摒弃了提取proposal的过程,只用一级就完成了识别/回归,虽然速度较快但准确率远远比不上两级结构。那有没有办法在单阶段结构中也能实现较高的准确度呢?Focal Loss就是要解决这个问题。
在这里插入图片描述
这是在coco数据集上的mAP指标, 可以看出要比一些单阶段的例如ssd,还有二阶段fpn faster rcnn都要高。在当时2018年的时候,还是SOTA的。

2.模型

2.1 二阶段要比单阶段模型效果好本质原因

作者认为,单阶段效果比二阶段差的根本原因是类别不均衡
二阶段模型一般在训练过程,第一个阶段筛选出的proposals,这已经过滤掉了大部分的背景bbox,第二个阶段采样过程保持正负样本的一定比例,例如fixed foreground-to-background ratio (1:3), or online hard example mining (OHEM). 这样就保持了前后背景样本的比例平衡问题。
而单阶段的模型,没有proposal,针对所有的候选位置进行采样,这些bbox大约有∼100k 左右。负样本的数量远远大于正样本的数量,造成正负样本的极不均衡。采样过程可以学习二阶段模型,但是这个过程肯定是低效的,因为训练过程还是大部分被`easily classified background主导,所以整体的效果稍差。

而正负样本的极不平衡会造成如下影响:

在计算loss时,负样本数量很多,所以在loss中负样本的比重就很大,然而负样本比较容易分类(easy negatives),所以给loss能提供的有用信息较少。
而正样本是我们最终要得到的检测结果,比较难分类(hard positive),所以提供的loss信息比较重要,但是由于数量少,这些关键的loss很容易被淹没掉。

2.2 模型结构

在这里插入图片描述
模型的结构中规中据
backbone: resnet 50 or 100
neck: fpn
head: dease head ( class + bbox regression)

最大的亮点是在于利用focal loss解决 关于前后背景/简单,难例不均衡问题,从而抑制easy sample,让更多的正负hard sample在loss上起到更大作用,更好的解决样本类别不均衡问题。

2.3.focal loss

2.3.1 公式说明

在这里插入图片描述

从图中可以看出,一般样本可以分为四大类:

easy negative:全是背景,比较容易判断的负样本
easy positive:全是物体,比好容易判断的正样本
hard negative:包含部分物体,但大部分为背景,比较难判断的负样本
hard positive:包含部分背景,但大部分为物体,比较难判断的正样本

可以看出hard examples就是在背景和物体过渡的区域,但是由于每张图中的物体较少,也就是正样本比较少,所有这种hard examples也比较少,同时由于负样本有很多,所以easy negative就很多,因此easy examples也就远多于hard examples。所以说正负样本不均衡可以引起hard-easy样本不均衡,进而使得loss被easy examples的loss所控制,从而使得模型没有一个有效的loss来指导训练,所以最终得到一个不好的模型,所以最后的准确率比较低。
所以我们需要Focal loss来赋予这些hard examples更多权重。
在这里插入图片描述
作者这里为了简化,拿二分类问题进行举例。

Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:
在这里插入图片描述

y’是经过激活函数的输出,所以在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取0.25,即正样本要比负样本占比小,这是因为负例易分。

在这里插入图片描述
只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。
gamma调节简单样本权重降低的速率,当gamma为0时即为交叉熵损失函数,当gamma增加时,调整因子的影响也在增加。实验发现gamma为2是最优。

gamma : 难例权重,越大越关注难例。gamma占主导地位。随着gamma的增大,alpha要相应的减小。
alpha:正负样本权重,越大越关注正样本。
在gamma增加的时候,alpha要适当减小。

2.3.2 其他

(1) 并不是对于所有的anchor都计算loss,只是对于存在gt的所有anchor计算loss
在这里插入图片描述

(2)  初始化
在这里插入图片描述

在模型运行初始阶段,为了训练稳定性,设定了一个预先值π,即正样本的概率一般取到π=0.01
在这里插入图片描述
最后一层的卷积bias b稍有不同

2.4 消融实验

在这里插入图片描述

(a) 单独调alpha,在0.75最优
(b) alpha+gamma : alpha降低到最小,gamma较大最好。关注negtivate hard example最好。>
© 调整anchor scale or aspect。这个也不是anchor越大越多最好
(d) OHEM vs FL ,FL更好一些
(e) input size尺度, backbone大小影响

在这里插入图片描述
正样本和负样本的累积分布函数(CDF)如图4所示。如果我们观察正样本损失(左),我们会发现CDF看起来,随着gamma的增加,变化其实并不大,说明gamma对于正样本难例的提升作用较小。

gamma对负样本的影响截然不同。gamma=0时,正CDF和负CDF相当相像的然而,随着gamma的增加模型权重更多的关注在较难的负样本上。在里面事实上,当gamma=2(我们的默认设置)时loss损失很少来自于背景样本。

正如可能的那样可见,FL可以有效地降低easy negetive sample的影响,将所有注意力集中在hard negative examples.上。

3.源码详解

详细结构代码串讲内容参见:
轻松掌握 MMDetection 中常用算法(一):RetinaNet 及配置详解

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

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

相关文章

后端开发规约

目录 项目MVC层级设计规范 工程项目模块设计 设计规约 Java编码规范 参考《阿里巴巴Java开发手册》,见文末参考文档 OOP 面向对象设计 & 面向接口编程 Lombok工具包依赖 Guava、Hutool 等脚手架工具包(三方包使用其一即可) 日志打…

python初级教程十 Mongodb增、删、改、查

Mongodb 插入文档 MongoDB 中的一个文档类似 SQL 表中的一条记录。 插入集合 集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name > value 对。 以下实例向 sites 集合中插入文档: #!/usr/bin/python3import pymongomyclient p…

03、Java并发 Java 线程池 ( Thread Pool ) (上)

本文我们将讲解 Java 中的线程池 ( Thread Pool ),从 Java 标准库中的线程池的不同实现开始,到 Google 开发的 Guava 库的前世今生。 本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的,不然有些知识会一头雾水。 J…

Redis基础篇——Redis安装以及配置文件的修改

文章目录1. 认识Redis1.1 特征1.2 安装 Redis1. 安装 Redis 依赖2. 上传安装包1.3 默认启动1.4 指定配置启动1.5 开机自启(推荐)1. 认识Redis Redis 诞生于 2009 年,全称是 Remote Dictionary Server,远程词典服务器,…

Databend 开源周报 #73

Databend 是一款强大的云数仓。专为弹性和高效设计,自由且开源。 即刻体验云服务:https://app.databend.com。 What’s New 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Features & Improvements Multiple Catalogs …

hudi实战-- 核心点解析

目录 Hudi 基础功能 Hudi 简介 Hudi 功能 Hudi 的特性 Hudi 的 架构 Hudi 数据管理 Hudi 表数据结构 hoodie 文件 数据文件 数据存储概述 Metadata 元数据 Index 索引 索引策略 Data 数据 Hudi 核心点解析 基本概念 时间轴Timeline 文件管理 索引 Index 表的存储…

NiN详解

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上,有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、NiN网络的…

【C语言开源库】 一个只有500行代码的开源http服务器:Tinyhttpd学习

项目搬运,带中文翻译:https://github.com/nengm/Tinyhttpd在嵌入式中,我们HTTP服务器用得最多的就是boa还有就是goahead,但是这2个代码量比较大,而Tinyhttpd只有几百行,比较有助于我们学习。一、编译及运行直接make之后…

用Python让奇怪的想法变成现实,2023年继续创作

2023年继续写作,用文章记录生活 时间过得真快,一下就到2023年了。 由于疫情肆虐,在网络的游弋的实现也长了,写作的自然也多了。 回想一下,2018-2021年这三年时间里一篇文章也没写过为0,哈哈,没…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + NVISTAR VP300 激光雷达 评测

简介:介绍NVISTAR 的二维DTOF激光雷达 在EHub_tx1_tx2_E100载板,TX1核心模块环境(Ubuntu18.04)下测试ROS驱动,打开使用RVIZ 查看点云数据,本文的前提条件是你的TX1里已经安装了ROS版本:Melodic。…

滴滴前端一面经典手写面试题

实现bind 实现bind要做什么 返回一个函数,绑定this,传递预置参数bind返回的函数可以作为构造函数使用。故作为构造函数时应使得this失效,但是传入的参数依然有效 // mdn的实现 if (!Function.prototype.bind) {Function.prototype.bind f…

Kuberneters(2)- Pod详解

第四章 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。 Namespace ​ Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 ​ 默认情况下&…

路由跳转同一个界面,但是params不同。页面不刷新?(路由的key)

文章目录引入知识点:路由的key值思路:结论:解决方法:效果:应用场景:引入知识点:路由的key值 如果不设置路由的key值,默认情况下是根据路径判断的,就是不包括params值 例子&#xff…

MySQL5-数据类型

目录 1.数值类型(分为整型和浮点型) 2.字符串类型 3.日期类型 MySQL和Java编程一样,创建表时要考虑数据类型。 MySQL表组成:列名/列数据类型;数据。 1.数值类型(分为整型和浮点型) 数据类型…

天工开物 #4 构建一个受保护的网站

前段时间,我出于兴趣试着做了一个需要登录鉴权才能访问的个人网站,最终以 Docusaurus[1] 为内容框架,Next.js[2] 做中间件,Vercel[3] 托管网站,再加上 Auth0[4] 作为鉴权解决方案,实现了一个基本免费的方案…

数位DP入门笔记(1)HUD-2089

题目: 题目理解和思路: 1.此题是给一个6位车牌号,正着不能含有连着的62,不能有4。 2.判断车牌号可能会采用dfs,因为每增加一位数就包含带4,或者形成62两种不合法情况(事实上没有用到&#xf…

java学习day67(乐友商城)商品详情及静态化

1.商品详情 当用户搜索到商品,肯定会点击查看,就会进入商品详情页,接下来我们完成商品详情页的展示, 1.1.Thymeleaf 在商品详情页中,我们会使用到Thymeleaf来渲染页面,所以需要先了解Thymeleaf的语法。 …

带你深度剖析《数据在内存中的存储》——C语言

文章目录 一、数据类型介绍 二、整型在内存中的存储方式 2、1 原码、反码、补码的讲解 2、2 大小端介绍 2、2、1 大小端的概念 2、2、2 为什么要区分大小端存储呢? 2、2、3 大小端判断练习 三、浮点数在内存中的存储方式 3、1 浮点数在内存中的存储例题 3、2 浮点数…

TensorFlow2.0实战:Cats vs Dogs

数据集准备 在本文中,我们使用“Cats vs Dogs”的数据集。这个数据集包含了23,262张猫和狗的图像 你可能注意到了,这些照片没有归一化,它们的大小是不一样的 但是非常棒的一点是,你可以在Tensorflow Datasets中获取这个数据集 …

梦在远方路在脚下,社科院与杜兰大学金融管理硕士项目与你一路相伴

梦想是指引我们飞翔的翅膀,梦想是远方的灯塔指引着我们前进的方向。梦想距离我们很远,但路在脚下,只要朝着梦想前进,终有一天梦想会照进现实。就像拥有读研梦想的我们,在社科院杜兰金融管理硕士项目汲取能量&#xff0…