R2CNN_Faster-RCNN_Tensorflow网络架构深度剖析:ResNet+RPN双路旋转检测的TensorFlow实现原理
【免费下载链接】R2CNN_Faster-RCNN_TensorflowDetectionTeamUCAS/R2CNN_Faster-RCNN_Tensorflow: 是一个基于TensorFlow实现的Faster R-CNN变体,适用于遥感图像处理。适合用于需要针对遥感图像进行目标检测的项目。特点是可以提供针对遥感图像优化的模型结构和训练流程。项目地址: https://gitcode.com/gh_mirrors/r2/R2CNN_Faster-RCNN_Tensorflow
R2CNN_Faster-RCNN_Tensorflow 是一个基于TensorFlow实现的旋转目标检测(Oriented Object Detection)开源项目,它在经典 Faster R-CNN 两阶段框架的基础上,为遥感图像、场景文字等任意角度目标增加了"旋转分支",最终输出带角度 θ 的旋转框。本文将从骨干网络、RPN 锚点设计、双路回归头到损失函数,完整拆解它的网络架构与实现原理。🔍
🎯 为什么遥感目标检测需要"旋转"检测?
传统 Faster R-CNN 输出的是水平框(x1, y1, x2, y2)。但遥感场景中的船只、飞机、停车场车辆、文字标牌几乎都是任意方向排列的:
- 用一个水平框去框住一条斜 45° 的船,框内会包含大量无关背景,IoU 天然偏低;
- 正负样本标注困难,模型难以收敛,mAP 显著下降。
R²CNN(Rotational Region CNN)的核心思想正是:在 Fast-RCNN 阶段同时输出水平框和旋转框(cx, cy, w, h, θ),用双头结构分别监督。本项目忠实复现了这一思想,并配套了完整的训练、推理与旋转 NMS 工具链。
网络全景:一张图看懂六大模块
整个网络在 libs/networks/build_whole_network.py 中由DetectionNetwork类统一构建,数据流分为 6 步:
- 骨干网络(ResNet-101 或 MobileNetV2)提取 C4 特征图;
- RPN在特征图上预测"前景/背景"分数与锚点回归量;
- 锚点生成:按 stride 16 在特征图上铺开 78 组候选框;
- Proposal 后处理:解码 → 裁剪 → TopK → NMS,得到 ROI;
- ROI Warping从特征图裁剪 14×14 小块,送入 Fast-RCNN;
- 双路分支:水平分支(4 维回归)+ 旋转分支(5 维回归)同时输出。
所有超参数集中在 libs/configs/cfgs.py,例如 DOTA 配置下骨干为resnet_v1_101,类别数CLASS_NUM = 15。
第一级:ResNet 骨干与 C4 特征图
骨干网络实现在 libs/networks/resnet.py 的resnet_base中:
| 阶段 | 结构 | 输出 | 步长 |
|---|---|---|---|
| 卷积1 | 7×7 Conv + 最大池化 | 64 通道 | ×2 |
| block1 | ResNet 残差块 | C2(256ch) | ×4 |
| block2 | ResNet 残差块 | C3(512ch) | ×8 |
| block3 | ResNet 残差块(stride=1) | C4(1024ch) | ×16 |
几个工程细节值得注意:
- C4 步长固定为 16(block3 的最后一个残差块改为 stride=1),这是 RPN 锚点
ANCHOR_STRIDE = 16的由来,保证特征点与原图坐标可以线性对齐; - 冻结策略:
FIXED_BLOCKS = 2会冻结 block1、block2,只微调后段,小批量训练时更稳定; - 骨干默认关闭 BatchNorm 学习(
is_training=False的 BN 参数),避免小 batch 下统计量抖动; - 若追求轻量化(如人脸检测 FDDB 场景),可切换为 MobileNetV2,骨干替换逻辑同样在 build_whole_network.py 的
build_base_network中。MobileNet 系列以极少的运算量换取了可观的精度,非常适合嵌入式部署:
第二级:RPN 区域提议网络
每个特征点 78 个锚点:规模×比例组合
RPN 结构是标准配置:C4 上先接一层 512 通道的 3×3 卷积,再分两个 1×1 卷积头——rpn_cls_score(每点 2×78 个前景/背景分数)和rpn_bbox_pred(每点 4×78 个回归量)。
锚点生成在 libs/box_utils/anchor_utils.py 的make_anchors中完成,DOTA 配置下:
| 参数 | 取值 | 说明 |
|---|---|---|
| 基础锚点 | 256×256 | BASE_ANCHOR_SIZE_LIST |
| 步长 stride | 16 | 特征点间隔 |
| 6 种 scale | 0.0625 ~ 2.0 | 覆盖小目标(16px)到大目标(512px) |
| 13 种 ratio | 1, 1/2, 2, 1/3, 3, 5, 1/4, 4, 1/5, 6, 1/6, 7, 1/7 | 适配长条形目标 |
| 每点锚点数 | 6 × 13 =78 | 远超常规 9 个,专为形状多变的遥感目标设计 |
从分数到 Proposal:解码→裁剪→TopK→NMS
后处理流程在 libs/detection_oprations/proposal_opr.py 的postprocess_rpn_proposals中:
- 解码:用
decode_boxes把网络输出的 4 维偏移量还原成真实坐标(宽高在 log 空间回归,用exp还原); - 裁剪:把越界框裁回图像边界内;
- TopK:按前景概率取前 12000(训练)/ 10000(测试)个;
- NMS:IoU 阈值 0.7,保留最多 2000(训练)/ 300(测试)个 ROI。
第三级:Fast-RCNN 双路分类回归
ROI Warping:裁剪到 14×14
与标准 Faster R-CNN 的 ROIAlign 7×7 不同,本项目采用ROI Warping:先用tf.image.crop_and_resize把 ROI 特征裁剪到 14×14,再经 2×2 最大池化得到 7×7 特征(ROI_SIZE = 14),随后复用 ResNet 的block4(C5)+ 全局平均池化得到特征向量——这部分在restnet_head中实现。
水平分支与旋转分支
得到特征向量后,网络分叉为两个全连接分支:
| 分支 | 分类头 | 回归头 | 输出维度 |
|---|---|---|---|
水平分支horizen_branch | CLASS_NUM+1 | 4 × (CLASS_NUM+1) | (x1,y1,x2,y2) |
旋转分支rotation_branch | CLASS_NUM+1 | 5 × (CLASS_NUM+1) | (cx,cy,w,h,θ) |
以 DOTA 15 类为例,旋转回归头每个 ROI 输出 16×5=80 个数。分类与回归各自独立,两条分支共享同一骨干与 C5 特征,互不干扰。
旋转框是怎么解码出来的?
旋转框的编解码在 libs/box_utils/encode_and_decode.py 中:
- 旋转框统一表示为
(cx, cy, w, h, θ),角度 θ 约束在[-90°, 0°)区间,基准角取 -90°; - 解码时中心点偏移按框宽高归一化,宽高取
exp还原,角度则做θ = tθ × 180/π + (-90°)的线性还原; - 回归量会先除以缩放因子
ROI_SCALE_FACTORS = [10, 10, 5, 5, 5],即角度方向的偏移被放大 5 倍参与梯度,让模型对角度更敏感——这正是旋转检测精度的关键之一。
损失函数:六项损失联合训练
损失构建在 libs/losses/losses.py,共 6 项:
| 损失项 | 类型 | 权重 | σ |
|---|---|---|---|
| RPN 分类 | Softmax CE | 2.0 | — |
| RPN 定位 | Smooth L1 | 1/7 | 3.0 |
| RCNN 分类(水平) | Softmax CE | 2.0 | — |
| RCNN 定位(水平) | Smooth L1 | 4.0 | 1.0 |
| RCNN 分类(旋转) | Softmax CE | 2.0 | — |
| RCNN 定位(旋转) | Smooth L1 | 4.0 | 1.0 |
正负样本按 IOU 阈值划分:RPN 用 0.7/0.3,Fast-RCNN 用 0.4/0.0,正样本占比分别为 50% 和 35%。此外项目还支持将FAST_RCNN_MINIBATCH_SIZE设为 -1 启用OHEM在线难样本挖掘。优化器为 SGD(学习率 3e-4,动量 0.9),训练入口在 tools/train.py。
推理流程与旋转 NMS
推理时的后处理同样双路并行:
- 水平路:解码 → 裁剪到图像边界 → 标准 NMS(
tf.image.non_max_suppression,IoU 阈值 0.1); - 旋转路:解码出旋转框 →旋转 NMS,由 libs/box_utils/nms_rotate.py 提供,并可通过 CUDA 算子(
rotate_polygon_nms)在 GPU 上加速,IoU 由 C++ 库rbbox_overlaps计算任意角度框的重叠度。
批量推理可用 tools/inference.py,带可视化绘图的演示脚本是 tools/demo_rh.py。
实测效果:DOTA、ICDAR2015 与 FDDB
项目在三个数据集上验证了架构的通用性:
① DOTA 遥感数据集(15 类):车辆、船只、飞机、操场、桥等目标均可用贴合的旋转框检测,效果如下(左为原图,右为检测结果):
② ICDAR2015 场景文字检测:输入一张商场实景照片——
旋转分支能把任意倾斜的文字行完整框出(上两图为广告牌检测,下两图为货架标签检测):
③ FDDB 人脸检测:换用 MobileNetV2 骨干后同样可实时检测人脸,配置见 libs/configs/cfgs_FDDB_mobilenet_v1.py。
快速上手:三步跑通旋转检测
- 准备数据:按 VOC 格式整理标注(旋转框 5 维 + 类别),用 data/io/convert_data_to_tfrecord.py 转成 TFRecord;
- 修改配置:在 libs/configs/cfgs.py 中设置
CLASS_NUM、DATASET_NAME、VERSION,并在 libs/label_name_dict/label_dict.py 中注册类别名; - 训练与推理:
python tools/train.py训练(DOTA 数据先跑data/io/DOTA/train_crop.py切图),完成后python tools/demo_rh.py即可看到旋转框检测结果。
总结
R2CNN_Faster-RCNN_Tensorflow 用一套清晰的工程化架构回答了"如何让两阶段检测器理解角度"这个问题:ResNet 提供强特征、RPN 用 78 组密集锚点保证候选召回、双路 Fast-RCNN 头分别负责水平与旋转回归、旋转 NMS 完成最终筛选。如果你想在自己的遥感或文字检测任务上实现旋转框检测,这套从骨干到后处理、从数据到训练的完整 TensorFlow 实现,是一个非常值得研读的起点。🚀
【免费下载链接】R2CNN_Faster-RCNN_TensorflowDetectionTeamUCAS/R2CNN_Faster-RCNN_Tensorflow: 是一个基于TensorFlow实现的Faster R-CNN变体,适用于遥感图像处理。适合用于需要针对遥感图像进行目标检测的项目。特点是可以提供针对遥感图像优化的模型结构和训练流程。项目地址: https://gitcode.com/gh_mirrors/r2/R2CNN_Faster-RCNN_Tensorflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考