• YOLOv7训练自己的数据集(口罩检测)


    前言

    • 本文是个人使用YOLOv7训练自己的VOC数据集的应用案例,由于水平有限,难免出现错漏,敬请批评改正。
    • YOLOv7代码结构与YOLOv5很相似,要求的数据集格式也一致,熟悉YOLOv5,可以快速入手YOLOv7。
    • 更多精彩内容,可点击进入我的个人主页查看

    前提条件

    实验环境

    matplotlib>=3.2.2
    numpy>=1.18.5
    opencv-python>=4.1.1
    Pillow>=7.1.2
    PyYAML>=5.3.1
    requests>=2.23.0
    scipy>=1.4.1
    torch>=1.7.0
    torchvision>=0.8.1
    tqdm>=4.41.0
    protobuf<4.21.3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    项目结构

    yolov7_train_mydatasets
    ├─cfg
    ├─data
    ├─deploy
    ├─figure
    ├─inference
    │  └─images
    ├─models
    ├─paper
    ├─scripts
    ├─tools
    ├─utils
    ├─VOCdevkit
        └─VOC2007
            ├─Annotations
            └─JPEGImages
    │  .gitignore
    │  detect.py
    │  export.py
    │  hubconf.py
    │  labelImg2yolo.py
    │  LICENSE.md
    │  README.md
    │  requirements.txt
    │  test.py
    │  train.py
    │  train_aux.py
    │  yolov7.pt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    制作自己的数据集

    • LabelImg是一款功能相当实用且被广泛使用的图像标注工具,为开发人员提供一个可以自定义制作和创建数据集的平台,所以我们这里使用LabelImg图像标注工具,来制作自己的数据集。
    • LabelImg下载地址 提取码:sjbz
    • 图像标注完成后,LabelImg 图像标注工具会生成.xml格式的文件,.xml格式的文件中包含标注图像的路径、大小以及标注图像中的目标的类别信息和目标的真实框在图像中的位置信息等。
    • 使用LabelImg 标注工具进行数据标注示例如下图所示。
      在这里插入图片描述
    • 使用LabelImg 图像标注工具会生成.xml格式的文件及其文件内容示例如下图所示。
      在这里插入图片描述
    <annotation>
    	<folder>folder>
    	<filename>01.jpgfilename>
    	<path>path>
    	<source>
    		<database>Unknowndatabase>
    	source>
    	<size>
    		<width>1179width>
    		<height>710height>
    		<depth>3depth>
    	size>
    	<segmented>0segmented>
    	<object>
    		<name>with_maskname>
    		<pose>Unspecifiedpose>
    		<truncated>0truncated>
    		<difficult>0difficult>
    		<bndbox>
    			<xmin>89xmin>
    			<ymin>37ymin>
    			<xmax>492xmax>
    			<ymax>659ymax>
    		bndbox>
    	object>
    	<object>
    		<name>without_maskname>
    		<pose>Unspecifiedpose>
    		<truncated>0truncated>
    		<difficult>0difficult>
    		<bndbox>
    			<xmin>680xmin>
    			<ymin>31ymin>
    			<xmax>1071xmax>
    			<ymax>684ymax>
    		bndbox>
    	object>
    annotation>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    数据集目录结构

    ├─VOCdevkit
    	└─VOC2007
    	    ├─Annotations
    	    │      01.xml
    	    │      ......
    	    └─JPEGImages
    	           01.jpg
    	           ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    训练自己的数据集

    VOC格式数据集转换成YOLO格式数据集

    在yolov7_train_mydatasets目录下,打开labelImg2yolo.py文件

    # 修改成自己数据集的类别名
    classes = ["with_mask","without_mask"] 
    
    • 1
    • 2

    然后,运行labelImg2yolo.py

    python labelImg2yolo.py
    
    • 1

    生成yolo格式的训练和验证数据集
    在这里插入图片描述
    在这里插入图片描述

    修改cfg配置

    新建一个myyolov7.yaml配置文件

    在这里插入图片描述

    myyolov7.yaml内容

    在这里插入图片描述

    # parameters
    nc: 2  # number of classes
    depth_multiple: 1.0  # model depth multiple
    width_multiple: 1.0  # layer channel multiple
    
    # anchors
    anchors:
      - [12,16, 19,36, 40,28]  # P3/8
      - [36,75, 76,55, 72,146]  # P4/16
      - [142,110, 192,243, 459,401]  # P5/32
    
    # yolov7 backbone
    backbone:
      # [from, number, module, args]
      [[-1, 1, Conv, [32, 3, 1]],  # 0
      
       [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2      
       [-1, 1, Conv, [64, 3, 1]],
       
       [-1, 1, Conv, [128, 3, 2]],  # 3-P2/4  
       [-1, 1, Conv, [64, 1, 1]],
       [-2, 1, Conv, [64, 1, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [[-1, -3, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [256, 1, 1]],  # 11
             
       [-1, 1, MP, []],
       [-1, 1, Conv, [128, 1, 1]],
       [-3, 1, Conv, [128, 1, 1]],
       [-1, 1, Conv, [128, 3, 2]],
       [[-1, -3], 1, Concat, [1]],  # 16-P3/8  
       [-1, 1, Conv, [128, 1, 1]],
       [-2, 1, Conv, [128, 1, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [[-1, -3, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [512, 1, 1]],  # 24
             
       [-1, 1, MP, []],
       [-1, 1, Conv, [256, 1, 1]],
       [-3, 1, Conv, [256, 1, 1]],
       [-1, 1, Conv, [256, 3, 2]],
       [[-1, -3], 1, Concat, [1]],  # 29-P4/16  
       [-1, 1, Conv, [256, 1, 1]],
       [-2, 1, Conv, [256, 1, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [[-1, -3, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [1024, 1, 1]],  # 37
             
       [-1, 1, MP, []],
       [-1, 1, Conv, [512, 1, 1]],
       [-3, 1, Conv, [512, 1, 1]],
       [-1, 1, Conv, [512, 3, 2]],
       [[-1, -3], 1, Concat, [1]],  # 42-P5/32  
       [-1, 1, Conv, [256, 1, 1]],
       [-2, 1, Conv, [256, 1, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [[-1, -3, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [1024, 1, 1]],  # 50
      ]
    
    # yolov7 head
    head:
      [[-1, 1, SPPCSPC, [512]], # 51
      
       [-1, 1, Conv, [256, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [37, 1, Conv, [256, 1, 1]], # route backbone P4
       [[-1, -2], 1, Concat, [1]],
       
       [-1, 1, Conv, [256, 1, 1]],
       [-2, 1, Conv, [256, 1, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [256, 1, 1]], # 63
       
       [-1, 1, Conv, [128, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [24, 1, Conv, [128, 1, 1]], # route backbone P3
       [[-1, -2], 1, Concat, [1]],
       
       [-1, 1, Conv, [128, 1, 1]],
       [-2, 1, Conv, [128, 1, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [-1, 1, Conv, [64, 3, 1]],
       [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [128, 1, 1]], # 75
          
       [-1, 1, MP, []],
       [-1, 1, Conv, [128, 1, 1]],
       [-3, 1, Conv, [128, 1, 1]],
       [-1, 1, Conv, [128, 3, 2]],
       [[-1, -3, 63], 1, Concat, [1]],
       
       [-1, 1, Conv, [256, 1, 1]],
       [-2, 1, Conv, [256, 1, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [-1, 1, Conv, [128, 3, 1]],
       [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [256, 1, 1]], # 88
          
       [-1, 1, MP, []],
       [-1, 1, Conv, [256, 1, 1]],
       [-3, 1, Conv, [256, 1, 1]],
       [-1, 1, Conv, [256, 3, 2]],
       [[-1, -3, 51], 1, Concat, [1]],
       
       [-1, 1, Conv, [512, 1, 1]],
       [-2, 1, Conv, [512, 1, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [-1, 1, Conv, [256, 3, 1]],
       [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],
       [-1, 1, Conv, [512, 1, 1]], # 101
       
       [75, 1, RepConv, [256, 3, 1]],
       [88, 1, RepConv, [512, 3, 1]],
       [101, 1, RepConv, [1024, 3, 1]],
    
       [[102,103,104], 1, IDetect, [nc, anchors]],   # Detect(P3, P4, P5)
      ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140

    创建自己数据集的yaml文件

    新建mydata.yaml文件

    在这里插入图片描述

    mydata.yaml文件内容
    # train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
    train: ./VOCdevkit  
    val: ./VOCdevkit  
    
    # number of classes
    nc: 2
    
    # class names
    names: ["with_mask","without_mask"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    进行训练

    python train.py --workers 8 --batch-size 4 --data data/mydata.yaml --img 640 640 --cfg cfg/training/myyolov7.yaml --weights 'yolov7.pt' --name myyolov7-train --hyp data/hyp.scratch.p5.yaml
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    训练完成,生成init.pt、best.pt和last.pt权重。
    在这里插入图片描述
    在这里插入图片描述

    进行测试

    python test.py --data data/mydata.yaml --img 640 --batch 32 --conf 0.001 --iou 0.65 --weights runs/train/myyolov7-train12/weights/best.pt --name myyolov7-train
    
    • 1

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

    进行预测

    python detect.py --weights runs/train/myyolov7-train12/weights/best.pt --conf 0.25 --img-size 640 --source inference/images/face_mask.jpg
    
    • 1

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

    源码获取

    获取链接 提取码:kzjc

    参考文献

    [1] https://github.com/WongKinYiu/yolov7
    [2] Chien-Yao Wang, Alexey Bochkovskiy, Hong-Yuan Mark Liao. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors,2022.

    • 更多精彩内容,可点击进入我的个人主页查看
  • 相关阅读:
    wordpress获取登录权限后获取shell的方法
    54. 螺旋矩阵
    【项目经验】:elementui表格中表头的多选框换成文字
    计算机毕业设计Java远程教育系统(源码+系统+mysql数据库+Lw文档)
    ES6生成器(Generator)和迭代器(Iterator)
    立即执行函数在前端国际化方案中的应用
    电机控制算法
    如何实现双击弹出提示并刷新图片列表的功能?
    便捷高效的电能管理:利用PLC远程控制网关实时监控配电箱
    从理论走向实战!阿里高工熬夜整理出的 Spring 源码速成笔记太香了
  • 原文地址:https://blog.csdn.net/FriendshipTang/article/details/126513426