rock3a: 基于自建数据集+yolov5s模型的rknn模型训练部署全流程

上一篇文章其实已经详述了模型训练到部署的整个流程,但是数据集到模型都是用的官方的coco数据集,这里为了记录开发板的模型训练到部署的整个流程,重新开了一篇文章进行记录。

首先准备数据集和rockchip官方推荐的yolov5源代码

这里需要注意的是数据集中的标签文件内容 一行只能有5个数,分别是类别和(x,y,w,h)

但是我平时用的labelimg.exe 生成的xml文件转化为txt标签文本文件后 一行有6个数,分别为类别,(x,y,w,h),以及置信度,这里需要做一下转换。

然后需要将coco/yaml128.yaml配置文件中的部分参数做一下修改 主要是训练类别数和训练类别名称

 一般做目标检测(比如我)只做一类检测,这里需要将类别数改为1,并将类别标签改为实际的标签名。

接下来就是训练模型,在yolov5-master路径下,键入命令

python3 train.py --data coco128.yaml --weights '' --cfg yolov5s.yaml --img 64

该命令的意思是读取coco128.yaml配置文件里面的数据集路径和类别数、类别名,模型架构为yolov5s,也就是small版本的模型,考虑到开发板的性能,所以这里选择的是small版本的模型,然后重新训练模型。训练模型完成后,需要将模型进行转换,转换为onnx模型。

这里需要将model/yolo.py文件某个部分进行修改,才能正确的将pt模型导出为onnx模型。

注:训练时不需要修改该部分代码  导出模型时需要修改该部分代码

椭圆处是需要注释的部分。

在yolov5-master 主目录下,键入命令

python3   export.py --weights yolov5s.pt --img 640 --batch 1 --opset 12 --include onnx

可以将pt模型转化为onnx模型。将转化后的onnx模型拷贝出来。

接下来在已经安装rknn-toolkit的虚拟机上,对onnx模型进行转换。

首先采用Netron.exe软件打开转化好的onnx模型查看其网络结构

并记下其三个输出的标号。

然后将onnx模型拷贝到/home/rock/workspace/rknn-toolkit2-1.4.0/examples/onnx/yolov5 这个目录下。

该目录下的test.py是瑞芯微官方已经写好的demo文件。

我在这里类比test.py写了一个onnx2rknn.py  ,功能与test.py差不多,只是少了连板推理部分。

注意需要在onnx2rknn.py文件中做部分修改

修改完成后,键入命令 python3 onnx2rknn.py文件,正常情况下会生成一个rknn结尾的文件。

接下来将该rknn文件拷贝到开发板上的对应目录下,我这里是

/home/rock/software/rknpu2-main/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux

相对于原始文件,这里我们需要修改如下几个部分:

  1. 需要在源代码中修改类别数

 

  1. 需要在配置文件中修改类别数

配置文件一共有两个,如上图所示。

我这里将配置文件里面的类别数修改为我自己的类别数

然后在开发板重新编译,键入命令

sh build-linux_RK356X.sh

然后进入 install/rknn_yolov5_demo_Linux/ 路径下,去执行可执行文件

这里说一句:

模型训练初期和模型多次迭代后,其运行速度是不一样的。

实测,当模型开始迭代时,运行一次目标检测耗时大约120ms,当模型迭代300个epoch时,运行一次目标检测耗时60ms,这其中的原因不得而知,如果有大佬知道的欢迎讨论

到此为止,基于自建数据集的模型训练到模型转化,模型部署已经搭建完毕。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我作为AI语言模型无法提供代码,但是我可以为您提供参考: 1. 首先需要将yolov7模型转换为rknn模型,可以使用rknn-toolkit进行转换,具体步骤可以参考官方文档:https://docs.rock-chips.com/zh_cn/rockchip_linux_sdk_user_guide/zh_cn/html/sdk_dev_tools/rknn/rknn_toolkit.html 2. 推理代码示例: ```python import cv2 import numpy as np from rknn.api import RKNN # 加载rknn模型 rknn = RKNN() rknn.load_rknn('yolov7.rknn') # 读取图片并进行预处理 img = cv2.imread('test.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (416, 416)) img = img.astype(np.float32) / 255. img = np.transpose(img, [2, 0, 1]) img = np.expand_dims(img, axis=0) # 设置输入输出节点 rknn.inputs[0].reshape([1, 3, 416, 416]) rknn.outputs[0].reshape([1, 2535, 85]) # 进行推理 outputs = rknn.inference(inputs=[img]) pred = outputs[0] # 解析输出结果 boxes = [] for i in range(pred.shape[0]): for j in range(pred.shape[1]): x, y, w, h = pred[i, j, :4] conf = pred[i, j, 4] cls_conf = pred[i, j, 5:] cls_id = np.argmax(cls_conf) score = conf * cls_conf[cls_id] if score > 0.5: cx = x * 32 + j * 32 cy = y * 32 + i * 32 bw = w * 32 bh = h * 32 xmin = int(cx - bw / 2) ymin = int(cy - bh / 2) xmax = int(cx + bw / 2) ymax = int(cy + bh / 2) boxes.append([xmin, ymin, xmax, ymax, cls_id, score]) # 绘制检测结果 for box in boxes: xmin, ymin, xmax, ymax, cls_id, score = box cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2) cv2.putText(img, f'{cls_id}:{score:.2f}', (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意事项: 1. 输入图片需要进行预处理。 2. 输出结果需要进行解析。 3. 输入输出节点需要根据模型的具体情况进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值