YOLOv5模型训练与TensorFlow Lite转换指南

在本文中,将探讨如何进行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模型时,都需要手动创建这个文件。幸运的是,这不是一个复杂的任务。

在Colab Notebook上训练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文件位于该目录。在实现脚本时,需要注意以下几点:

  • 必须指定图像大小(在例子中是415像素)。模型将每个图像步幅为416像素,因为415不是预定义的最大步幅32的倍数。
  • 指定批次大小。在这种情况下,将其保持在16。
  • 必须指定训练周期的数量。训练周期的数量越多,置信度越高。在某个时刻可能会出现过拟合,如果数据集相对较小,这种情况会很快发生。目前30个周期就足够了,否则会注意到一些过拟合。
  • 通过--data参数,引用包含数据集配置的.yaml文件。
  • 需要指定训练流程中要使用的预训练模型。请记住,可用的选项有YOLOv5s (yolov5s),YOLOv5m (yolov5m),YOLOv5l (yolov5l)和YOLOv5x (yolov5x)。在例子中,第一个选项是最好的,因为需要一个非常轻量级的模型。
  • 最后,--nosave用于仅保存最终检查点,--cache使流程能够缓存图像以减少训练时间。想保留最佳指标,所以不使用--nosave。

在训练过程中,为了了解它的进展情况,要关注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个周期没有意义的原因。

在Google Colab上测试模型

现在让探索一下模型有多自信。可以绘制训练期间获得的验证批次,并检查每个标签的置信度分数:

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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485