多水果图像分类器训练实战:从香蕉扩展到多类别质检——IoT-For-Beginners 制造业课程作业深度指南
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇文章以 4-manufacturing/lessons/1-train-fruit-detector/assignment.md 的课后作业为核心骨架,结合同课 README.md 与后续课程源码,系统讲解如何将只识别一种水果(香蕉)熟度的图像分类器,扩展为能区分多种水果、多类别质量标签的实战模型。你将掌握多标签训练的数据准备规范、Azure Custom Vision 训练/评估全流程、跨品类预测的局限性与改进策略,并能从源码层面理解 IoT 设备调用分类器预测 API 的完整调用链。
作业背景:从单水果到多水果的分类器演进
在第 15 课《Train a fruit quality detector》中,你已经使用 Azure Custom Vision 训练了一个图像分类器,其目标仅是区分同一种水果(香蕉)的熟与未熟两个标签。而本次作业要求更进一步:
- 训练分类器识别多种水果,且允许水果处于不同成熟度;
- 训练效果会因水果类型、以及熟果与生果之间的外观差异而不同;
- 需要特别关注外观相似的水果(例如苹果与西红柿)之间的区分能力。
也就是说,模型的标签集从「{ripe banana, unripe banana}」扩展为「{ripe apple, unripe apple, ripe tomato, unripe tomato}」这类多类别集合,分类问题也从简单的二分类演化为真正的多类别(Multiclass)图像分类。
✅ 思考题:观察你身边的果蔬——无论农场、花园还是超市,它们是否成熟度完全一致?多水果训练正是模拟工厂/仓库流水线上"一篮混装、需逐级分拣"的真实场景。
为什么图像分类器不总是最佳选择
作业文档给出了一个重要提示:
对于成熟时会发生颜色变化的水果,图像分类器可能不如颜色传感器(color sensor)有效——因为许多分类器实际运行在灰度图像上,而不是全彩图像。
这背后是分类器的实际运行机制:Custom Vision 接受最大 10240x10240 的训练/预测图片,但训练与推理均将图片缩放至 227x227 分辨率(见 README.md)。在如此低的分辨率下,依赖"绿色→红色"这类强颜色信号的判断,确实可能被基于色相的光学传感器(如流水线上用杠杆把青西红柿弹入废料箱的早期光学分拣机)做得更直接。这也是为什么传统光学分拣是第一代自动化方案,而 ML 模型的价值在于识别疾病、瘀伤、腐烂等更微妙的形态差异。
前置知识回顾:图像分类与迁移学习
在动手扩展训练之前,需要明确几个核心概念(均来自 第 15 课 README):
- 传统编程:数据 + 算法 → 输出;
- 机器学习:数据 + 已知输出 → 训练出模型(model)→ 模型对新数据输出预测(prediction);
- 图像分类器(image classifier):基于带标签图片训练,对未见图片按标签进行分类的模型;
- 迁移学习(transfer learning):分类器在海量(数百万乃至数十亿)图片上预训练后,其内部已擅长识别形状、颜色与纹理,再用少量新图片微调即可适配新任务。
迁移学习正是 Custom Vision 能以「每标签最少 5 张图片」起步的原因,官方建议至少 30 张以获得更好效果。本次多水果作业正是迁移学习能力的直接检验。
实战一:训练多水果分类器的完整流程
1. 准备 Azure 资源(训练 + 预测)
使用 Azure CLI 在资源组fruit-quality-detector中创建两个认知服务资源,SKU 均为免费层F0:
# 训练资源 az cognitiveservices account create --name fruit-quality-detector-training \ --resource-group fruit-quality-detector \ --kind CustomVision.Training \ --sku F0 \ --yes \ --location <location> # 预测资源 az cognitiveservices account create --name fruit-quality-detector-prediction \ --resource-group fruit-quality-detector \ --kind CustomVision.Prediction \ --sku F0 \ --yes \ --location <location><location>替换为创建资源组时所用的区域;--yes表示同意认知服务条款;- 若免费账户已占用任一认知服务的免费层,则改用
S0SKU。
2. 创建多类别分类项目
在 CustomVision.ai):
| 设置项 | 取值 |
|---|---|
| 资源 | fruit-quality-detector-training |
| 项目类型 | Classification(分类) |
| 分类类型 | Multiclass(多类别) |
| 域 | Food(食品) |
对于本次多水果作业,Multiclass 意味着每张图片只归属一个标签(如"熟苹果"),模型输出的是各标签的概率分布,取概率最高者作为预测结果。这与每张图可含多个标签的 Multilabel 是不同的建模思路。
3. 多水果训练数据采集规范
采集数据是本次作业的核心工作量,需遵守以下规范(源于 README.md):
- 数量:每个标签至少 5 张训练图(更多更好,建议 30 张);另需若干独立测试图(用于训练后的验证,绝不与训练图重复);
- 格式:PNG 或 JPEG,单张小于 6MB;iPhone 等设备拍摄的 HEIC 需先转换并压缩;
- 构图:被分类物体应占据画面主体,因为最终会被缩放到 227x227;
- 背景控制:背景要么一致、要么多样,绝不能让背景与标签强相关。文档举例:曾有皮肤癌分类器几乎 100% 识别的是照片里的"尺子"而非痣——因为恶性样本照片都放了尺子。多水果训练中同理,不能让"苹果都放在红色桌布、西红柿都放在绿色桌布"。
以本次作业为例,可参照课程自带的香蕉示例数据集(training 目录 下含 25 张熟香蕉、29 张生香蕉,testing 目录 下各 2 张),为每种水果、每个成熟度标签准备类似的图片集合,并通过 Custom Vision 门户的"上传并标记图片"功能打上ripe/unripe标签(参考 image-upload-bananas.png)。
4. 训练、测试与重训练迭代
- 上传并标记所有标签的图片后,在门户中选择Quick Training(快速训练),训练通常耗时数分钟;
- 用预留的测试图片(而非训练图)做 Quick Test,观察各标签的概率输出——模型输出的是概率而非硬性二值答案,例如一张图可能预测
ripe 99.7%、unripe 0.3%,由代码取最高概率(参考 bananas-ripe-vs-unripe-predictions.png); - 对于预测错误的图片,通过Predictions标签页将其修正标签后并入训练集,再次训练出新迭代(iteration),反复迭代直到满意——每次 Quick Test 的图片与结果都会被服务端存储,供重训练使用。
实战二:从 IoT 设备调用多水果分类器(源码佐证)
训练完成并发布迭代(Performance 标签页 → Publish,绑定fruit-quality-detector-prediction资源,得到形如https://<location>.api.cognitive.microsoft.com/customvision/v3.0/Prediction/<id>/classify/iterations/Iteration2/image的预测 URL 与Prediction-Key)后,即可从各类 IoT 设备调用。仓库 2-check-fruit-from-device 课程提供了三套实现:
树莓派 / 虚拟设备(Python)
pi/fruit-quality-detector/app.py 展示了完整调用链:先用PiCamera以 640x480 拍摄 JPEG,再解析预测 URL 提取endpoint、project_id、iteration_name,最后用CustomVisionPredictionClient携带Prediction-Key调用classify_image并逐条打印tag_name与概率:
from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient from msrest.authentication import ApiKeyCredentials prediction_url = '<prediction_url>' prediction_key = '<prediction key>' parts = prediction_url.split('/') endpoint = 'https://' + parts[2] project_id = parts[6] iteration_name = parts[9] prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key}) predictor = CustomVisionPredictionClient(endpoint, prediction_credentials) image.seek(0) results = predictor.classify_image(project_id, iteration_name, image) for prediction in results.predictions: print(f'{prediction.tag_name}:\t{prediction.probability * 100:.2f}%')注意:iteration_name取 URL 的第 10 段(索引 9),这意味着更换模型迭代只需替换 URL——这正是多轮重训练后发布新迭代、设备端零改动切换模型的机制。虚拟设备版本(app.py)仅将摄像头替换为 CounterFit 模拟counterfit_shims_picamera,逻辑完全一致。
Wio Terminal(Arduino/C++)
main.cpp 走 REST 直调路线:按下板载 C 键后拍摄 JPEG 存入缓冲区,用HTTPClient向PREDICTION_URL发送POST(Content-Type 为application/octet-stream,头带Prediction-Key),返回 200 后解析 JSON 中的predictions数组并打印tagName与概率。其中PREDICTION_URL、PREDICTION_KEY、WiFi 凭据及 TLS 根证书(Microsoft Azure DigiCert Global Root G2)集中在 config.h,TLS 证书用于WiFiClientSecure的加密连接。
这套 REST 调用对多水果模型完全透明——标签从 2 个变为 N 个,设备端代码无需任何改动,只需在代码逻辑里针对多个标签做业务分流(例如对ripe类放行、对unripe/bruised类剔除)。
评估清单:本次作业评分标准
作业官方评分标准(Rubric)是自检多水果训练成果的直接依据:
| 标准 | 示范(Exemplary) | 合格(Adequate) | 待改进(Needs Improvement) |
|---|---|---|---|
| 为多种水果训练分类器 | 成功为多种水果训练分类器 | 仅成功为一种额外水果训练 | 无法为更多水果训练分类器 |
| 判断分类器效果 | 能正确评价分类器对不同水果的表现 | 能观察并提出改进建议 | 无法评价分类器效果 |
结合评分标准,建议提交作业时至少完成:
- 扩展标签:在香蕉之外增加至少一种水果(示范级可加入苹果 + 西红柿这类易混淆组合);
- 对照实验:分别记录「单水果」与「多水果」训练后的测试概率,尤其关注苹果/西红柿这类相似外观的混淆概率;
- 合理性分析:解释为什么某些水果对(如外观差异大的柑橘与草莓)更容易区分,而颜色变化型水果(青→红西红柿)在低分辨率灰度推理下可能不如光学传感器——这与作业开头强调的局限性呼应。
局限性与进阶方向
- 数据分布漂移:用手机拍的训练图与 IoT 摄像头实拍图在清晰度、色彩、光照上差异明显,会导致预测准确率下降。第 16 课建议直接用设备拍摄图片重训练模型(见 2-check-fruit-from-device/README.md 的 Improve the model 小节),必要时删除原训练图重新迭代;
- Edge 化部署:训练好的迭代可发布为 Azure IoT Edge 模块,将推理下沉到设备端,减少云端往返与网络依赖(见 3-run-fruit-detector-edge);
- 传感器触发:结合距离传感器在果实到达检测位时再拍照,可构建完整的自动化分拣触发链路(见 4-trigger-fruit-detector)。
延伸挑战
作业之外,README.md 的 Challenge 环节提出了值得尝试的边界测试:用草莓、充气香蕉、香蕉服人偶、甚至黄色卡通角色的图片去预测——图像分类器基于概率特征匹配,不理解"香蕉"的语义,这类"域外图片"的预测结果往往颇具启发性,也是检验模型鲁棒性的低成本手段。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考