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

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati