智能花园 · 2026/5/24

GardenHome 薄荷/月季小模型训练与部署技术记录

记录 GardenHome 薄荷/月季边缘识别小模型从数据清洗、类别平衡、绿色裁剪、ONNX 导出到树莓派部署和历史照片重识别的完整优化过程。

tips-onlyGardenHome植物识别边缘 AIONNX树莓派

这是一份关于 GardenHome 植物识别小模型的训练复盘。目标很明确:解决一张明显是薄荷的照片被识别为月季的问题,并把这次修正沉淀成后续可重复使用的训练、导出、部署和验证流程。

这次优化不是单纯“多训一次模型”,而是把数据来源、标签可信度、类别平衡、图像预处理、ONNX 导出、树莓派端部署、历史照片重识别等环节一起梳理了一遍。最终新版模型已经部署到设备端,并修正了原来的薄荷误判案例。

背景问题

设备页面中有一张用户确认是薄荷的照片,却被模型识别成了月季。这个错误说明模型在真实环境下对薄荷和月季叶片的边界还不稳,尤其是在下面这些条件下容易偏向月季:

所以,这次处理重点不是换一个更大的模型,而是先把小模型训练链路做扎实。

数据来源

这次综合使用了两类照片:

树莓派现场照片很重要。干净的本地照片可以帮助模型学习基础特征,但真实部署效果往往取决于现场照片,因为设备看到的不是实验室环境,而是花盆、墙面、自然光、摄像头视角和偶发模糊一起构成的复杂场景。

最终用于本轮训练的数据被整理成平衡后的裁剪数据集:

总数: 642 张
薄荷: 321 张
月季: 321 张
训练集: 450 张
验证集: 128 张
测试集: 64 张
测试集类别分布: 薄荷 32 张,月季 32 张

标签处理原则

这次最重要的原则是:只把人工复核后的植物标签当作训练真值。

在 GardenHome 样本里,不能简单把通用 label 字段当成植物类别。它可能表示图片质量或状态,比如 normalbad_image。用于植物种类训练的字段应该是人工确认后的 plant_label

另外,旧模型预测和 teacher 初标都不能直接当作最终标签。它们可以用来提高标注效率,也可以帮助发现 hard case,但不能未经复核就进入最终训练集。否则模型会把自己的旧错误重新学进去,形成“错误自举”。

本轮训练采用的原则是:

类别平衡

旧模型偏向月季,一个直接原因是训练数据里月季样本更多。模型在不确定时更容易预测成训练集中更常见的类别。

本轮训练把薄荷和月季平衡到各 321 张。这个处理比盲目增加照片数量更重要。更多照片不一定带来更高准确率,如果新增照片继续偏向月季,模型可能会更加偏向月季。

对这种二分类小模型来说,数据质量和类别平衡通常比模型大小更关键。

绿色植物区域裁剪

原图里有很多与植物种类无关的内容,比如花盆、桌面、墙面、支架、边框和光照阴影。直接把整张图缩放到模型输入尺寸,会让这些背景信息混进模型判断。

本轮训练加入了绿色植物区域裁剪:先尽量定位图中的绿色植物主体,再把主体区域送入模型。这样模型更多关注叶片纹理、形态、颜色和边缘,而不是背景。

关键点是:训练端和推理端必须使用一致的预处理。

树莓派端运行时也同步加入了绿色裁剪逻辑,当前预处理可以概括为:

image_128_green_crop_imagenet_normalized

如果训练时使用裁剪图,而线上推理仍然使用完整原图,模型在验证集上可能表现很好,但部署后仍然容易出错。这类“训练和推理输入不一致”是边缘 AI 小模型很常见的坑。

模型训练与导出

本轮模型版本为:

mint_rose_v7_cropped_hardcase_128

模型使用 128 尺寸输入,并导出为 ONNX,便于树莓派端通过轻量运行时加载。

导出的主要文件包括:

plant_multitask.onnx
plant_multitask.onnx.data
labels.yaml

labels.yaml 用于保持类别顺序和模型输出一致。对于分类模型来说,类别顺序非常关键。如果训练端和推理端的类别索引不一致,即使模型本身正确,显示结果也会错。

验证结果

在本地测试集上,植物种类分类结果为:

薄荷: 32/32
月季: 32/32
species accuracy: 100%

这个结果说明当前测试集上的薄荷/月季分类已经明显改善。但它不代表真实世界里永远不会错。真实场景会继续出现新的光照、角度、遮挡、叶片状态和背景组合,所以后续仍然需要 hard case 回流。

原来的关键误判样本已经被修正:

样本: 20260523-232554-wide_1-wide_1
人工判断: 薄荷
旧问题: 被识别为月季
新版结果: 薄荷
置信度: 约 0.68

这里的置信度只有中等水平,说明模型已经纠正方向,但边界还可以继续变厚。这样的样本应该保留为下一轮 hard-case 训练材料。

部署方式

这次没有简单把 ONNX 文件手工复制到树莓派后就结束,而是通过 GardenHome 的模型导入和部署流程完成。

这样做的原因是:

最终激活的模型为:

模型 ID: 6
模型名称: mint_rose_v7_cropped_hardcase_128
状态: active

旧模型被标记为 superseded,以减少 UI 上的状态混乱。

部署后必须重跑历史照片

模型部署成功,并不代表页面上已有照片会自动变成新结果。如果页面仍然显示旧识别结果,用户会误以为新模型没有生效。

所以部署后需要触发历史照片重新识别。重新处理后,页面上的旧照片才会用当前 active 模型重新计算结果。

这个步骤对产品体验很重要:模型文件更新、设备加载成功、页面结果更新,是三个不同层面的事情,需要都完成才算闭环。

本轮关键改进总结

这次提升准确度主要来自下面几个改动:

注意事项

后续继续训练时,建议遵守这些规则:

下一轮优化方向

下一轮可以重点补充这些照片:

更进一步,可以把网页里的人工复核变成主动学习入口:低置信度照片自动进入复核队列,人工修正后进入下一轮训练集。这样 GardenHome 的植物识别能力就不是一次性模型,而是一个可以持续自我改进的闭环系统。