详解经典旋转目标检测算法RoI Transformer

本文解析了RoITransformer在旋转目标检测中的应用,介绍了opencv角度定义和RoITransformer中角度处理方法,网络结构包括Backbone、RPN、RoIAlign和RRoIAlign,重点讲解了数据预处理和RoITransformer在特征提取和角度计算中的关键步骤。

一、引言

1、旋转目标检测检测

旋转目标检测检测就是将具有旋转方向的目标检测出来,也就是需要检测目标的中心点、长宽、角度。在俯视图的目标检测中比较常见,如遥感图像目标检测、航拍图像目标检测等。(见下图旋转目标检测,图源论文RoI Transformer )
旋转目标检测示例

2、旋转目标检测算法

目前多阶段里面性能较好的是RoI Transformer这个算法,本篇博客将详细分析此算法。
论文《Learning RoI Transformer for Oriented Object Detection in Aerial Images
开源代码基于mmdetection

3、RoI Transformer

先简要看一下RoI Transformer的介绍吧,移步这里见第三部分旋转目标检测。下面将从数据处理、网络结构、RoI Align三个方面进行介绍。

二、数据处理

常见的目标检测算法都是做的水平目标检测,预测目标的中心点、长宽就好了,那么旋转目标多了一个角度。对于不同的算法对于角度的定义不同,处理方式略微不同。下面主要介绍两种旋转目标检测角度定义的方式。

1、opencv旋转矩形角度定义方式

opencv在旋转矩形的时候,以X轴逆时针旋转θ角度得到宽边,表示旋转的角度,如图红色角度。因此所有的角度范围为[-90,0)
在这里插入图片描述

下面说下在用opencv如何得到旋转矩形的坐标及其角度。

img = cv2.imread('test.png') #读入rgb图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转化为灰度图
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#获取二进制图像
#通过二进制图像获得二进制区域的边界框
#cv2.RETR_EXTERNAL表示只检测外轮廓
#cv2.CHAIN_APPROX_NONE存储所有的轮廓点
#返回值:img_是将轮廓部分画出来;contours所有轮廓坐标;hierarchy 表示轮廓属性,如个数等,具体可以查下opencv API
img_, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
max_contour = max(contours, key=len)
# 返回一个最小外接矩形 (x,y) (h,w),angle [-90,0)
rect = cv2.minAreaRect(max_contour)
#获得旋转矩形的四个顶点坐标
poly = cv2.boxPoints(rect)

2、RoI Transformer中旋转目标角度定义

论文中角度的定位范围是[-π,π],针对bbox坐标[[x1,x2,x3,x4],[y1,y2,y3,y4]],角度计算为θ=np.arctan2(-(x2-x1),(y2-y1)),具体的角度见论文配图(如下)。
在这里插入图片描述
现在我们知道了角度的定义方式了,需要由八个顶点坐标计算中心点、长宽、θ这几个参数值。
(1)中心点计算
( x , y ) = ( 1 / 4 ∑ i 4 x i , 1 / 4 ∑ i 4 y i ) (x,y)=(1/4∑_i^{4}x_i,1/4∑_i^{4}y_i) (x,y)=(1/4i4xi1/4i4yi)
(2)长宽计算
长宽计算在此论文中先将旋转框经过角度旋转之后得到水平框,然后计算水平框的x、y坐标的左右、上下极值,得到[minx, miny, maxx, maxy]四个坐标,再计算矩形的长宽值。
在这里插入图片描述
由图斜框与水平(x轴)的夹角是θ,那么将此斜框逆时针旋转β角度得到水平框。显然可得β=90-θ(长的好看的人需要推导一下)。那么现在就可以根据θ和A’点坐标来计算旋转之后点A的坐标了。
为了看起来简单,以斜框的中心点画坐标轴(因为四个坐标都可以以中心点作为参考)
在这里插入图片描述
设A’坐标[x’,y’],求A的坐标[x,y],设红直线的长度为d(即A与A’到中心的距离)
x = d × s i n ( β + γ ) = d × ( s i n β c o s γ + s i n γ c o s β ) = x ′ c o s β + y ′ s i n β x=d×sin(β+γ)=d×(sinβcosγ+sinγcosβ)=x'cosβ+y'sinβ x=d×sin(β+γ)=d×(sinβcosγ+sinγcosβ)=xcosβ+ysinβ
y = d × c o s ( β + γ ) = d × ( c o s β c o s γ − s i n β s i n γ ) = y ′ c o s β − x ′ s i n β y=d×cos(β+γ)=d×(cosβcosγ-sinβsinγ)=y'cosβ-x'sinβ y=d×cos(β

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值