yolov9 瑞芯微 rknn 部署 C++代码

   yolov9目标检测rknn的C++部署来了。

   特别说明:如有侵权告知删除,谢谢。

  直接上代码和模型,欢迎参考交流 【完整代码和模型】

1、rknn模型准备

  pytorch转onnx,onnx再转rknn模型这一步就不再赘述,请参考上一篇 【yolov9 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署】

2、C++ 代码

  模型和图片读取部分参考rknn官方提供的示例,详细代码请参本实例对应的github仓库,代码和模型 。本实例提供的完整代码也就只包含两个.c文件和一个.h 文件,阅读起来没啥难度。

3、编译运行

1)编译

cd examples/rknn_yolov9_demo_dfl_open

bash build-linux_RK3588.sh

2)运行

cd install/rknn_yolov9_demo_Linux

./rknn_yolov9_demo

  注意:修改模型、测试图像、保存图像的路径,所在文件为 src 下main.cc文件。示例使用的类别时80类,自己的数据注意修改类别,在 include 下 postprocess.h 文件。

4、板端效果

pytorch测试效果
在这里插入图片描述
  onnx测试效果,冒号“:”前的数子是coco的80类对应的类别,后面的浮点数是目标得分。(类别:得分)
在这里插入图片描述

5、后处理时耗

  训练代码参考官方开源的yolov9训练代码,考虑到有些板端对SiLU的支持有限,本示例训练前把激活函数SiLU替换成了ReLU,训练使用的模型配置文件是yolov9.yaml,输入分辨率640x640。用 from thop import profile 统计的模型计算量和参数量 Flops: 120081612800.0(120G),Params: 55388336.0(55M)。
在这里插入图片描述
  由于模型的计算量在这里,所以推理时耗长也在意料之中,当然可以考虑用yolov9小一点模型配置。

### YOLOv8 模型换与部署瑞芯微 RKNN 平台教程 #### 准备工作 为了成功将YOLOv8模型换并部署瑞芯微RKNN平台上,需准备必要的开发环境和工具链。确保安装了Python、PyTorch以及ONNX等相关库。 #### 将 PyTorch 模型导出为 ONNX 格式 首先需要把原始的YOLOv8 PyTorch模型保存成通用中间表示形式——ONNX文件。此过程涉及定义输入张量形状,并调用`torch.onnx.export()`函数完成换操作[^3]。 ```python import torch from ultralytics import YOLO model = YOLO(&#39;yolov8n.pt&#39;) # 加载预训练好的YOLOv8 nano版本模型 dummy_input = torch.randn(1, 3, 640, 640) # 创建虚拟输入数据用于导出 output_onnx = &#39;yolov8n.onnx&#39; input_names = ["image"] output_names = [&#39;boxes&#39;, &#39;labels&#39;] torch.onnx.export(model, dummy_input, output_onnx, input_names=input_names, output_names=output_names, opset_version=12) ``` #### 使用 RKNN Toolkit 进行模型优化与编译 一旦获得了`.onnx`格式的目标检测网络结构描述文档,则可以利用官方提供的[RKNN Toolkit](https://github.com/rockchip-linux/rknn-toolkit),将其进一步化为适用于特定硬件架构下的可执行二进制码(即`.rknn`文件)。具体命令如下所示: ```bash pip install rknn-toolkit==1.7.0 # 安装对应版本的RKNN toolkit包 ``` 接着编写一段简单的脚本来处理后续步骤: ```python from rknn.api import RKNN if __name__ == &#39;__main__&#39;: # Create RKNN object rknn = RKNN() # Pre-process config print(&#39;--> Config model&#39;) rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform=&#39;rv1126&#39;) # Load ONNX model print(&#39;--> Loading model&#39;) ret = rknn.load_onnx(model=&#39;./yolov8n.onnx&#39;) if ret != 0: print(&#39;Load ONNX model failed!&#39;) exit(ret) # Build model print(&#39;--> Building model&#39;) ret = rknn.build(do_quantization=True, dataset=&#39;./dataset.txt&#39;) if ret != 0: print(&#39;Build model failed!&#39;) exit(ret) # Export RKNN model print(&#39;--> Exporting RKNN model&#39;) ret = rknn.export_rknn(&#39;./yolov8n.rknn&#39;) if ret != 0: print(&#39;Export RKNN model failed!&#39;) exit(ret) print(&#39;done&#39;) ``` 上述代码片段展示了如何通过设置量化参数来减小最终生成的应用程序体积大小的同时保持较高的精度水平;同时也指定了目标平台为RV1126系列处理器作为运行载体之一[^1]。 #### C++ 接口实现推理功能 最后,在嵌入式设备端可通过C++ API接口加载之前构建出来的`.rknn`文件来进行实时图像识别任务。下面给出了一段简化版的例子说明怎样初始化会话对象、配置输入输出缓冲区尺寸规格等细节事项[^2]: ```cpp #include "rknn_api.h" int main() { const char* model_path = "./yolov8n.rknn"; int ret; /* 初始化 */ rknn_context ctx; ret = rknn_init(&ctx, model_path, 0, 0, NULL); if (ret < 0){ printf("rknn_init fail! ret=%d\n", ret); return -1; } /* 获取输入输出属性信息 */ rknn_tensor_attr *input_attrs = new rknn_tensor_attr[input_num]; memset(input_attrs, 0, sizeof(rknn_tensor_attr)*input_num); for(int i=0; i<input_num; ++i){ input_attrs[i].index=i; ret=rknn_query(ctx,RKNN_QUERY_INPUT_ATTR,&input_attrs[i],sizeof(rknn_tensor_attr)); ... } } ``` 这段源码实现了基本的功能框架搭建,实际应用中还需要补充更多逻辑控制语句以满足不同场景需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值