OrientedRCNN论文解读_目标检测

论文链接

1、出发点

OrientedRCNN论文解读_特征向量_02
 首先Rotate RPN通过撒各个角度比例尺寸的anchor生成OP(Oriented Proposal的缩写),缺点很明显:计算量和内存占用大。
 于是RoI Transformer提出借助水平anchor来生成OP,由于舍弃了旋转anchor故计算量下去了。大致流程就是:Horizental_Anchor --> RPN --> Horizental Proposal -->Roi Align–> FC --> OP。缺点:引入了FC和RoIAlign,导致网络heavy且复杂。
 故本文考虑直接Horizental_Anchor --> OP,从而简化模型降低过拟合风险。

2、模型结构

OrientedRCNN论文解读_目标检测_03
 总体结构比较简单,就是二阶网络结构。我首先介绍Oriented RPN。

2.1. Oriented RPN

OrientedRCNN论文解读_目标检测_04

 这里关注下通道维度变化:首先256是特征图维度,之后在特征图每个位置撒了A(A=3)个Horizental anchor,经过 1*1 的卷积操作将通道维度变成了6*A = 18。即每个anchor的输出预测值为6个参数:(x,y,w,h, delta_alpha, delta_belta),分别表示中心,倾斜框的外接矩形的宽和高以及偏移中心位置的两个量。以下图为例:
OrientedRCNN论文解读_深度学习_05
 本质上将OP表示方式变成了6个参数表示方式。通过下面公式很容易得到OP的v1-v4四个角点的横纵坐标。

OrientedRCNN论文解读_角点_06
  由于预测出来的(delta_alpha, delta_belta)不可能完全一样,故导致输出的OP是个平行四边形:如下图:
OrientedRCNN论文解读_特征向量_07
 而RRoI Align只能提取倾斜矩形框的特征,并不能提取倾斜平行四边形特征,故本文在RPN输出OP前又多了一步解码过程,将平行四边形变成(x,y,w,h,theta)格式,便于后续RRoI Align提取特征。
OrientedRCNN论文解读_深度学习_08
 思路就是先计算平行四边形的对角线长度,将短边resize和长边一样长就行了。这里贴下代码:

    polys = torch.stack([ga, y1, x2, gb, _ga, y2, x1, _gb], dim=-1) # 平行四边形四个坐标
    center = torch.stack([gx, gy, gx, gy, gx, gy, gx, gy], dim=-1)  # 堆叠四次中心坐标
    center_polys = polys - center     # 计算每个坐标和中心的相对距离
    diag_len = torch.sqrt(            # 计算对角线长度,就是 勾股定理
        torch.square(center_polys[..., 0::2]) + torch.square(center_polys[..., 1::2]))
    max_diag_len, _ = torch.max(diag_len, dim=-1, keepdim=True)      # 获得长边长度
    diag_scale_factor = max_diag_len / diag_len                      # 获得resize比例
    # 将相对距离进行resize
    center_polys = center_polys * diag_scale_factor.repeat_interleave(2, dim=-1) 
    rectpolys = center_polys + center  # 相对距离在+上中心得到倾斜矩形四个坐标
    obboxes = rectpoly2obb(rectpolys).flatten(-2) # 转成五点表示法

2.2. RRoI Align

 这部分不介绍了,就是提取Oriented RPN生成的OP的特征向量。

总结

 实验效果SOTA,这里不贴了。