OrientedRCNN论文解读


前言

 本文介绍一篇二阶段的旋转目标检测论文Oriented RCNN,该篇论文类似FasterRCNN,有RPN以及ROIAlign,只不过将其改成了旋转的方式,本文将详细介绍是如何实现上述两个核心算子的。
在这里插入图片描述

论文链接

1、出发点

在这里插入图片描述
 首先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、模型结构

在这里插入图片描述
 总体结构比较简单,就是二阶网络结构。我首先介绍Oriented RPN。

2.1. Oriented RPN

在这里插入图片描述

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

在这里插入图片描述
由于预测出来的(delta_alpha, delta_belta)不可能完全一样,故导致输出的OP是个平行四边形:如下图:
在这里插入图片描述
 而RRoI Align只能提取倾斜矩形框的特征,并不能提取倾斜平行四边形特征,故本文在RPN输出OP前又多了一步解码过程,将平行四边形变成(x,y,w,h,theta)格式,便于后续RRoI Align提取特征
在这里插入图片描述
 思路就是先计算平行四边形的对角线长度,将短边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的特征向量,用一个简单公式表示就是:
f i = R R o i A l i g n ( F , r o t a t e _ b b o x ) f_i = RRoiAlign(F,rotate\_bbox) fi=RRoiAlign(F,rotate_bbox)
 之后将其送入检测分类头回归旋转坐标元素即可。

总结

 实验效果SOTA,其实idea确实挺好想,但要想实现确实很难,总之是一篇不错的工作。

### Oriented R-CNN的研究论文 Oriented R-CNN是一种改进的目标检测框架,专门用于处理具有方向性的物体。传统R-CNN及其变体通常假设边界框为轴对齐矩形,但在某些特定领域(如遥感图像中的飞机、船舶等),目标可能呈现任意角度倾斜的情况。为此,研究人员提出了面向旋转边框的对象检测解决方案。 #### 主要贡献 - **引入了旋转锚点机制**:不同于以往仅考虑水平和垂直方向的Anchor Boxes,在Oriented R-CNN中设计了一套能够适应不同朝向变化的新颖Anchors[^2]。 - **优化后的损失函数**:针对旋转回归任务调整了原有的Smooth L1 Loss计算方式,使得模型可以更好地拟合带有角度信息的真实标签[^4]。 ```python def oriented_smooth_l1_loss(pred, target, beta=1.0 / 9): """ Smooth L1 loss with angle difference. Args: pred (Tensor): Predictions of shape (N, 5). Each row contains [cx_pred, cy_pred, w_pred, h_pred, theta_pred]. target (Tensor): Ground truth values of same shape as `pred`. Format is identical to `pred`. beta (float): Parameter controlling point where the Huber function transitions from quadratic to linear. Returns: Tensor: Computed smooth l1 losses between predictions and targets. """ assert isinstance(beta, float), "Beta must be a single value." diff = torch.abs(pred - target) cond = diff[:, :4].lt(beta).sum(dim=-1) # Compute smooth L1 for geometric parameters cx,cy,w,h loss_geo = torch.where( cond.unsqueeze(-1), 0.5 * diff[:, :4] ** 2 / beta, diff[:, :4] - 0.5 * beta ).mean() # Special treatment for angular parameter due to periodicity property cos_diff = torch.cos(target[:, 4]) - torch.cos(pred[:, 4]) sin_diff = torch.sin(target[:, 4]) - torch.sin(pred[:, 4]) loss_angle = 0.5 * (cos_diff ** 2 + sin_diff ** 2) return loss_geo + loss_angle.mean() ``` #### 实现方法 该算法继承了许多现代两阶段检测器的特点: - 利用强大的骨干网提取特征,例如ResNet系列配合FPN结构来增强多尺度表达能力; - 设计专用模块负责生成高质量的方向敏感区域建议; - 对最终输出进行精细化微调,包括但不限于位置修正以及置信度评分提升。 #### 应用场景 鉴于其独特优势,Oriented R-CNN特别适用于那些存在大量非正交排列实体的数据集分析工作当中,具体实例如下: - 遥感影像解译:识别并标注卫星照片里各类交通工具轨迹走向; - 文档扫描件文字行定位:帮助OCR软件更精确地分割文档页面内的字符区块布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值