使用yolov5的2.0分支训练自己的模型并在x3派运行

目录

  • 准备代码、权重、数据集
    • 配置环境
    • 准备数据
    • 标注数据
  • 训练模型
  • 转换模型
    • 验证模型
    • 准备校准数据
    • 转换为板上模型
    • 模型精度分析
  • 上板

之前训练自己模型的时候使用的是博主 bubbling的1.0分支的代码,博主的 博客比较详细,使用的是VOC2007数据集,可以快速上手根具需要训练自己的模型。不过最近需要将yolov5的模型部署到旭日X3派的开发板上,参考教程和社区帖子一阵折腾,成功转换模型并运行了,就是检测的结果很不理想(后续补坑,看看么个事儿)。猜想可能是版本问题,模型后处理过程不同导致,决定按教程里面,使用 官方2.0分支训练部署模型试试。

准备代码、权重、数据集

在准备放置yolov5工程的文件目录打开终端,使用命令:

git clone https://github.com/ultralytics/yolov5  # clone repo
cd yolov5
git reset --hard 5e970d4  # last commit before v2.0

或者直接在官方2.0分支页面Assets下点击下载Sources code(zip)并解压。接着下载yolov5l/m/s/x.pt这些预训练权重文件(分别对应大/中/小/较大),建议先使用yolov5s.pt试试,下载后放在解压后的yolov5-2.0文件夹下的weights文件夹下。

配置环境

conda create -n yolo python=3.8.10 

在yolov5工程文件夹中右键打开终端,使用创建的yolo环境

conda activate yolo

安装依赖:

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

然后运行一下命令,对/inference/images中的图片作一个检测:

python detect.py --weights weights/yolov5s.pt --img 416 --conf 0.4 --source inference/images/

可以看到/inference/output文件中已有结果。
在这里插入图片描述

准备数据

在yolov5-2.0/data文件夹下打开终端:

bash get_coco2017.sh

没有魔法大概率连接不了下载coco数据集的网站,可以使用百度网盘下载一个coco128数据集,可以看到coco128数据集中的图片文件的存放和/data/coco128.yaml中train:描述的路径一致,coco128中labels中存放为yolo格式的.txt标注文件,文件名称和images中的图片一一对应。
可以将自己的数据集图片存放在yolov5-2.0/data/coco128/images/train2017中。
修改/data/coco128.yaml中的train:和val:为./data/coco128/images/train2017/nc:为自己标注的类别数量,names:为标注时使用的标签名称。

标注数据

在yolo环境中使用清华源镜像安装标注工具labelImg

(yolo)xxx:~$ pip install labelImg -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功后,运行labelImg

(yolo)xxx:~$ labelImg

在这里插入图片描述打开目录选择yolov5-2.0/data/coco128/images/train2017;改变存放目录选择yolov5-2.0/data/coco128/labels/train2017(标注产生的文件将保存在此位置);格式选择YOLO;点击创建区块,使用矩形框选要识别检测的物体并给定标签:xxx;点击查看,可勾选自动保存模式;滑动鼠标滚轮可对待标注图片进行放大缩小。

训练模型

数据准备好后,运行下列命令进行训练:

python train.py --img 640 --batch 16 --epochs 100  --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ./weights/yolov5s.pt

训练过程中可能出现如下错误:
1.

from google.protobuf.pyext import _message
TypeError: bases must be types

protobuf版本太高,降低版本

pip install protobuf==3.19.6 -i https://pypi.tuna.tsinghua.edu.cn/simple

运行命令后可能会提示tensorboard x.xx.xx requires protobuf>=x.xx.xx,根据提示将上述命令中坂本改为protobuf>=x.xx.xx的版本即可,若有其他冲突,可改变提示其他库的版本。

 b[:, 4] += math.log(8 / (640 / s) ** 2)  # obj (8 objects per 640 image)
RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.

修改yolov5-2.0/models/yolo.py"的131行左右,将in _initialize_biases修改为如下:

def _initialize_biases(self, cf=None):  # initialize biases into Detect(), cf is class frequency
        # cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.
        m = self.model[-1]  # Detect() module
        for mi, s in zip(m.m, m.stride):  #  from
            b = mi.bias.view(m.na, -1)  # conv.bias(255) to (3,85)
            with torch.no_grad():
                b[:, 4] += math.log(8 / (640 / s) ** 2)  # obj (8 objects per 640 image)
                b[:, 5:] += math.log(0.6 / (m.nc - 0.99)) if cf is None else torch.log(cf / cf.sum())  # cls
            mi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)

即增加with torch.no_grad():禁用梯度运算。
3.

image = image.resize((scaled_width, scaled_height), Image.ANTIALIAS)
AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'

在pillow的高版本中,'ANTIALIAS’方法被弃用了,可将Image.ANTIALIAS修改为Image.LANCZOS,或者降低pillow版本

pip install pillow==9.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

训练好的模型权重文件保存在run/exp0/weights,分为best.pt和last.pt,分别为最小损失模型权重和最后一个世代模型权重。

转换模型

选择runs/exp2/weights/best.pt进行转换,修改yolov5-2.0中/models/export.py中第48行为:

torch.onnx.export(model, img, f, verbose=False, opset_version=11, input_names=['images'],
                          output_names=['classes', 'boxes'] if y is None else ['output'])

opset_version由12修改为11,yolo.py第29行修改为:

x[i] = x[i].permute(0, 2, 3, 1).contiguous()

然后运行命令:

export PYTHONPATH="$PWD"
python models/export.py --weights ./runs/exp2/weights/best.pt --img-size 640 --batch-size 1

如没有安装onnx和coremltoos,则会出现如下提示信息:

ONNX export failure: No module named 'onnx'
CoreML export failure: No module named 'coremltools'

可使用命令进行安装:

pip  install onnx==1.7.0 coremltools -i https://pypi.tuna.tsinghua.edu.cn/simple

onnx的版本好像没有特别限制,1.11.0试了也可以,估计是版本不要太高,然后和环境中已有的安装库不冲突即可。
转换完成后,best.onnx会在best.pt同级文件目录下。
将best.onnx复制到OE开发包即horizon_xj3_open_explorer_v2.5.2-py38_20230331文件夹的/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/model_zoo/mapper/detection/yolov5_onnx_optimized文件路径下。
打开终端,进入OE包首层路径

cd horizon_xj3_open_explorer_v2.5.2-py38_20230331

也可先进入OE包即horizon_xj3_open_explorer_v2.5.2-py38_20230331文件夹,右键选择打开终端。
然后激活horizon_bpu环境

conda activate horizon_bpu

在OE包中创建data文件夹,/data 为数据集文件目录,如果该目录不存在会导致加载问题,创建好后再运行命令:

bash run_docker.sh data/ cpu

成功

Docker version is v2.5.2
Dataset path is /home/tjuqz/horizon_xj3_open_explorer_v2.5.2-py38_20230331/data
OpenExplorer package path is /home/tjuqz/horizon_xj3_open_explorer_v2.5.2-py38_20230331
Unable to find image 'openexplorer/ai_toolchain_ubuntu_20_xj3_cpu:v2.5.2' locally
v2.5.2: Pulling from openexplorer/ai_toolchain_ubuntu_20_xj3_cpu
Digest: sha256:e47c6d874426d1bea80b681a8e867ea43b9236aa2b54979d95706eb5f42b85b5
Status: Downloaded newer image for openexplorer/ai_toolchain_ubuntu_20_xj3_cpu:v2.5.2
root@1ff840d9d93f:/open_explorer# 

下面我们主要使用/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/03_yolov5s/mapper下的示例进行操作,在终端运行:

root@1ff840d9d93f:/open_explorer# cd ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/03_yolov5s/mapper

验证模型

使用hb_mapper checker后面跟对应参数对模型进行验证,修改上面提到的03_yolov5s/mapper下01_check.sh中语句onnx_model="../../../01_common/model_zoo/mapper/detection/yolov5_onnx_optimized/best.onnx",即改为要验证的模型,接着运行命令:

bash 01_check.sh

命令行出现:

...
...
INFO End model checking....

无其他错误提示信息,应该是没有问题的,模型检查过程中的输出信息保存在hb_mapper_checker.log文件中,可查看具体输出信息。

准备校准数据

将自己训练模型使用的数据(选择了50张作为校准数据)放在/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/calibration_data/coco文件夹中。
在上面提到的03_yolov5s/mapper下修改preprocess.py第23行修改为PadResizeTransformer(target_size=(640, 640)),(640,640)为训练时使用的图片输入大小,可根据自己情况修改。
然后运行02_preprocess.sh

root@1ff840d9d93f:/open_explorer/ddk/samples/ai_toolchain
/horizon_model_convert_sample/04_detection/03_yolov5s
/mapper# bash 02_preprocess.sh

终端出现:

write:./calibration_data_bgr_f32/1.bgr
write:./calibration_data_bgr_f32/2.bgr
write:./calibration_data_bgr_f32/3.bgr
write:./calibration_data_bgr_f32/5.bgr
write:./calibration_data_bgr_f32/6.bgr
write:./calibration_data_bgr_f32/7.bgr

转换后的数据文件夹为calibration_data_bgr_f32

转换为板上模型

在上面提到的03_yolov5s/mapper下修改yolov5s_config.yaml中第16行为:onnx_model: '../../../01_common/model_zoo/mapper/detection/yolov5_onnx_optimized/best.onnx',第37行为:output_model_file_prefix: 'best_640x640_nv12'
然后可运行如下命令进行转换:

root@1ff840d9d93f:/open_explorer/ddk/samples/ai_toolchain
/horizon_model_convert_sample/04_detection/03_yolov5s
/mapper# bash 03_build.sh

终端出现提示信息:

...
INFO End Model Convert

转换的过程中的输出信息保存在hb_mapper_makertbin.log文件中,可查看具体输出信息;转换后的模型保存在model_output文件夹下。

模型精度分析

在上面提到的03_yolov5s/mapper下修改coco_metric.py中第22行为:

class_names = [
        "xxx",
    ]

其中xxx为训练数据时采用的数据集标注时给的标签。
修改postprocess.py第30行为:yolov5s_config.NUM_CLASSES = 1
第57行为:

 model_output[0] = model_output[0].reshape([1, 80, 80, 3,
                                               6]).transpose([0, 3, 1, 2, 4])
    model_output[1] = model_output[1].reshape([1, 40, 40, 3,
                                               6]).transpose([0, 3, 1, 2, 4])
    model_output[2] = model_output[2].reshape([1, 20, 20, 3,
                                               6]).transpose([0, 3, 1, 2, 4])

04_inference.sh第16和20行改为quanti_model_file="./model_output/best_640x640_nv12_quantized_model.onnx"original_model_file="./model_output/best_640x640_nv12_original_float_model.onnx",第33行改为infer_image="../../../01_common/test_data/det_images/666.jpg",其中666.jpg为测试你模型效果的图片,存放在OE包/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/test_data/det_images下。
运行:

bash 04_inference.sh

可以看到mapper下生成demo.jpg为测试图片的检测结果(教程中提到测试结果应该大致和上板运行效果无异,不过我在板上运行,识别效果还是有些偏差)。

上板

然后可以将model_output下best_640x640_nv12.bin复制到开发板上运行,参见上一篇文章,不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/279818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

迷宫问题的对比实验研究(代码注释详细、迷宫及路径可视化)

题目描述 对不同的迷宫进行算法问题,广度优先、深度优先、以及人工智能上介绍的一些算法:例如A*算法,蚁群算法等。 基本要求: (1)从文件读入9*9的迷宫,设置入口和出口,分别采用以上方…

基于huffman编解码的图像压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Huffman编码算法步骤 4.2 Huffman编码的数学原理 4.3 基于Huffman编解码的图像压缩 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..…

基于ElementUI二次封装el-table与el-pagination分页组件[实际项目使用]

效果&#xff1a; 二次封装el-table组件 <template><div><!-- showHeader:是否显示头部size:表格的大小height:表格的高度isStripe:表格是否为斑马纹类型tableData:表格数据源isBorder:是否表格边框handleSelectionChange:行选中&#xff0c;多选内容发生变化回…

遗传算法的应用——求解一元函数的极值

遗传算法的应用——求解一元函数的极值 1 基本概念2 预备知识3.1 模拟二进制转化为十进制的方法3.2 轮盘赌选择算法 3 问题4 Matlab代码5 运行效果6 总结 1 基本概念 遗传算法(Genetic Algorithm,GA)是模拟生物在自然环境中遗传和进化过程从而形成的随机全局搜索和优化方法&am…

3D视觉-结构光测量-多线结构光测量

工作原理 多线结构光测量在测量方式上类似上述线结构光测量&#xff0c;但是两者也有着一些明显的差别。这种形式的结构光测量&#xff0c;也常常被成为面结构光测量。首先激光器发出电光源通过通过光栅的调制产生多个切片光束&#xff0c;这些切片光束照射到待测物体表面后形成…

2023第三届中国高校大数据挑战赛B题代码

任务已完成&#xff0c;聚类效果很好&#xff08;主要在于数据的处理以及特征工程&#xff09;, 需代码si&#xff0c;yuer有限先到先得。

AI测试|颠覆客户端UI自动化?别担心,你还不会失业!AppAgent框架简单试用

01 AppAgent会成为新的趋势吗&#xff1f; 近日&#xff0c;腾讯团队发表了一篇论文&#xff0c;并开源了一款基于大语言模型的&#xff0c;用于手机端执行复杂任务的多模态智能代理框架——AppAgent。该框架设计的初衷&#xff0c;是让 AI 智能体能自己操作手机&#xff0c;完…

数据压缩专题——静止图像的小波变换编码

随着数字图像技术的发展和应用的广泛&#xff0c;对图像的压缩和编码变得越来越重要。小波变换编码作为一种有效的图像压缩和编码方法&#xff0c;在静止图像处理中得到了广泛应用。本文将介绍静止图像的小波变换编码的基本原理和关键步骤&#xff0c;以及其在图像压缩中的应用…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率&#xff08;C&#xff09; …

前后端分离nodejs+vue医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架&#xff1a;Express/koa 前端:Vue.js 数据库&#xff1a;mysql 开发软件&#xff1a;VScode/webstorm/hbuiderx均…

HBuilder常用的快捷键

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 常用快捷键分9项快捷键1.文件(4)2.编辑(13)3.…

JavaScript系列——正则表达式

文章目录 需求场景正则表达式的定义创建正则表达式通过 / 表示式/ 创建通过构造函数创建 编写一个正则表达式的模式使用简单模式使用特殊字符常用特殊字符列表特殊字符组和范围 正则表达式使用代码演示 常用示例验证手机号码合法性 小结 需求场景 在前端开发领域&#xff0c;在…

Idea中使用Tomcat部署并启动Web项目

首先在Idea中选择编辑运行配置&#xff0c;如下图 左上角的“”号&#xff0c;选择Tomcat服务&#xff0c;如下图 自定义服务名称和项目在浏览器的访问路径 配置Tomcat服务器路径&#xff0c;如下图 然后在服务器中部署项目&#xff08;下面的警告提示&#xff1a;Warning: No …

PostgreSQL 作为向量数据库:入门和扩展

PostgreSQL 拥有丰富的扩展和解决方案生态系统&#xff0c;使我们能够将该数据库用于通用人工智能应用程序。本指南将引导您完成使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序所需的步骤。 我们将从pgvector 扩展开始&#xff0c;它使 Postgres 具有特定于向量数据库…

HCIP:rip综合实验

实验要求&#xff1a; 【R1-R2-R3-R4-R5运行RIPV2】 【R6-R7运行RIPV1】 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.加快网络收敛&#xff0c;减少路由条目数量&#xff0c;增…

Vue 框架前导:详解 Ajax

Ajax Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性&#xff0c;可在不刷新页面的情况下实现和服务器的通信&#xff0c;交换数据或者更新页面 01. 体验 A…

golang 图片加水印

需求&#xff1a; 1&#xff0c;员工签到图片加水印 2&#xff0c;水印文字需要有半透明的底色&#xff0c;避免水印看不清 3&#xff0c;图片宽设置在600&#xff0c;小于600或者大于600都需要等比例修改图片的高度&#xff0c;保持水印在图片中的大小和位置 4&#xff0c;处理…

湘潭大学-2023年下学期-c语言-作业0x0a-综合1

A 求最小公倍数 #include<stdio.h>int gcd(int a,int b) {return b>0?gcd(b,a%b):a; }int main() {int a,b;while(~scanf("%d%d",&a,&b)){if(a0&&b0) break;printf("%d\n",a*b/gcd(a,b));}return 0; }记住最大公约数的函数&…

【C++杂货铺】C++11新特性——lambda

文章目录 一、C98中的排序二、先来看看 lambda 表达式长什么样三、lambda表达式语法3.1 捕捉列表的使用细节 四、lambda 的底层原理五、结语 一、C98中的排序 在 C98 中&#xff0c;如果要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法&#xff0c;下面…

《掌握这些黑科技,让你的电脑办公效率飞升》

随着电脑在现代办公中的广泛应用&#xff0c;如何提升电脑办公效率成为了一个重要的话题。随着科技的不断发展&#xff0c;越来越多的黑科技涌现出来&#xff0c;为我们提升电脑办公效率提供了更多的选择。在这篇文章中&#xff0c;我将为大家介绍几种提升电脑办公效率的黑科技…