SuperAPI AI 工具集

xiao-edgeimpulse-train

智能体与模型

查看项目

更新于 10-16 02:12

技能介绍

用途 该技能面向 XIAO ESP32S3(Sense)开发板,使用 Edge Impulse REST API 完成 TinyML 模型的训练与部署,全程不需要 edge-impulse-cli(资料说明其 serialport@8 依赖在 Node 22+ 上需要 VS C++ 构建工具,因此不要尝试安装)。资料称以下步骤已于 2026-07 端到端执行并验证。

主要能力

  • 通过 REST API 上传数据集、创建 impulse、生成特征、训练模型、构建并下载 Arduino 推理库。
  • 支持音频(关键词识别)与视觉(图像分类,MobileNet 迁移学习)两类任务。
  • 包含 ESP32-S3 端侧部署所需的修复:张量内存溢出、PSRAM 分配、摄像头旋转、音频电平差异、摄像头自动白平衡预热。

使用方式 Step 0:向用户索取 Edge Impulse 管理员 API key(ei_...),或从项目 .env 读取 EI_API_KEY。自动创建的项目 key 角色为“Ingestion & deployment”,无法创建 impulse 或启动训练,会报 insufficient permissions(valid roles: [admin])。需要时提示用户:Studio → Dashboard → Keys → Add new API key → Role Admin(full access)→ 立即复制完整 key。用 GET https://studio.edgeimpulse.com/v1/api/projects(header x-api-key)获取 projects[0].id。PowerShell 中 $pid 是只读保留变量,应使用 $proj。

Step 1:上传数据集(ingestion API)。每个文件一次 POST,标签来自 x-label 头:curl.exe -s -X POST -H "x-api-key: $key" -H "x-label: $cls" -F "data=@$($f.FullName)" https://ingestion.edgeimpulse.com/api/training/files。WAV 需 16 kHz 16-bit 单声道;图像 jpg/png 原样上传。全部上传后自动划分训练/测试:POST /v1/api/$proj/rebalance。一个项目对应一个模型;若要为不同任务重新训练,先 POST /v1/api/$proj/raw-data/delete-all(先归档已部署的库 zip)。

Step 2:创建 impulse,使用 POST https://studio.edgeimpulse.com/v1/api/$proj/impulse(是 POST 不是 PUT)。音频(关键词识别)的 MFCC 块必须设置 implementationVersion: 4,否则会得到 v1 并在特征生成时报 “mel filterbank contains all zeros”。视觉(图像分类,MobileNet 迁移学习)使用 image 输入块与 keras-transfer-image 学习块。

Step 3:生成特征后训练。POST /v1/api/$proj/jobs/generate-features,body 为 {"dspId":2,"calculateFeatureImportance":false};以 10-15 秒间隔轮询 GET /v1/api/$proj/jobs/$jobId/status,检查 job.finished / job.finishedSuccessful;失败时用 GET /v1/api/$proj/jobs/$jobId/stdout 读取最新日志。特征成功后训练:POST /v1/api/$proj/jobs/train/keras/3,音频 body 为 {"trainingCycles":100,"learningRate":0.005},视觉 body 为 {"trainingCycles":20,"learningRate":0.0005}。准确率在训练任务 stdout 的 val_accuracy 行中。每次轮询总等待时间应低于工具超时,必要时在新调用中继续轮询。

Step 4:构建并下载 Arduino 库。POST /v1/api/$proj/jobs/build-ondevice-model?type=arduino,body 为 {"engine":"tflite-eon"};轮询任务后 GET /v1/api/$proj/deployment/download?type=arduino,保存为 <name>.zip。安装:用 arduino-cli config get directories.user 找到 sketchbook,解压到 <sketchbook>\libraries<project>_inferencing;zip 通常多嵌套一层文件夹,需展平使 src<project>_inferencing.h 存在。按任务(音频/视觉)归档 zip,因为切换任务会覆盖库。

Step 5:端侧修复(ESP32-S3,视觉任务必需)。切换库后首次编译使用 --clean,因为 arduino-cli 缓存会保留同名同版本库的旧对象,症状为 objs.a ... is not an object link 错误或修改后字节大小不变。张量内存溢出崩溃(Failed to allocate persistent buffer ... EI_MAX_OVERFLOW_BUFFER_COUNT + 启动时 Guru Meditation):编辑 src\edge-impulse-sdk\porting\ei_classifier_porting.h,在末尾附近 #if defined(CONFIG_IDF_TARGET_ESP32S3) 处硬定义 EI_MAX_OVERFLOW_BUFFER_COUNT 30 且无 #ifndef 保护,导致 -D 标志和模型文件默认值全部被忽略;将 30 改为 2048,然后 --clean。将内存池放入 PSRAM:在 sketch 中添加 ei_malloc/ei_calloc/ei_free 实现(SDK 的分配器是弱符号),并用 --board-options PSRAM=opi 构建。

Step 6:推理 sketch 集成。通过静态缓冲模式(signal.get_data)喂数据,不要用 EI 示例的 <I2S.h> 代码(在 esp32 core 3.x 上会出错,应使用 ESP_I2S.h)。视觉特征打包:每像素一个 float = (r<<16)|(g<<8)|b。XIAO Sense 摄像头渲染旋转 90°:降采样时顺时针旋转(sx = yW/H; sy = H-1-(xH/W)),否则准确率会崩溃;可通过将一帧按 none/cw/ccw 三种方式分类并比较来经验性验证方向。音频电平差距:麦克风音频比满量程训练 WAV 安静得多,最佳修复是通过设备麦克风本身采集训练数据。摄像头自动白平衡需要预热:正式采集前先抓取并丢弃约 8 帧。

适用场景 适用于在 XIAO ESP32S3(Sense)上做 TinyML 音频关键词识别或图像分类,并希望仅用 REST API 完成 Edge Impulse 训练与 Arduino 库部署的开发者。

限制 资料未提供收费、价格、平台支持范围、模型精度保证或除上述步骤外的其他功能说明;edge-impulse-cli 明确不适用。