• 手把手改进yolo训练自己的数据(坑洼路面识别)


    结果展示

    img

    在Pothole Detection数据集上对YOLOv7进行微调的步骤如下:

    0 环境配置

    if` `not` `os.path.exists(``'yolov7'``):``  ``!git clone https:``/``/``github.com``/``WongKinYiu``/``yolov7.git` `%``cd yolov7` `!pip install ``-``r requirements.txt
    
    • 1
    1. 数据集准备:

      • 收集一个专门用于pothole(坑洼)检测的数据集,包括图像和相应的注释文件。注释可以使用Pascal VOC或YOLO格式。
      • 将数据集分割为训练集和验证集。
      • 图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-
      • 数据下载链接:

    在这里插入图片描述

    
    !wget https://learnopencv.s3.us-west-2.amazonaws.com/pothole_dataset.zip
    
    • 1
    • 2
    # Extract the dataset.
    !unzip -q pothole_dataset.zip
    
    • 1
    • 2

    数据排列:

    
    pothole_dataset/
    ├── images
    │   ├── test [118 entries exceeds filelimit, not opening dir]
    │   ├── train [1265 entries exceeds filelimit, not opening dir]
    │   └── valid [
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 下载预训练权重:

      • 从官方仓库或Darknet网站等来源获取YOLOv7的预训练权重。

        
        !wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
        
        
        • 1
        • 2
        • 3
    2. 配置文件:

      • 创建或修改所需的训练配置文件。
      • 调整类别数量以匹配pothole检测数据集中的类别数。
      • 更新训练、验证和测试数据集的路径。
      • 根据需要自定义其他超参数。

      更改配置文件

      %%writefile data/pothole.yaml
      train: ../pothole_dataset/images/train
      val: ../pothole_dataset/images/valid
      test: ../pothole_dataset/images/test
       
      # Classes
      nc: 1  # number of classes
      names: ['pothole']  # class names
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    3. 训练:

      • 使用下载的预训练权重初始化YOLOv7模型

      • 加载训练数据集,并通过迁移学习等技术开始微调模型。

      • 在多个epochs上训练模型,同时监控损失和mAP(mean Average Precision)指标。

      • 使用数据增强技术(如随机裁剪、翻转、旋转等)来提高模型的泛化能力。

      • –device:GPU设备编号(ID),用于进行训练。由于只有一个GPU,所以设为0。

        –data:接受数据集的YAML文件路径。

        –img:默认情况下,图像会在输入网络之前被调整为640×640的分辨率。您可以在此处指定图像大小。

        –cfg:模型配置文件的路径,用于加载我们之前创建的模型架构。

        –weights:预训练模型的路径。

        –name:默认情况下,所有训练、验证和测试结果都会保存在runs目录的子目录中。您可以通过此参数指定这些子目录的名称。

        –hyp:YOLOv7系列中的所有模型都具有不同的参数和超参数。这些包括学习率、数据增强技术以及增强的强度等多个超参数。所有这些超参数都在yolov7/data目录中的超参数文件(YAML文件)中定义。在此参数中,您需要指定合适的YOLOv7-tiny模型超参数文件的路径

      
      !python train.py --epochs 100 --workers 4 --device 0 --batch-size 32 \
      --data data/pothole.yaml --img 640 640 --cfg cfg/training/yolov7_pothole-tiny.yaml \
      --weights 'yolov7-tiny.pt' --name yolov7_tiny_pothole_fixed_res --hyp data/hyp.scratch.tiny.yaml
      Let’s go over
      
      • 1
      • 2
      • 3
      • 4
      • 5

      r-images%5Cimage-20231012205821363.png&pos_id=img-MOmMEWe5-1697116793583)

    4. 评估:

    5. 在这里插入图片描述

      	
      python detect.py --source ../../inference_data/video.mp4 --weights runs/train/yolov7_pothole_multi_res/weights/best.pt --view-img
      
      
      • 1
      • 2
      • 3

      评估脚本:

      !python test.py --weights runs/train/yolov7_tiny_pothole_fixed_res/weights/best.pt --task test --data data/pothole.yaml
      1
      2
      Class      Images      Labels           P           R      mAP@.5  mAP@.5:.95: 100% 4/4 [00:04<00:00,  1.09s/it]
                      all         118         304        0.82       0.556        0.64       0.348
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 在验证数据集上评估训练好的模型,以评估其性能。
      • 计算精确度、召回率和F1分数等指标来衡量模型的准确性。
      • 根据评估结果调整模型或超参数。

      Results after fine tuning YOLOv7-tiny model on the pothole detection dataset

      改进:

      YOLOv7 fixed resolution fine tuning results.

    %%writefile cfg/training/yolov7_pothole.yaml
    # parameters
    nc: 1  # 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]
    
    • 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
    1. 测试:

      • 在单独的测试数据集上测试最终训练好的模型,以评估其在实际场景中的性能。

      • 分析模型的预测结果,计算指标,并根据需要进行改进。

        YOLOv7 FPS and inference time comparison between different models.

    请记住,根据数据集的规模、质量和特定要求对YOLOv7模型进行微调。此外,确保拥有足够的数据量,以避免过拟合并获得良好的泛化能力。

  • 相关阅读:
    【数据结构】哈希表
    《canvas》之第5章 文本操作
    Windows安装MySQL及Python操作MySQL数据库脚本实例详解
    大端与小端
    Solidity 小白教程:20. 发送 ETH
    PW7014替代ETA7014:高崩溃电压、低成本、强性能,市场新宠儿
    2022年最新数据库经典面试题及答案汇总(含PostgreSQL、Oracle、MySQL)
    PyQt5_pyqtgraph双均线组合工具
    复盘一个诡异的Bug
    小白学java
  • 原文地址:https://blog.csdn.net/ALiLiLiYa/article/details/133799568