news 2026/7/2 15:00:19

基于TensorFlow的旋转目标检测R2CNN实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于TensorFlow的旋转目标检测R2CNN实现

基于 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 对比:

方法mAPPLBDBRGTFSDSVLVSHTCSTSBFRRAHASPHC
SSD10.5939.839.090.6413.180.260.391.1116.2427.579.2327.169.093.031.051.01——
YOLOv221.3939.5720.2936.5823.428.852.094.8244.3438.3534.6516.0237.6247.2325.57.45——
R-FCN26.7937.838.2113.6437.266.742.65.5922.8546.9366.0433.3747.110.625.1917.96——
FR-H36.2947.166119.8551.7414.8712.86.8856.2659.9757.3248.78.2337.2523.05————
FR-O52.9379.0969.1217.1763.4934.237.1636.289.1969.658.9649.452.5246.6944.846.3——
R2CNN60.6780.9465.7535.3467.4459.9250.9155.8190.6766.9272.3955.0652.2355.1453.3548.22——
RRPN61.0188.5271.2031.6659.3051.8556.1957.2590.8172.8467.3856.6952.8453.0851.9453.58——
ICN68.2081.4074.3047.7070.3064.9067.8070.0090.8079.1078.2053.6062.9067.0064.2050.20——
R2CNN++71.1689.6681.2245.5075.1068.2760.1766.8390.9080.6986.1564.0565.3468.0162.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.h5
  • resnet101_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 numpy

  • nvcc 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

评估过程自动完成以下步骤:

  1. 加载真实标签(TXT 格式 OBB)
  2. 执行前向推理得到预测框
  3. 使用旋转 IoU 进行匹配(考虑角度差异)
  4. 计算 PR 曲线与 AP
  5. 汇总得到 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)

缩写全称中文含义
HBBHorizontal Bounding Box水平包围框
OBBOriented Bounding Box旋转包围框(带角度)
ROIRegion of Interest感兴趣区域
NMSNon-Maximum Suppression非极大值抑制
IoUIntersection over Union交并比
OHEMOnline Hard Example Mining在线难例挖掘
FPNFeature Pyramid Network特征金字塔网络
GPUGraphics 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 不仅具备良好的可读性和可维护性,也为工业级部署提供了坚实基础。无论是科研探索还是实际落地,都值得深入尝试与优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 17:56:19

PyTorch从环境配置到GPU加速完整笔记

PyTorch实战全栈指南&#xff1a;从零搭建高效训练流水线 在深度学习项目中&#xff0c;一个稳定、高效的开发环境和清晰的训练流程是成功复现模型与快速迭代的关键。很多初学者在使用PyTorch时常常卡在“明明代码没错&#xff0c;却跑不起来”——可能是环境冲突、数据格式不…

作者头像 李华
网站建设 2026/7/2 2:40:28

PyTorch GPU利用率低?提速训练的8大实用技巧

PyTorch GPU利用率低&#xff1f;提速训练的8大实用技巧 在使用 PyTorch 训练深度学习模型时&#xff0c;你是否经历过这样的场景&#xff1a;显存已经快爆了&#xff0c;nvidia-smi 却显示 GPU 利用率长期卡在 10%~30%&#xff0c;甚至更低&#xff1f;看着 A100 这样的“算力…

作者头像 李华
网站建设 2026/6/28 23:25:28

错过再等十年:智普Open-AutoGLM核心原理首次公开解读

第一章&#xff1a;错过再等十年&#xff1a;智普Open-AutoGLM核心原理首次公开解读智普AI最新发布的Open-AutoGLM模型&#xff0c;标志着自动化自然语言处理迈向新纪元。该模型融合了图神经网络与大语言模型的双重优势&#xff0c;能够在无监督场景下自动构建知识图谱并完成复…

作者头像 李华
网站建设 2026/6/26 17:56:25

OpenCV4 Python GPU加速YOLOv3目标检测实战

OpenCV4 Python GPU加速YOLOv3目标检测实战 在实时视频分析、智能监控和自动驾驶等场景中&#xff0c;“快”从来不只是一个性能指标&#xff0c;而是系统能否落地的关键门槛。哪怕模型精度再高&#xff0c;如果单帧处理耗时超过几十毫秒&#xff0c;整个系统就会因为延迟累积…

作者头像 李华
网站建设 2026/7/2 0:26:57

梯度下降法:优化算法核心解析

梯度下降法&#xff1a;优化算法核心解析 在一张泛黄的老照片上&#xff0c;斑驳的灰度影像记录着百年前的一次家庭聚会。人物轮廓依稀可辨&#xff0c;但衣着的颜色、背景的景致早已湮没在时光中。如今&#xff0c;只需几秒&#xff0c;AI就能为这张黑白照“还原”出近乎真实…

作者头像 李华
网站建设 2026/6/26 17:56:26

JFinal实现验证码生成与图片输出

JFinal 验证码生成与图片输出实战&#xff1a;构建安全高效的 Web 验证方案 在现代 Web 应用开发中&#xff0c;登录和注册环节的安全性至关重要。随着自动化脚本和爬虫技术的普及&#xff0c;单纯依赖表单提交已无法有效抵御暴力破解与批量注册攻击。验证码作为一道基础但关键…

作者头像 李华