前言
之前讲了如何安装配置 YOLOv5 ,并使用默认的模型进行检测1,这里开始尝试标注数据集,并使用数据集在 YOLOv5s 模型上进行训练和检测。
我的配置: Ubuntu 20.04 + Python 3.8
2022.1.8 找到了官方的教程: Train Custom Data
labelImg
标注软件推荐使用 labelImg 。
Github: https://github.com/tzutalin/labelImg
作者没有提供 ubuntu 下的可执行文件,所以需要直接下源码运行。
执行如下指令,修改默认分类:
vim data/predefined_classes.txt
如果没有特殊需要,建议清空,否则标注时会默认增加这些分类,如果不注意会导致训练错误。
执行如下指令,配置运行环境:
sudo apt-get install pyqt5-dev-toolssudo pip3 install -r requirements/requirements-linux-python3.txtmake qt5py3
执行如下指令,运行软件:
python3 labelImg.pypython3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
下面是 labelImg 的界面,把红框里的数据格式改成 yolo,然后就能标注数据集了。
标注
这里感谢 Vanessa Ni 的教程2,并提供了我的第一个数据集来源。
选择了一个鱼类相关的数据集: Labeled Fishes in the Wild
选择60张图片,将图片从0开始编号:
新建训练数据文件夹 images/ 和 labels/,将图片放到 images 里,然后使用 labelImg 标注,把标注结果保存到 labels 里:
完成数据集的标注后,创建数据集的配置文件。
将 images 和 labels 都放在 YOLO/traindata/ 文件夹下,在该路径下创建 traindata.yaml 文件,用于配置数据集信息:
# train and val datatrain: /home/nono/YOLO/traindata/val: /home/nono/YOLO/traindata/
# number of classnv: 1
# class namesnames: ['fish']
- train : 训练数据集的路径
- val : 测试数据集的路径
- nv : 分类数量
- name : 分类名词
训练
进入 YOLO 项目的根目录。
输入如下指令,使用 YOLOv5s 对数据集进行训练:
python train.py --weights yolov5s.pt --data traindata/traindata.yaml --img 320 --nosave --device cpu
- weights : initial weights path,初始权重文件
- data : hyperparameters path,训练数据文件
- img : train, val image size (pixels),训练输入图像的大小
- nosave : only save final checkpoint,只保存最后和最好的权重文件
- device : cuda device, i.e. 0 or 0,1,2,3 or cpu,选择计算单元
详细的可通过 python train.py -h 查看帮助
最后的训练结果如下图:
用了59张图片,共计130个标签,最后 mAP 达到了 0.992。
最终的训练结果能在 runs/train/ 找到。
下图是 YOLO 给的关于模型性能的分析图表:
下图是模型在训练集上的检测结果:
检测
进入 YOLO 项目的根目录。
输入如下指令,用新训练的模型进行检测:
python detect.py --weights runs/train/exp10/weights/best.pt --source traindata/test.mp4 --device cpu
- weights : model path(s)
- source : file/dir/URL/glob, 0 for webcam
- device : cuda device, i.e. 0 or 0,1,2,3 or cpu
详细的可以通过 python detect.py -h 查看帮助
检测结果如下图:
最终的检测结果和视频在 runs/detect/ 中。
报错
AssertionError: Label class 15 exceeds nc=1 …
AssertionError: Label class 15 exceeds nc=1 in /home/nono/YOLO/traindata/traindata.yaml. Possible class labels are 0-0
这个报错出现的原因是,在使用 labelImg 进行标注的前,没有删除默认分类。
打开标注后生成的标签文件:15 0.719727 0.731120 0.396484 0.233073
数据集里有15个分类,但实际分类只有1个,解决方法在上面安装时有提到,删除默认分类后重新标注一遍数据集即可。
AssertionError: Label class 1 exceeds nc=1 …
AssertionError: Label class 1 exceeds nc=1 in /home/nono/YOLO/traindata/traindata.yaml. Possible class labels are 0-0
这个报错是上一个报错的后续,在尝试训练后出现了上一个问题,虽然没有成功训练,但是 yolo 会生成 .cache 文件,把数据集文件夹下的 .cache 文件删掉就行,应该和 .yaml 文件在同一目录下3。