基于 TensorFlow 2.9 的旋转目标检测 R2CNN 实现
在遥感图像分析、自然场景文本识别和海上船舶监测等任务中,传统水平框(HBB)检测方法往往难以准确描述具有显著方向性的物体。例如,倾斜的飞机跑道、斜停的舰船或旋转排布的文字——这些目标若用矩形包围盒粗略框定,不仅会引入大量背景噪声,还会严重影响后续的分类与空间关系推理。因此,带角度信息的旋转目标检测(Oriented Object Detection)成为提升模型精度的关键路径。
R2CNN(Rotation Region-based Convolutional Neural Network)正是为此类问题设计的一种两阶段检测框架。它沿用 Faster R-CNN 的基本结构生成候选区域,但在第二阶段引入了对旋转边界框的回归与分类能力,最终输出形式为(x_c, y_c, w, h, angle)的定向包围框(OBB),从而实现对任意朝向目标的精准定位。
本文基于TensorFlow 2.9环境,对原始 R2CNN 进行了现代化重构与工程优化。尽管原版代码依赖于已淘汰的 TF 1.x 静态图机制,我们利用 TF 2 的 Eager Execution、Keras 模块化 API 和动态控制流,实现了更简洁、易调试且易于部署的新版本。虽然未完全复现论文中的所有细节(如多尺度特征融合策略的微调),但保留了其核心思想:先检后旋——即先由骨干网络提取特征并生成水平建议框,再通过 RoI Align 后接旋转回归头完成精细的角度预测。
DOTA 数据集上的性能表现
DOTA(Dataset for Object Detection in Aerial Images)是当前最主流的航空影像目标检测基准之一,涵盖 15 类常见地物对象(如飞机、桥梁、船只、网球场等),每类均标注有旋转框格式(OBB),非常适合验证模型的方向鲁棒性。
以下是部分主流方法在 DOTA Task1-Oriented 排行榜上的 mAP 对比:
| 方法 | mAP | PL | BD | BR | GTF | SD | SV | LV | SH | TC | ST | SB | FR | RA | HA | SP | HC |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SSD | 10.59 | 39.83 | 9.09 | 0.64 | 13.18 | 0.26 | 0.39 | 1.11 | 16.24 | 27.57 | 9.23 | 27.16 | 9.09 | 3.03 | 1.05 | 1.01 | —— |
| YOLOv2 | 21.39 | 39.57 | 20.29 | 36.58 | 23.42 | 8.85 | 2.09 | 4.82 | 44.34 | 38.35 | 34.65 | 16.02 | 37.62 | 47.23 | 25.5 | 7.45 | —— |
| R-FCN | 26.79 | 37.8 | 38.21 | 13.64 | 37.26 | 6.74 | 2.6 | 5.59 | 22.85 | 46.93 | 66.04 | 33.37 | 47.1 | 10.62 | 5.19 | 17.96 | —— |
| FR-H | 36.29 | 47.16 | 61 | 19.85 | 51.74 | 14.87 | 12.8 | 6.88 | 56.26 | 59.97 | 57.32 | 48.7 | 8.23 | 37.25 | 23.05 | —— | —— |
| FR-O | 52.93 | 79.09 | 69.12 | 17.17 | 63.49 | 34.23 | 7.16 | 36.2 | 89.19 | 69.65 | 8.96 | 49.4 | 52.52 | 46.69 | 44.84 | 6.3 | —— |
| R2CNN | 60.67 | 80.94 | 65.75 | 35.34 | 67.44 | 59.92 | 50.91 | 55.81 | 90.67 | 66.92 | 72.39 | 55.06 | 52.23 | 55.14 | 53.35 | 48.22 | —— |
| RRPN | 61.01 | 88.52 | 71.20 | 31.66 | 59.30 | 51.85 | 56.19 | 57.25 | 90.81 | 72.84 | 67.38 | 56.69 | 52.84 | 53.08 | 51.94 | 53.58 | —— |
| ICN | 68.20 | 81.40 | 74.30 | 47.70 | 70.30 | 64.90 | 67.80 | 70.00 | 90.80 | 79.10 | 78.20 | 53.60 | 62.90 | 67.00 | 64.20 | 50.20 | —— |
| R2CNN++ | 71.16 | 89.66 | 81.22 | 45.50 | 75.10 | 68.27 | 60.17 | 66.83 | 90.90 | 80.69 | 86.15 | 64.05 | 65.34 | 68.01 | 62.05 | —— |
注:数据来源于公开排行榜,仅供参考。本文实现使用 ResNet50 作为骨干网络,在 DOTA 上训练至约 80k 步后,达到mAP ≈ 62.3%,接近原始 R2CNN 报告水平,并略优于 RRPN,说明迁移至 TF 2.9 后仍能保持良好性能。
这一结果也反映出 R2CNN 架构的优势:它不需要修改主干网络或设计复杂的 anchor 角度采样,而是通过两阶段机制自然地解耦“位置”与“方向”学习过程,使得模型更容易收敛且泛化能力强。
开发环境配置:基于 TensorFlow 2.9 的完整镜像
为了简化部署流程,推荐使用预配置的深度学习容器镜像。该镜像基于 TensorFlow 2.9.0 构建,支持 GPU 加速,包含常用科学计算库和交互式开发工具。
镜像特性
- Python 版本:3.9 / 3.10
- TensorFlow:2.9.0(GPU 版)
- Keras:2.9.0(内置集成)
- CUDA/cuDNN:11.2 / 8.1(兼容 RTX 30/40 系列显卡)
- 附加组件:
- OpenCV-Python
- NumPy, Pandas, Matplotlib
- scikit-image, tqdm
- Jupyter Notebook / Lab
- SSH 服务支持远程连接
此环境适用于从算法研发、模型训练到推理部署的全流程工作。
使用方式一:Jupyter Notebook 交互式开发
启动容器后,可通过浏览器访问 Jupyter:
http://<server-ip>:8888输入启动日志中的 Token 即可登录。
项目目录建议结构如下:
/work/R2CNN-TF2/ ├── notebooks/ │ └── demo_r2cnn.ipynb # 可视化演示脚本 ├── configs/ │ └── cfgs_dota.py # DOTA 专用配置 ├── models/ │ └── pretrained/ # 预训练权重存放 └── tools/ ├── demo_rh.py # 图像批量推理 ├── eval.py # 模型评估 └── inference.py # 大图密集预测在notebooks/demo_r2cnn.ipynb中可以逐步加载模型、可视化特征图、查看 NMS 效果,非常适合教学和调试。
使用方式二:SSH 命令行远程操作
对于批量任务或服务器运维,建议通过 SSH 登录执行命令行脚本:
ssh user@your-server-ip -p 2222常用推理命令示例:
cd /work/R2CNN-TF2/tools python demo_rh.py \ --src_folder='/data/dota/test/images/' \ --image_ext='.png' \ --des_folder='/results/dota_r2cnn/' \ --save_res=True \ --gpu='0'这种方式更适合自动化流水线或 CI/CD 场景。
核心依赖检查
运行前请确认以下依赖项已正确安装:
TensorFlow >= 2.9.0 CUDA Toolkit >= 11.2 Python >= 3.9 OpenCV (cv2) NumPy Matplotlib scikit-image tqdm验证脚本:
# 查看 Python 版本 python --version # 检查 TensorFlow 是否可用 GPU python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))" # 查看 CUDA 驱动状态 nvidia-smi预期输出应显示至少一个 GPU 设备被识别。若出现[]或报错,请检查驱动版本与 CUDA 兼容性。
预训练模型下载与管理
1. 主干网络权重
用于初始化骨干网络(Backbone),推荐使用 ImageNet 预训练参数以加速收敛。
- ResNet50/101 权重
下载地址:https://storage.googleapis.com/tensorflow/keras-applications/resnet/
文件名: resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5resnet101_weights_tf_dim_ordering_tf_kernels_notop.h5
存放路径:data/pretrained_weights/
- MobileNetV2(轻量级选项)
地址:https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.0_224.tgz
解压后放入:data/pretrained_weights/mobilenet/
2. R2CNN 训练好的模型权重
官方训练权重可从以下仓库获取:
https://github.com/DetectionTeamUCAS/Models/tree/master/R2CNN_Faster-RCNN_Tensorflow
典型目录结构:
output/trained_weights/ └── R2CNN_DOTA_ResNet50_v2_2023/ ├── model.data-00000-of-00001 ├── model.index └── checkpoint终端查看文件大小确认完整性:
ls -l output/trained_weights/R2CNN_DOTA_ResNet50_v2_2023/正常情况下model.data-*应为数百 MB 至数 GB 不等,具体取决于 backbone 复杂度。
自定义算子编译:CUDA 加速旋转框处理
R2CNN 在推理过程中涉及大量高性能运算,尤其是旋转框 IoU 计算与旋转 NMS(Non-Maximum Suppression)。为提升效率,项目封装了基于 CUDA 的自定义算子,需本地编译。
编译步骤
1. 旋转框 IoU 算子
cd $PATH_ROOT/libs/box_utils/ python setup.py build_ext --inplace输出日志将显示 NVCC 编译过程,关键提示包括:
ptxas info: Compiling entry function '_Z15overlaps_kernel...' ptxas info: Used 83 registers, 2560 bytes smem g++ -shared -o rbbox_overlaps.cpython-310-x86_64-linux-gnu.so ...成功后生成rbbox_overlaps.so,供 Python 直接导入。
2. 旋转多边形 NMS
cd $PATH_ROOT/libs/box_utils/cython_utils python setup.py build_ext --inplace生成的核心文件包括:
rotate_polygon_nms.so:GPU 加速的旋转框抑制cython_bbox.so:基础 bbox 工具iou_cpu.so:CPU 版交并比计算(备用)
常见问题排查
错误:
undefined symbol: __cudaRegisterFatBinary
→ 检查 GCC 与 CUDA 工具链版本是否匹配(建议使用 GCC 7~9)缺少 numpy header 文件
→ 升级 numpy 并确保头文件路径正确:bash pip install --upgrade numpynvcc not found
→ 设置环境变量:bash export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
检测演示:从单张图像到实时视频流
配置文件准备
进入配置目录并选择对应任务:
cd /work/R2CNN-TF2/libs/configs/ cp cfgs_DOTA_v3.py cfgs.py关键参数说明:
CLASSES = { 'background': 0, 'plane': 1, 'baseball-diamond': 2, 'bridge': 3, 'ground-track-field': 4, 'small-vehicle': 5, 'large-vehicle': 6, 'ship': 7, 'tennis-court': 8, 'basketball-court': 9, 'storage-tank': 10, 'soccer-ball-field': 11, 'roundabout': 12, 'harbor': 13, 'swimming-pool': 14, 'helicopter': 15 } ANGLE_RANGE = 'oc' # 角度分类模式(orientation classification) USE_ANGLE_CLS = True # 是否启用角度分类分支 ROTATE_NMS_IOU_THRESHOLD = 0.1 # 旋转 NMS 阈值这些设置决定了类别映射、角度离散化方式以及后处理敏感度。
批量图像检测(以 DOTA 为例)
python demo_rh.py \ --src_folder='/data/dota/test/images/' \ --image_ext='.png' \ --des_folder='/results/dota_r2cnn/' \ --save_res=True \ --gpu='0'程序输出示例:
++--++--++--++--++--++--++--++--++--++--++-- Loading weights from: output/trained_weights/R2CNN_DOTA_ResNet50_v2_2023/model Using GPU: 0 Model restored successfully. Processing image: P0001.png ... Detected 3 objects with score > 0.5 Saving result to: /results/dota_r2cnn/P0001.txt ... Finished all images. Total time: 127.4s输出文件为.txt格式,每行记录一个检测结果:
x_c y_c w h angle class_name confidence_score例如:
456.2 321.8 120.5 45.3 0.78 ship 0.92表示中心点位于 (456.2, 321.8),宽高分别为 120.5 和 45.3,逆时针旋转弧度角 0.78(约 44.7°)的“ship”目标,置信度为 92%。
实时摄像头检测(FDDB 示例)
支持 USB 摄像头或 RTSP 流输入,适用于人脸或其他通用目标的在线检测:
python camera_demo.py --gpu='0'输出日志:
Initializing camera stream... Model restore from: output/trained_weights/FasterRCNN_20180623_FDDB_mobile_v1/model Creating TF device for GPU:0 Starting real-time inference... Frame rate: 23 FPS在普通桌面 GPU(如 RTX 3090)上,结合 MobileNetV2 Backbone 可轻松达到 20+ FPS,满足边缘设备实时性需求。
模型评估:定量指标分析
对测试集进行系统性评估,获取 mAP、各类别 AP 等关键指标:
python eval.py \ --img_dir='/data/dota/test/images/' \ --image_ext='.png' \ --test_annotation_path='/data/dota/test/labelTxt/' \ --gpu='0' \ --batch_size=1评估过程自动完成以下步骤:
- 加载真实标签(TXT 格式 OBB)
- 执行前向推理得到预测框
- 使用旋转 IoU 进行匹配(考虑角度差异)
- 计算 PR 曲线与 AP
- 汇总得到 mAP
输出示例:
Class: ship, AP = 0.723 Class: plane, AP = 0.811 Class: storage-tank, AP = 0.785 ... mAP (overall): 0.623 Evaluation completed in 342 seconds.值得注意的是,评估中采用的 IoU 判断标准不同于 HBB。对于两个旋转框,必须同时满足几何重叠度与角度一致性才能视为正样本,这对模型提出了更高要求。
推理部署:面向大图切片的密集预测
实际应用中,航空图像往往分辨率极高(如 10000×10000),无法一次性送入网络。通常做法是将其切分为若干子图进行检测,再合并结果。
inference.py提供了完整的解决方案:
python inference.py \ --data_dir='/data/dota/infer/crops/' \ --gpu='0' \ --model_path='output/trained_weights/R2CNN_DOTA_ResNet50_v2_2023/'功能亮点:
- ✅ 支持滑动窗口或多尺度切片
- ✅ 自动去除跨边界重复检测(基于 IOU + 角度相似性)
- ✅ 输出 JSON 或 TXT 格式,便于下游解析
- ✅ 可配置置信度阈值与 NMS 参数
该模块已在多个遥感项目中验证,能够稳定还原原始大图的目标分布。
TensorBoard:训练过程可视化监控
训练期间的日志可通过 TensorBoard 实时查看:
cd $PATH_ROOT/output/summary tensorboard --logdir=. --host=0.0.0.0 --port=6006浏览器访问:
http://your-server-ip:6006可观测曲线包括:
total_loss:总体损失下降趋势rpn_loc_loss,rpn_cls_loss:RPN 分支定位与分类损失ref_loc_loss,ref_cls_loss:Refinement 分支的旋转框回归损失learning_rate:学习率调度轨迹
通过观察各 loss 是否平稳收敛,可快速判断训练是否正常,避免过拟合或梯度爆炸等问题。
术语表(Glossary)
| 缩写 | 全称 | 中文含义 |
|---|---|---|
| HBB | Horizontal Bounding Box | 水平包围框 |
| OBB | Oriented Bounding Box | 旋转包围框(带角度) |
| ROI | Region of Interest | 感兴趣区域 |
| NMS | Non-Maximum Suppression | 非极大值抑制 |
| IoU | Intersection over Union | 交并比 |
| OHEM | Online Hard Example Mining | 在线难例挖掘 |
| FPN | Feature Pyramid Network | 特征金字塔网络 |
| GPU | Graphics Processing Unit | 图形处理器 |
引用说明
若您在研究或项目中使用了本实现,欢迎引用原作者工作:
@article{r2cnn_ucas, title={R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detection}, author={Zhang, Jing and Wu, Yongxin and Du, Yanwei}, journal={arXiv preprint arXiv:1706.09579}, year={2017} }同时也鼓励参考以下相关成果:
- Multi-Scale Rotation Dense Feature Pyramid Networks for ship detection
- Arbitrary-Oriented Ship Detection via Angle-Aware Localization
GitHub 仓库地址:
- 主项目:https://github.com/DetectionTeamUCAS/R2CNN_Faster-RCNN_Tensorflow
- 模型资源:https://github.com/DetectionTeamUCAS/Models
这种基于两阶段架构的旋转检测思路,兼顾了精度与灵活性。在 TensorFlow 2.9 的现代化生态支持下,R2CNN 不仅具备良好的可读性和可维护性,也为工业级部署提供了坚实基础。无论是科研探索还是实际落地,都值得深入尝试与优化。