使用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() modulefor mi, s in zip(m.m, m.stride):  #  fromb = 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())  # clsmi.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()

然后运行命令:

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复制到开发板上运行,参见上一篇文章,不再赘述。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS仿真R2机器人之安装运行及MoveIt的介绍

R2(Robonaut 2)是NASA美国宇航局与GM通用联合推出的宇航人形机器人,能在国际空间站使用,可想而知其价格是非常昂贵,几百万美刀吧,还好NASA发布了一个R2机器人的Gazebo模型,使用模型就不需要花钱了,由于我们…

Oracle查询重复数据取第二行,好用来删除重复数据

Oracle查询重复数据取第二行,好用来删除重复数据 SELECT * FROM ( SELECT e.* , ROW_NUMBER() over(PARTITION BY product_category_id,model_size_id ORDER BY product_category_id,model_size_id) rn FROM equ_check_rules e ) s WHERE rn 2;

《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》

基于Feign的声明式远程调用(代码更优雅),用它来去代替我们之前的RestTemplate方式的远程调用 1. Nacos配置管理:Nacos Config 服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相…

计量经济学|学习笔记以及学习感悟

初级计量经济学着重于介绍基本的统计工具和经济模型,以帮助理解经济数据和经济现象之间的关系。它包括回归分析、假设检验和预测方法等内容。中级计量经济学则深入研究这些方法的理论基础和实际应用,包括更复杂的模型和技术,如面板数据分析、…

【验证概括 SV的数据类型_2023.12.18】

验证概括 验证的过程是保证芯片实现符合规格说明书(Specification,spec)的过程 验证的两项任务: RTL sim:前仿真,验证功能 GLS-Gate (Level Simulation):后仿真,验证功能和时序 验…

SourceTree的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装:二、使用步骤1.获取地址2.放入sourceTree 3.点击推送 前言 提示:这里可以添加本文要记录的大概内容: 简单讲解一…

SpringBoot 2 集成Spark 3

前提条件: 运行环境&#xff1a;Hadoop 3.* Spark 3.* ,如果还未安装相关环境&#xff0c;请参考&#xff1a; Spark 初始 CentOS 7 安装Hadoop 3 单机版 SpringBoot 2 集成Spark 3 pom.xml <?xml version"1.0" encoding"UTF-8"?> <pro…

stm32中的i2c协议

stm32中I2C 文章目录 stm32中I2CI2C 协议简介I2C物理层协议层I2C基本读写过程 **通讯的起始和停止信号****数据有效性****地址及数据方向****响应** STM32的I2C特性及架构**STM32** **的** I2C外设简介STM32 的 I 2C 架构剖析通讯引脚 通讯过程主发送器主接收器 I2C初始化结构体…

【数据结构】快速排序(4种方式实现)

前言&#xff1a;前面我们学习了几种相对比较简单的排序&#xff0c;今天我们要一起学习的是快速排序&#xff0c;我们将通过四种方式来模拟实现快排。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &#x1f4a…

【23.12.29期--Spring篇】Spring的 IOC 介绍

介绍一下Spring的IOC ✔️引言✔️ lOC的优点✔️Spring的IOC✔️ 拓展知识仓✔️IOC是如何实现的&#xff1f; ✔️引言 所谓的IOC (inversion of control) &#xff0c;就是控制反转的意思。何为控制反转? 在传统的程序设计中&#xff0c;应用程序代码通常控制着对象的创建和…

车载毫米波雷达及芯片新趋势研究2--“CMOS+AiP+SoC”与4D毫米波雷达推动产业越过大规模发展临界点

2.1 MMIC芯片工艺发展至CMOS时代&#xff0c;芯片集成度更高、体积与成本下降  MMIC芯片工艺经GaAs、SiGe已发展至CMOS时代&#xff0c;CMOS MMIC具有更低成本、更高集成度的优势。 工艺的主要变化发生在MMIC芯片的射频材料部分&#xff0c;目前SiGe仍为主流工艺。 SiGe虽在…

Maven配置教程

一&#xff1a;下载 Maven – Download Apache Maven 二&#xff1a;解压 三&#xff1a;修改setting 1.在<localRepository>标签内添加自己的本地位置路径 <!-- localRepository| The path to the local repository maven will use to store artifacts.|| Default:…

Redis主从

一、为何需要主从 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离 二、如何设置主从 有临时和永久两种模式&#xff1a; 修改配置文件&#xff08;永久生效&#xff09; 在redis.conf中添…

网站服务器被入侵,如何排查,该如何预防入侵呢?

在我们日常使用服务器的过程中&#xff0c;当公司的网站服务器被黑客入侵时&#xff0c;导致整个网站以及业务系统瘫痪&#xff0c;将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应&#xff0c;对入侵问题做到及时处理&#xff0c;以最快的时间…

【基础篇】八、Arthas实现热部署

文章目录 1、Arthas实现热部署2、示例3、注意点 1、Arthas实现热部署 实现热部署指的是在服务不停止的情况下&#xff0c;动态地更新字节码文件到内存中&#xff0c;即&#xff1a;把修复后的类的字节码文件更新到内存中&#xff0c;让类加载器重新加载 背景&#xff1a;修复了…

[RoarCTF 2019]Easy Java(java web)

题目 页面如下 页面长得像sql注入 点击help看一下 这里需要了解java web目录结构 WEB INF:Java的web应用安全目录&#xff1b; 此外如果想在页面访问WEB-INF应用里面的文件&#xff0c;必须要通过web.xml进行相应的映射才能访问&#xff1b; WEB-INF是Java Web应用程序中的一…

基于Python的短视频APP大学生用户数据分析预测

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目背景 本项目以国内高校大学生在一段时间内对某短视频平台的使用数据为基础。通过数据分析和建模方法&#xff0c;我们深入挖掘这些数据中所蕴含的信息&#xff0c;以实现对高校和大学生维度的统计分析。…

Modbus转Profinet,不会编程也能用!轻松快上手!

Modbus转Profinet是一种用于工业自动化领域的通信协议转换器&#xff0c;可以将Modbus协议转换为Profinet协议&#xff0c;实现设备之间的数据交换与通信。这个工具的使用非常简单&#xff0c;即使没有编程经验的人也可以轻松上手。即使不会编程的人也可以轻松快速上手使用Modb…

【成功案例】起量时间缩短30%,超额达成目标!看初创厂商如何从0-1?

在非游出海的大浪潮中&#xff0c;工具类应用占据了半壁江山&#xff0c;不管是持续变现能力和收益周期&#xff0c;都跑出了优异成绩。 这股增长之风也吹到初创厂商这里&#xff0c;KP公司公司带着他们的首款产品JoySteps&#xff0c;勇敢地踏出了这一步。 从零到一的过程少…

鸿蒙原生应用再添新丁!爱奇艺入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;爱奇艺 入局鸿蒙 来自 HarmonyOS 微博12月29日消息&#xff0c;#爱奇艺完成鸿蒙原生应用Beta版#作为中国头部在线视频平台&#xff0c;爱奇艺 完成鸿蒙原生应用Beta版&#xff0c;将以丰富的正版高清视频资源促进鸿蒙生态的进一步繁荣&#x…