目录

在 Ubuntu20.04 系统上使用4张GPU卡基于容器训练模型。

准备数据

project
├── data.yaml           #数据集配置文件
├── models              #网络模型(可以使用下面的脚本自动生成)
│   ├── yolov5s.yaml    #Small
│   ├── yolov5m.yaml    #Medium
│   ├── yolov5l.yaml    #Large
│   └── yolov5x.yaml    #XLarge
├── images              #图片
│   ├── train           #训练集
│   │   ├── 000001.jpg
│   │   ├── 000002.jpg
│   │   └── 000003.jpg
│   └── val             #验证集
│       ├── 000010.jpg
│       └── 000011.jpg
├── labels              #YOLO格式的标注
│   ├── train           #训练集
│   │   ├── 000001.txt
│   │   ├── 000002.txt
│   │   └── 000003.txt
│   └── val             #验证集
│       ├── 000010.txt
│       └── 000011.txt
├── test                #测试图片
└── output              #推理后的标注图片

构建环境

  • 拉取镜像
    $ docker pull ultralytics/yolov5:latest
    
  • 运行容器
    $ docker run --ipc=host --runtime=nvidia -it --name project_name-yolov5 \
      -v project_dir:/usr/src/app/project ultralytics/yolov5:latest
    

拷贝模型网络和下载预模型

  • 拷贝
    $ mkdir project/models
    $ cp models/yolov5?.yaml project/models
    
  • 替换所有模型网络的类别
    $ sed -i 's/nc: 80/nc: 2/g' project/models/yolov5?.yaml
    
  • 验证替换结果
    $ head -n 2 project/models/yolov5?.yaml
    ==> project/models/yolov5l.yaml <==
    # parameters
    nc: 2  # number of classes
    ==> project/models/yolov5m.yaml <==
    # parameters
    nc: 2  # number of classes
    ==> project/models/yolov5s.yaml <==
    # parameters
    nc: 2  # number of classes
    ==> project/models/yolov5x.yaml <==
    # parameters
    nc: 2  # number of classes
    
  • 下载预模型
    $ bash weights/download_weights.sh
    $ cp yolov5?.pt project/models/
    

配置训练数据集信息

$ nano project/data.yaml

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: project/images/train/
val: project/images/val/

# number of classes
nc: 2

# class names
names: ['close', 'open']

训练

  • 删除之前的训练日志
    $ rm -r project/runs*
    
  • 训练指定版本
    $ python train.py --epoch 50 --batch-size 16 --data project/data.yaml \
      --cfg project/models/yolov5s.yaml --weights project/models/yolov5s.pt \
      --project project/runs/train
    
  • 批量训练多个版本
    for v in 's' 'm' 'l' 'x'
    do
    python train.py --epoch 100 --batch-size 64 --data project/data.yaml \
      --cfg project/models/yolov5$v.yaml --weights project/models/yolov5$v.pt \
      --project project/runs-$v/train
    done
    

推理

  • 指定版本
    $ python detect.py --weights project/runs/train/exp/weights/best.pt \
      --source project/test --project project/runs/detect
    
  • 批量多个版本
    for v in 's' 'm' 'l' 'x'
    do
    python detect.py --weights project/runs-$v/train/exp/weights/best.pt \
      --source project/test --project project/runs-$v/detect
    done
    

推理参数

  • 指定固定的输出目录(–exist-ok –name)
    $ python detect.py --weights project/runs/train/exp/weights/best.pt \
      --source project/test --project project/output \
      --exist-ok --name ''
    
  • 输出YOLO格式的标注数据(–save-txt)
    $ python detect.py --weights project/runs/train/exp/weights/best.pt \
      --source project/test --project project/output \
      --exist-ok --name '' --save-txt
    
  • 过滤类别(–classes)
    $ python detect.py --weights project/runs/train/exp/weights/best.pt \
      --source project/test --project project/output \
      --exist-ok --name '' --class 0 1
    

参考资料