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

得到结果:

### 将RKNN3588模型部署到开发板上的最佳实践 #### 准备工作 为了成功将RKNN3588模型部署至开发板,需先完成必要的准备工作。这包括但不限于确保开发板已正确配置Ubuntu或Debian操作系统,并安装所需的依赖库。 对于NPU和RGA运行环境的设置,可以通过克隆指定仓库来获取所需资源: ```bash git clone https://github.com/airockchip/librga.git git clone https://github.com/rockchip-linux/rknpu2.git ``` 上述命令用于下载librga以及rknpu2两个项目文件[^2]。 #### 部署流程概述 利用RKNN Toolkit lite2可以简化RKNN模型向RK3588开发板迁移的过程。具体操作涉及几个重要环节:转换、优化及加载模型;编写应用程序接口(API),以便调用该模型执行特定任务;最后,在目标设备上测试应用性能以验证其准确性与效率。 #### 实际操作指南 以下是基于RKNN Toolkit lite2的具体实施步骤说明: 1. **模型准备** - 确认所使用的神经网络架构已被支持; - 如果是从其他框架(如TensorFlow, PyTorch等)导入,则需要通过工具包提供的功能将其转化为兼容格式。 2. **环境搭建** - 安装Python SDK及其他可能需要用到的支持软件包; - 设置好交叉编译器链路,如果打算在主机而非直接于嵌入式平台上构建程序的话。 3. **API设计与实现** - 参考官方文档中的例子学习如何创建适合的应用逻辑; - 编写能够有效管理输入输出数据流并与硬件加速单元交互的代码片段。 4. **移植与调试** - 把经过充分测试后的可执行文件传输给实际物理机器; - 进行初步的功能性和稳定性检验,必要时调整参数直至达到预期效果为止。 ```python from rknn.api import RKNN if __name__ == '__main__': # 初始化RKNN对象实例 rknn = RKNN() # 加载预训练好的rknn模型文件路径 model_path = './model.rknn' # 调用load_rknn方法读取本地存储的模型结构定义 ret = rknn.load_rknn(model_path) if ret != 0: print('Load RKNN model failed!') # 执行初始化过程,为后续推断做准备 ret = rknn.init_runtime(target='rv1126') if ret != 0: print('Init runtime environment failed!') # 开始预测... ``` 此段脚本展示了怎样运用Python API快速启动一个简单的推理会话[^1]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mrs.Gril

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

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

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

打赏作者

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

抵扣说明:

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

余额充值