一、引言
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/4i∑4xi,1/4i∑4yi)
(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β)=x′cosβ+y′sinβ
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(β

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

1996

被折叠的 条评论
为什么被折叠?



