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

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形