news 2026/9/14 7:51:48

多水果图像分类器训练实战:从香蕉扩展到多类别质检——IoT-For-Beginners 制造业课程作业深度指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多水果图像分类器训练实战:从香蕉扩展到多类别质检——IoT-For-Beginners 制造业课程作业深度指南

多水果图像分类器训练实战:从香蕉扩展到多类别质检——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. 训练、测试与重训练迭代

  1. 上传并标记所有标签的图片后,在门户中选择Quick Training(快速训练),训练通常耗时数分钟;
  2. 用预留的测试图片(而非训练图)做 Quick Test,观察各标签的概率输出——模型输出的是概率而非硬性二值答案,例如一张图可能预测ripe 99.7%unripe 0.3%,由代码取最高概率(参考 bananas-ripe-vs-unripe-predictions.png);
  3. 对于预测错误的图片,通过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 提取endpointproject_iditeration_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 存入缓冲区,用HTTPClientPREDICTION_URL发送POST(Content-Type 为application/octet-stream,头带Prediction-Key),返回 200 后解析 JSON 中的predictions数组并打印tagName与概率。其中PREDICTION_URLPREDICTION_KEY、WiFi 凭据及 TLS 根证书(Microsoft Azure DigiCert Global Root G2)集中在 config.h,TLS 证书用于WiFiClientSecure的加密连接。

这套 REST 调用对多水果模型完全透明——标签从 2 个变为 N 个,设备端代码无需任何改动,只需在代码逻辑里针对多个标签做业务分流(例如对ripe类放行、对unripe/bruised类剔除)。

评估清单:本次作业评分标准

作业官方评分标准(Rubric)是自检多水果训练成果的直接依据:

标准示范(Exemplary)合格(Adequate)待改进(Needs Improvement)
为多种水果训练分类器成功为多种水果训练分类器仅成功为一种额外水果训练无法为更多水果训练分类器
判断分类器效果能正确评价分类器对不同水果的表现能观察并提出改进建议无法评价分类器效果

结合评分标准,建议提交作业时至少完成:

  1. 扩展标签:在香蕉之外增加至少一种水果(示范级可加入苹果 + 西红柿这类易混淆组合);
  2. 对照实验:分别记录「单水果」与「多水果」训练后的测试概率,尤其关注苹果/西红柿这类相似外观的混淆概率;
  3. 合理性分析:解释为什么某些水果对(如外观差异大的柑橘与草莓)更容易区分,而颜色变化型水果(青→红西红柿)在低分辨率灰度推理下可能不如光学传感器——这与作业开头强调的局限性呼应。

局限性与进阶方向

  • 数据分布漂移:用手机拍的训练图与 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 7:48:50

SVM与SVR在降水量预测中的实战:从回归原理到调参优化

简介&#xff1a;一套基于支持向量机算法的降水量预测模型代码&#xff0c;适合气象、水文等领域研究者&#xff0c;以及希望掌握支持向量机回归流程的机器学习初学者。完整工程覆盖数据读取、缺失处理、核函数选择、惩罚系数与核参数调优、模型评估与预测输出等环节&#xff0…

作者头像 李华
网站建设 2026/9/14 7:48:32

双旋翼无人机飞控实战:双ESP32分工与PID调参

简介&#xff1a;鲲鹏是一套基于Arduino IDE开发的双旋翼无人机完整开源方案&#xff0c;飞控采用两颗ESP32芯片&#xff0c;兼顾Wi-Fi/蓝牙通信与多核算力&#xff0c;适合无人机爱好者、嵌入式开发者及机器人方向学生。资源覆盖硬件设计、嵌入式源码到装配模型全链路&#xf…

作者头像 李华
网站建设 2026/9/14 7:47:59

博士论文答辩:理论创新点的高效表达方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 7:46:58

资源下载工具 res-downloader:边刷视频号边把资源链接收进本地列表

资源下载工具 res-downloader&#xff1a;边刷视频号边把资源链接收进本地列表 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …

作者头像 李华