整合了多方资料,作为流程补充
部署流程仅作参考,请多方参考寻找适合自己环境的部署方法,有问题还请斧正


1.YOLOv5本地部署训练自建数据集

用的是YOLO格式的数据集,
标注采用labelimg
cam7.png

环境配置
anaconda python 3.8.19
cuda:12.4
显卡:3060 laptop 6g
驱动版本551.76

1
2
3
4
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
pip install onnx

安装完成后,建议删除cpu版本的pytorch,使用gpu版本,训练会快一点

1
2
pip uninstall torch
pip uninstall torchvision

以下为GPU版本的pytorch安装,安装前请检查cuda版本是否适配

1
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu121

装完打开yolo5文件夹内train.py
滑到最下面改一下目录,运行即可开始训练
cam8.png

训练参数没动过,有需求的话可以调,保证weights,cfg,data地址对就行
具体参数其他帖子有解释了,这里不过多赘述

使用export.py将.pt文件转为.onnx

图像尺寸注意改为224 320 没试过其他尺寸,有兴趣可以试试

通过网址输入 netron.app 查看.onnx模型的三个输出
这里可能每个模型都不一样,后面模型量化时候需要用
cam1.png
如下,这是我自定义数据集训练模型的输出

1
2
3
/model.24/m.0/Conv_output_0
/model.24/m.1/Conv_output_0
/model.24/m.2/Conv_output_0

2.Docker环境配置

接下来就需要在docker容器里进行操作了

TPU-MLIR需要在Docker环境开发,可以直接下载docker镜像(速度比较慢),参考如下命令:

1
docker pull sophgo/tpuc_dev:latest

或者可以从【TPU工具链工具包】中下载的docker镜像(速度比较快),然后进行加载docker

1
docker load -i  docker_tpuc_dev_v3.2.tar.gz

离线包下载地址,可以用winscp下载

1
2
3
sftp://218.17.249.213
username: cvitek_mlir_2023
password: 7&2Wd%cu5k

如果是首次使用Docker,可以执行下述命令进行安装和配置(仅首次执行):

1
2
3
4
5
6
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

【进入docker环境】 确保安装包在当前目录,然后在当前目录创建容器如下:

1
docker run --privileged --name MYNAME -v $PWD:/workspace -it sophgo/tpuc_dev:latest

cam6.png
MYNAME 是容器名字,自己自定义就可以

3.TPU-MLIR量化环境搭建

1
2
3
https://github.com/sophgo/tpu-mlir/releases/tag/v1.7
上面网址下载
tpu-mlir-resource.tar 和 tpu_mlir-1.7-py3-none-any.whl

放在你进容器时候所在的文件夹

1
2
3
pip install tpu_mlir-1.7-py3-none-any.whl
安装它的全部依赖
pip install tpu_mlir-1.7-py3-none-any.whl[all]

再新建一个文件夹用来存放测试图片和onnx模型
cam2.png

然后就可以开始量化模型了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
执行下面命令ONNX 转 MLIR(记得output_names换为自己模型的输出,文件位置也需要根据自己情况来)
model_transform \
--model_name yolov5s \
--model_def num1.onnx \
--input_shapes [[1,3,224,320]] \
--mean 0.0,0.0,0.0 \
--scale 0.0039216,0.0039216,0.0039216 \
--keep_aspect_ratio \
--pixel_format rgb \
--output_names /model.24/m.0/Conv_output_0,/model.24/m.1/Conv_output_0,/model.24/m.2/Conv_output_0 \
--test_input images/num.png \
--test_result yolov5s_top_outputs.npz \
--mlir yolov5s.mlir

执行下面命令MLIR 转 INT8 模型,转 INT8 模型前需要跑 calibration, 得到校准表
run_calibration.py yolov5s.mlir \
--dataset images \
--input_num 100 \
-o yolov5s_cali_table

接着执行下面
model_deploy \
--mlir yolov5s.mlir \
--quantize INT8 \
--calibration_table yolov5s_cali_table \
--processor cv181x \
--test_input yolov5s_in_f32.npz \
--test_reference yolov5s_top_outputs.npz \
--tolerance 0.85,0.45 \
--model yolov5s_cv181x_int8_sym.cvimodel

cam5.jpg

yolov5s_cv181x_int8_sym.cvimodel

这是我们需要的模型

4.模型测试

yolov5s_num1.mud内容如下,各位别忘了改label跟model名字

1
2
3
4
5
6
7
8
9
10
11
[basic]
type = cvimodel
model = yolov5s_num1_cv181x_int8_sym.cvimodel

[extra]
model_type = yolov5
input_type = rgb
mean = 0, 0, 0
scale = 0.00392156862745098, 0.00392156862745098, 0.00392156862745098
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
labels = one,two,three,four,five,six,seven,eight,nine,zero

运行代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from maix import camera, display, image, nn, app

detector = nn.YOLOv5(model="/root/models/yolov5s_num1.mud")
cam = camera.Camera(detector.input_width(), detector.input_height(), detector.input_format())
dis = display.Display()
print("www")
print(detector.input_width(),detector.input_height(), detector.input_format())

while not app.need_exit():
img = cam.read()
objs = detector.detect(img, conf_th = 0.5, iou_th = 0.45)
for obj in objs:
img.draw_rect(obj.x, obj.y, obj.w, obj.h, color = image.COLOR_RED)
msg = f'{detector.labels[obj.class_id]}: {obj.score:.2f}'
img.draw_string(obj.x, obj.y, msg, color = image.COLOR_RED)
dis.show(img)

连接cam跟电脑,把cvmodel和mud上传到/root/models/ 路径下
cam3.png
实机运行如图
cam4.jpg
感觉可玩性很高啊,等期末考完猛猛把玩一手

部分参考资料:
MaixPy 自定义(离线训练) AI 模型和运行
CV18xx芯片使用指南
yolov5编译ONNX模型
通用yolov5模型部署
利用tpu-mlir工具将深度学习算法模型转成算能科技平台.bmodel模型的方法步骤
量化与量化调优
Yolov5 Detection On Milk-v Duo
CV181x/180x ISP 调试经验总结