990 字
5 分钟
YOLO入门 2 标注数据集并训练检测

前言#

之前讲了如何安装配置 YOLOv5 ,并使用默认的模型进行检测1,这里开始尝试标注数据集,并使用数据集在 YOLOv5s 模型上进行训练和检测。

我的配置: Ubuntu 20.04 + Python 3.8

2022.1.8 找到了官方的教程: Train Custom Data


labelImg#

标注软件推荐使用 labelImg 。

Github: https://github.com/tzutalin/labelImg

作者没有提供 ubuntu 下的可执行文件,所以需要直接下源码运行。

执行如下指令,修改默认分类:

Terminal window
vim data/predefined_classes.txt

如果没有特殊需要,建议清空,否则标注时会默认增加这些分类,如果不注意会导致训练错误。

执行如下指令,配置运行环境:

Terminal window
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3

执行如下指令,运行软件:

Terminal window
python3 labelImg.py
python3 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 data
train: /home/nono/YOLO/traindata/
val: /home/nono/YOLO/traindata/
# number of class
nv: 1
# class names
names: ['fish']
  • train : 训练数据集的路径
  • val : 测试数据集的路径
  • nv : 分类数量
  • name : 分类名词

训练#

进入 YOLO 项目的根目录。

输入如下指令,使用 YOLOv5s 对数据集进行训练:

Terminal window
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 项目的根目录。

输入如下指令,用新训练的模型进行检测:

Terminal window
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

Footnotes#

  1. YOLOv5入门 1 使用预训练模型进行检测

  2. YOLOv5超详细的入门级教程(训练篇)(一)——训练自制数据集(识别鱼类)

  3. stackoverflow

YOLO入门 2 标注数据集并训练检测
https://fuwari.vercel.app/posts/人工智能/计算机视觉/yolo入门-2-标注数据集并训练检测/
作者
Asuwee
发布于
2021-12-26
许可协议
CC BY-NC-SA 4.0