Loading [MathJax]/extensions/TeX/AMSmath.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​关注难易样本分布 Focaler-IoU | 提升边界框回归在目标检测中的应用性能 !

​关注难易样本分布 Focaler-IoU | 提升边界框回归在目标检测中的应用性能 !

作者头像
集智书童公众号
发布于 2024-04-14 06:05:59
发布于 2024-04-14 06:05:59
6700
举报
文章被收录于专栏:集智书童集智书童

在目标检测领域,边界框回归起着至关重要的作用,而目标检测的定位精度很大程度上取决于边界框回归的损失函数。现有研究通过利用边界框之间的几何关系来提高回归性能,而忽略了难以和容易样本分布对边界框回归的影响。在这篇文章中,作者分析了难以和容易样本分布对回归结果的影响,然后提出了Focaler-IoU,通过关注不同的回归样本,该方法可以提高不同检测任务中的检测器性能。最后,作者使用现有的高级检测器和回归方法进行了不同检测任务的比较实验,并使用本文提出的办法进一步提高了检测性能。 代码:https://github.com/malagoutou/Focaler-IoU

I Introduction

目标检测是计算机视觉的基本任务之一,其目的是在图像中定位并识别物体。根据是否生成 Anchor 点,目标检测方法可以分为Anchor-based和 Anchor-Free两大类。Anchor-based算法包括FasterR-CNN,YOLO系列,SSD和 RetinaNet。Anchor-Free的检测算法包括CornerNet,CenterNet 和 FCOS。在这些检测器中,边界框回归损失函数作为定位分支的重要组成部分,起着不可替代的作用。

Bounding Box Regression Losses

随着计算机视觉的发展,目标检测任务受到了越来越多研究者的关注。为了评估各种算法在检测任务上的性能,需要引入一个合适的指标。在提出IoU之前,

-范数损失被用作早期边界框回归问题的评估指标,但是,由于

-范数损失对异常值非常敏感,这导致异常值对损失有更大的影响,使模型在存在异常值时性能不稳定。

为了更好地解决上述问题,提出了一种更合适的指标:IoU。在基于IoU的评估标准下,大多数目标检测任务的检测精度得到了进一步提高,但是IoU损失本身也存在一些缺陷,例如,当GT框和 Anchor 框之间没有重叠时,它们的梯度将消失,无法准确描述两个边界框之间的位置关系。

为了弥补这一缺陷,GIoU提出使用包含GT框和 Anchor 框的最小外接矩形来计算损失,可以提高检测性能。在CIoU和DIoU中,为了加速GIoU的收敛速度,CIoU通过进一步考虑GT框和 Anchor 框的宽高比来加速收敛,而DIoU通过归一化两个边界框的中心之间的距离来加速收敛。EIoU在CIoU的基础上进一步考虑形状损失,通过最小化GT框和 Anchor 框的宽高差来加速收敛。SIoU进一步考虑连接两个边界框中心线的线的角度,并根据角度重新定义距离损失和形状损失,并将它们作为新的损失项添加到损失函数中,以实现最佳检测效果。

Focal Loss

在边缘回归的过程中,不平衡训练样本的问题依然存在。训练样本可以根据是否包含目标类别分为正样本和负样本。一些传统的解决样本不平衡问题的方法是在训练过程中,在采样和重新加权困难样本,但是这种方法的效果并不显著。

在Focal Loss中,提出了一种方法,即容易识别的负样本占总损失的大部分,并且主导梯度。Focal Loss通过调整正样本和负样本的权重,使模型更关注难以分类的正样本,从而减少相对容易分类的负样本的权重,从而提高模型识别罕见目标类别的能力。在Libra R-CNN中,提出了一种简单而有效的平衡学习框架,其中在目标层面使用Balanced L1损失将训练样本分为异常值和内值。异常值被视为困难样本,与内值相比,它们可以产生更大的梯度,这对训练过程是有害的。

因此,Libra R-CNN使用梯度回归来促进内值,并剪切那些异常值产生的较大梯度,以获得更好的分类结果。在EIoU中,将训练样本分为高质量样本( Anchor 点)和低质量样本(异常值),并基于L1损失提出FocalL1损失来增加高质量样本对训练过程的梯度贡献。同时,将EIoU损失作为FocalL1损失的一个变量,使模型能够更关注高质量样本,从而进一步提高检测效果。

这篇文章的主要贡献如下:

  1. 分析了困难样本和容易样本分布对边界框回归的影响。基于现有的边界框回归方法,提出了Focaler-IoU,通过线性区间映射关注不同的回归样本。
  2. 使用先进的单阶段检测器进行了实验,以验证作者的方法可以有效提高检测性能并弥补现有方法的不足。

II Related work

近年来,随着检测器的不断发展,边缘回归损失也得到了迅速发展。最初,IoU被提出用于评估边缘回归的状态,然后基于IoU等新的约束条件GIoU, DIoU, CIoU, EIoU, SIoU等相继提出。

IoU Metric

IoU是最流行的目标检测评估指标,其定义如下:

其中,

表示预测的边界框,

表示真实目标框。

GIoU Metric

由于在边界框回归中,GT框和 Anchor 框之间没有重叠,因此IoU损失出现了梯度消失的问题。为了解决这个问题,提出了GIoU,其定义如下:

其中,

表示 GT框和 Anchor 框之间的最小外接矩形。

DIoU Metric

与GIoU相比,DIoU考虑了边界框之间的距离约束,并在IoU的基础上,通过添加中心点归一化距离损失项,使得回归结果更加准确。它定义如下:

在这里,

表示 Anchor 框的中心点,

表示 GT 框的中心点,

表示欧几里得距离,其中

之间的最小外接矩形的对角线距离。

CIoU 进一步考虑了 GT 和 Anchor 框之间的形状相似性,通过在 DIoU 的基础上添加一个新的形状损失项来减少 Anchor 框和 GT 框之间的宽高比差异。它定义如下:

在这里,

分别表示 GT 框的宽度和高度,

分别表示 Anchor 框的宽度和高度。

EIoU Metric

EIoU 根据 CIoU 重新定义了形状损失,并通过直接减少 GT 框和 Anchor 框之间的宽高比差异进一步提高了检测精度。它定义如下:

在这里,

分别表示最小检测框覆盖 GT 框和 Anchor 框的宽度和高度。

SIoU Metric

在前人研究的基础上,SIoU 进一步考虑了边界框之间的角度对边界框回归的影响,旨在通过减小 Anchor 框和 GT 框之间的角度差异来加速收敛过程。它的定义如下:

III Methods

Analysis

各种目标检测任务中存在样本不平衡问题,可以根据目标检测的难度将其分为难以检测的样本和易于检测的样本。从目标尺度分析的角度来看,一般的检测目标可以被视为简单样本,而非常小的目标由于在精确定位方面的难度,可以被视为难以检测的样本。对于以简单样本为主的检测任务,在边界框回归过程中关注简单样本有助于提高检测性能。对于以难以检测的样本为主的检测任务,相比之下,则需要关注难以检测样本的边界框回归。

Focaler-IoU

为了在不同的检测任务中关注不同的回归样本,作者使用线性区间映射方法重构 IoU 损失,从而提高边缘回归。公式如下:

在这里,

表示重构的 Focaler-IoU,IoU 表示原始的 IoU 值,

。通过调整

的值,作者可以使

关注不同的回归样本。它的损失定义如下:

将 Focaler-IoU 损失应用到基于 IoU 的边界框回归损失函数中,

,

,

,

分别为:

IV Experiments

PASCAL VOC on YOLOv8

PASCAL VOC 数据集是目标检测领域中最流行的数据集之一。在本篇文章中,作者使用 VOC2007 和 VOC2012 的训练集和测试集,包括 16,551 张图像,以及 VOC2007 的测试集,包含 4,952 张图像。

在本实验中,作者选择最新的单阶段检测器 YOLOv8 和 YOLOv7-tiny 在 VOC 数据集上进行比较实验,并选择 SIoU 作为实验的比较方法。实验结果如下表1 所示:

AI-TOD on YOLOv5

AI-TOD 是一个遥感图像数据集,与一般的图像数据集不同,因为它包含大量微小的目标,且平均目标大小为 12.8 像素。在本实验中,作者选择 YOLOv5s 作为检测器,并使用 SIoU 作为比较方法。实验结果如下表2 所示:

V Conclusion

在这篇文章中,作者分析了困难样本和容易样本分布对目标检测的影响。当困难样本占主导地位时,需要关注困难样本以提高检测性能。当简单样本的比例较大时,相反的情况是正确的。

接下来,提出 Focaler-IoU 方法,通过线性区间映射重构原始 IoU 损失,以实现关注困难样本和容易样本的目标。最后,比较实验证明了所提出的方法可以有效地提高检测性能。

参考

[1].Focaler-IoU: More Focused Intersection over Union Loss.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 集智书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
单元测试框架spock和Mockito应用
spock是一款基于Groovy语言的单元测试框架,其基础也是Java的Junit,目前最新版已经到了2.0,但对Groovy和响应的Java版本要求较高,具体信息参考:Spock 2.0 M1版本初探。
FunTester
2020/05/18
2.6K0
Spock单元测试框架以及在美团优选的实践
Spock是国外一款优秀的测试框架,基于BDD(行为驱动开发)思想实现,功能非常强大。Spock结合Groovy动态语言的特点,提供了各种标签,并采用简单、通用、结构化的描述语言,让编写测试代码更加简洁、高效。目前,美团优选物流绝大部分后端服务已经采用了Spock作为测试框架,在开发效率、可读性和维护性方面均取得了不错的收益。
测试开发社区
2021/08/23
3.6K0
Spock单元测试框架以及在美团优选的实践
Java开发必须要知道的知识体系
Java是超高人气编程语言,拥有跨平台、面向对象、泛型编程等特性。在TIOBE编程语言排行榜中,连续夺得第一宝座,而且国内各大知名互联网公司,后端开发首选语言:非Java莫属。今天只是梳理下Java知识体系,后续会针对各类目有更详细的经验分享。 知识体系 JDK Java8 Lambda 语句 方法引用 日期/时间处理API 等等,不一一列举,详细的参考这些文档 URL:http://www.oracle.com/technetwork/cn/java/javase/documentation/index.
企鹅号小编
2018/01/11
1.4K0
Maven和Gradle中配置单元测试框架Spock
Maven本身不支持其他JVM语言(例如Groovy或Scala)。要在Maven项目中使用它,需要使用第三方插件。对于Groovy而言,最好的选择似乎是GMavenPlus(重写不再维护的GMaven插件)。另一种选择是允许使用Groovy-Eclipse编译器和Maven 的插件,但是它没有使用官方的插件,groovyc并且在过去,使用Groovy 的新发行版/功能存在一些问题。
FunTester
2019/11/14
2.3K0
Spock单元测试框架使用详解「建议收藏」
Spock(Spock官网:http://spockframework.org/)作为java和Groovy测试一种表达的规范语言,其参考了Junit、Groovy、jMock、Scala等众多语言的优点,并采用Groovy作为其语法,目前能够在绝大多数的集成开发环境(如eclipse,Intellij Ieda),构建工具(如Maven,gradle)等场景运行。Spock单元测试相对于传统的junit、JMockito、EsayMock、Mockito、PowerMock,由于使用了Groovy作为语法规则,代码量少,容易上手,提高了单元测试开发的效率,因此号称是下一代单元测试框架。
全栈程序员站长
2022/07/05
3.1K0
Selenium 4 Java的最佳测试框架
几十年来,Java一直是开发应用程序服务器端的首选编程语言。尽管JUnit一直在与开发人员一起帮助他们进行自动化的单元测试,但随着时间的推移和测试行业的发展,特别是伴随着自动化测试的兴起,已经开发了许多基于Java的开源框架,它们在验证和业务逻辑方面与JUnit有所不同。在这里,我将讨论用于使用Selenium WebDriver执行测试自动化的顶级Java测试框架,还将重点介绍这些顶级Java测试框架的优缺点和独到之处。
FunTester
2019/12/17
1.7K0
这些测试工具和框架你了解吗
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试.如果说测试工程师今年应该学习什么的问题,答案可能包括编程语言、库和框架,但如果你需要改进或学习一件事,那么下面这些框架是你绕不开的技能。
louiezhou001
2020/02/27
2.5K0
这些测试工具和框架你了解吗
Java开发必须要知道的知识体系
Java是超高人气编程语言,拥有跨平台、面向对象、泛型编程等特性。在TIOBE编程语言排行榜中,连续夺得第一宝座,而且国内各大知名互联网公司,后端开发首选语言:非Java莫属。今天只是梳理下Java知识体系,后续会针对各类目有更详细的经验分享。
Java团长
2018/08/06
1.4K0
那些能帮助你提升十倍开发效率的优质工具
Java世界中存在着很多工具,从著名的IDE(例如Eclipse,NetBeans和IntelliJ IDEA)到JVM profiling和监视工具(例如JConsole,VisualVM,Eclipse Memory Analyzer等)。
Java架构
2019/10/18
1.5K0
那些能帮助你提升十倍开发效率的优质工具
90%程序员都应该掌握的开发工具,看看这些你是否都掌握了
本文主要介绍 Java 程序员应该学习的一些基本和高级工具。如果你想成为一名更好的程序员,最重要的技巧之一就是学习你的编程工具。
架构狂人
2023/11/07
4730
90%程序员都应该掌握的开发工具,看看这些你是否都掌握了
2021年软件测试工具总结(1):抓包工具、单元测试工具
大家好,我是洋子,作为一名测试开发/软件测试工程师, 在进行软件测试的过程中,会用到测试工具去辅助测试,以提高测试工作的效率
Bug挖掘机
2022/09/28
2.8K0
2021年软件测试工具总结(1):抓包工具、单元测试工具
Gradle -- 初体验
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
宋先生
2019/07/18
1.1K0
Gradle -- 初体验
10个Java开发人员的顶级测试工具、库和框架介绍
最近,我写了一些关于Java开发人员今年应该学习什么的文章,例如编程语言、库 和 框架,但如果你只有一件事需要改进或学习,那么那必须是你的自动化测试技能。
田维常
2019/07/16
3K0
10个Java开发人员的顶级测试工具、库和框架介绍
Spock框架Mock对象、方法经验总结
近期已然陷入了单元测试的汪洋大海,上万行的代码突然要求起来单元测试覆盖率,着实很恐怖的。最经过艰苦的抗争学习之后,终于迈过了技术这个坎儿,特来分享一下最近踩坑的经历,和一些典型的使用场景案例分享。
FunTester
2022/02/08
5.5K4
让单测变得如此简单 -- spock 框架初体验
测试流程在软件开发过程中显得越来越重要了,因为无论经验多么丰富的开发者,都难免在编码过程中出现失误甚至是逻辑错误,在这样的前提下,单元测试就显得非常重要了。 单元测试通过对程序中每个部分进行独立的测试覆盖,且在每次代码更新后自动执行,保证了新的修改不会影响到旧的功能。 可以说,编写单元测试让程序员尽早的发现问题、暴露问题,从而让整个编码过程更为可控,同时,编写单元测试过程中对细节的关注,也让程序员更多的思考自己编写的程序的健壮性。 但单元测试又意味着我们需要在维护业务代码的同时,额外维护单元测试的流程和用例,无疑增加了维护成本,而对于程序开发的交接工作来说,除了文档、业务代码,还需要阅读和理解前人的单元测试流程,无疑也让新人的上手难度大为增加。 既然单元测试如此重要,那么我们是否可以找到一个编写高效、易于维护、简单易懂的单元测试框架呢?java 中的 spock 正是凭借这样的理念而诞生的一种测试框架。
用户3147702
2022/06/27
1.6K0
让单测变得如此简单 -- spock 框架初体验
关于单测技术选型,聊聊我的思考
其中 JUnit 不支持 Mock,因此基本不会只用 JUnit,而是结合其他有 Mock 功能的框架一起使用。从知名度及使用率来说,Mockito 和 Spock 使用较多,而 PowerMock、JMockit、TestableMock 使用较少。下面我们将主要对比 Mockito 和 Spock 两种框架的差异。
陈树义
2023/04/17
8560
关于单测技术选型,聊聊我的思考
身为Java程序员,这些开源工具你一定要学会
本文主要介绍Java程序员应该在2018年学习的一些基本和高级工具。如果你是一位经验丰富的Java开发人员,拥有5到10年的经验,你可能对这些工具很熟悉,但如果不是,现在就是是开始学习这些工具的好时机。
用户1257393
2018/09/30
9830
身为Java程序员,这些开源工具你一定要学会
Groovy单元测试框架spock基础功能Demo
最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock。由于本身使用Groovy的原因,比较钟情于spock框架,但是奈何兼容性比较差,特别是跟Mockito等框架的高级语法的兼容。不过这不妨碍spock是一个非常优秀的单元测试框架,特别体现在用例的形式和测试报告的展示方式以及报错信息的展示(这个我最中意)。
FunTester
2019/11/14
9390
1. 了解Groovy
最近,对Groovy脚本语言的兴趣越来越多了,刚巧对于java语言比较熟悉,了解和入手Groovy可以说丝毫不困难。
zinyan.com
2022/12/07
1.7K0
1. 了解Groovy
Java单元测试 --- Spock
易读的测试用例名字,可以使用任意字符串,比如下面中test stack 易理解的代码模块:given, when, then, expect
十毛
2019/03/27
1.8K0
Java单元测试 --- Spock
推荐阅读
相关推荐
单元测试框架spock和Mockito应用
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档