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

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

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

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

1、rknn模型准备

  pytorch转onnx,onnx再转rknn模型这一步就不再赘述,请参考上一篇 【yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快】

2、C++ 代码

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

3、编译运行

1)编译

cd examples/rknn_yolov10_demo_open

bash build-linux_RK3588.sh

2)运行

cd install/rknn_yolov10_demo_Linux

./rknn_yolov10_demo

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

4、板端效果

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

  板端rknn测试效果,冒号“:”前的数子是coco的80类对应的类别,后面的浮点数是目标得分(类别:得分)。板端效果和pytoch效果不完全一致是由于转rknn时精度有所丢失导致。若想让精度丢失的少,可以考虑使用更多、更丰富的量化图片。
在这里插入图片描述

5、后处理时耗

  本示例用的是yolov10n,模型计算量6.7G,看到这个时耗觉得可能是有操作切换到CPU上进行计算的,查了rknn转换模型日志确实是有操作切换到CPU上进行的,对应的是模型中 PSA 模块计算 Attention 这部分操作。
在这里插入图片描述
在这里插入图片描述

### 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('yolov8n.pt') # 加载预训练好的YOLOv8 nano版本模型 dummy_input = torch.randn(1, 3, 640, 640) # 创建虚拟输入数据用于导出 output_onnx = 'yolov8n.onnx' input_names = ["image"] output_names = ['boxes', 'labels'] 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__ == '__main__': # Create RKNN object rknn = RKNN() # Pre-process config print('--> Config model') rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rv1126') # Load ONNX model print('--> Loading model') ret = rknn.load_onnx(model='./yolov8n.onnx') if ret != 0: print('Load ONNX model failed!') exit(ret) # Build model print('--> Building model') ret = rknn.build(do_quantization=True, dataset='./dataset.txt') if ret != 0: print('Build model failed!') exit(ret) # Export RKNN model print('--> Exporting RKNN model') ret = rknn.export_rknn('./yolov8n.rknn') if ret != 0: print('Export RKNN model failed!') exit(ret) print('done') ``` 上述代码片段展示了如何通过设置量化参数来减小最终生成的应用程序体积大小的同时保持较高的精度水平;同时也指定了目标平台为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)); ... } } ``` 这段源码实现了基本的功能框架搭建,实际应用中还需要补充更多逻辑控制语句以满足不同场景需求。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值