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

news2024/11/27 14:52:51

目录

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

之前训练自己模型的时候使用的是博主 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()

然后运行命令:

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.coloradmin.cn/o/1342409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

反转链表、链表的中间结点、合并两个有序链表(leetcode 一题多解)

一、反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路一:翻转单链表指针方向 这里解释一下三个指针的作用: n1&#xff1…

解决RestHighLevelClient报错missing authentication credentials for REST request

使用ElasticSearch Java API时遇到错误 "missing authentication credentials for REST request" 这是代码: RestHighLevelClient esClient new RestHighLevelClient(RestClient.builder(new HttpHost("localhost",9200,"http")));CreateIndexR…

接口测试工具:Postman的高级用法!

Postman 是一款功能强大的 API 开发和测试工具,以下是一些高级用法的详细介绍和操作步骤。 一. 环境和全局变量 环境变量允许你设置特定于环境(如开发、测试、生产)的变量,全局变量则在所有环境中都能访问。 操作步骤&#xff…

「年终总结」生成人工智能的奇妙年份

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

AI大模型时代下运维开发探索第二篇:基于大模型(LLM)的数据仓库

在SREWorks社区聚集了很多进行运维数仓建设的同学,大家都会遇到类似的挑战和问题: 数仓中存储大量数据消耗成本,但很多存储的数据却并没有消费。进数仓的ETL学习成本高、管理成本高,相关同学配合度低,以及上游结构改动…

天津医科大学临床医学院专升本药学专业有机化学考试大纲

天津医科大学临床医学院高职升本科专业课考试大纲药学专业《有机化学》科目考试大纲 一、考试基本要求 本考试大纲主要要求考生对《有机化学》基本概念有较深入的了解,能够系统地掌握各类化合物的命名、结构特点及立体异构、主要性质、反应、来源和合成制备方法等…

VSCode远程开发配置

目录 概要远程开发插件安装开始连接SSH无密码登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码,使用远程开发,可以在与生产环境相同的环境中开发、测试和部署代码,减少因环境不同而导致的问题。当下VSCode远程开发是支持的比…

iPortal内置Elasticsearch启动失败的几种情况——Linux

作者:yx 文章目录 前言一、端口占用二、ES启动过慢三、磁盘占用过高,导致ES变为只读模式 前言 在Linux环境启动iPortal后有时会出现搜索异常的情况,如下截图,这是因为Elasticsearch(以下简称“ES”)没启动…

【论文阅读】AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion

AADiff:基于文本到图像扩散的音频对齐视频合成。 code:没开源 paper:[2305.04001] AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion (arxiv.org) 一种新的T2V框架,额外使用音频信号来控制时间动态,使现成的…

Nginx服务器中设置禁止访问文件或目录的方法

location ^~ /assets/ { deny all; } 已启用目录浏览 在nginx要禁止某个或一类资源,只需要增加一个location,然后在其中使用deny all即可。 禁止访问扩展名为bat的文件,配置如下: location ~* /.bat { deny all…

部署一款开源的网站监控工具—Uptime Kuma

项目介绍 项目地址:louislam/uptime-kuma: A fancy self-hosted monitoring tool (github.com) Uptime Kuma是一个开源的网络服务监控工具。它允许用户监视他们的网络服务,以确保其正常运行,并提供有关服务可用性和性能的实时信息。Uptime K…

纯CSS实现马里奥效果,回忆一下童年吧

📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 &#x1f4…

【JavaWeb】day01-HTMLCSS

day01-HTML&CSS HTML 图片标签&#xff1a;<img> src&#xff1a;指定图像URL&#xff08;绝对路径/相对路径&#xff09;width&#xff1a;图像宽度&#xff08;像素/相对于父元素的百分比&#xff09;height&#xff1a;图像高度&#xff08;像素/相对于父元素的百…

智慧城市新型基础设施建设综合方案:文件全文52页,附下载

关键词&#xff1a;智慧城市建设方案&#xff0c;智慧城市发展的前景和趋势&#xff0c;智慧城市项目方案&#xff0c;智慧城市管理平台&#xff0c;数字化城市&#xff0c;城市数字化转型 一、智慧城市新基建建设背景 1、城市化进程加速&#xff1a;随着城市化进程的加速&am…

【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)

文章目录 &#x1f354;Bean的获取&#x1f384;注入IOC容器对象⭐代码实现&#x1f6f8;根据bean的名称获取&#x1f6f8;根据bean的类型获取&#x1f6f8;根据bean的名称和类型获取 &#x1f384;Bean的作用域⭐代码实现&#x1f388;注意 &#x1f384;第三方Bean⭐代码实现…

基于Java+SpringBoot+vue实现图书借阅管理系统

基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 &#x1f345; 作者主页 程序设计 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvue实现图书借阅和销售商城一体化…

C++面试宝典第11题:两数之和

题目 给定一个整数数组和一个目标值,请在该数组中找出和为目标值的那两个整数,并返回他们的数组下标,要求时间复杂度为O(n)。可以假设每种输入只会对应一个答案,注意:不能重复利用这个数组中同样的元素。 解析 这道题主要考察应聘者对算法时间复杂度和空间复杂度的理解,时…

麒麟信安成为福建省信息技术应用创新协会首批成员单位

为深入贯彻落实福建省委省政府关于信创工作部署&#xff0c;在福建省密码管理局、福建省工业和信息化厅、福建省数字福建建设领导小组办公室指导下&#xff0c;12月27日&#xff0c;福建省电子信息集团牵头举办福建省信息技术应用创新发展大会&#xff0c;中国工程院陈左宁院士…

2023-12-29 服务器开发-centos部署ftp

摘要: 2023-12-29 服务器开发-centos-部署ftp 部署ftp vsftpd&#xff08;very secure FTP daemon&#xff09;是Linux下的一款小巧轻快、安全易用的FTP服务器软件。本教程介绍如何在Linux实例上安装并配置vsftpd。 前提条件 已创建ECS实例并为实例分配了公网IP地址。 背景…

LVM逻辑卷与扩容

目录 一.LVM&#xff1a; 1.什么是LVM&#xff1a; 2.LVM的基本核心组件&#xff1a; 3.LVM的基本命令&#xff1a; 二.逻辑卷的创建&#xff1a; 第一步&#xff0c;我们先要为虚拟机添加硬盘 然后我们要添加依赖包 然后我们要进行磁盘分区 再添加好分区后&#xff0…