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

部署运行你感兴趣的模型镜像

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

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

  之前写过yolov8检测、分割、关键点模型的部署的多篇博文,yolov8还没玩溜,这不yolov9又来了。yolov9刚出来两三天,有朋友就问:yolov9都出来好几天了,怎么没有见到你写一篇部署博客呢。其实yolov9出来两三天,说实话还是通过朋友告知才知道的。一直想抽时间把yolov9部署给盘一下,奈何一拖就又是好几天,这两天抽时间终于把这个yolov9给盘完了。

1 模型和训练

  训练代码参考官方开源的yolov9训练代码,考虑到有些板端对SiLU的支持有限,本示例训练前把激活函数SiLU替换成了ReLU,训练使用的模型配置文件是yolov9.yaml,输入分辨率640x640。用 from thop import profile 统计的模型计算量和参数 Flops: 120081612800.0(120G),Params: 55388336.0(55M)

2 导出 yolov9 onnx

  导出onnx时需要修改两个地方。

  特别说明:只在导出onnx时修改,训练时无需修改,修改以下代码后运行会报错,但是可以生成onnx文件,无需关注报错。

   第一个处:增加以下代码(红色框内新增):
在这里插入图片描述

        reslut = []
        for i in range(self.nl):
            reslut.append(self.cv2[i](x[i]))
            reslut.append(self.cv3[i](x[i]))
        return reslut

第二处修改:增加以下代码(红色框内新增)
在这里插入图片描述

class CBFuse(nn.Module):
    def __init__(self, idx):
        super(CBFuse, self).__init__()
        self.idx = idx

    def forward(self, xs):
        target_size = xs[-1].shape[2:]

        if target_size[0] < 10:
            res = [F.interpolate(x[self.idx[i]], size=target_size, mode='nearest') for i, x in enumerate(xs[:-1])]
            out = torch.sum(torch.stack(res + xs[-1:]), dim=0)
            return out
        j = 0
        for i, x in enumerate(xs[:-1]):
            j = i
            if target_size[0] < 10:
                continue
            if i == 0:
                x0 = F.interpolate(x[self.idx[i]], size=target_size, mode='nearest')
            if i == 1:
                x1 = F.interpolate(x[self.idx[i]], size=target_size, mode='nearest')
            if i == 2:
                x2 = F.interpolate(x[self.idx[i]], size=target_size, mode='nearest')

        if j == 2 and target_size[0] > 10:
            out = x0 + x1 + x2 + xs[-1:][0]
            return out
        if j == 1 and target_size[0] > 10:
            out = x0 + x1 + xs[-1:][0]
            return out
        if j == 0 and target_size[0] > 10:
            out = x0 + xs[-1:][0]
            return out

        res = [F.interpolate(x[self.idx[i]], size=target_size, mode='nearest') for i, x in enumerate(xs[:-1])]
        out = torch.sum(torch.stack(res + xs[-1:]), dim=0)
        return out

最后:增加保存onnx文件代码
在这里插入图片描述

    print(torch.onnx.ir_version)
    print("===========  onnx =========== ")
    dummy_input0 = torch.randn(1, 3, 640, 640)
    input_names = ["data"]
    output_names = ["output1", "output2", "output3", "output4", "output5", "output6"]
    torch.onnx.export(model, (dummy_input0), "./test_onnx/yolov9_relu_80class.onnx", verbose=True, input_names=input_names, output_names=output_names, opset_version=12)
    print("======================== convert onnx Finished! .... ")

3 yolov9 测试效果

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

onnx测试效果(确保修改CBFuse后导出的onnx测试结果和pytorch是一致的)
在这里插入图片描述

4 tensorRT 时耗

  模型训练使用的配置文件是yolov9.yaml,输入分辨率是640x640,转trt使用的fp16_mode,显卡Tesla V100,cuda_11.0。
在这里插入图片描述

5 rknn 板端C++部署

  模型训练使用的配置文件是yolov9.yaml,输入分辨率是640x640,芯片rk3588.

  把在rk3588板子上测试的模特推理时耗,和用C++代码写的后处理时耗,都给贴出来供大家参考。【rk3588的C++代码参考链接】
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.9

PyTorch 2.9

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 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(&#39;yolov10_tensorrt.pth&#39;)) ``` 综上所述,虽然各平台间存在一定差异,但从整体上看,如果开发者具备一定经验,则可以在上述三种环境中顺利集成YOLOv10,并根据不同应用场景需求选取最适合的技术路线。
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值