yolo world 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

  特别说明:参考官方开源的 yoloworld 代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。

  模型和完整仿真测试代码,放在github上参考链接 模型和代码

  yoloworld出来的有一段时间了,还没有盘到板端上玩一玩,不把这个给整落地工作都干不起劲。落地过程也是一波三折多次想放弃,起早赶晚的抽时间干,再试一次,再试最后一次,再试最最后一次 。。。yoloworld 环境(MMDet)搭建都折腾了三次,转onnx也折腾了三次,上rknn板子又是三次(尝试rknn_toolkit2-1.3.0、rknn_toolkit2-1.6.0运行报错,最终用的rknn_toolkit2-2.0.0运行成功),都快折腾废了。

1 模型训练

  训练就不多说,也没有尝试过,训练参考官方代码,本示例直接用yolov8提供的yoloworld模型(本想用腾讯提供的模型,奈何搭建环境太折腾;尝试过Huggingface导出的onnx模型,奈何规避不掉板端不支持的操作),进行板端部署。

1 导出 yolo_world onnx (yolo_world_v2_s)

   尝试过用 huggingface 提供的demo导出onnx,但其中有操作(torch.einsum)板端支持不了,只能放弃作罢。本示例使用的是yolov8提供的yoloworld代码,进行onnx导出,规避 torch.einsum 操作,得到可以上板子的onnx模型。导出时进行调整,导出模型示意图如下,导出的类别使用的是80类。本示例对应提供的代码只用于适用六个输出头。

指定导出类别、以及导出六个输出头参考:(特别说明:本示例以yolov8提供的yoloworld代码为示例)

使用的yolov8提供的权重文件:权重文件

由于yolov8官方代码在不断修改,博客中使用的版本已打包:转onnx时使用的yolov8版本

第一步:保存指定类别的权重文件

from ultralytics import YOLO

model = YOLO("./yolov8s-world.pt")
model.set_classes(["person", "bus"])           # 指定导出类别(以两个类别为例)
model.save("./custom_yolov8s-world.pt")        # 保存指定类别的权重文件

第二步:修改输出头
在这里插入图片描述

        # 导出 onnx 增加
        y = []
        for i in range(self.nl):
            t1 = self.cv2[i](x[i])
            t2 = self.cv4[i](self.cv3[i](x[i]), text)
            y.append(t1)
            y.append(t2)
        return y

第三步:增加保存onnx代码
在这里插入图片描述

        print("===========  onnx =========== ")
        import torch
        dummy_input = torch.randn(1, 3, 640, 640)
        input_names = ["data"]
        output_names = ["reg1", "cls1", "reg2", "cls2", "reg3", "cls3"]
        torch.onnx.export(self.model, dummy_input, "./yoloworld_v2_zq.onnx", verbose=False, input_names=input_names, output_names=output_names, opset_version=12)
        print("======================== convert onnx Finished! .... ")

第四步:运行,生成六个头的onnx文件

from ultralytics import YOLO

model = YOLO("./custom_yolov8s-world.pt")   # 加载第一步生成的指定类别的权重文件(生成onnx)

本示例生成的onnx如下(6个输出头,2个检测类别):
在这里插入图片描述

2 pytorch测试效果

在这里插入图片描述
onnx测试效果
在这里插入图片描述

3 tensorRT 时耗

  模型yolo_world_v2_s,导出类别80类,输入分辨率是640x640,转trt使用的fp16_mode,显卡Tesla V100,cuda_11.0。
在这里插入图片描述

5 rknn 板端C++部署

  模型yolo_world_v2_s,导出类别80类,输入分辨率是640x640,芯片rk3588.
在这里插入图片描述
  把在rk3588板子上测试的模特推理时耗,和用C++代码写的后处理时耗,都给贴出来供大家参考。【rk3588的C++代码参考链接】

### YOLOv10 部署于不同硬件平台 #### 瑞芯微 RKNN 芯片部署 YOLOv10 的复杂度与性能表现 对于瑞芯微RKNN芯片而言,YOLO系列模型的移植通常涉及将PyTorch或ONNX格式转换成RKNN专用格式。由于缺乏针对YOLOv10的具体优化工具链支持,这一过程可能较为繁琐[^1]。然而,在完成必要的量化处理并成功编译后,基于RK3588等高性能SoC的表现来看,其能够提供令人满意的实时检测能力。 ```bash # 假设已经安装好rknn-toolkit2环境 python3 -m rknn.api.create_rknn --model yolov10.onnx --output yolov10.rknn ``` #### 地平线 Horizon 芯片上的部署挑战与优势 地平线Horizon提供了专门面向AI加速器设计的软件栈,使得像YOLO这样的神经网络更容易被适配到这些平台上运行。尽管官方文档主要围绕较早版本的YOLO展开讨论,但对于最新版如YOLOv10来说,通过调整输入尺寸、锚框参数等方式仍可实现良好效果。此外,得益于内置的强大算力单元,即使是在高分辨率图像下也能保持较快的速度。 ```cpp // 使用Horizon SDK加载预训练好的YOLOv10权重文件 horizon::vision::Model model = horizon::vision::loadModel("path/to/yolov10"); ``` #### NVIDIA TensorRT 上的应用特点分析 NVIDIA TensorRT作为一款专为深度学习推理而生的产品,拥有成熟的生态系统和完善的支持体系。它不仅可以直接读取来自PyTorch/ONNX等形式定义的YOLO架构描述符,而且借助FP16半精度浮点数运算模式进一步提升了效率。因此,在GPU资源充足的情况下,采用TensorRT来承载YOLOv10几乎是最优解之一;同时,凭借CUDA库的优势,可以获得极高的吞吐量和较低延迟特性。 ```python import tensorrt as trt from torch2trt import TRTModule net_trt = TRTModule() net_trt.load_state_dict(torch.load('yolov10_tensorrt.pth')) ``` 综上所述,虽然各平台间存在一定差异,但从整体上看,如果开发者具备一定经验,则可以在上述三种环境中顺利集成YOLOv10,并根据不同应用场景需求选取最适合的技术路线。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值