本博客会从一个从未部署过任何环境的电脑上一步步复现如何本地训练自定义模型并成功部署到Maixcam上实现数字识别的功能。
文章中会引用到我当时学习是参考到的文章,都会在下面列出来,在此对这些向我提供过帮助的博主表示感谢!!
本文中默认读者已经了解过相对应的知识,一些非常详细的操作我会引用一些文章。
转换格式并部署为app
- 1.1 Vmware17.5的安装
- 1.2 Ubuntu22.04的安装
- 1.3 Vmware tools工具安装
- 1.4 安装docker环境
- 1.5 拉取tpuc_dev镜像
- 1.6 设置共享文件夹
- 1.7 安装tpu-milr
- 1.8 准备量化模型
- 1.9 编写转换脚本
- 1.10 编写mud文件
- 1.11 Maixvision编写代码并导出app
1.1 Vmware17.5的安装
具体安装包我会都放在文章末尾。
安装虚拟机(VMware)保姆级教程
1.2 Ubuntu22.04的安装
1.3 Vmware tools工具安装
该安装方法中有一些和现在不一样的情况
我们使用ISO映像文件,就是你下载的那个镜像
随后步骤一致
在弹出VMware Tools光盘图标后,可以直接双击打开,直接将.tar.gz文件拖放至桌面
随后步骤一致
在安装pl文件时,注意遇见提示yes 先按y再回车,no直接回车。
最后安装成功可能不会显示Enjoy那一行,可能直接是successfully啥啥的,这也能说明安装完成了。
重启虚拟机让VMware Tools生效。
测试复制粘贴是否有效
可以在宿主机上新建一个txt文件,右键复制后看能否在虚拟机上粘贴
若不能实现复制粘贴的话,在终端上执行以下命令,并继续重启,即可实现
sudo apt-get autoremove open-vm-tools
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop
1.4 安装docker环境
大家可以直接参考这篇文章,因为作者真的很牛!
Ubuntu 22.04安装Docker(最全教程,无需科学上网)
1.5 拉取tpuc_dev镜像
首先大家参考这篇文章,介绍了docker的一些基本命令
Docker常用操作和命令
随后参考这篇文章:
当初在拉取镜像的时候折磨了很久,一直报错链接超时,因为文件比较大,在CSDN的苦海里翻找许久终于找到这个博主发的文章救了我一命!
Docker拉取sophgo-tpuc_dev镜像(最全最快安装教程)
我们直接快速拉取镜像,因为科学上网也没什么用。
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/24/06/14/12/sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz
会发现,拉取下来的压缩包已经保存在了桌面上
我们只需要继续在桌面的终端上执行下面命令,随后等待一会,就会发现已经拉取成功到docker上,通过docker images可以查看到。
docker load -i sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz
记住记住!!!!创建自己的容器需要名称对应 这里的名称是tpuc_dev:v3.2而非文章中的:latest
我们首先在桌面上新建一个文件夹取名为MaixCAM,然后在文件夹内打开终端,创建容器。
所以我们创建容器的指令如下:创建的一个名为MaixCAM的容器
docker run --privileged --name MaixCAM -v $PWD:/workspace -it sophgo/tpuc_dev:v3.2
1.6 设置共享文件夹
首先进入下面网站下载
tpu_mlir-1.7-py3-none-any.whl 这个文件
https://github.com/sophgo/tpu-mlir/releases/tag/v1.7
在宿主机上新建一个文件夹,命名为share,将上面那个文件拖放进去
随后参考VMware共享文件夹设置这篇文章,进行共享文件夹设置
如果没有出现共享的share文件夹可以再输入下面这行代码
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other
1.7 安装tpu-milr
我们打开之前建立好的MaixCAM文件夹,将共享文件夹内的文件复制进去。在容器内执行命令进行安装
pip install tpu_mlir-1.7-py3-none-any.whl[all] #安装全部依赖
安装完成如图:
1.8 准备量化模型
我们将在宿主机上生成的onnx文件和部分数据集照片(这里我随机选取了84张)移动到MaixCAM文件夹中,如图
1.9 编写转换脚本
我们首先打开这个网站:https://netron.app/ 将自己的onnx文件导入进去,找到合适的量化节点。
可以看到这里有三个conv,后面的计算均由 CPU 进行,我们量化时就采取这几个conv的输出作为模型的最后输出,在这里输出名分别叫**/model.24/m.0/Conv_output_0,/model.24/m.1/Conv_output_0,/model.24/m.2/Conv_output_0。**
转换模型主要就两个命令,model_transform.py 和 model_deploy.py,主要麻烦的是参数,所以我们写一个脚本convert_yolov5_to_cvimodel.sh存下来方便修改。
我们首先在workspace中执行命令新建一个.sh文件
vim convert_yolov5_to_cvimodel.sh
随后将下面代码粘贴到.sh文件中,:w 保存 :q 退出
#!/bin/bash
set -e
net_name=best
input_w=320
input_h=224
# mean: 0, 0, 0
# std: 255, 255, 255
# mean
# 1/std
# mean: 0, 0, 0
# scale: 0.00392156862745098, 0.00392156862745098, 0.00392156862745098
mkdir -p workspace
cd workspace
# convert to mlir
model_transform.py \
--model_name ${net_name} \
--model_def ../${net_name}.onnx \
--input_shapes [[1,3,${input_h},${input_w}]] \
--mean "0,0,0" \
--scale "0.00392156862745098,0.00392156862745098,0.00392156862745098" \
--keep_aspect_ratio \
--pixel_format rgb \
--channel_format nchw \
--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 ../test.jpg \
--test_result ${net_name}_top_outputs.npz \
--tolerance 0.99,0.99 \
--mlir ${net_name}.mlir
# export bf16 model
# not use --quant_input, use float32 for easy coding
model_deploy.py \
--mlir ${net_name}.mlir \
--quantize BF16 \
--processor cv181x \
--test_input ${net_name}_in_f32.npz \
--test_reference ${net_name}_top_outputs.npz \
--model ${net_name}_bf16.cvimodel
echo "calibrate for int8 model"
# export int8 model
run_calibration.py ${net_name}.mlir \
--dataset ../images \
--input_num 200 \
-o ${net_name}_cali_table
echo "convert to int8 model"
# export int8 model
# add --quant_input, use int8 for faster processing in maix.nn.NN.forward_image
model_deploy.py \
--mlir ${net_name}.mlir \
--quantize INT8 \
--quant_input \
--calibration_table ${net_name}_cali_table \
--processor cv181x \
--test_input ${net_name}_in_f32.npz \
--test_reference ${net_name}_top_outputs.npz \
--tolerance 0.9,0.6 \
--model ${net_name}_int8.cvimodel
以下部分复制于Maixpy官方文档
可以看到,这里有几个比较重要的参数
- output_names 就是我们前面说到的输出节点的输出名。
- mean, scale 就是训练时使用的预处理方法,比如 YOLOv5 官方代码的预处理是把图像 RGB 3个通道分别**-mean再除以std,并且默认mean** 为0,std为255,即将图像的值归一,这里scale就是1/std。你的模型需要根据实际的预处理方法修改。
- test_input 就是转换时用来测试的图像,这里是**…/test.jpg**,所以实际模型转换时我们需要在此脚本所在同目录放一张test.jpg的图,你的模型根据你的实际情况替换图像。
- tolerance 就是量化前后允许的误差,如果转换模型时报错提示值小于设置的这个值,说明转出来的模型可能相比
onnx模型误差较大,如果你能够容忍,可以适当调小这个阈值让模型转换通过,不过大多数时候都是因为模型结构导致的,需要优化模型,以及仔细看后处理,把能去除的后处理去除了。 - quantize 即量化的数据类型,在 MaixCAM 上我们一般用 INT8 模型,这里我们虽然也顺便转换了一个 BF16模型,BF16
模型的好处时精度高,不过运行速率比较慢,能转成 INT8 就推荐先用 INT8,实在不能转换的或者精度要求高速度要求不高的再考虑
BF16。 - dataset表示用来量化的数据集,也是放在转换脚本同目录下,比如这里是images文件夹,里面放数据即可,对于 YOLOv5来说就是图片,从原始的数据集中复制一部分即可。 用 –input_num 可以指定实际使用图片的数量(小于等于 images目录下实际的图片)。
随后我们直接执行下面语句
chmod +x convert_yolov5_to_cvimodel.sh && ./convert_yolov5_to_cvimodel.sh
转化完成,如图:
1.10 编写mud文件
根据你的模型情况修改mud文件,对于 YOLOv5 就如下,修改成你训练的labels就好了
我们将生成的best_int8.cvimodel文件改个名为best.cvimodel 随后创建一个best.mud文件,用记事本打开并粘贴下面代码
[basic]
type = cvimodel
model = best.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 = 1,2,3,4,5,6,7,8
这里basic部分指定了模型文件类别和模型文件路径,是必要的参数,有了这个参数就能用MaixPy或者MaixCDK中的maix.nn.NN类来加载并运行模型了。
我们这里跑的是数字1-8的识别模型,只需要将label改成1-8 即可
1.11 Maixvision编写代码并导出app
我们连接上自己的MaixCAM后,打开设备文件管理器,在root/文件夹下新建一个my_own文件夹,将best.cvimodel和best.mud文件放入
随后简单套用一下代码:
from maix import camera, display, image, nn, app
detector = nn.YOLOv5(model="/root/my_own/best.mud", dual_buff = True)
cam = camera.Camera(detector.input_width(), detector.input_height(), detector.input_format())
dis = display.Display()
while not app.need_exit():
img = cam.read()
objs = detector.detect(img, conf_th = 0.8, 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)
按照打包安装应用的流程走,就可以部署为自己的app啦~
运行效果可以见我发过的b站视频
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="lcNQk6DK-1728987741101" src="https://player.bilibili.com/player.html?aid=112853436664560"></iframe>MaixCAM 本地训练跑的YOLOv5这谁打得过它啊
标签:Yolov5,name,部署,模型,MaixCam,input,--,model,net From: https://blog.csdn.net/m0_75041317/article/details/142930573