yolov7目标检测:基于自定义数据集完成检测、训练、测试

时间:2022-03-29 01:27:08

多目标检测

前言

yolo网络模型详解,请看博主这篇文章:三万字硬核详解:yolov1、yolov2、yolov3、yolov4、yolov5、yolov7

本篇文章主要分四部分:(1)环境配置与文件配置(2)检测(3)训练(4)测试

  • 其中,检测和训练都是可以独立进行的。检测是依赖于权重文件即可运行(可官网下载),而训练是基于自定义训练数据集和超参数生成权重文件。
  • 请仔细阅读文章目录,了解整体框架与设计流程后,能让你更快上手!

一、环境与文件准备

1.1、环境配置

详细请看博主这篇文章:【深度学习环境配置】详细教程(资源已上传)

1.2、源码下载

官方下载地址:【GitCode mirrors】YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

  • 项目路径中不可以有中文(否则会异常报错,找原因找到奔溃) yolov7目标检测:基于自定义数据集完成检测、训练、测试

1.3、权重文件下载

(1)测试权重文件下载:进入官网,下载Test用的权重文件:yolov7.pt
yolov7目标检测:基于自定义数据集完成检测、训练、测试

(2)训练权重文件下载:进入官网,下载Train用的权重文件:yolov7_training.pt
yolov7目标检测:基于自定义数据集完成检测、训练、测试

(3)在yolov7-main文件夹下新建一个weights文件夹,然后将下载好的两个权重文件放进去。
yolov7目标检测:基于自定义数据集完成检测、训练、测试

1.4、详解源码中的文件夹与文件

(1)下载后自带的文件夹及文件

文件夹

  • cfg:存放训练所需要的网络结构文件(.yaml)
  • data:存放4个超参数配置文件、数据集配置文件(coco.yaml)
  • inference:存放检测的图像与视频数据
  • models:存放4个脚本文件:(__ init __.py)初始化脚本、(common.py)模型组件定义脚本、(experimental.py)实验脚本、(yolo.py)网络模型脚本
  • paper:存放论文(yolo.pdf)
  • scripts:文件下载脚本(get_coco.sh)
  • tools:存放多个ipynb文件
  • utils:yolov7的python工具文件夹:activations.py激活函数脚本、autoanchor.py自动锚框脚本、datasets.py定义数据加载 / 预处理 / 标注等函数、general.py通用函数脚本、loss.py损失函数脚本、metrics.py性能指标计算脚本、plots.py画图工具脚本、torch_utils.py定义基于torch的实用工具脚本

文件

  • requirement.txt:训练和测试所需要下载的库
  • export.py:模型转换脚本
  • detect.py:测试脚本
  • train.py:训练脚本
  • test.py:测试脚本

(2)训练时需要新建的文件夹

  • weights:存放训练与检测的权重文件:yolov7.pt、yolov7_training.pt
  • datasets:存放用户自定义数据集(yolo格式)

(3)训练或测试后自动生成的文件夹

  • runs:存放训练和测试的结果(权重文件和相关信息)

1.5、详解配置参数

配置参数请看detect.py,如下图。
yolov7目标检测:基于自定义数据集完成检测、训练、测试

举例说明:权重参数('--weights')是字符串类型(type=str),故在默认值default中输入字符串,并指定权重文件的默认地址(default='yolov7.pt')。help是自定义描述文档。详细用法请参考argparse

配置参数 说明
--weights 权重文件
--cfg 模型配置文件
--data 数据集配置文件
-hyp 超参数文件
--epochs 训练总轮次
--batch-size 一次训练所选取的样本数
--img-size 输入图片分辨率大小
--rect 是否采用矩形训练,默认False
--resume 接着上次训练的中途结果继续训练
--nosave 是否只保存最终的模型,默认False
--notest 是否只测试最后一个epoch,默认False
--noautoanchor 是否不自动调整anchor,默认False
--evolve 是否进行超参数进化,默认False
--bucket 谷歌云盘bucket,一般不会用到
--cache images 是否提前缓存图片到内存,以加快训练速度,默认False
--image-weights 是否使用加权图像进行训练,默认False
--device 指定训练设备:[cpu默认值,0表示一个gpu设备,[0,1,2,3]表示多个gpu设备]
--multi-scale 是否进行多尺度训练,默认False
--single-cls 数据集是否只有一个类别,默认False
--adam 选择优化器adam
--sync-bn 是否使用跨卡同步BN,在DDP模式使用
--local_rank 自动单机多卡训练,一般不改动
--workers dataloader的最大worker数量
--project 保存到项目/名称
--entity W&B实体类
---name 保存到项目/名称
--exist-ok 现有项目/名称确定,不递增,默认False
--quad 是否使用四元数据加载器,默认False
--linear-lr 是否使用线性学习率,默认False
--label-smoothing 标签平滑
--upload_dataset 是否更新数据集,默认False
--bbox_interval 设置W&B的边界框图像记录间隔
--save-period 每一个epoch记录训练日志信息
--artifact_alias 保存到项目结果地址
--freeze 冻结层数,默认False
--v5-metric 是否假设AP计算中的最大召回率为1.0,默认False

二、检测模型(detect.py)

2.1、自定义检测数据准备

如下图:

  • 个人新增了几张图片(1.jpg、2.jpg、3.jpg、4.jpg)。
  • 个人新增了一个视频(目标实时跟踪.mp4)。
  • 其余皆为下载源码时自带的图片。

yolov7目标检测:基于自定义数据集完成检测、训练、测试

2.2、配置参数

2.2.1、方式一:打开Pycharm,进入Terminal,输入指令开始检测

python detect.py --weights weights/yolov7.pt --source inference/images

11、具体操作如下图:yolov7目标检测:基于自定义数据集完成检测、训练、测试
需确认当前项目工作路径,必须在yolov7-main文件夹下运行。若路径错误,cd到指定路径下。

  • (1) --weights:表示权重文件路径
  • (2) --source:表示检测图像和视频路径
  • (3) --device:表示选用设备类型。
    • ( --device 0/1/2/3:分别表示选择1/2/3/4个GPU)
    • ( --device cpu:表示选择CPU,(不输入)默认选择CPU。

22、运行成功显示如下:
yolov7目标检测:基于自定义数据集完成检测、训练、测试

2.2.2、方式二:点击Edit Configuration,输入配置参数,开始检测。

若出现的不是当前运行文件,可打开detect.py运行一次之后再取消,就自动生成了。

11、具体操作如下图:yolov7目标检测:基于自定义数据集完成检测、训练、测试
yolov7目标检测:基于自定义数据集完成检测、训练、测试

22、运行成功显示如下:
yolov7目标检测:基于自定义数据集完成检测、训练、测试

2.3、查看检测结果

进入runs -> detect -> exp,里面存放所有检测好的图片和视频。且每运行一次,都将新增一个exp文件夹。(运行失败也会新增)

如下图:

  • 个人新增了几张图片(1.jpg、2.jpg、3.jpg、4.jpg),识别效果很精确。
  • 个人新增了一个视频(目标实时跟踪.mp4),识别效果很精确。
  • 其余皆为下载源码时自带的图片。
    yolov7目标检测:基于自定义数据集完成检测、训练、测试
    yolov7目标检测:基于自定义数据集完成检测、训练、测试

三、训练模型(train.py)

3.1、自定义训练数据准备(yolo格式)

yolov7目标检测:基于自定义数据集完成检测、训练、测试
在当前项目路径下,新建 datasets 文件夹。训练与测试数据集的存放格式根据 yolov7 的要求详细如下:

  • (1)在 datasets 文件夹下,新建 Helmet 文件夹:Helmet是自定义文件名:通常命名为当前项目的检测物体名称(如:检测车,命名为car)
  • (2)在 Helmet 文件夹下,新建 images 和 labels 文件夹,以及存放训练和验证每一张图像的绝对路径的两个( .txt )文本。该文本详解如下/font>
    • (2.1)在 images 文件夹下,新建 train 和 val 两个文件夹,分别存放训练与验证的图片数据集。依据数据集数量来划分,通常训练与验证的比例是三七分。
    • (2.2)在 labels 文件夹下,新建 train 和 val 两个文件夹。分别存放训练与验证数据的标注文件( .txt ),每个数据对应一个标准文件。该文件通过labelImg制作而成,详解如下。/font>

按上述要求构建好符合yolo格式的数据集后,进入datasets/Helmet文件夹下,新建两个文本文件:train.txt、val.txt。该两个文件分别写入在 images/train 和 images/val 下,所有图片的绝对路径。
yolov7目标检测:基于自定义数据集完成检测、训练、测试

3.2、labelImg制作图像标签

在上述自定义数据准备中,提到的 labels 文件夹下的训练与验证数据的标注文件,需要通过labelImg软件去处理生成。就是通过将 images 文件夹下的训练和验证数据,一对一的生成yolo格式的标准文件,并保存在 labels文件夹下的对应路径。

3.2.1、labelImg的环境配置

参考博客:labelImg使用教程

(1)进入DOS命令窗口,输入指令进行安装:pip install labelImg。下载过程比较痛苦,费了九牛二虎之力,反反复复下载失败后,终于成功。
(2)下载完成后,输DOS命令窗口入指令启动软件:labellmg
yolov7目标检测:基于自定义数据集完成检测、训练、测试

3.2.2、基于labelImg开始标注

(1)加载和保存路径:加载图片路径并选择保存路径,这样我们对image的每张图片的处理都会储存进label中,之后val也是同理。

  • Open Dir(选择图片路径):选择datasets/Helmet/images/train
  • Change Save Dir(选择保存路径):选择datasets/Helmet/labels/train

注意:因为使用cv2.imread读取图像,所有路径中不能有中文。否则导致失败。

(2)开始标注检测目标:首先选择YOLO格式类型(yolov7只支持YOLO格式类型的数据),点击Create RectBox,在当前图片手动标注检测目标(ROI),并自命名检测目标的类别。然后点击Save,即完成了一张图片的标注。最后通过Next Image或Prev Image将所有图片分别标注并保存。

  • YOLO/CreateML/PascalVOC:生成标注文件的格式类型,共提供三种类型。
  • Create RectBox(创造矩形框):加载图片路径之后才可选。
  • Save:保存当前操作并生成标注文件到指定路径。
  • Next Image(下一张图片):在选择的图片路径下,切换当前图片的下一张图片。
  • Prev Image(上一张图片):在选择的图片路径下,切换当前图片的上一张图片。

快捷键:W(创建矩形框),A(上一张图片),D(下一张图片)

(3)查看标注文件与标签文件

  • 每一张图像都会生成对应的(num.txt)标注文件,按输入图像的顺序自动排序。在标注文件中,每一行表示一个目标的信息,共有五个参数:目标类别class、矩形框的位置信息(x_center, y_center, width, height),N行表示当前图像标注了N个矩形框。
  • 并会生成一个(classes.txt)标签文件,里面包括所有目标类别。

下图是 labels/train 的举例,labels/val 同理:
yolov7目标检测:基于自定义数据集完成检测、训练、测试
yolov7目标检测:基于自定义数据集完成检测、训练、测试
yolov7目标检测:基于自定义数据集完成检测、训练、测试

3.3、配置文件

需要配置两个文件:

  • 一个是模型的配置文件:/yolov7/cfg/training/yolov7.yaml
  • 一个是数据集的配置文件:/yolov7/data/coco.yaml

3.3.1、模型配置文件

具体操作如下:

  • 第一步,复制yolov7.yaml文件到相同的路径下,然后重命名为yolov7-Helmet.yaml。(可自定义名称,训练时会指定该文件路径。)在复制文件上修改参数的意义是为了保存先验文件
  • 第二步,在Pycharm中,打开yolov7-Helmet.yaml文件,修改参数。该文件只需要修改 1 个地方,就是类别数量。需要对应自定义数据集的目标类别。yolov7目标检测:基于自定义数据集完成检测、训练、测试

3.3.2、数据集配置文件

具体操作如下:

  • 第一步,复制coco.yaml文件到相同的路径下,然后重命名为Helmet.yaml。(可自定义名称,训练时会指定该文件路径。)在复制文件上修改参数的意义是为了保存先验文件
  • 第二步,在Pycharm中,打开Helmet.yaml文件,修改参数。该文件需要修改 5 个地方。
    • 第一处:注释自动下载COCO数据集的命令,以防代码自动下载数据集占用内存。
    • 第二处:修改 train 的位置(存放所有训练图像的绝对路径文件)
    • 第三处:修改 val 的位置(存放所有验证图像的绝对路径文件)
    • 第四处:修改 nc 的类别数量(即自定义数据集对应的目标类别)
    • 第五处:修改 names 的类别名称(即自定义数据集对应的目标类别)yolov7目标检测:基于自定义数据集完成检测、训练、测试

3.4、开始训练

3.4.1、训练权重文件

(1)输入指令

  • 详细教程请看第二章检测中的参数配置:2.1.1方式一、2.1.2方式二

以方式一进行演示: 打开Pycharm,进入Terminal,输入指令开始训练
python train.py --weights weights/yolov7_training.pt --cfg cfg/training/yolov7-Helmet.yaml --data data/Helmet.yaml --device cpu --batch-size 8 --epoch 1
参数说明:
(1)train.py:当前运行文件
(2) --weights:训练的权重文件
(3) --cfg:模型的配置参数文件
(4) --data:数据的配置参数文件
(5) --device 0:表示指定一块GPU
(6) --batch-size:表示batch数
(7) --epoch:表示迭代训练次数

(2)查看训练结果

训练成功会得到两个权重文件:last.pt、best.pt
yolov7目标检测:基于自定义数据集完成检测、训练、测试

进入runs -> train -> exp,里面存放训练的过程日志与权重文件。且每运行一次,都将新增一个exp文件夹。(运行失败也会新增)

yolov7目标检测:基于自定义数据集完成检测、训练、测试
yolov7目标检测:基于自定义数据集完成检测、训练、测试

3.4.2、常见BUG汇总

  • BUG"UnicodeDecodeError: 'gbk' codec can't decode byte 0xxx in position XX"
  • 解决方法:打开文本文件时,使用encoding参数指定编码格式。
  • 例如with open(r'trainers.txt') as f:更换为with open(r'trainers.txt', encoding='utf-8') as f:
  • 参考文章:读取文件被提示“UnicodeDecodeError”
  • BUG"org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping"
  • 解决方法:可能原因是在yaml文件中,冒号之后忘记空格(或其他不符合yolo格式问题)。
  • 例如:在【3.3、配置文件】中,共需要对两个yaml文件进行参数修改,请详细核对是否有误。分别是模型配置文件:/yolov7/cfg/training/yolov7.yaml数据集配置文件/yolov7/data/coco.yaml
  • 参考文章:学习YAML的时候遇到的问题

3.4.3、加载训练权重文件,开始检测

  • 步骤一:提取 runs\train\exp15\weights\best.pt 权重文件。
  • 步骤二:与博文中第二章【二、检测(detect.py)】的检测流程是一样的,只是替换了权重文件和自定义检测图片 。

四、测试模型(test.py)

模型评估:将训练模型移植到有标注的测试集或验证集上,进行模型效果的评估。在目标检测中,最常使用的评估指标为mAP。

  • 博文的前述教程只准备了训练与检测的数据准备与搭建,故若需要使用测试模型,需按照上述流程进行测试数据准备与搭建。
  • 在 test.py 文件中指定数据集配置文件和训练结果模型。详细流程如下:打开Pycharm,进入Terminal,输入指令开始训练:python test.py --data Helmet.yaml --weights runs/train/exp15/weights/best.pt --augment

参考文献

针对每一篇文章,都标注了可参考的部分内容。

1、YOLOv8教程系列:一、使用自定义数据集训练YOLOv8模型(详细版教程,你只看一篇->调参攻略),包含环境搭建/数据准备/模型训练/预测/验证/导出等

将xml文件转换成YOLO系列标准读取的txt文件,提供.py文件

2、YoloV7实战:手把手教你使用Yolov7进行物体检测(附数据集)

将json数据转为yolov7格式的txt数据
,提供make_yolo_data.py文件完成数据集搭建:
(1)使用train_test_split方法切分出训练集、验证集和测试集。
(2)调用change_2_yolo5方法将json里面的数据转为yolov5格式的txt数据,返回训练集、验证集和测试集的图片list。
(3)创建数据集文件夹,然后将图片和txt文件copy到对应的目录下面。

3、YOLOv7训练自己的数据集(超详细)

将VOC数据集转换为YOLO数据集
(1)通过split_train_val.py文件,在dataSet 文件夹下,新建训练集、验证集、测试集。
(2)通过voc_label.py文件,将训练集、验证集、测试集生成label标签(训练中要用到),同时将数据集路径导入txt文件中。
(3)训练、测试、检测

4.1、YOLOv7(目标检测)入门教程详解—检测,推理,训练
4.2、yolov7训练自己的数据集

手把手教你搭建检测与训练所需要的环境、配置文件、yolo数据准备、labellmg使用、

5、睿智的目标检测61——Pytorch搭建YoloV7目标检测平台

(1)将yolov7分模块化进行原理分析以及代码注释。
(2)模块化包括:Backbone,FPN以及Yolo Head、预测框、非极大值抑制、loss、正样本的匹配过程。

6、YOLO系列 — YOLOV7算法(一):使用自定义数据集跑通YOLOV7算法

YOLOV7算法(一):使用自定义数据集跑通YOLOV7算法(包括对整个项目文件作用的解读)
YOLO系列 — YOLOV7算法(二):YOLO V7算法detect.py代码解析
YOLO系列 — YOLOV7算法(三):YOLO V7算法train.py代码解析
YOLO系列 — YOLOV7算法(四):YOLO V7算法网络结构解析
训练过程中的重要代码解析
YOLO系列 — YOLOV7算法(六):YOLO V7算法onnx模型部署
YOLO系列 — YOLOV7算法(七):YOLOV7算法总结

7、YOLOv7训练自己的VOC数据集

(1)YOLOV7训练自己的yolo数据集
(2)YOLOv7训练自己的VOC数据集

8、论文投稿相关项目(49)+目标检测算法公共数据集(25)+算法训练相关项目(12)+yolov5与yolov7的改进之处对比(主干网络改进+轻量化网络+注意力机制+检测头部改进+空间金字塔池化+损失函数+NMS)