在 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