openRv1126 AI算法部署实战之——ONNX模型部署实战
在RV1126开发板上部署ONNX算法,实时目标检测+RTSP传输。视频演示地址
rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili
一、准备工作
1.从官网下载YOLOv5-v7.0工程(YOLOv5的第7个版本)
手动在线下载: Releases · ultralytics/yolov5 · GitHub
手动在线下载地址: https://github.com/ultralytics/yolov5/releases
往下拉找到yolov5s.pt和source code(tar.gz)并下载
在虚拟机中新建1个文件夹yolo,将上面下载的yolov5-7.0.tar.gz工程拷贝到虚拟机并解压,
得到/home/rv1126/yolo/yolov5-7.0文件夹
然后将yolov5s.pt拷贝至解压后的yolov5-7.0目录
2.YOLO初体验—ubuntu下跑YOLO预训练模型
首先进入pytorch训练环境,再进入yolo工程目录
conda activate py3.8-pytorch-1.13.0
cd /home/rv1126/yolo/yolov5-7.0/
在虚拟机中运行yolo程序
python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source data/images
上述命令表示:采用预训练模型yolov5s.pt, 喂入模型中的图片被resize为640*640大小, 置信度阈值为0.25, 源图片位于data/images下
运行结束后生成的已标记目标的图片文件放在run/detect/exp目录
二、YOLOV5模型转换为RKNN格式
1.修改models/yolo.py文件
打开/home/rv1126/yolo/yolov5-7.0/models/yolo.py找到59行,添加3个输出。注释后面的1输出。
注意python对文件格式要求较高,如果不会改或者改完报错,请拷贝/home/rv1126/yolov5/yolov5-7.0-github/models/yolo.py文件替换/home/rv1126/yolo/yolov5-7.0/models/yolo.py文件
2.将yolov5s.pt导出为yolov5s.onnx文件
注意当前环境为训练环境(py3.8-pytorch-1.13.0)
python export.py --weights yolov5s.pt --img 640 --batch 1 --include onnx
在当前路径生成yolov5s.onnx
3.将yolov5s.onnx模型转换为yolov5s.rknn
从/home/rv1126/yolov5/yolov5-7.0-github路径中拷贝模型转换脚本convert-onnx-to-rknn-pre.py和文件夹img到当前路径/home/rv1126/yolo/yolov5-7.0
进入模型转换环境
conda activate py3.6-rknn-1.7.3
开始转换模型
python convert-onnx-to-rknn-pre.py
在当前目录生成yolov5.rknn
三、部署yolov5.rknn到RV1126开发板上
1.准备工作
首先在开发板执行如下命令,退出出厂测试程序
killall rkmedia_rockx_person_detection
在开发板执行如下命令,挂载nfs根文件系统
busybox mount -t nfs -o nolock,nfsvers=3 192.168.1.108:/home/rv1126 /getnfs/
2.拷贝模型到开发板并运行程序
cd /getnfs/yolo/yolov5-7.0
cp yolov5s.rknn /demo/bin/yolov5s_relu_rv1109_rv1126_out_opt.rknn
在开发板执行如下命令 运行yolo例程
/demo/bin/openRv1126_yolov5_object_recognize
3.VLC查看视频,串口查看打印坐标
然后在电脑上打开VLC播放器,输入如下取流地址。注意IP地址请根据实际修改
rtsp://192.168.1.105/live/main_stream
即可看到实时yolo检测的视频画面。
串口实时打印检测框坐标信息
如需退出请按ctrl+c
4.源码说明
上面运行的openRv1126_yolov5_object_recognize程序源码位于路径:
/home/rv1126/openRv1126-Aidemo/openRv1126_yolov5_object_recognize_rtsp
该源码定义了模型路径、数据集路径、识别类目数量如下
/home/rv1126/openRv1126-Aidemo/openRv1126_yolov5_object_recognize_rtsp
openRv1126_yolov5_object_recognize.cpp指定模型路径
static char *model_path = "/demo/bin/yolov5s_relu_rv1109_rv1126_out_opt.rknn";
postprocess.cc指定数据集路径
#define LABEL_NALE_TXT_PATH "/demo/bin/coco_80_labels_list.txt"
postprocess.h指定模型识别类目数量
#define OBJ_CLASS_NUM 80
附录:操作命令
附录
pytorch/ONNX预训练模型转换rknn onnx/torchscript->rknn
思路:yolov5 v7在训练环境导出为torchscript或onnx,然后在转换环境调用对应的API来转换成RKNN模型
https://github.com/ultralytics/yolov5/releases 找到v7,往下拉找到 yolov5s.pt 和 source code(tar.gz)并下载
1.下载yolov5 v7工程,并导出pt->onnx/torchscript
1.1修改models/yolo.py第59行打开注释,3个输出。注释后面的1输出
return x[0],x[1],x[2]
1.2修改好models/yolo.py文件中的def forward(self, x)函数以后, 可执行如下命令, 将.pt文件导出.onnx 或者. torchscript格式文件:
// 转换为TorchScript格式, 得到 yolov5s.torchscript文件
python export.py --weights ./yolov5s.pt --img 640 --batch 1 --include torchscript
// 转换为ONNX格式, 得到 yolov5s.onnx文件
python export.py --weights ./yolov5s.pt --img 640 --batch 1 --include onnx
// 若需要指定opset, 可根据安装的onnx库的版本来调整, 如安装的onnx库的版本是1.12.0, 后面加上--opset 12
python export.py --weights ./yolov5s.pt --img 640 --batch 1 --include onnx --opset 12
2.模型转换 onnx/torchscript->rknn
2.1源码解析
target = 'rv1126'# 确定目标设备target
rknn = RKNN()# 创建RKNN对象
rknn.config(
reorder_channel='0 1 2',
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
target_platform=target,
output_optimize=1)
rknn.load_pytorch(model="./original_model/best.torchscript", input_size_list=[[3,640,640]])# 加载模型
rknn.build(dataset='./dataset/dataset1.txt',pre_compile=True)# 构建 RKNN 模型,并预处理
rknn.export_rknn('./rknn_model/yolov5-7.0-torchscript.rknn')# 导出 RKNN 模型
rknn.release()# 释放RKNN对象
2.2转换实操:yolov5导出,复制到/home/rv1126/ModelConvertSample/original_model best.onnx 和 best.torchscript
python convert-onnx-to-rknn-pre.py
python convert-pytorch-to-rknn-pre.py
生成 /home/rv1126/ModelConvertSample/rknn_model/ yolov5-7.0-onnx.rknn 和 yolov5-7.0-torchscript.rknn