news 2026/3/25 22:10:49

基于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/3/16 3:29:46

模型自动优化真的可行吗,Open-AutoGLM是如何实现零人工干预调参的?

第一章&#xff1a;模型自动优化真的可行吗&#xff0c;Open-AutoGLM是如何实现零人工干预调参的&#xff1f;在深度学习领域&#xff0c;超参数调优长期依赖专家经验与反复实验。Open-AutoGLM 的出现挑战了这一传统范式&#xff0c;通过自动化机制实现了无需人工干预的模型优化…

作者头像 李华
网站建设 2026/3/19 10:20:25

Open-AutoGLM部署实战详解(新手必看版)

第一章&#xff1a;Open-AutoGLM部署实战概述Open-AutoGLM 是一个面向自动化自然语言任务的开源大模型推理框架&#xff0c;支持灵活的模型加载、动态提示工程与多后端部署能力。本章将介绍其核心部署流程与关键配置策略&#xff0c;帮助开发者快速构建高效稳定的推理服务。环境…

作者头像 李华
网站建设 2026/3/15 21:10:34

利用DFM文件实现自定义窗体样式

利用DFM文件实现自定义窗体样式&#xff1a;为DDColor黑白老照片修复工具打造专属界面 发这篇文章前其实已经搁置很久了&#xff0c;一开始是因为家里那台老电脑跑不动ComfyUI&#xff0c;每次启动都卡得像幻灯片。直到某天我在GitHub上刷到了那个叫DDColor的项目——能把泛黄的…

作者头像 李华
网站建设 2026/3/23 14:21:13

基于智能推荐的考研经验分享平台的设计与实现周记

第1-15周周记第1周工作任务&#xff1a;系统需求分析与设计工作记录&#xff1a;本周主要完成了对大学生兼职系统的需求分析&#xff0c;明确了管理员后台、学生端、企业端的主要功能需求。管理员后台需要实现兼职招聘发布与管理、投简信息处理、用户通知管理、学生咨询与企业回…

作者头像 李华
网站建设 2026/3/21 9:32:41

AI搜索引擎品牌提及指南:用数据驱动策略,让品牌被AI主动推荐

“为什么ChatGPT不提我们的品牌&#xff1f;AI搜索结果里根本看不到我们的身影&#xff1f;”——这是如今SEO从业者和品牌方最常面临的灵魂拷问。在AI成为信息获取核心渠道的时代&#xff0c;品牌能否被AI搜索引擎提及&#xff0c;直接关系到线上曝光与商业转化。但想要获得AI…

作者头像 李华