使用yolov5训练自己的目标检测模型并部署在Jetson Nano上

1. 项目的克隆

YOLOv5的代码是开源的,所以我们可以从github上download其源码。

  • 本次使用的分支是master下的v5.0版本,其他版本暂未尝试,有时间的同学可自行尝试

在这里插入图片描述

  • clone 方法
git clone --recursive git@github.com:ultralytics/yolov5.git

clone不下来,或者时间较长的,检查一下github的密钥有没有添加,以及有没有相关魔法

2. 项目代码结构

将我们clone下来的好的yolov5的代码用一款IDE打开(我用的是pycharm),打开之后整个代码目录如下图
在这里插入图片描述
现在来对代码的整体目录做一个介绍:

├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。但是自己的数据集不建议放在这个路径下面,而是建议把数据集放到yolov5项目的同级目录下面。

├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。

├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。

├── weights:放置训练好的权重参数。

├── detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。

├── train.py:训练自己的数据集的函数。

├── test.py:测试训练的结果的函数。

├──requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。

以上就是yolov5项目代码的整体介绍。我们训练和测试自己的数据集基本就是利用到如上的代码。

3. 环境的安装和依赖的安装

关于深度学习的环境的安装,值得一提的一点就是,正常需要利用GPU去训练数据集的话,是需要安装对应的CUDAcudnn

打开requirements.txt这个文件,可以看到里面有很多的依赖库和其对应的版本要求。我们打开命令终端,在中输入如下的命令,就可以安装了。

pip3 install -r requirements.txt

在这里插入图片描述

4. 数据集和预训练权重的准备

4.1利用labelimg标注数据和数据的准备

4.1.1 labelimg介绍:

Labelimg是一款开源的数据标注工具,可以标注三种格式。

   1、VOC标签格式,保存为xml文件。

   2、yolo标签格式,保存为txt文件。

   3、createML标签格式,保存为json格式。

4.1. 2 labelimg的安装

pip3 install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述
运行如上命令后,系统就会自动下载labelimg相关的依赖。由于这是一个很轻量的工具,所以下载起来很快。

4.2 使用labelimg

4.2.1 数据准备

首先这里需要准备我们需要打标注的数据集。这里我建议新建一个名为VOC2007的文件夹(这个是约定俗成,不这么做也行),里面创建一个名为JPEGImages的文件夹存放我们需要打标签的图片文件;再创建一个名为Annotations存放标注的标签文件;最后创建一个名为 predefined_classes.txt 的txt文件来存放所要标注的类别名称。

VOC2007的目录结构为:

├── VOC2007
│├── JPEGImages 存放需要打标签的图片文件
│├── Annotations 存放标注的标签文件
│├── predefined_classes.txt 定义自己要标注的所有类别(这个文件可有可无,但是在我们定义类别比较多的时候,最好有这个创建一个这样的txt文件来存放类别)

4.2.2 标注前的一些设置

  1. 首先在JPEGImages这个文件夹放置待标注的图片,具体的类别因人而异。
    在这里插入图片描述
  2. 创建一个名为Annotations存放标注的标签文件

在这里插入图片描述

  1. 创建一个名为 predefined_classes.txt 的txt文件来存放所要标注的类别名称
    在这里插入图片描述
    VOC2007的目录结构为:

├── VOC2007
│├── JPEGImages 存放需要打标签的图片文件
│├── Annotations 存放标注的标签文件
│├── predefined_classes.txt 定义自己要标注的所有类别(这个文件可有可无,但是在我们定义类别比较多的时候,最好有这个创建一个这样的txt文件来存放类别)

  1. 输入如下的命令打开labelimg。这个命令的意思是打开labelimg工具;打开JPEGImage文件夹,初始化predefined_classes.txt里面定义的类。
labelImg JPEGImages predefined_classes.txt

运行如上的命令就会打开这个工具;如下。
在这里插入图片描述

  • 下面介绍图中的我们常用的按钮。

在这里插入图片描述
待标注图片数据的路径文件夹,这里输入命令的时候就选定了JPEGImages。(当然这是可以换的)

在这里插入图片描述
保存类别标签的路径文件夹,这里我们选定了Annotations文件夹。

在这里插入图片描述
这个按键可以说明我们标注的标签为voc格式,点击可以换成yolo或者createML格式。

    点击View,会出现如图红色框框中的选项。最好和我一样把勾勾勾上。

    Auto Save mode:切换到下一张图的时候,会自动保存标签。

    Display Labels:会显示标注框和标签

    Advanced Mode:标注的十字架会一直悬浮在窗口。

在这里插入图片描述

常用快捷键如下:
A:切换到上一张图片

D:切换到下一张图片

W:调出标注十字架

del :删除标注框框

Ctrl+u:选择标注的图片文件夹

Ctrl+r:选择标注好的label标签存在的文件夹

4.2.3 开始标注

由于我们设置标注的十字架一直在标注界面上,这就不需要我们按快捷键w,然后选定我们需要标注的对象。按住鼠标左键拖出框框就可以了。如下图所示,当我们选定目标以后,就会加载出来predefined_classes.txt 定义自己要标注的所有类别(如果类别多,是真的很方便,就不需要自己手打每个类别的名字了)。打好的标签框框上会有该框框的类别(图中由于颜色的原因不太清晰,仔细看会发现的)。然后界面最右边会出现打好的类别标签。打好一张照片以后,快捷键D,就会进入下一张,这时候就会自动保存标签文件(voc格式会保存xml,yolo会保存txt格式)。
在这里插入图片描述
标签打完以后可以去Annotations 文件下看到标签文件已经保存在这个目录下。

4.3 将数据集为划分训练集和验证集

在yolov5目录下创建程序data_spl.py 并运行

程序如下:(可以不更改,注意下数据集的地址)

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File  : data_spl.py
# @Author: joker-wt
# @Date  : 2024/4/18
# @Desc  :
# @Contact : tl.wt123@qq.com

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='VOC2007/Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='VOC2007/ImageSets', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0  # 训练集和验证集所占比例。 这里没有划分测试集
train_percent = 0.9     # 训练集所占比例,可自己进行调整
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行完毕后 会生成 ImagesSets文件夹,且在其下生成 测试集、训练集、验证集,存放图片的名字(无后缀.jpg)

由于没有分配测试集,所以测试集为空。

若要分配,更改第 14、15 行代码,更改所在比例即可。
在这里插入图片描述

4.4 配置文件

在 yolov5 目录下的 data 文件夹下 新建一个 my_yolov5.yaml文件(可以自定义命名),打开。

内容是:

训练集以及验证集(train.txt和val.txt)的路径(可以改为相对路径)

以及 目标的类别数目和类别名称。

给出模板: 冒号后面需要加空格

train: /home/joker/idrive_project/yolov5/VOC2007/ImageSets/train.txt
val: /home/joker/idrive_project/yolov5/VOC2007/ImageSets/val.txt

# number of classes
nc: 4

# class names
names: ["release_speed_limit", "roundabout","speed_limit","turn_left"]

4.5 修改模型配置文件

选择一个模型,在yolov5目录下的model文件夹下是模型的配置文件,有n、s、m、l、x版本,逐渐增大(随着架构的增大,训练时间也是逐渐增大)。

这里放一些官方数据: https://github.com/ultralytics/yolov5

在这里插入图片描述
在这里插入图片描述

这里选用 yolov5s.yaml.。修改参数。

自动法获取anchors,只需更改nc 标注类别数,不用更改anchors
在这里插入图片描述

4.6 获得预训练权重

一般为了缩短网络的训练时间,并达到更好的精度,我们一般加载预训练权重进行网络的训练。而yolov5的5.0版本给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重。通过如下的图可以获得权重的名字和大小信息,可以预料的到,预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。预训练权重可以通过这个网址进行下载,本次训练自己的数据集用的预训练权重为yolov5s.pt。

5. 模型训练

5.1 开始训练

打开yolov5 目录下的 train.py 程序,我们可以多看看这些参数使用。

在这里插入图片描述

训练自己的模型需要修改如下几个参数就可以训练了。首先将weights权重的路径填写到对应的参数里面,然后将修改好的models模型的my_yolov5.yaml文件路径填写到相应的参数里面,最后将data数据的hat.yaml文件路径填写到相对于的参数里面。这几个参数就必须要修改的参数。

常用参数解释如下:

这个大部分借鉴了参考链接。

  • weights:权重文件路径

  • cfg:存储模型结构的配置文件

  • data:存储训练、测试数据的文件

  • epochs:指的就是训练过程中整个数据集将被迭代(训练)了多少次,显卡不行你就调小点。

  • batch-size:训练完多少张图片才进行权重更新,显卡不行就调小点。

  • img-size:输入图片宽高,显卡不行就调小点。

  • device:cuda device, i.e. 0 or 0,1,2,3 or cpu。选择使用GPU还是CPU

  • workers:线程数。默认是8。

其它参数解释:

  • noautoanchor:不自动检验更新anchors

  • rect:进行矩形训练

  • resume:恢复最近保存的模型开始训练

  • nosave:仅保存最终checkpoint

  • notest:仅测试最后的epoch

  • evolve:进化超参数

  • bucket:gsutil bucket

  • cache-images:缓存图像以加快训练速度

  • name: 重命名results.txt to results_name.txt

  • adam:使用adam优化

  • multi-scale:多尺度训练,img-size +/- 50%

  • single-cls:单类别的训练集

进入pytorch环境,进入yolov5文件夹

训练命令如下:

python3 train.py --weights weights/yolov5s.pt  --cfg models/yolov5s.yaml  --data data/my_yolov5.yaml --epoch 200 --batch-size 8 --img 640   --device 0

关于配置参数的解释说明:

–weights weights/yolov5s.pt :这个也许你需要更改路径。我是将yolov5的pt文件都放在weights目录下,你可能没有,需要更改路径。
–epoch 200 :训练200次
–batch-size 8:训练8张图片后进行权重更新
–device 0:使用GPU 0 训练

5.2 训练过程

如果没有报错的话,,训练过程如下图所示
在这里插入图片描述
其中训练好的模型会保存在/home/joker/idrive_project/yolov5/runs/train目录下

在这里插入图片描述

5.3 训练时间

我个人的笔记本是华硕天选3,显卡是NVIDIA 3060的,一个epoch大概4s的时间,整个数据集有450张图片,一共9个类别,每个类别50张图片。整个过程训练下来大概10来分钟左右。、

  • 训练结束后的结果
    在这里插入图片描述

5.4 训练结果

直接放图片吧

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 实际检测效果

可以执行下面的指令检测我们的模型效果
用刚刚训练出的最好的模型 best.pt 来测试,在yolov5目录下的 runs/train/exp/weights 。

 python3 detect.py --weights runs/train/exp/weights/best.pt --source 0
  • 其他数据输入源示例
python3 detect.py --source 0  # webcam  自带摄像头
                            file.jpg  # image 图片
                            file.mp4  # video 视频
                            path/  # directory
                            path/*.jpg  # glob
                            'https://youtu.be/NUsoVlDFqZg'  # YouTube
                            'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

测试结果保存在 yolov5/runs/detect 目录下

在这里插入图片描述

6. 使用TensorRT量化YOLO v5的训练结果模型

因为要将模型部署在Jetson Nano中使用,所以可以考虑量化一下pt模型

首先,确保你的电脑各种环境都有了,比如pytorch,tensorrt,YOLO v5等

6.1 项目代码clone

接下来去下载tensorrt项目,地址:

https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v5.0

一定要将分支切换到yolov5-v5.0, 我以这个版本进行尝试

在这里插入图片描述

6.2 生成.wts文件

  • 找到YOLOv5文件夹中的gen_wts.py,复制到前面提到过的YOLOv5项目的根目录下,运行并生成.wts文件.
    只有在yolov5项目文件夹下才能执行脚本文件,因为这个脚本文件需要相关的依赖

在终端中执行下面的命令,注意文件路径

python3 gen_wts.py --w best.pt

运行后显示:
在这里插入图片描述

这里就会生成一个.wts后缀的文件
在这里插入图片描述

找到生成的.wts文件,并复制到tensorrtx/yolov5文件夹中.

找到yololayer.h文件,打开修改类别数量(根据自己的情况而定),和输入图片大小(修改是尽量是32的倍数)

7. 参考资料

感谢各位CSDN大佬的经验帖

  1. Yolov5训练自己的数据集(详细完整版)

  2. 目标检测—教你利用yolov5训练自己的目标检测模型

  3. YOLOV5训练自己的数据集(踩坑经验之谈)

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先,你需要安装好PyTorch和OpenCV。然后,你可以从GitHub上下载yolov5的代码。 接下来,你需要准备你的数据集。数据集应该包含你想要检测的物体的图像和标签。标签应该是一个XML文件,其中包含物体的类别和位置。 然后,你需要将数据集分成训练集和验证集。训练集用于训练模型,验证集用于评估模型的性能。 接下来,你需要创建一个配置文件,其中包含模型的参数和训练的超参数。你可以使用默认的配置文件,也可以根据你的需求进行修改。 然后,你可以开始训练模型。在训练过程中,你可以使用tensorboard来监视模型的性能。 最后,你可以使用训练好的模型来进行目标检测。你可以使用OpenCV来读取图像,并使用训练好的模型来检测物体。 总之,使用yolov5训练自己的目标检测模型需要一些准备工作和技能,但是一旦你掌握了这些技能,你就可以创建自己的目标检测模型了。 ### 回答2: Yolov5是一种便捷快速的目标检测框架,它在精度和速度上比之前的版本有所提高。如果你想要使用Yolov5训练自己的目标检测模型,以下是一些步骤和技巧。 1. 准备数据集:首先,必须准备一个数据集,该数据集包含你想要检测的物体的图像。数据集可以从其他公开数据集直接下载或从自己收集的数据集中获取。无论是哪种方式,数据集都必须以YOLOv5可读的格式组织,即每个图像必须有一个它的标签文件,标签文件中包含有关每个物体位置和类别的信息。 2. 安装必要的依赖项:安装YOLOv5需要具有Python,其次我们要安装所需的Python的库依赖,例如Pytorch、NumPy、Pandas,等等。 可以通过使用conda或pip来安装这些依赖项; 3. Clone YOLOv5 Github repostory:要下载Yolov5,可以克隆YOLOv5 Github网址。从命令行中运行以下命令: git clone https://github.com/ultralytics/yolov5.git cd yolov5 4. 这个项目结构: * ┣ data/ * ┃ ┣ image/ * ┃ ┃ ┣ train/ * ┃ ┃ ┃ ┣ image_1.jpg * ┃ ┃ ┃ ┣ image_1.txt * ┃ ┃ ┃ ...... * ┃ ┃ ┣ valid/ * ┃ ┣ train.py * ┃ ┣ utils/ * ┃ ┣ models/ * ┃ ┣ weights/ * ┣ name.names * ┣ yolov5s.yaml 5. 准备NGC预训练数据:在训练模型前,需要下载预训练权重。YOLOv5的权重文件可以从NGC上下载,也可以从 https://github.com/ultralytics/yolov5/releases/ 上下载发布的权重文件。 6. 配置自己的类别:可以通过YOLOv5的配置文件修改,Yolov5使用YAML(Yet Another Markup Language)格式来配置其超参数,如类别数量,学习率,训练epoch等。 7. 训练模型:准备好以上步骤后,就可以开始训练模型了。可以使用 train.py 脚本进行训练。比如: python train.py --img 640 --batch 16 --epochs 10 --data ./data/yolo.yaml --cfg models/yolov5s.yaml --weights "" 8. 验证、测试模型:尽管loss值很低,并不意味着模型一定很好。因此,为了更好的评估模型的性能,建议你对测试集进行评估,可以使用 detect.py 脚本来进行评估。比如: python detect.py --source data/images/test/ --weights runs/train/exp/weights/best.pt 9. 将模型导出为TensorRT引擎:为了在移动设备或嵌入式设备上使用Yolov5模型,可以将其导出为TensorRT引擎。可以使用Yolov5提供的 export.py 脚本导出为TensorRT引擎。 python export.py --weights runs/train/exp7/weights/best.pt --img 640 --batch 1 总的来说,使用Yolov5训练自己的目标检测模型需要一些前置工作去写,然后通过配置参数,运行训练、验证和测试脚本。在每个步骤中,需要十分清楚自己要做什么,处理好每一个细节问题,才能顺利地完成自己的目标检测模型训练并有一定的精度。 ### 回答3: Yolov5是一种深度学习模型,能够进行目标检测,它对于广泛的物体检测任务具有出色的性能。本文将手把手地介绍如何使用Yolov5进行目标检测模型训练。 1. 下载和安装Yolov5 第一步是下载和安装Yolov5。我们可以在Github上得到最新的代码,并通过命令运行安装。安装完成后,建议按照提示安装必要的Python依赖项。 2. 准备数据集 第二步是准备好训练和测试数据集,可以使用现成的数据集,也可以从头开始创建自己的数据集。对于自制数据集,需要将图像和注释文件存储在相应目录中。注释文件描述了图像中所有目标的位置和类别。当完成这一步骤时,我们应该获得训练和测试集目录,每个目录应该包含图像文件和相应的注释文件。 3. 配置训练参数 第三步是为训练配置所需的超参数。这些参数包括网络结构,学习率,批量大小,迭代次数等等。可以通过修改配置文件来设置这些参数。我们需要基于网络结构来选择模型的版本。在配置文件中,我们需要设置图像的大小、目标分类的数量、训练和测试数据集的路径以及其他必要的参数。 4. 训练模型 当所有参数设置完成后,可以开始训练模型。通过在命令行中运行yolo.py脚本,可以启动训练过程。该脚本在训练期间使用指定的超参数和数据集对模型进行训练,并输出各个batch的训练状态信息。 5. 评估模型 训练模型后,需要对模型进行评估。评估过程包括计算模型的准确度、精度和召回率等指标。我们可以使用测试集对模型进行测试,并输出相关的指标信息。在测试期间,我们可以使用训练期超参数的某些变体或者优化超参数,以改进模型的精度。 6. 应用模型 最后一步是将模型应用于新的数据集。这可以通过在模型的输出上提取目标的位置和类别来完成,从而进行物体检测。在将模型应用于新数据集时,最好考虑训练和验证数据之间的数据分布差异,确保模型在新的数据集上的表现仍然良好。 总之,使用Yolov5进行目标检测模型训练需要准备好训练和测试数据集、配置模型的超参数以及选择网络结构和版本。训练和评估模型后,就可以将模型应用于新的数据集。需要注意的是,在整个过程中,超参数的选择和调整对模型的性能有着关键性的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joker-wt

我的心愿是——世界和平

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值