RKNN3588上部署 RTDETRV2

RT-DETR V2 是由百度研究团队在 2024年 提出的,是其广受好评的实时目标检测模型 RT-DETR 的重大升级版本。它继承了第一代 RT-DETR 利用 Transformer 架构实现端到端目标检测 和 卓越实时性能 的核心优势,并针对模型精度、训练效率和部署灵活性进行了全方位的显著提升,再次刷新了实时检测的SOTA(State-of-the-Art)水平。

核心目标与核心优势:

  1. 更高精度: 在保持甚至超越实时速度的前提下,显著提升在各种场景下的检测精度(平均精度均值 - AP)。

  2. 更快训练: 极大地缩短模型训练所需时间,降低研发和迭代成本。官方宣称训练速度比 V1 快 3倍

  3. 更强部署灵活性: 提供更广泛的硬件平台支持(如 NVIDIA GPU, Intel CPU, NVIDIA Jetson, ARM 处理器等)和更高效的推理引擎适配(如 TensorRT, ONNX Runtime, OpenVINO)。

关键技术革新:

RT-DETR V2 的成功源于多项创新设计:

  1. 混合编码器设计:

    • 巧妙地融合了 CNN 骨干网络(如 HGNetv2) 和 Transformer 编码器 的优势。

    • CNN 高效提取局部特征,Transformer 则擅长捕捉长距离依赖和全局上下文。

    • 这种混合结构在特征提取阶段就为高精度和高效性奠定了基础。

  2. 不确定性最小化查询(Uncertainty-minimal Queries - UMQs):

    • 这是 V2 的核心创新之一。传统 DETR 类模型使用可学习的对象查询(Object Queries)来定位和识别目标,但其初始化和匹配存在不确定性。

    • UMQs 机制通过 显式地建模和最小化查询的空间位置不确定性,引导模型学习到更稳定、更精准的初始目标位置表示。

    • 效果: 显著加速了训练收敛速度(是训练提速的关键),并提升了检测精度,尤其是对小目标的检测能力。

  3. IoU 感知查询选择:

    • 在将特征图上的点(Anchor Points)转换为解码器输入的对象查询时,V2 引入了 IoU(交并比)感知机制。

    • 它不仅考虑分类得分,还综合考虑预测框与真实框的IoU质量来选择最具有代表性和高质量的查询。

    • 效果: 筛选出更优质的初始查询,为解码器提供更有效的输入,进一步提升精度。

  4. 尺度增强的混合分配:

    • 改进了训练过程中为预测框分配监督标签(即正负样本分配)的策略。

    • 通过结合动态匹配(如匈牙利算法)和基于规则的静态分配(如ATSS)的优点,并融入多尺度信息

    • 效果: 为模型提供了更丰富、更稳定的监督信号,尤其是在处理不同尺度的目标时,提升了训练的鲁棒性和最终精度。

性能表现:

在权威的 COCO 目标检测数据集上,RT-DETR V2 展现了令人印象深刻的性能:

  • 例如,RT-DETR-L 模型在 COCO val2017 上达到 54.8% AP,同时推理速度在 NVIDIA Tesla T4 GPU 上高达 74 FPS

  • 更重要的是,它在 各种硬件平台(从高端GPU到边缘CPU) 上都实现了领先的精度-速度权衡,验证了其卓越的部署灵活性。

  • 其训练速度相比 V1 大幅提升(约3倍),极大地提高了研发效率。

但是在边缘端上部署确实存在较多的问题,今天我们在RK3588上部署RTDETRV2.

导出onnx:


import os
import sys

import torch
import torch.nn as nn

from src.core import YAMLConfig
from rtModel import Model

def main(args, ):
    """main
    """
    cfg = YAMLConfig(args.config, resume=args.resume)


    model = Model()

    data = torch.rand(1, 3, 1024, 1024)
    size = torch.tensor([[1024, 1024]])
    _ = model(data, size)

    dynamic_axes = {
        'images': {0: 'N', },
        'orig_target_sizes': {0: 'N'}
    }

    output_file = args.resume.replace('.pth', '.onnx') if args.resume else 'model.onnx'

    torch.onnx.export(
        model,
        (data, size),
        output_file,
        input_names=['images', 'orig_target_sizes'],
        output_names=['labels', 'boxes', 'scores'],
        # dynamic_axes=dynamic_axes,
        opset_version=16,
        verbose=False,
        do_constant_folding=True,
    )

    if args.check:
        import onnx
        onnx_model = onnx.load(output_file)
        onnx.checker.check_model(onnx_model)
        print('Check export onnx model done...')

    if args.simplify:
        import onnx
        import onnxsim
        dynamic = True
        # input_shapes = {'images': [1, 3, 640, 640], 'orig_target_sizes': [1, 2]} if dynamic else None
        input_shapes = {'images': data.shape, 'orig_target_sizes': size.shape} if dynamic else None
        onnx_model_simplify, check = onnxsim.simplify(output_file, test_input_shapes=input_shapes)
        onnx.save(onnx_model_simplify, output_file)
        print(f'Simplify onnx model {check}...')


if __name__ == '__main__':

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--config', '-c', default='configs/dfine/dfine_hgnetv2_l_coco.yml', type=str, )
    parser.add_argument('--resume', '-r', type=str, )
    parser.add_argument('--check',  action='store_true', default=True,)
    parser.add_argument('--simplify',  action='store_true', default=True,)
    args = parser.parse_args()
    main(args)

转换为rknn,正常转换即可。

得到rknn将其push到开发板中。

执行命令:

./rknn_yolov5_demo ../REDETRV2_RKNN.rknn ../vedio_0_2_580.jpg 10 RTDETRV2

得到结果:

### 如何在瑞芯微RK3588平台上部署RTDETR目标检测模型 #### 准备工作 为了成功地在瑞芯微RK3588平台上部署RTDETR模型,首先需要准备必要的环境和依赖项。确保安装了用于模型转换和优化的工具包以及支持硬件加速的相关库。 克隆所需的GitHub仓库以获取最新的模型部署示例和支持代码[^2]: ```bash git clone https://github.com/airockchip/rknn_model_zoo.git cd rknn_model_zoo/ ``` 接着,还需要下载专门针对YOLO系列模型设计的导出工具,尽管这里是为YOLOv8定制的,但对于其他类型的对象检测器如RTDETR也有一定的借鉴意义: ```bash git clone https://github.com/airockchip/ultralytics_yolov8.git ``` 另外,考虑到图像预处理的重要性,在验证阶段可借助OpenCV简化流程;而在最终产品中,则应利用RGA(Rockchip Graphics Accelerator)提供的`librga`接口来执行高效的色彩空间变换和其他操作: ```bash git clone https://github.com/airockchip/librga.git ``` #### 转换PyTorch RTDETR模型至RKNN格式 一旦准备工作完成,下一步就是将训练好的PyTorch版本的RTDETR模型转化为适合于RK3588 NPU运行的形式——即RKNN文件。此过程涉及使用特定API加载原始.pth权重并指定输出路径保存新的.rknn文件: 假设已经有一个名为`rt detr_best.pt`的最佳性能checkpoint存在本地磁盘上, 可按照如下方式将其转变为RKNN兼容形式[^3]: ```python from ultralytics import YOLO model = YOLO('path/to/your_rt_detr_best.pt') export_path = model.export(format="rknn", opset=12) print(f"Exported RKNN Model Path: {export_path}") ``` 注意这里的`format="rknn"`参数指定了期望的目标格式,而`opset=12`则定义了ONNX运算符集版本号,这两个选项可能依据具体需求有所调整。 #### 编译与测试C++应用程序 最后一步是在嵌入式Linux环境中编写一段简单的C++程序读取上述生成的`.rknn`文件,并调用相应的SDK函数初始化网络结构、输入数据流并通过NPU进行前向传播计算得到预测结果。这部分的具体实现细节可以参照官方文档中的说明或是参考之前提到过的`rknn_model_zoo`项目里的实例代码片段[^1]。 此外,如果计划进一步提升效率或集成更多特性的话,不妨考虑深入研究由Rockchip维护的核心工具链——`rknn-toolkit2`[^5], 它不仅包含了丰富的命令行实用程序帮助开发者更好地理解和管理整个开发周期内的各项任务,还提供了详尽的技术资料辅助解决可能出现的各种挑战。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrs.Gril

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值