BBAVectors:一种Anchor Free的旋转物体检测方法

2024-06-21 08:38

本文主要是介绍BBAVectors:一种Anchor Free的旋转物体检测方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


导读

WACV2021的一篇文章,将CenterNet的方案用到了旋转物体的检测中,设计了一种精巧的旋转框表达方式,免去了设计anchor麻烦,效果也非常好,而且代码也开源了。

文末有下载好的论文和代码链接。


摘要

这是一篇有方向的物体检测的文章。当前的有方向物体检测往往是两阶段的基于anchor的检测方法,但是这种方法会有正负anchor的不平衡的问题。这篇文章将基于水平关键点的物体检测的方法扩展了一下,用于有方向的物体检测。我们首先进行物体的中心点的检测,然后回归一个包围框的边缘感知向量(BBAVectors)来得到有方向的包围框。为了让这个向量的学习变得简单,我们还进一步将有方向的包围框分成了水平框和选择框两类。

1. 介绍

两阶段的基于anchor的旋转框检测有一些缺点:(1)anchor的设计非常的复杂,要去设计不同的比例,不同的尺寸。(2)正负样本会非常的不均衡,这会导致训练很慢,而且无法达到最优的效果。(3)第二个阶段的crop和regress策略在计算量上也比较大。除了基于anchor的方法之外,最近anchor free的物体检测方法得到了较大的发展,CenterNet的方法是先检测物体的中心点,然后直接回归出物体的宽和高,当然,我们可以直接再回归一个旋转角度θ来将CenterNet扩展到有方向的物体检测,但是,对于任意的旋转物体,宽和高实际上依赖于不同的旋转坐标系统,所以直接回归会有些难度。

本文中,我们扩展了CenterNet的方法,将其应用到有方向物体的检测中,但是,并不是直接回归w,h和θ,而是学习一个box boundary-aware vectors(BBAVectors),如图1(b),然后得到物体的有方向的包围框。在实际做的过程中,我们发现,在一些极端情况下,向量和象限的边界非常的靠近,如图1(c),这样区分向量的类型就比较困难。

总结一下,我们的贡献如下:

  • 提出了一个描述OBB的方法,box boundary-aware vectors(BBAVectors),非常的简单有效。BBAVectors对于所有的物体都在同一个笛卡尔坐标系中。

  • 我们将基于特征点检测的CenterNet扩展到了方向物体检测场景中。这是一个单阶段而且anchor free的方法。

图1:带方向的包围框的表示方式

2. 方法

2.1 结构

网络结构如图2,是一个U型的结构,我们使用了ResNet101的Conv1~5作为主干,然后再进行上采样,得到一个原始图像1/4大小的特征图。在上采样的过程中,会有下采样时候的层的跳跃连接拼接到一起。

图2:本文提出的方法的整体结构以及OBB的描述方法

2.2 热图

Heatmap是用来定位关键点的。这里,我们用来检测物体的中心点。热图有k个通道,分别对应了不同类别的物体。热图的每个像素点的值表示物体的置信度。

Groundtruth 假设c=(cx,cy)是旋转框的中心点,我们以c为中心,构建一个2D的高斯分布来作为热图的groundtruth,其中,高斯分布的方差是和物体的尺寸相关的一个自适应的值。

训练损失 在训练热图的时候,只有中心点c是正样本,其他的点,包括高斯分布范围中的点都是负样本。由于这个正负样本的极度不平衡,所以直接去学习中心点是比较困难的,所以,我们对高斯分布以内的点的损失做了一定程度的衰减,使用了一个focal loss的变体来训练这个热图。

其中,p_hat表示groundtruth,p表示预测值,N是物体的数量,α和β是超参数,这里α=2,β=4。

2.3 中心点的偏移

在预测阶段,从热图中提取峰值点作为物体的中心点,这个中心点c是一个整数,但是,原始图经过下采样之后,得到的中心点的坐标是一个浮点数,为了弥补这个量化的误差,我们还需要再预测一个偏移量O:

用L1 loss来进行优化:

其中,SmoothL1的表达式可以是:

2.4 包围框的参数

为了得到带方向的包围框,一个很自然的想法就是回归出宽,高,和角度θ,我们把这个base line称为Center+wh+θ,如图1(a)。这个方法有几个缺点:(1)小的角度的变化对于损失来说可能是微不足道的,但是对于IOU却会产生较大的影响。(2)OBB中的w,h是在各自独立的旋转坐标系统中定义的,角度θ是相对于y轴的,这样,网络很难去联合训练所有的物体。所以,我们提出了一种描述OBB的方法,叫做box boundary-aware vectors(BBAVectors),包括4个向量,t,r,b,l。在我们的设计中,这4个向量分布在笛卡尔坐标系的4个象限中,所有的旋转物体都共用一个坐标系,这样可以高效的利用共同的信息,并提升模型的泛化能力。我们有意的设计了4个向量,而不是2个,为的是当某些局部特征不是很明确的时候可以得到更多的交互信息。

此时,包围框的参数定义为:b = [t,r,b,l,w,h],其中w,h是外接水平包围框的宽和高,如图2所示。这样,每个包围框就有2x4+2=10个参数,我们还是用L1 loss来回归box的参数:

2.5 方向

我们发现,当物体框和xy轴对齐的时候,检测会失败,这个原因可能是象限的边界问题,这种类型的向量的差别很难区分。我们把这个问题叫做corner case,我们把OBBs分为两类,一类是水平的,一类是旋转的,当OBBs是水平的,w和h帮助我们得到准确的包围框。另外,外接矩形的参数也可以帮助我们去更好的描述OBB。

我们定义了一个旋转特征图α,我们这样定义:

然后通过交叉熵来优化:

3. 实验

我们在两个数据集上进行了验证,DOTA和HRSC2016。

3.1 和其他模型的对比

DOTA:

HRSC2016:

3.2 消融实验

我们对比了BBAVectors+r和BBAVectors+rh两种方法,一种是不区分水平和旋转物体,一种区分水平和旋转物体:

3.3 和baseline的对比

我们还对比了Center+wh+θ的baseline模型:

3.4 在DOTA数据上的结果可视化

公众号后台回复“BBAV”,下载已打包好的论文和代码。


请长按或扫描二维码关注本公众号

喜欢的话,请给我个在看吧

这篇关于BBAVectors:一种Anchor Free的旋转物体检测方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080737

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定