1. 实验目的:

1.完成yolov5s模型的训练及推理验证。

2.完成onnx模型的转换的转换。

3.完成模型量化环境配置、模型验证、验证数据集准备及模型的量化转换。

4.完成转换后的模型在地平线RDK X3开发板上的部署和推理,静态图片推理和实时图像推理。

5.以上过程均需在实验报告中体现。

  1. 实验环境:
  1. 地平线开发板烧写OriginBot SD卡镜像,v2.0.1版本;参考链接
  2. PC电脑,Windows系统或Ubuntu系统,完成环境配置,用于yolov5的模型训练和onnx模型的转换。
  3. Ubuntu系统虚拟机,用于模型的量化和转换。
  1. 实验内容及步骤

3.1下载yolov5

使用tag为v2.0的版本的yolov5提前进行模型的训练。下载链接:https://github.com/ultralytics/yolov5/blob/v2.0。可以直接下载zip压缩包,解压得到文件夹yolov5-2.0。

下载yolov5s.pt预训练模型,放入到weights文件夹下,下载链接:Release v2.0 · ultralytics/yolov5 · GitHub

3.2 修改数据集配置文件

在data目录下创建一个test_data.yaml的数据集配置文件,其中train为训练集图片的路径,val为验证集图片的路径,nc为检测的类型数目,names为检测的类型的名称,如下图所示:

修改模型配置文件models/yolov5s.yaml,根据检测的类型将nc修改为2,对应mouse和screwdriver这两个类别;

3.3 训练模型

1)在正式开始训练之前,需要对train.py进行以下修改:

修改完成之后,打开anaconda 终端,运行训练命令如下,–device 0表示使用GPU:

python train.py –img 640 –batch 1 –epochs 100 –data data/test_data.yaml –weights weights/yolov5s.pt –device 0

正常情况下会开始训练,训练100个epochs后结果如下:

训练结束后,在runs\exp0\weights文件夹下生成了最后一轮训练的模型last.pt100轮中最好的模型best.pt,同时生成了训练结果的统计分析:

模型训练完成后,使用test数据集进行测试,将test文件夹放在inference文件夹下,使用训练出来的best.pt模型,置信度为0.7,执行如下命令:

python detect.py –source ./inference/test –weights ./runs/exp0/weights/best.pt –conf 0.7

正常情况下会开始进行检测,自动读取test文件夹中的图片,

检测完成后,在test文件夹同级目录下生成output文件夹,用于存放结果,如下图:

具体测试结果:

图中的置信度有0.8以上,说明模型的训练效果不错,可以继续使用

3.4 onnx模型转换-依赖环境安装及文件修改

模型训练测试完成后,需要将模型转换成onnx模型,用于下一步的模型转换,安装环境依赖:

pip install onnx==1.7

修改导出版本:export.py文件第48

修改输出节点维度信息:yolo.py文件29

安装成功:

3.5 yolov5模型转onnx

使用训练好的best.pt模型,img-size 设为672。命令如下,

python export.py –weights ./runs/exp0/weights/best.pt –img-size 672 –batch-size 1

正常情况下,会在runs/exp0/weights文件夹下生成best.onnx模型。

不过实验过程中遇到错误:

报错如下:

TorchScript export success, saved as ./runs/exp15/weights/best.torchscript.pt

ONNX export failure: Descriptors cannot be created directly.

If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.

If you cannot immediately regenerate your protos, some other possible workarounds are:

1. Downgrade the protobuf package to 3.20.x or lower.

2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

报错:

解决方法:卸载protobuf,并重新安装3.20版本的rotobuf

3.6 模型量化环境配置

首先安装Anaconda

配置环境:

在虚拟机的Linux系统中安装完成支持 Python 3.8.x 版本的 Anaconda3 环境

其中出现无法使用conda命令的报错(conda: command not found)

在尝试启动修改环境变量无果后,最后将整个虚拟机删除,并重新建一个磁盘空间50GB大小的虚拟机后成功可以安装对应的conda环境。

在指令中输入conda list,可以查看自己是否进入成功安装conda

成功安装Anaconda,实验继续

下面是环境配置的过程:

1.linux终端开发机中执行如下命令,获取模型转换资料包:

wget -c ftp://xj3ftp@vrftp.horizon.ai/ai_toolchain/ai_toolchain.tar.gz –ftp-password=xj3ftp@123$%

wget -c ftp://xj3ftp@vrftp.horizon.ai/model_convert_sample/yolov5s_v2.0.tar.gz –ftp-password=xj3ftp@123$%

2.创建模型转换环境:

conda create -n horizon_bpu python=3.8 -y

3.进入conda模型转换环境:

conda activate horizon_bpu

4.解压模型转换环境和示例模型安装包并进行相关依赖的安装:

tar -xvf yolov5s_v2.0.tar.gz

tar -xvf ai_toolchain.tar.gz

pip install ai_toolchain/h* -i https://mirrors.aliyun.com/pypi/simple

pip install pycocotools -i Simple Index

第三条指令执行时出现了如图的错误:

不能构建pycocotools,其实是没有安装GCC:前面还有错误信息error: command ‘gcc’ failed: No such file or directory表明系统可能没有安装GCCGNU编译器套件)。可以使用系统的包管理器来安装它。

sudo apt-get install build-essential

在顺利完成安装后,可以键入 hb_mapper –help 命令验证是否可以正常得到帮助信息,若打印如下信息,说明环境已安装完成

3.7 模型量化转换

开发环境准备完成,使用命令:conda activate horizon_bpu 进入开发机模型转换环境。

将转换后的best.onnx模型放到yolov5s_v2.0/04_detection/03_yolov5s/mapper文件夹下。

然后按以下步骤进行模型验证

进入浮点模型转换示例yolov5s模型目录:

cd yolov5s_v2.0/04_detection/03_yolov5s/mapper

修改01_check_X3.sh脚本:

将模型修改为自己转换好的 best.onnx模型,如下图:

确认模型结构及算子是否支持,并提供每个算子执行硬件的分配情况(BPU/CPU),RDK X3 执行脚本:01_check_X3.sh

bash 01_check_X3.sh

命令执行完毕后,出现以下日志,说明模型校验成功:

验证数据准备

模型检查通过后,根据以下步骤进行模型转换。

修改校准数据,在01_common/calibtation_data文件夹下新建文件夹my_image,用于存放自己的校准数据,修改02_preprocess.sh 中的–src_dir–dst_dir路径,src_dir所指路径用于存放训练数据中取50张标准数据图片,dst_dir所指路径用于存放转换后的.rgb文件;

进行校准数据预处理,修改02_preprocess.sh脚本文件:

执行脚本:02_preprocess.sh,进行校准数据预处理:

bash 02_preprocess.sh

命令执行完毕后,出现以下日志并无任何报错,说明数据预处理成功:

同时,在mapper文件夹下生成my_calibration_data_rgb_f32文件夹,校准数据转换成.rgb格式;

模型转换

1.yolov5s_config_X3.yamlmodel_parameters下的onnx_model参数修改为自己的模型best.onnx,如下图:

2.yolov5s_config_X3.yamlcalibration_parameters下的cal_data_dir参数修改为自己的校准数据预处理之后的文件夹calibration_data_rgb_f32,如下图:

#转换时所需的配置文件 yolov5s_config_X3.yaml,已存放在03_build_X3.sh脚本同级文件夹下,然后RDK X3 执行脚本:03_build_X3.sh

bash 03_build_X3.sh

命令执行完毕后,若出现以下日志并无任何报错,说明模型转换成功:

3.8 模型部署

注意事项:模型上板运行前,将 my_yolov5s_672x672_nv12.bin 定点模型拷贝至开发板的/opt/hobot/model/x3/basic/ 目录下

放一张自己的图像数据比如test103.jpg07_yolov5_sample文件夹下用于推理,并修改test_yolov5.py文件,修改使用的模型为my_yolov5s_672x672_nv12.bin,读取的图片为test102.jpg

修改postprocess.py文件,修改检测的类型数量num_classes2,修改reshape参数,其中reshape([1, 84, 84, 3, 7])最后一个参数7num_classes + 5得出,如下图:

修改coco_classes.names文件,如下图:

调用以下命令运行:

cd /app/pydev_demo/07_yolov5_sample/

sudo python3 ./test_yolov5.py

命令执行完毕后,若出现以下日志并无任何报错,说明模型部署成功:

得到result识别图像如下: