嵌入式AI---训练自己的yolov5目标检测模型

李华_ 2024-08-31 11:31:01 阅读 88

文章目录

前言一、yolov5源码下载二、数据集制作三、模型训练四、模型推理总结


文章阅读顺序:

(1)训练自己的yolov5目标检测模型(本文)

(2)yolov5模型转化为华为昇腾om模型

(3)在华为昇腾推理自己的yolov5目标检测模型

前言

由于实际项目需要在嵌入式环境部署一个目标检测模型,故以车辆检测为例,基于常用的轻量级检测算法yolov5s,在3060显卡训练了一个自己的车辆检测模型。源码版本为yolov5 v6.0,采用UA-DETRAC数据集训练。


一、yolov5源码下载

本项目选用yolov5 v6.0。源码下载链接:https://github.com/ultralytics/yolov5/releases

1.打开上面的链接,找到v6.0版本

在这里插入图片描述

2.拖到下面打开Assets

在这里插入图片描述

3.下载这两个即可

在这里插入图片描述

4.将解压后的源码用pycharm打开,yolov5s.pt文件放到源码目录

在这里插入图片描述

(PyTorch环境安装省略,本人采用python3.7 torch1.11.0,缺什么包再pip即可。不用完全一样,环境安装可以参考链接)

二、数据集制作

原始数据集链接:(不建议用,过于臃肿,需要特殊处理)

<code>链接:https://pan.baidu.com/s/1QJUSodZZWaBPKxqgnGuIvg

提取码:rucf

处理后的数据集链接:(建议使用,已根据项目需要进行特殊处理)

链接: https://pan.baidu.com/s/12Qu-0aVSS48cm0AgXLNhqw?pwd=xmrx

提取码: xmrx

处理数据集的原因:UA-DETRAC原始数据集的图片过多,相邻的几帧图片几乎一模一样,故进行了抽帧处理,每隔几帧抽一张作为新数据集。此外,原始数据集的label标注格式不方便工程使用,新数据集进行了格式处理。

(若不想训练车辆检测模型,可以采用labelimg自己标注数据集,参考链接)

将下载好的数据集放入工程目录

在这里插入图片描述

三、模型训练

在确保pytorch环境以及需要的包安装完成后,只需对项目进行以下几处修改即可开始训练。

1.在data目录下添加配置文件UA-DETRAC.yaml

在这里插入图片描述

UA-DETRAC.yaml填充内容如下:(修改为自己的存储路径)

<code>train: D:/yolov5/yolov5-6.0/UA-DETRAC_train/images/train/ # 16551 images

val: D:/yolov5/yolov5-6.0/UA-DETRAC_train/images/val/ # 4952 images

nc: 4

names: ['car', 'bus', 'van', 'others']

2.在models目录下添加配置文件yolov5s_car.yaml

在这里插入图片描述

yolov5s_car.yaml填充内容如下:

<code># parameters

nc: 4 # number of classes

depth_multiple: 0.33 # model depth multiple

width_multiple: 0.50 # layer channel multiple

# anchors

anchors:

- [10,13, 16,30, 33,23] # P3/8

- [30,61, 62,45, 59,119] # P4/16

- [116,90, 156,198, 373,326] # P5/32

# YOLOv5 backbone

backbone:

# [from, number, module, args]

[[-1, 1, Focus, [64, 3]], # 0-P1/2

[-1, 1, Conv, [128, 3, 2]], # 1-P2/4

[-1, 3, C3, [128]],

[-1, 1, Conv, [256, 3, 2]], # 3-P3/8

[-1, 9, C3, [256]],

[-1, 1, Conv, [512, 3, 2]], # 5-P4/16

[-1, 9, C3, [512]],

[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32

[-1, 1, SPP, [1024, [5, 9, 13]]],

[-1, 3, C3, [1024, False]], # 9

]

# YOLOv5 head

head:

[[-1, 1, Conv, [512, 1, 1]],

[-1, 1, nn.Upsample, [None, 2, 'nearest']],

[[-1, 6], 1, Concat, [1]], # cat backbone P4

[-1, 3, C3, [512, False]], # 13

[-1, 1, Conv, [256, 1, 1]],

[-1, 1, nn.Upsample, [None, 2, 'nearest']],

[[-1, 4], 1, Concat, [1]], # cat backbone P3

[-1, 3, C3, [256, False]], # 17 (P3/8-small)

[-1, 1, Conv, [256, 3, 2]],

[[-1, 14], 1, Concat, [1]], # cat head P4

[-1, 3, C3, [512, False]], # 20 (P4/16-medium)

[-1, 1, Conv, [512, 3, 2]],

[[-1, 10], 1, Concat, [1]], # cat head P5

[-1, 3, C3, [1024, False]], # 23 (P5/32-large)

[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)

]

3.修改train.py

修改train.py的parse_opt函数里的以下配置参数:

训练权重、模型配置文件、数据集配置文件

parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')code>

parser.add_argument('--cfg', type=str, default='models/yolov5s_car.yaml', help='model.yaml path')code>

parser.add_argument('--data', type=str, default=ROOT / 'data/UA-DETRAC.yaml', help='dataset.yaml path')code>

原train.py设置的训练轮数为300,为了测试代码能否跑通,以下将训练轮数修改为5。

parser.add_argument('--epochs', type=int, default=5)

然后运行train.py即可,见到这个打印信息就说明开始训练了(耐心等待训练结束即可)

在这里插入图片描述

运行train.py可能会出现一些bug,以下为解决办法:

问题1:提示Downloading https://ultralytics.com/assets/Arial.ttf to C:\Users\li\AppData\Roaming\Ultralytics\Arial.ttf…然后程序异常终止。

这是因为yolo项目需要用到Arial.ttf这个字体,运行代码尝试下载该字体导致了下载失败。有两种解决方法,一种是提前下载好该字体,一种是直接屏蔽字体检查

解决方法1:参考

解决方法2:将utils目录下的plots.py的字体检查代码代码注释掉(方法2无法根除问题,训练期间可能会打印错误信息,但不影响训练)

<code>class Annotator:

# if RANK in (-1, 0):

# check_font() # download TTF if necessary

# YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations

def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'):code>

问题2:wandb是用来做训练过程可视化的,但wandb频繁报错,影响了训练,如何关闭wandb?

修改工程中的utils/loggers/wandb/wandb_utils.py

# try:

# import wandb

#

# assert hasattr(wandb, '__version__') # verify package import not local dir

# if pkg.parse_version(wandb.__version__) >= pkg.parse_version('0.12.2') and RANK in [0, -1]:

# wandb.login(timeout=30)

# except (ImportError, AssertionError):

# wandb = None

wandb = None # 将上面代码注释掉,添加这行

修改工程中的utils/loggers/–init–.py

# try:

# import wandb

#

# assert hasattr(wandb, '__version__') # verify package import not local dir

# except (ImportError, AssertionError):

# wandb = None

wandb = None # 将上面代码注释掉,添加这行

问题3:提示页面文件太小,无法完成操作

这是因为计算机内存太小,加载数据集时爆内存了,修改train.py的配置参数即可。worker会影响dataloader加载数据集,worker越小,内存占用越小。

parser.add_argument('--workers', type=int, default=1, help='maximum number of dataloader workers')code>

问题4:提示RuntimeError: Unable to find a valid cuDNN algorithm to run convolution

这是因为计算机GPU显存太小,爆显存了,修改train.py的配置参数即可。batch会影响模型训练收敛,batch越小,显存占用越小。

parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs')code>

四、模型推理

训练结束后,可以在runs/train/exp目录看见训练结果(可能有多个exp目录,这是因为运行了多次train.py,进最新的那个),在runs/train/exp/weight目录下可以看到best.pt和last.pt模型文件,我们选用best.pt作为推理模型。

1.将runs/train/exp/weight/best.pt复制到工程目录

在这里插入图片描述

2.修改detect.py参数

将权重文件修改为best.pt,将测试路径修改为测试数据集路径

<code>parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'best.pt', help='model path(s)')code>

parser.add_argument('--source', type=str, default=ROOT / 'UA-DETRAC_test/images', help='file/dir/URL/glob, 0 for webcam')code>

运行detect.py,见到这个输出则说明正在进行推理测试

在这里插入图片描述

检测结果存放在runs/detect/exp

在这里插入图片描述

注:训练轮数过少的模型可能无法分辨车辆类型,想要得到较高的检测精度,需要后续增加训练轮数并调节超参。


总结

本文基于车辆数据集UA-DETRAC训练了yolov5目标检测模型,模型能够分辨不同种类的车辆。后续仍有精度提升、边缘计算设备部署、数据集更换等工作需要展开,持续更新,敬请期待。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。