在本文中,将探讨如何进行YOLOv5模型的训练,并在Google Colab Notebook上进行验证。此外,还将学习如何将模型转换为TensorFlow Lite格式,以便在资源受限的设备上运行。
任何模型的训练都离不开数据。对于YOLOv5模型,需要将图像集分为训练集和验证集,以及相应的.txt文件。通常,训练集和验证集的比例为80%和20%。数据集的组织结构如下:
Dataset
|
| -- images
| | -- train
| | -- val
|
| -- labels
| | -- train
| | -- val
|
| -- dataset.yaml
手动将前3,829张图像放入images/train目录,剩余的955张放入images/val目录。然后,将对应的.txt文件复制到labels/train和labels/val目录中。
dataset.yaml文件告诉模型数据集的分布情况、类别数量以及类别名称。以下是文件示例:
# dataset.yaml 示例
train: ./images/train
val: ./images/val
test: ./images/val # 可选,如果需要测试集
num_classes: 2
classes: ['with_mask', 'without_mask']
每次训练YOLOv5模型时,都需要手动创建这个文件。幸运的是,这不是一个复杂的任务。
不会让本地计算机承受极限压力,因为有多种云计算选项可供选择。让使用Google Colab Notebook,这是一个非常强大且易于使用的解决方案。
在继续之前,需要提到一件重要的事情。YOLOv5模型基于PyTorch,这是一个机器学习框架,它需要大量的计算资源,无法在小型设备上运行。有一个变通方法,请耐心等待。
YOLOv5以及其他版本的YOLO都是由Ultralytics开发的,它维护了一个Git仓库,可以从中获取使用这些模型所需的所有文件。尽管这是官方仓库,但它仍然缺少一些重要的改进。一些重要的功能将在2021年初包含在内。该仓库将包含将PyTorch自定义模型转换为TensorFlow和TensorFlow Lite兼容版本所需的功能。后者在谈论CPU/内存受限设备上的机器学习时被认为是最佳解决方案。
上述改进由Ultralytics的重要贡献者开发,并可在中找到。这是将在本项目中使用的仓库。选择这条路线的原因是因为当前的PyTorch - TensorFlow Lite转换在Ultralytics的流程中没有明确定义。需要手动将.pt文件转换为.onnx,然后获取TensorFlow权重,最后将其转换为TensorFlow Lite权重。在这个过程中,很容易出错,导致最终模型不稳定。
好的,让开始吧!拿一杯咖啡,启动Google Colab Notebook()。
首先,设置GPU实例类型。在屏幕顶部的菜单中,选择Edit > Notebook settings > GPU,并确保'Hardware accelerator'设置为GPU。
接下来,选择Runtime > Change Runtime Type > Hardware accelerator > GPU。两个下拉列表必须按如下方式选择:
Notebook settings: GPU
Change Runtime Type: GPU
笔记本需要一些时间来初始化,请给它几分钟。
一旦笔记本运行起来,设置初始配置:
# 导入基本库
import torch
from IPython.display import Image
!git clone https://github.com/ultralytics/yolov5
%cd yolov5
!git checkout tf-android
上述代码将导入基本库,克隆包含模型的YOLOv5仓库,以及将PyTorch自定义模型转换为TensorFlow Lite所需的关键文件到/content目录。
下一步是安装一些必需的组件,并更新当前笔记本的TensorFlow版本:
# 安装必需的组件
!pip install -r requirements.txt
!pip install tensorflow==2.3.1
保持这个版本的TF,因为YOLOv5与它配合得很好。
# 打印PyTorch版本和GPU信息
print('All set. Using PyTorch version %s with %s' % (torch.__version__, torch.cuda.get_device_properties(0) if torch.cuda.is_available() else 'CPU'))
让将人脸口罩数据集导入笔记本。已经将其上传到GitHub,所以运行下一行:
%cd /content
!git clone https://github.com/sergiovirahonda/FaceMaskDataset
一旦所有文件都被克隆,需要将数据集的dataset.yaml文件移动到/content/yolov5/data目录。使用左侧的文件浏览器,手动将文件从/content/FaceMaskDataset拖动到/content/yolov5/data。如前所述,此文件包含YOLO训练模型所需的信息。如果想检查文件,运行以下命令:
%cd /content
!git clone https://github.com/sergiovirahonda/FaceMaskDataset
现在是时候在自定义数据上训练模型了。首先,导航到/yolov5目录,train.py文件位于该目录。在实现脚本时,需要注意以下几点:
在训练过程中,为了了解它的进展情况,要关注mAP@.5指标(平均精度)。如果它接近1,模型就取得了很好的结果!
要训练模型,请运行以下命令:
%cd /yolov5
!python train.py --img 415 --batch 16 --epochs 30 --data dataset.yaml --weights yolov5s.pt --cache
上述代码执行数据集的基本检查,缓存图像,并覆盖其他配置。它们输出模型架构摘要(检查一下以了解模型的组成),然后开始训练。
训练结束后,应该在/content/yolov5/runs/train/exp/weights目录下保存两个文件:last.pt和best.pt。将使用best.pt。
如果想探索训练过程中记录的指标,建议使用TensorBoard,这是一个非常互动的探索工具:
%load_ext tensorboard
%tensorboard --logdir runs
这将加载类似以下内容的东西:
注意mAP和精度在25个周期后达到最大值。这就是为什么训练模型超过30个周期没有意义的原因。
现在让探索一下模型有多自信。可以绘制训练期间获得的验证批次,并检查每个标签的置信度分数:
Image(filename='runs/train/exp/test_batch0_pred.jpg', width=1000)
这将绘制以下内容:
虽然0.8不是一个很好的分数,但在这类模型中仍然是好的。请记住,YOLOv5为了检测速度牺牲了准确性。
现在有了一个训练好的模型。要在新的、未见过的图像上测试它,手动创建一个新目录(例如,/content/test_images),上传一些图像,然后运行以下代码:
%load_ext tensorboard
%tensorboard --logdir runs
将实现detect.py脚本,使用best.pt权重和416x416像素的图像尺寸(这一点非常重要)。结果将保存在runs/detect/exp中。要显示结果,请运行以下代码:
#
绘制第一张图像
Image(filename='runs/detect/exp/testimage1.jpg', width=415)