Skip to main content

从数据集到 XIAO ESP32S3 的模型部署

欢迎来到这篇全面的教程,我们将在这里将你的数据集转化为一个完整的模型,并将其部署到 XIAO ESP32S3 上。在本指南中,我们将通过 Roboflow 的直观工具标注数据集,并在 Google Colab 的协作环境中进行模型训练。

接下来,我们将使用 SenseCraft Model Assistant 部署训练好的模型,这是一个连接训练与实际应用之间的桥梁。通过本教程的学习,不仅能够让你的自定义模型在 XIAO ESP32S3 上运行,你还将掌握如何解读和利用模型的预测结果。

从数据集到模型落地,我们将进行以下主要步骤:

  1. 标注数据集 —— 本章节介绍如何获取可以用于训练的标注数据集。主要有两种方式,一种是使用 Roboflow 社区提供的标注数据集,另一种是使用你自己的场景图片作为数据集,但需要你手动进行标注。

  2. 训练数据集导出模型 —— 本章节将介绍如何使用 Google Colab 平台进行训练,生成一个可以部署到 XIAO ESP32S3 的模型。

  3. 通过 SenseCraft Model Assistant 上传模型 —— 本部分介绍如何使用导出的模型文件,借助 SenseCraft Model Assistant 上传模型到 XIAO ESP32S3。

  4. 模型的常见协议与应用 —— 最后,我们将介绍 SenseCraft AI 的统一数据通信格式,帮助你最大限度地利用设备与模型的潜力,开发符合自己场景的应用。

让我们一起深入,开始将你的数据转化为现实的激动人心的过程吧。

所需材料

在开始之前,你需要准备以下设备:

Seeed Studio XIAO ESP32S3Seeed Studio XIAO ESP32S3 Sense

无论是 XIAO ESP32S3 版本还是 Sense 版本都可以作为本教程的内容使用,但由于标准版产品无法使用摄像头扩展板,因此我们建议使用 Sense 版本。

标注数据集

在本部分内容中,我们允许用户自由选择他们已有的数据集。这包括社区的或者是自己拍摄的场景图片。本教程将介绍两种主流的场景。第一种是使用 Roboflow 社区 提供的现成标注数据集,第二种是使用你自己拍摄的高清图像并标注数据集。请根据你的需求,阅读下面不同的教程。

第1步:创建一个免费的 Roboflow 账户

Roboflow 提供了标注、训练和部署计算机视觉解决方案所需的一切。要开始,请创建一个 免费的 Roboflow 账户

在审核并接受服务条款后,你将被要求在公共计划和入门计划之间选择其一。

接下来,你将被要求邀请合作者加入你的工作区。这些合作者可以帮助你标注图像或管理工作区中的视觉项目。邀请完合作者后(如果你希望这样做),你就可以创建项目了。

选择如何获取数据集

选择一个适合的 Roboflow 数据集来直接使用,涉及确定最符合你项目要求的数据集,考虑数据集的大小、质量、相关性和许可等方面。

第2步:浏览 Roboflow Universe

Roboflow Universe 是一个你可以找到各种数据集的平台。访问 Roboflow Universe 网站,探索可用的数据集。

Roboflow 提供了筛选器和搜索功能,帮助你找到符合条件的数据集。你可以按领域、类别数、注释类型等进行筛选,使用这些筛选器来缩小符合标准的数据集范围。

第3步:评估单个数据集

一旦你有了候选数据集,逐一评估它们,查看:

标注质量:检查标注是否准确、一致。

数据集大小:确保数据集足够大,以便模型能够有效学习,但又不至于太大,无法处理。

类别平衡:数据集中的各类别应尽量平衡。

许可证:审查数据集的许可证,确保你能按预期使用它。

文档:审查任何与数据集一起提供的文档或元数据,以更好地理解其内容和已应用的任何预处理步骤。

tip

你可以通过 Roboflow 健康检查 查看模型的状态。

第4步:下载样本

如果你找到了合适的数据集,你可以选择下载并使用它。Roboflow 通常允许你下载数据集的样本。测试样本,查看它是否与你的工作流程兼容,是否适合你的模型。

继续后续步骤时,我们建议将数据集导出为如下所示的格式。

你将获得该模型的 原始 URL,请将其保管好,我们稍后将在模型训练步骤中使用该链接。

caution

如果您第一次使用 Roboflow,并且对数据集的选择没有任何判断,使用一个数据集训练模型并进行初步测试以查看其性能可能是必要的。通过这个步骤,您可以评估该数据集是否符合您的要求。

如果数据集符合您的要求,并且在初步测试中表现良好,那么它很可能适合您的项目。否则,您可能需要继续寻找,或者考虑通过添加更多的图像来扩展数据集。

训练数据集导出模型

步骤 1. 访问 Colab Notebook

您可以在 SenseCraft 模型助手的 Wiki 中找到不同类型的 Google Colab 代码文件。如果您不确定选择哪个代码文件,可以根据您的模型类别(目标检测或图像分类)选择其中的任何一个。

如果您尚未登录 Google 账户,请先登录以访问 Google Colab 的全部功能。

点击“连接”以为您的 Colab 会话分配资源。

步骤 2. 添加您的 Roboflow 数据集

在正式逐步运行代码块之前,我们需要修改代码内容,以便代码可以使用我们准备的数据集。我们需要提供一个 URL,将数据集直接下载到 Colab 文件系统中。

请在代码中找到 下载数据集 部分。您将看到如下示例程序。

%mkdir -p Gesture_Detection_Swift-YOLO_192/dataset 
!wget -c https://universe.roboflow.com/ds/xaMM3ZTeWy?key=5bznPZyI0t -O Gesture_Detection_Swift-YOLO_192/dataset.zip
!unzip -q Gesture_Detection_Swift-YOLO_192/dataset.zip -d Gesture_Detection_Swift-YOLO_192/dataset

这段代码用于创建一个目录,从 Roboflow 下载数据集,并将其解压到 Google Colab 环境中的新创建目录中。下面是每行代码的解释:

  1. %mkdir -p Gesture_Detection_Swift-YOLO_192/dataset:

    • 这一行创建一个名为 Gesture_Detection_Swift-YOLO_192 的新目录,并在其中创建一个子目录 dataset-p 参数确保如果目录已存在,不会返回错误,并会创建必要的父目录。
  2. !wget -c https://universe.roboflow.com/ds/xaMM3ZTeWy?key=5bznPZyI0t -O Gesture_Detection_Swift-YOLO_192/dataset.zip:

    • 这一行使用 wget 命令行工具从提供的 Roboflow URL 下载数据集。-c 参数允许在下载中断时恢复下载,-O 参数指定下载文件的输出位置和文件名,在这里是 Gesture_Detection_Swift-YOLO_192/dataset.zip
  3. !unzip -q Gesture_Detection_Swift-YOLO_192/dataset.zip -d Gesture_Detection_Swift-YOLO_192/dataset:

    • 这一行使用 unzip 命令将 dataset.zip 文件的内容解压到之前创建的 dataset 目录中。-q 参数让 unzip 命令在静默模式下运行,抑制大部分输出信息。

要将此代码定制为您自己的 Roboflow 模型链接:

  1. Gesture_Detection_Swift-YOLO_192 替换为您希望存储数据集的目标目录名称。

  2. 将 Roboflow 数据集的 URL (https://universe.roboflow.com/ds/xaMM3ZTeWy?key=5bznPZyI0t) 替换为您导出数据集的链接(这是我们在 标注数据集的最后一步 中获得的原始 URL)。确保如果需要访问密钥,包含该参数。

  3. 如果有必要,调整 wget 命令中的输出文件名(-O your_directory/your_filename.zip)。

  4. 确保 unzip 命令中的输出目录与您创建的目录一致,且文件名与您在 wget 命令中设置的文件名相匹配。

caution

如果您更改了文件夹目录名 Gesture_Detection_Swift-YOLO_192,请注意,您还需要修改代码中其他使用该目录名的部分,否则可能会出现错误!

步骤 3. 调整模型参数

接下来需要调整模型的输入参数。请跳转到 使用 SSCMA 训练模型 部分,您将看到以下代码片段。

!sscma.train configs/swift_yolo/swift_yolo_tiny_1xb16_300e_coco.py \
--cfg-options \
work_dir=Gesture_Detection_Swift-YOLO_192 \
num_classes=3 \
epochs=10 \
height=192 \
width=192 \
data_root=Gesture_Detection_Swift-YOLO_192/dataset/ \
load_from=Gesture_Detection_Swift-YOLO_192/pretrain.pth

此命令用于启动机器学习模型(特别是 YOLO(You Only Look Once)模型)的训练过程,使用的是 SSCMA(Seeed Studio SenseCraft Model Assistant)框架。该命令包含多个选项来配置训练过程。下面是每部分的解释:

  • !sscma.train 是启动 SSCMA 框架中的训练命令。

  • configs/swift_yolo/swift_yolo_tiny_1xb16_300e_coco.py 指定了训练的配置文件,其中包括模型架构、训练计划、数据增强策略等设置。

  • --cfg-options 允许您通过命令行覆盖 .py 文件中指定的默认配置。

  • work_dir=Gesture_Detection_Swift-YOLO_192 设置了训练输出(如日志和保存的模型检查点)将存储的目录。

  • num_classes=3 指定模型应训练识别的类别数。它取决于您拥有的标签数量,例如石头、剪刀、布应该是三个标签。

  • epochs=10 设置训练的周期数(epochs)。推荐值通常在 50 到 100 之间。

  • height=192width=192 设置模型期望的输入图像的高度和宽度。

caution

我们不建议您更改 Colab 代码中的图像大小,因为这个值是我们验证过的一个合适数据集大小,经过验证能在大小、准确性和推理速度之间取得平衡。如果您使用的不是这种尺寸的图像,且想确保准确性,可以考虑更改图像大小,但请不要超过 240x240。

  • data_root=Gesture_Detection_Swift-YOLO_192/dataset/ 定义了训练数据所在目录的路径。

  • load_from=Gesture_Detection_Swift-YOLO_192/pretrain.pth 提供了一个预训练模型检查点文件的路径,模型将从该文件恢复训练,或者作为迁移学习的起点。

要根据您的训练自定义此命令,您需要:

  1. 如果有自定义的配置文件,将 configs/swift_yolo/swift_yolo_tiny_1xb16_300e_coco.py 替换为您的配置文件路径。

  2. work_dir 更改为您希望保存训练输出的目录。

  3. 更新 num_classes 为您数据集中类别的数量。它取决于您拥有的标签数量,例如石头、剪刀、布应该是三个标签。

  4. 调整 epochs 为您模型所需的训练周期数。推荐值通常在 50 到 100 之间。

  5. 设置 heightwidth 为与您的模型输入图像尺寸匹配的值。

  6. data_root 更改为指向您的数据集根目录的路径。

  7. 如果您有不同的预训练模型文件,请相应地更新 load_from 路径。

步骤 4. 运行 Google Colab 代码

运行代码块的方法是点击代码块左上角的播放按钮。

点击按钮后,代码块将会执行,如果一切顺利,您将看到代码块执行完成的标志——一个勾号符号会出现在代码块左侧。如图所示,这是执行第一个代码块完成后的效果。

如果您遇到与我上图相同的错误信息,请检查您是否正在使用 T4 GPU,请 不要使用 CPU 进行此项目。

然后,重新执行代码块。对于第一个代码块,如果一切顺利,您将看到如下结果。

接下来,执行从 下载预训练模型权重文件导出模型 的所有代码块。并请确保每个代码块都没有错误。

note

代码中出现的警告可以忽略。

步骤 5. 评估模型

当您到达 评估模型 部分时,您可以选择执行 评估 TFLite INT8 模型 代码块。

tip

评估 TFLite INT8 模型涉及将量化模型的预测与单独的测试数据集进行对比,以衡量其准确性和性能指标,评估量化对模型精度的影响,并分析其推理速度和资源使用情况,以确保它满足边缘设备的部署约束。

以下是我执行此代码块后有效的部分结果。

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.450
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.929
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.361
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.474
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.456
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.515
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.529
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.529
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.536
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.537
03/19 01:38:43 - mmengine - INFO - bbox_mAP_copypaste: 0.450 0.929 0.361 -1.000 0.474 0.456
{'coco/bbox_mAP': 0.45, 'coco/bbox_mAP_50': 0.929, 'coco/bbox_mAP_75': 0.361, 'coco/bbox_mAP_s': -1.0, 'coco/bbox_mAP_m': 0.474, 'coco/bbox_mAP_l': 0.456}
FPS: 128.350449 fram/s

评估结果包括一系列平均精度(AP)和平均召回率(AR)指标,计算时考虑了不同的交并比(IoU)阈值和物体大小,这些是评估目标检测模型性能时常用的指标。

  1. AP@[IoU=0.50:0.95 | area=all | maxDets=100] = 0.450

    • 这个得分是模型在 IoU 阈值从 0.50 到 0.95 范围内的平均精度,增量为 0.05。0.450 的 AP 表示模型在这个范围内有中等的准确度。这是 COCO 数据集中常用的关键指标。
  2. AP@[IoU=0.50 | area=all | maxDets=100] = 0.929

    • 在 IoU 阈值为 0.50 时,模型的平均精度为 0.929,说明模型在较宽松的匹配标准下检测物体非常准确。
  3. AP@[IoU=0.75 | area=all | maxDets=100] = 0.361

    • 在更严格的 IoU 阈值 0.75 下,模型的平均精度下降到 0.361,表明在严格匹配标准下性能有所下降。
  4. AP@[IoU=0.50:0.95 | area=small/medium/large | maxDets=100]

    • 对于不同大小的物体,AP 分数有所不同。然而,小物体的 AP 为 -1.000,这可能表示没有足够的小物体评估数据,或者模型在小物体检测方面的表现较差。中等和大型物体的 AP 分别为 0.474 和 0.456,表明模型在中大型物体检测方面表现较好。
  5. AR@[IoU=0.50:0.95 | area=all | maxDets=1/10/100]

    • 不同 maxDets 值下的平均召回率相对一致,范围为 0.515 到 0.529,表明模型能够可靠地检索大部分真正的正例。
  6. FPS: 128.350449 fram/s

    • 模型在推理过程中以大约 128.35 帧每秒的速度处理图像,表明其具有实时或接近实时的处理能力。

总体而言,模型在 IoU 为 0.50 时表现非常优秀,在 IoU 为 0.75 时表现中等。它在中大型物体检测上表现更好,但可能在小物体检测上存在问题。此外,模型推理速度非常快,适用于需要快速处理的场景。如果在应用中小物体的检测至关重要,可能需要进一步优化模型或收集更多小物体数据以提高性能。

步骤 6. 下载导出的模型文件

导出模型 部分之后,您将获得不同格式的模型文件,这些文件默认存储在 ModelAssistant 文件夹中。在本教程中,存储目录是 Gesture_Detection_Swift_YOLO_192

tip

有时 Google Colab 不会自动刷新文件夹的内容。在这种情况下,您可能需要通过点击左上角的刷新图标来刷新文件目录。

在上述目录中,.tflite 格式的模型文件可用于 XIAO ESP32S3 和 Grove Vision AI V2。对于 XIAO ESP32S3 Sense,请确保选择使用 **xxx

_int8.tflite** 格式的模型文件。其他格式的文件无法被 XIAO ESP32S3 Sense 使用。

一旦找到模型文件,请尽快将它们下载到您的电脑上,因为如果您长时间闲置,Google Colab 可能会清空您的存储目录!

通过这里进行的步骤,我们已经成功导出了可以支持 XIAO ESP32S3 的模型文件,接下来让我们将模型部署到设备上。

通过 SenseCraft Model Assistant 上传模型

步骤 7. 上传自定义模型到 XIAO ESP32S3

接下来,我们来到了 Model Assistant 页面。


请在选择 XIAO ESP32S3 后连接设备,然后选择页面底部的 上传自定义 AI 模型

然后,您需要准备模型名称、模型文件和标签。我想在这里特别说明如何确定标签 ID 这一元素。

如果您是直接下载 Roboflow 的数据集

如果您直接下载了 Roboflow 的数据集,那么您可以在健康检查页面查看不同的类别及其顺序。只需安装此处输入的顺序即可。

tip

您不需要在 ID:Object 中填写数字,只需直接填写类别名称,图像中类别前面的数字和冒号会自动添加。

如果您使用的是自定义数据集

如果您使用的是自定义数据集,您可以在健康检查页面查看不同的类别及其顺序。只需安装此处输入的顺序即可。

tip

您不需要在 ID:Object 中填写数字,只需直接填写类别名称,图像中类别前面的数字和冒号会自动添加。

然后点击右下角的发送模型按钮。这个过程可能需要约 3 到 5 分钟左右。如果一切顺利,您将能够在上方的模型名称和预览窗口中看到您的模型结果。

至此,恭喜您,您已经成功地训练并部署了自己的模型。

模型的常见协议和应用

在上传自定义模型的过程中,除了我们可以可视化上传的模型文件外,还有设备的固件需要传输到设备中。在设备的固件中,包含了一套已建立的通信协议,规定了模型结果输出的格式,以及用户可以对模型执行的操作。

由于篇幅问题,我们在此 Wiki 中不会展开这些协议的具体细节,我们将在 Github 上通过文档详细说明这一部分。如果您对更深入的开发感兴趣,请点击以下链接。


故障排除

1. 如果我按照步骤操作,最终模型结果不尽如人意,该怎么办?

如果您的模型识别精度不理想,您可以通过以下几个方面进行诊断和改进:

  1. 数据质量和数量

    • 问题:数据集可能太小或缺乏多样性,或者标注存在不准确的情况。
    • 解决方案:增加训练数据的规模和多样性,进行数据清洗,修正标注错误。
  2. 训练过程

    • 问题:训练时间可能不够,或者学习率设置不当,导致模型无法有效学习。
    • 解决方案:增加训练周期,调整学习率和其他超参数,并实现早期停止以避免过拟合。
  3. 类别不平衡

    • 问题:某些类别的样本远多于其他类别,导致模型偏向于多数类。
    • 解决方案:使用类别权重、过采样少数类或欠采样多数类来平衡数据。

通过全面分析并实施有针对性的改进,您可以逐步提高模型的准确性。记得在每次修改后使用验证集测试模型的性能,以确保改进有效。

2. 为什么我按照 Wiki 中的步骤操作后,在 SenseCraft 部署中看到 Invoke failed 消息?

如果遇到 Invoke failed,说明您训练的模型不符合设备使用的要求。请关注以下几个方面:

  1. 请检查是否修改了 Colab 中的图像大小。默认的压缩大小为 192x192,而 Grove Vision AI V2 要求图像大小为正方形,请不要使用非正方形尺寸进行压缩。并且不要使用过大的尺寸(推荐不要超过 240x240)。

技术支持与产品讨论

感谢您选择我们的产品!我们致力于为您提供多种支持,确保您的产品使用体验尽可能顺利。我们提供了多种沟通渠道,以满足不同的需求和偏好。

Loading Comments...