[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122150460


目录

前言:

步骤1:下载对应版本的YOLO开源代码

1.1 github链接

1.2 下载

1.3 拷贝到Pycharm工程目录中

步骤2: 下载或创建自定义数据集

2.1 下载COCO128数据集(可选之一)

2.2 从其他网站下载所需要的开源数据集(可选之一)

2.3 手工制作自己的数据(可选之一)

步骤3: 组织数据集文件目录

步骤4: 为新数据集创建新配置文件或修改已有配置文件:xxxdataset.yaml

步骤5:选择模型文件

5.1 选择模型文件

5.2 预训练模型的配置文件

步骤6:用自定义数据训练模型

6.1 命令行

6.2 训练结果的输出

步骤7:手工检验模型的训练效果



前言:

为什么不使用官网的数据集进行训练呢?

主要原因有两个:

(1)COCO和VOC数据集太大,用于个人学习训练的话,时间太长,预计要1个星期才能训练完成。

(2)用YOLO进行目标检测,在多数时候,我们自己的图片数据集与YOLO官方提供的预训练模型所对应的数据集是不相同的。

主要区别在于:

  • 数据集图片的种类不同,自定义图片的种类有多有少,这个差别导致需要重新定义输出层。
  • 数据集图片的内容不同,这与我们特定的业务强相关,特定业务所需要的图片, 与YOLO的数据集是不完全相同的,甚至相差很大。
  • 数据集图片的背景不同,即使目标检测了类型相同,实际目标所处的环境也不一定相同。

这些就导致,我们需要基于YOLO官方预训练好的权重参数(预训练模型),然后,根据自身数据集的需求,重新训练YOLO模型的权重参数,最终才能满足我们自身业务的需求。

因此,我们首先从训练自己的数据集集开始。

要达成上述目标,具体步骤如下(本文重点讲解YOLO的使用方法,不讲原理):

官网手册:Train Custom Data - YOLOv5 Documentation

步骤1:下载对应版本的YOLO开源代码

1.1 github链接

登录github主页:https://github.com/search?q=PYTORCH++YOLOV5,所搜 “pytorch yolov5”

得到如下的信息:

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第1张图片

GitHub - ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLiteYOLOv5 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.https://github.com/ultralytics/yolov5

YOLO V5是按照项目管理的方式发布yolo v5的源代码的,yolo v5有不同 release tag,可以按照tag下载不同的release 版本,也可以直接下载master branch上的最新版本。

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第2张图片

1.2 下载

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第3张图片

1.3 拷贝到Pycharm工程目录中

cp
cd yolov5
$ pip install -r requirements.txt  # install

步骤2: 下载或创建自定义数据集

YOLO V5官方的开源代码,不自带数据集本身,需要程序员自己下载或创建数据集。

有几种方式创建数据集:

  • 下载已经标注过的开源数据集:网络中有大量的免费或收费的数据集
  • 制作自己的数据集:需要自己创建文件、标签

2.1 下载COCO128数据集(可选之一)

(1)从官网下载COCO128

COCO128是一个小型教程数据集,由COCO train2017中的前 128 张图像组成。这些128 张图像用于训练和验证,以验证我们的训练效果。

我们可以通过官网下载下载COCO128数据集, 需要先申请账号。

 coco128 | Kaggle

(2)从其他途径,如CSDN下载COCO128

我们也可以通过CSDN下载,有人在CSDN上提供了已经通过官网下载的COCO128数据集。

coco128.zip_coco128,coco128数据集-机器学习文档类资源-CSDN下载

2.2 从其他网站下载所需要的开源数据集(可选之一)

如下网站提供了大量的小型的已经打好标准的自定义数据集,我们可以直接利用这些数据集,这样可以节省大量需要我们手工打标签的时间。

官网地址:C​​​​​​omputer Vision Datasets

比如戴口罩的数据集:

戴口罩的数据集地址:Mask Wearing Object Detection Dataset

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第4张图片

直接下载YOLO V5版本对应格格式的文件

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第5张图片

2.3 手工制作自己的数据(可选之一)

(0)数据集名称:xxxdata

xxxdataset/

(1)采集自己的自定义数据集的图片数据

原始的图片文件存放在xxxdataset/images 目录中

xxxdataset/images/im0.jpg  # image

(2)用打标签工具为自己的自定义图片数据集打标签

xxxdataset/labels/

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第6张图片

(3)通过标签格式转换工具,把标签转换成YOLO V5格式(不同版本,格式有些差异)

YOLO V5的标签是txt格式:

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第7张图片

(4)标签文件与图片文件的关系:

xxxdataset/images/im0.jpg  # image
xxxdataset/labels/im0.txt  # label
  • images:存放原始的图片文件
  • labels:存放同名的标签文件,每个原始图片有一个同名的标签文件

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第8张图片

详见相关文章阐述。

步骤3: 组织数据集文件目录

把标注好的数据集拷贝到YOLO V5工程目录所在同一目录下的dataset目录中。

 如果datasets没有指定的数据集,YOLO V5的程序会自动下载该数据集

步骤4: 为数据集创建配置文件或修改已有配置文件:xxxdataset.yaml

(1)配置文件名称: xxx.yaml

每个数据集xxx, 都有一个xxx.yaml数据集文件与之对应,用于指导模型训练程序,如何找到数据集图片与标签,以及获取数据的信息。

(2)配置文件的存放位置:yolov5/data/ 

如下是YOLO V5项目自带的数据集的配置文件:

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第9张图片

 (3)配置文件的内容与格式

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第10张图片

  • path(可选):数据集的根目录
  • train(必选):训练图片的子目录
  • val(必选):验证图片的子目录
  • nc(必选):分类的数目
  • names(必选):每个分类的名称
  • download(可选):远程下载数据集的路径(如果本地没有,则从网络下载)

步骤5:选择模型文件

5.1 选择模型文件

为了适应不同的应用场景,YOLO V5并不是采用单一规模的模型,而是采用多种规模的模型。不同的规模的模型,其速度、所需要的内存空间,mAP不尽相同。

 GitHub - ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第11张图片

 其中,有4个典型规模的模型:

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第12张图片

这里我们选择YOLOV5s为例

5.2 预训练模型的配置文件

(1)模型配置文件的作用

模型的配置文件,用于YOLO V5的工程文件来创建模型、下载预训练模型、初始化模型等操作。

(2)模型配置文件的存放位置

YOLO V5已经为支持的默认的模型创建了模型的模型的配置文件,如下图所示:

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第13张图片

 (3)模型配置文件的内容(YoloV5s为例)

# YOLOv5  by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes                     # 分类数目
depth_multiple: 0.33  # model depth multiple    # 模型的深度倍数,值越小,模型的规模越小
width_multiple: 0.50  # layer channel multiple  # 模型通道的倍数,值越小,模型的规模越小
anchors:                                        # 先验框: 3 * 3 = 9个
  - [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 v6.0 backbone                          # 特征提取网络
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 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, 6, 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, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 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)
  ]

模型配置文件是YOLO V5自带的,用户也可以修改该配置文件或创建自己的配置文件。

步骤6:用自定义数据训练模型

6.1 命令行

(1)GPU内存》=12G

# Train YOLOv5s on COCO128 for 5 epochs
$ python train.py --img 640 --batch 16 --epochs 5 --data coco128.yaml --weights yolov5s.pt

(1)GPU内存<=8G

# Train YOLOv5s on COCO128 for 5 epochs
$ python train.py --img 640 --batch 1 --epochs 5 --data coco128.yaml --weights yolov5s.pt

$ python train.py --img 640 --batch 1 --epochs 5 --data MaskWearing.yaml --weights yolov5s.pt
  •  python train.py: 模型训练文件
  • --img 640 :图片文件的尺寸=640 * 640
  • --batch 16 : batch size,如果GPU的内存空间不足,可是降低batch size。
  • --epochs 5 :训练的轮数
  • --data coco128.yaml :数据集配置文件
  • --weights yolov5s.pt  :预训练模型,节省训练时间,如果为空,则重头开始训练。

命令行所有的参数:

python train.py --img 640 --batch 1 --epochs 5 --data coco128.yaml --weights yolov5s.pt
train: weights=yolov5s.pt, cfg=, data=coco128.yaml, hyp=data\hyps\hyp.scratch.yaml, epochs=5, batch_size=1, imgsz=640, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, evolve=None, bucket=, cache=None, image_weights=False, device=, multi_scale=False, single_cls=False, adam=False, sync_bn=False, workers=8, project=runs\train, name=exp, exist_ok=False, quad=False, linear_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest

6.2 训练结果的输出

(1)log

(pytorch-gpu-os) PS F:\MySource\github\yolov5>  python train.py --img 640 --batch 1 --epochs 5 --data coco128.yaml --weights yolov5s.pt
train: weights=yolov5s.pt, cfg=, data=coco128.yaml, hyp=data\hyps\hyp.scratch.yaml, epochs=5, batch_size=1, imgsz=640, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, evolve=None, bucket=, cache=None, image_weights=False, device=, multi_scale=False, single_cls=False, adam=False, sync_bn=False, workers=8, project=runs\train, name=exp, exist_ok=False, quad=False, linear_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest
github: fatal: unable to access 'https://github.com/ultralytics/yolov5.git/': Failed to connect to github.com port 443 after 21127 ms: Timed out
Command 'git fetch && git config --get remote.origin.url' timed out after 5 seconds
YOLOv5  v6.0-162-gaffa284 torch 1.10.0 CUDA:0 (NVIDIA GeForce RTX 2070, 8192MiB)

hyperparameters: lr0=0.01, lrf=0.1, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0
Weights & Biases: run 'pip install wandb' to automatically track and visualize YOLOv5  runs (RECOMMENDED)
TensorBoard: Start with 'tensorboard --logdir runs\train', view at http://localhost:6006/

                 from  n    params  module                                  arguments
  0                -1  1      3520  models.common.Conv                      [3, 32, 6, 2, 2]
  1                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]
  2                -1  1     18816  models.common.C3                        [64, 64, 1]
  3                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]
  4                -1  2    115712  models.common.C3                        [128, 128, 2]
  5                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]
  6                -1  3    625152  models.common.C3                        [256, 256, 3]
  7                -1  1   1180672  models.common.Conv                      [256, 512, 3, 2]
  8                -1  1   1182720  models.common.C3                        [512, 512, 1]
  9                -1  1    656896  models.common.SPPF                      [512, 512, 5]
 10                -1  1    131584  models.common.Conv                      [512, 256, 1, 1]
 11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']
 12           [-1, 6]  1         0  models.common.Concat                    [1]
 13                -1  1    361984  models.common.C3                        [512, 256, 1, False]
 14                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]
 15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']
 16           [-1, 4]  1         0  models.common.Concat                    [1]
 17                -1  1     90880  models.common.C3                        [256, 128, 1, False]
 18                -1  1    147712  models.common.Conv                      [128, 128, 3, 2]
 19          [-1, 14]  1         0  models.common.Concat                    [1]
 20                -1  1    296448  models.common.C3                        [256, 256, 1, False]
 21                -1  1    590336  models.common.Conv                      [256, 256, 3, 2]
 22          [-1, 10]  1         0  models.common.Concat                    [1]
 23                -1  1   1182720  models.common.C3                        [512, 512, 1, False]
 24      [17, 20, 23]  1    229245  models.yolo.Detect                      [80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
Model Summary: 270 layers, 7235389 parameters, 7235389 gradients, 16.5 GFLOPs

Transferred 349/349 items from yolov5s.pt
Scaled weight_decay = 0.0005
optimizer: SGD with parameter groups 57 weight, 60 weight (no decay), 60 bias
train: Scanning '..\datasets\coco128\labels\train2017.cache' images and labels... 128 found, 0 missing, 2 empty, 0 corrupted: 100%|███████████████████████████████████████████████████████████████████████████████| 128/128 [00:00

(2)训练好的模型文件

\yolov5\runs\train\exp7\weights

  • best.pt  => 精度最好的模型文件
  • last.pt   =>  最新的模型文件

(3)训练集部分目标检测的图片输出

\yolov5\runs\train\exp7\train_batchXXX.jpg

(4)验证集目标检测的图片输出

\yolov5\runs\train\exp7\val_batchXXX.jpg

(5)训练结果的可视化文件

\yolov5\runs\train\exp7\result.jpg

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第14张图片

步骤7:手工检验模型的训练效果

(1)模型训练后的权重矩阵输出

\yolov5\runs\train\exp7\weights

  • best.pt  => 精度最好的模型文件
  • last.pt   =>  最新的模型文件

(2)用训练的模型进行预测

python detect.py --source .\data\images\bus.jpg --weights runs\train\exp7\weights\best.pt

执行结果输出:Results saved to runs\detect\exp63

(pytorch-gpu-os) PS F:\MySource\github\yolov5> python detect.py --source .\data\images\bus.jpg --weights runs\train\exp7\weights\best.pt
detect: weights=['runs\\train\\exp7\\weights\\best.pt'], source=.\data\images\bus.jpg, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False
YOLOv5  v6.0-162-gaffa284 torch 1.10.0 CUDA:0 (NVIDIA GeForce RTX 2070, 8192MiB)

Fusing layers...
Model Summary: 213 layers, 7225885 parameters, 0 gradients, 16.5 GFLOPs
current working directory: F:\MySource\github\yolov5
image's abs: F:\MySource\github\yolov5\data\images\bus.jpg
image's abs: F:\MySource\github\yolov5\data\images\bus.jpg
image 1/1 F:\MySource\github\yolov5\data\images\bus.jpg: 640x480 3 persons, 1 bus, Done. (0.007s)
Speed: 0.0ms pre-process, 7.0ms inference, 7.0ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs\detect\exp63

[YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测_第15张图片

 更详细的预测方法如下:

[YOLO专题-9]:YOLO V5 - ultralytics/yolov5代码快速启动详解_文火冰糖(王文兵)的博客-CSDN博客


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122150460

你可能感兴趣的:(人工智能-YOLO专题,深度学习,计算机视觉,目标检测,自定义数据集训练)