瑞芯微rk3588部署yolov5模型实战

模型转换

  ​使用此yolov5 仓库获取yolov5代码以及模型

通过pt模型转换为onnx模型

python export.py --rknpu rk3588 --weight yolov5s.pt

  ​rk_platform 支持 rk1808、rv1109、rv1126、rk3399pro、rk3566、rk3562、rk3568、rk3588、rv1103、rv1106。(实际上,无论平台如何,导出的模型都是相同的)
  ​’yolov5s.pt’ 可以替换为您的模型路径
  ​将生成一个文件名“RK_anchors.txt”,可以在外部执行 post_process 时使用它。
  ​注意:请使用–rknpu参数调用,不要更改export.py中的默认rknpu值。​
在这里插入图片描述

通过onnx模型转换为rknn模型

  ​使用此模型转换库
打开yolo_ppyolo.yml文件

#support yolo[v5,v6,v7,v8], ppyoloe_plus
model_framework: onnx
model_file_path: best_3588B.onnx
RK_device_platform: RK3588

dataset: coco_dataset_20.txt
quantize: True
pre_compile: online

graph:
  in_0:
    shape: 3,640,640
    mean_values: 0
    std_values: 255
    img_type: RGB

configs:
  quantized_dtype: asymmetric_quantized-8
  quantized_algorithm: normal
  optimization_level: 3

​根据模型修改 yml 配置文件参数
在这里插入图片描述

必填项
  ​model_framework 参数,指定模型来源框架,如 onnx / pytorch.
  ​model_file_path 参数,指定模型路径
  ​RK_device_platform 参数,指定RKNN平台
执行参数说明

参数名作用
–yml_path(必填)指定yml配置文件路径
–eval_perf评估性能(基于rknn.eval_perf)
–eval_memory评估内存(基于rknn.eval_memory)
–python_api_test测试 rknn-toolkit.run 与 framework.run 结果的余弦值
–capi_test设定 CPU/DDR/NPU 频率,测试 capi 与 framework.run结果余弦值,记录 input_set, run, output_get 耗时
–capi_zero_copy_test设定 CPU/DDR/NPU 频率,测试 capi 与 framework.run结果余弦值,记录耗时(目前可能有bug)
–report生成报告

可选项
  ​默认使用量化。请注意先准备好COCO测试数据集(下载可参考工程目录下datasets内容)。如不使用量化功能,请将 quantize 参数设为 False
  ​默认不启用预编译功能。如需启用请将 pre_compile 参数设为 online,并通过usb口连接npu设备(此功能仅在 RKNN-Toolkit1 上有效,usb口需要能adb连上npu设备,RKNN-Toolkit2 没有此配置)
  ​如需使用模拟器,请将 RK_device_id 设为 simulator
  ​如果是自己训练的模型及数据,请将 dataset 路径指定到对应的训练/测试数据上,model_file_path指定到对应的pt模型路径,模型输入尺寸由 3,640,640 改为 3,h,w,如 3,736,1280
  ​测试 coco benchmark 时,建议使用 200 - 500 张图片进行量化。

参数名填写内容
model_name(选填)导出 rknn 模型的名称
model_platform(必填)原模型的框架名(如caffe, darknet, keras, mxnet, onnx, pytorch, tensorflow, tflite)
model_file_path(必填)原模型路径(可填相对路径)
RK_device_platform(必填)目标npu设备平台,可填 [rk3399pro/rk1808/rv1109/rv1126/rk3566/rk3568/rk3588]
RK_device_idnpu设备id(可以通过abd devices获取),仅连接单个npu设备的时候可不填,默认为None
dataset量化数据集,具体填写格式参考demo或user_guide手册。
quantize是否量化,填 [True/False]
pre_compile预编译模型,填写 [off\online]
(仅RKNN_toolkit1生效)
graph
- in_0(必填)对于多输入的,请依次命名为 in_0,in_1,…,in_n
- name(tensorflow模型必填)输入节点名
- shape(必填)输入的尺寸,nchw/nhwc的格式取决于原框架的形式,如pytorch模型的 3,224,224
- mean_values输入的均值归一数,如 123.675,116.28,103.53。对于各通道归一化数字相等的,允许填写单值,如 0,0,0 => 0
- std_values输入的方差归一数,如 58.395,58.295,58.391。对于各通道归一化数字相等的,允许填写单值,如 255,255,255 => 255
- img_type根据原模型输入类型,填写 RGB 或者 BGR,如果是非图片的数据,请勿填写
- out_0(tensorflow模型必填)对于多输出的,请依次命名为 out_0,out_1,…,out_n
- name(tensorflow模型必填)输出节点名
config对应 rknn.config 的参数配置
- quantized_dtype量化类型
RKNN_toolkit1: 可填写 [asymmetric_affine-u8, dynamic_fixed_point-i8, dynamic_fixed_point-i16]
RKNN_toolkit2: 可填写 [asymmetric_quantized-8]
- quantized_algorithm量化方法:可选[‘normal’, ‘mmse’],默认为 normal
- optimization_level优化等级,默认为3
- mmse_epochmmse迭代次数,默认为3
(仅RKNN_toolkit1生效)
- do_sparse_network使用稀疏化优化量化模型,默认为True,如果量化模型掉精度,可考虑设为 False
(仅RKNN_toolkit1生效)
- quantize_input_node单独量化输入节点
(仅RKNN_toolkit1生效)
- merge_dequant_layer_and_output_node合并输出节点与反量化层
(仅RKNN_toolkit1生效)
- force_builtin_perm为输入添加transpose layer使 nhwc -> nchw
(仅RKNN_toolkit1生效)

使用以下语句转换

./convert_yolo_ppyolo.sh

请添加图片描述
出现Exprot RKNN model即为转换成功

模型部署

使用rknn部署库进行部署
以linux平台为例

编译

根据指定平台修改 build-linux_<TARGET_PLATFORM>.sh中的交叉编译器所在目录的路径 TOOL_CHAIN,例如修改成

export TOOL_CHAIN=~/opt/tool_chain/gcc-9.3.0-x86_64_aarch64-linux-gnu/host

然后执行:

./build-linux_<TARGET_PLATFORM>.sh

推送执行文件到板子

将 install/rknn_yolo_demo_Linux 拷贝到板子的/data/目录.

adb push install/rknn_yolo_demo_Linux /data/

运行(单图测试)

adb shell
cd /data/rknn_yolo_demo_Linux/

export LD_LIBRARY_PATH=./lib

./rknn_yolo_demo yolov5 q8 single_img ./yolov5s_u8.rknn ./model/RK_anchors_yolov5.txt ./model/dog.jpg 

多图测试

cd $(pwd | sed 's/\(rknn_model_zoo\).*/\1/g')
adb push rknn_model_zoo/datasets/COCO/val2017 /userdata/

adb shell
cd /userdata/rknn_yolo_demo/
./rknn_yolo_demo yolov5 q8 multi_imgs ./yolov5s_u8.rknn ./model/RK_anchors_yolov5.txt ./model/coco_dataset_path.txt

群内交流更多技术
130856474

【资源介绍】 基于RK3588部署yolov5s模型源码(实时摄像头检测)+部署说明文档.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 yolov5模型(.pt)在RK3588(S)上的部署(实时摄像头检测) - 所需: - 安装了Ubuntu20系统的RK3588 - 安装了Ubuntu18的电脑或者虚拟机 <details> <summary>一、yolov5 PT模型获取</summary> [Anaconda教程](https://blog.csdn.net/qq_25033587/article/details/89377259)\ [YOLOv5教程](https://zhuanlan.zhihu.com/p/501798155)\ 经过上面两个教程之后,你应该获取了自己的`best.pt`文件 </details> <details> <summary>二、PT模型转onnx模型</summary> - 将`models/yolo.py`文件中的`class`类下的`forward`函数由: ```python def forward(self, x): z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training: # inference if self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) if isinstance(self, Segment): # (boxes + masks) xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4) xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf.sigmoid(), mask), 4) else: # Detect (boxes only) xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4) xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, self.na * nx * ny, self.no)) return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) ``` 改为: ```python def forward(self, x): z = [] # inference
要在rk3568上部署yolov5模型,你可以按照以下步骤进行操作: 1. 首先,你需要在Windows上搭建训练环境并使用pytorch框架训练yolov5s模型。你可以参考\[1\]中提供的教程来完成这一步骤。 2. 在训练完成后,你需要将训练好的模型转换为rknn模型。你可以使用RKNN-Toolkit2来进行转换。建议使用conda虚拟环境,并按照\[3\]中提供的文档进行安装。 3. 在转换完成后,你可以将rknn模型部署到rk3568电路板上进行推理。具体的部署步骤可能因为你的具体环境和需求而有所不同,你可以参考RKNN-Toolkit2的文档或者官方文档来了解如何在rk3568上部署rknn模型。 总结起来,你需要在Windows上搭建训练环境并使用pytorch框架训练yolov5s模型,然后将训练好的模型转换为rknn模型,并最后在rk3568上部署rknn模型进行推理。希望这些信息对你有帮助! #### 引用[.reference_title] - *1* [(十二)rk3568 NPU 中部署自己训练的模型,(1)使用yolov5训练自己的数据集-环境搭建部分](https://blog.csdn.net/dongshizhishui/article/details/126887399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(十二)rk3568 NPU 中部署自己训练的模型,(1)使用yolov5训练自己的数据集-模型训练部分](https://blog.csdn.net/dongshizhishui/article/details/130302325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [手把手教学YOLOV5在RK3568的部署应用及代码实现](https://blog.csdn.net/yangbisheng1121/article/details/128785690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值