RK3568笔记五:基于Yolov5的训练及部署

若该文为原创文章,转载请注明原文出处。

一. 部署概述

环境:Ubuntu20.04、python3.8

芯片:RK3568

芯片系统:buildroot

开发板:ATK-DLRK3568

开发主要参考文档:《Rockchip_Quick_Start_RKNN_Toolkit2_CN-1.4.0.pdf》、《Rockchip_User_Guide_RKNN_Toolkit2_CN-1.4.0.pdf》

二、yolov5模型训练

1、训练环境

训练是在云端训练的,平台AutoDL租了一台2080IT,配置如下:

2、环境搭建

1、创建conda环境

复制代码
conda create -n rkyolov5 python=3.8       // 用于yolov5
conda create -n rknn2_env python=3.8 -y   // 用于rknn2

2、激活conda环境

复制代码
conda activate rkyolov5
​
conda deactivate  // 退出环境

3、安装pytoch

复制代码
pip install torch==1.7.1+cu101 torchvision==0.8.2+cu101 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html -i https://pypi.tuna.tsinghua.edu.cn/simple 

4、下载yolov5-v6.0

首先需要在官网下载yolov5-6.0的项目 我们打开yolov的官网,Tags选择6.0版本

复制代码
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

5、训练

复制代码
python train.py --img 640 --data coco128.yaml --cfg yolov5s.yaml --weights yolov5s.pt --epoch 300 --batch-size 16 --device 0

出错:The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:

原因numpy版本问题

处理,重新安装

复制代码
pip uninstall numpy
 
pip install numpy==1.22

出错:AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS

ModuleNotFoundError: No module named 'PIL'

原因是pillow库版本不支持,降低版本

复制代码
pip install pillow==9.5.0

6、pt转onnx

转换步骤:

修改models/yolo.py,修改class Detect(nn.Module):的forward函数

注意!!!仅在转换时修改,在训练时改回原状态!再训练时不要忘记哦!

复制代码
# 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.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
#                 self.grid[i] = self._make_grid(nx, ny).to(x[i].device)
#
#             y = x[i].sigmoid()
#             if self.inplace:
#                 y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
#                 y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
#             else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
#                 xy = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
#                 wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i].view(1, self.na, 1, 1, 2)  # wh
#                 y = torch.cat((xy, wh, y[..., 4:]), -1)
#             z.append(y.view(bs, -1, self.no))
#
#     return x if self.training else (torch.cat(z, 1), x)
​
def forward(self, x):
    z = []  # inference output
    for i in range(self.nl):
        x[i] = self.m[i](x[i])  # conv
​
    return x

修改export.py函数的--opset为12

运行export.py

复制代码
python export.py --weights best.pt --img 640 --batch 1 --opset 12

简化模型

复制代码
python -m onnxsim weights/yolov5s.onnx weights/yolov5s-sim.onnx

三、安装rknn-toolkit2

根据正点原子的教程安装,先安装工具链,在创建环境,在安装rknn-toolkit2,之后转换模型

下载地址:GitHub - rockchip-linux/rknn-toolkit2

1、创建一个新的环境

复制代码
conda create rknn2_env python=3.8 -y

2、安装

进入packages

复制代码
pip install rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl

等待安装

把转换好的onnx 拷贝到 rknn-toolkit2-master/examples/onnx/yolov5目录下,

3、修改test.py文件

复制代码
ONNX_MODEL = 'yolov5s_relu.onnx'
RKNN_MODEL = 'yolov5s_relu.rknn'

4、运行

复制代码
python test.py

出错: ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /root/miniconda3/envs/rknn2_env/lib/python3.8/site-packages/rknn/api/lib/linux-x86_64/cp38/librknnc.so)

原因:工具链没安装,安装后测试正常。

四、部署

通过测试,使用正点原子的yolov5例程测试结果不对,所以使用SDK里自带的rknpu2里的example

重新编译里面的例子,直接编译不编译不过,需要修改一下。

修改build-linux_RK356X.sh和CMakeLists.txt,把正点原子的libs拷贝过来重新编译

编译后的文件在install目录下,把rknn_yolov5_demo_Linux通过adb拷贝到开发板上。

打开开发板终端,运行: ./rknn_yolov5_demo model/RK356X/last.rknn model/zidane.jpg

生成的结果保存在当前目录下。

通过输出信息可以看来推理有出结果,结果也是对的,但只有一个,图片是有2个人.

程序应该还有地方要修改,等到改好后在开放代码。

如有侵权,或需要完整代码,请及时联系博主。

相关推荐
Dovis(誓平步青云)2 小时前
【数据结构】励志大厂版·初阶(复习+刷题):线性表(顺序表)
c语言·数据结构·经验分享·笔记·学习·算法·学习方法
星火撩猿3 小时前
GIS开发笔记(5)结合osg及osgEarth实现虚线环形区域绘制
笔记
pumpkin845143 小时前
学习笔记十三—— 理解 Rust 闭包:从语法到 impl Fn vs Box<dyn Fn>
笔记·学习·rust
·醉挽清风·3 小时前
学习笔记—C++—模板初阶
开发语言·c++·笔记·学习
星星火柴9365 小时前
数据结构:哈希表 | C++中的set与map
数据结构·c++·笔记·算法·链表·哈希算法·散列表
十年之少9 小时前
异步编程——微信小程序
笔记·学习·微信小程序
WDeLiang9 小时前
学习笔记 - Swfit 6.1 - 语法概览
笔记·学习·swift
红白小蛋糕11 小时前
《操作系统真象还原》第八章(1)——内存管理系统
汇编·笔记·ubuntu
LIUDAN'S WORLD11 小时前
YOLOv3实践教程:使用预训练模型进行目标检测
人工智能·深度学习·yolo·计算机视觉
LIUDAN'S WORLD11 小时前
YOLOv2 快速入门与核心概念:更快、更准的目标检测利器
人工智能·yolo·目标检测