尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
IoT-For-Beginners 水果质检实战:在设备上响应 Custom Vision 分类结果并驱动执行器
IoT-For-Beginners 水果质检实战在设备上响应 Custom Vision 分类结果并驱动执行器【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇基于 IoT-For-Beginners 制造Manufacturing项目的第 2 课 assignment.md 展开当你的 IoT 设备已经能调用云端图像分类器、拿到ripe / unripe的预测概率值之后如何让设备对这些预测结果做出响应——把数据上报 IoT Hub、本地点亮 LED、或由无服务器代码判定成熟度后下发命令控制执行器。读完本篇你可以完整继承作业要求与评分标准并结合仓库中的真实设备代码Wio Terminal / Raspberry Pi / 虚拟设备理解预测值的解析方式与三种响应方案的落地路径。一、作业背景设备手里已经有什么在 2-check-fruit-from-device 课程中你已经完成了三件事用摄像头Wio Terminal 的摄像头、树莓派摄像头或 CounterFit 虚拟设备拍摄图片在 Custom Vision 门户发布Publish了fruit-quality-detector项目的某个迭代并让设备通过预测 API 拿到分类结果。设备端拿到预测结果的代码在仓库中是现成的例如树莓派/虚拟设备的 code-classify/pi/fruit-quality-detector/app.pyprediction_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}%)这里的两个字段正是响应的输入prediction.tag_name标签名如ripe/unripe和prediction.probability0~1 的置信度。虚拟设备版本 code-classify/virtual-iot-device/fruit-quality-detector/app.py 与之一致只是把picamera.PiCamera换成了counterfit_shims_picamera.PiCamera并初始化 CounterFit 连接方便在没有硬件时验证同样的预测解析逻辑。二、作业要求Instructions原文档的作业指令可以概括为你的设备已经完成了图像分类并拿到了预测值现在要为这些预测值编写响应逻辑。响应方式由你任选其一或组合上报云端把数据发送到 IoT Hub交由其他系统处理例如后续用 Azure Functions、存储与分析控制执行器在设备本地根据预测值直接操作执行器——原文的典型例子是当水果未成熟unripe时点亮 LED两者结合的闭环方案设备把数据发送到 IoT Hub由一段无服务器serverless代码判断水果是否成熟再下发一条命令回来控制设备上的执行器。注意第 3 种方案的关键特征决策不在设备端而在云端无服务器函数中设备端除了发送数据外还需要接收来自 IoT Hub 的 C2Dcloud-to-device消息并按命令动作。完整架构可参考本课程最后一课 4-trigger-fruit-detector/README.md 中对Things → Insights → Actions参考架构的阐述其中 Actions 明确包含控制设备上的执行器与数据可视化两类。三、设备端如何拿到并解析预测值源码级说明三种硬件路径的设备代码都已放在课程目录的code-classify子目录下你的响应代码应当直接建立在它们之上。3.1 Wio TerminalArduino/C见 code-classify/wio-terminal/fruit-quality-detector/src/main.cppclassifyImage()函数展示了微控制器上完整的预测调用与结果解析链路void classifyImage(byte *buffer, uint32_t length) { HTTPClient httpClient; httpClient.begin(client, PREDICTION_URL); httpClient.addHeader(Content-Type, application/octet-stream); httpClient.addHeader(Prediction-Key, PREDICTION_KEY); int httpResponseCode httpClient.POST(buffer, length); if (httpResponseCode 200) { String result httpClient.getString(); DynamicJsonDocument doc(1024); deserializeJson(doc, result.c_str()); JsonObject obj doc.asJsonObject(); JsonArray predictions obj[predictions].asJsonArray(); for(JsonVariant prediction : predictions) { String tag prediction[tagName].asString(); float probability prediction[probability].asfloat(); // ... 打印 tagName 与百分比 } } httpClient.end(); }几个对响应逻辑有直接影响的细节预测 URL 与密钥定义在 src/config.h 中PREDICTION_URL、PREDICTION_KEYconfig.h内还内置了 Azure TLS 根证书用于WiFiClientSecure的 HTTPS 校验响应体是 JSONpredictions数组中每项包含tagName与probability。要在本地点亮 LED你只需在这个for循环内判断tag是否为unripe且probability超过你设定的阈值例如 0.5再digitalWrite对应引脚触发摄像是 Wio Terminal 的 C 按钮WIO_KEY_C见 main.cpp 的loop()响应逻辑同样挂在这个事件之后即可。从源码结构看classifyImage()目前只把预测打印到串口——这正是作业留白的位置把它扩展为上报 本地执行或等待云端命令。3.2 树莓派 / 虚拟设备Python如前文 app.py 所示results.predictions是一个可遍历集合每个元素带tag_name与probability。在 Python 中做本地响应更直观例如判断存在 unripe 且 probability 0.5 的预测项时输出 GPIO 高电平。虚拟设备路径的意义在于没有真实 GPIO 时你可以先用 CounterFit 验证判断—响应逻辑本身再把执行器部分映射到真实引脚。四、三种响应方案的设计要点4.1 方案 A只把预测数据发送到 IoT Hub这是最小改动方案设备端新增一个 IoT Hub 客户端如azure-iot-device-client库或 MQTT over TLS把 JSON 载荷例如{tagName: unripe, probability: 0.93, timestamp: ...}发送到 Hub 的devices/{deviceId}/messages遥测主题。局限对照评分标准如果响应内容不依赖预测值例如无差别地把原始图片或原始报文全部发出去在评分中被归为Adequate而非Exemplary。因此即便选这条路载荷里也应包含解析后的tagName/probability并让后续处理如 Azure Functions 触发器基于这些值做动作。4.2 方案 B本地根据预测值直接控制执行器原文给出的示例是水果未成熟时点亮 LED。实现要点在解析到预测项后Wio Terminal 的classifyImage()循环内、或 Python 的for prediction in results.predictions循环内确定目标标签引入判定阈值比较unripe 的 probability 是否高于 ripe或直接设定概率阈值避免把噪声预测如 50.2% 的弱信号也当成决策依据驱动执行器C 侧digitalWrite(ledPin, HIGH/LOW)Python 侧用RPi.GPIO/gpiozero控制 GPIO。一致性要求对应评分标准中的Exemplary档对于预测值相同的输入设备的响应必须一致。也就是说判定逻辑要是确定性的——同样的{tagName, probability}组合应产生同样的 LED 状态/同样的上报行为不能引入未初始化的随机状态。4.3 方案 CIoT Hub 无服务器代码的云端闭环这是作业描述中最完整的形态与课程第 4 课 4-trigger-fruit-detector/README.md 展示的参考架构一致参见上图中设备 → IoT Hub → Azure Functions → 存储/命令的消息流设备把预测结果作为遥测发到 IoT Hub一个事件触发IoT Hub 事件的 Azure Function消费该消息在云端判断水果是否成熟可叠加时间戳、连续多次采样等策略并把结果写入 Azure Storage 供分析Function 再向该设备发送一条C2D 命令消息如{command: set-led, value: true}设备端注册 C2D 消息回调收到命令后执行对应的执行器动作。选这条路线时设备端需要同时具备发送遥测与接收 C2D 消息两类代码仓库前序课程1-getting-started 的4-connect-internet各课中已演示过 MQTT 连接 IoT Hub、接收云ToDevice 消息的完整做法可直接作为代码基础。五、评分标准Rubric完整继承原文档原文档给出的评估维度如下表翻译自 assignment.md 所对应的英文版 assignment.md标准优秀Exemplary合格Adequate需要改进Needs Improvement响应预测结果Respond to predictions实现了依赖预测值的响应且对相同预测值能产生一致的响应行为实现了不依赖预测值的响应例如只是把原始数据发送到 IoT Hub无法把设备编程为对预测结果做出响应对照这张表自检你的实现你的响应是否读了probability同一概率下重复运行LED/上报行为是否稳定这两点是优秀与合格的分水岭。六、动手路径与延伸阅读先跑通基线编译并运行 wio-terminal 的 code-classify 工程或运行 Pi 版 app.py确认能稳定打印tagName与百分比在预测解析处插入你的响应逻辑本地 LED 阈值判定或 IoT Hub 客户端发送遥测若选择云端闭环参考 3-run-fruit-detector-edge/README.md 中设备与云端服务如何分工的讨论以及第 4 课参考架构图确定消息流用不同成熟度的水果重复拍摄验证确认相同预测值下响应一致弱预测值下不误触发。注意事项config.h与app.py中的PREDICTION_URL、PREDICTION_KEY均为占位符如prediction_url需替换为 Custom Vision 门户Prediction URL对话框中提供的值该密钥是访问模型的安全凭据仅持有密钥的应用可调用模型其余请求会被拒绝——这也是你在写 C2D 闭环时应当同样重视传输与身份安全的原因。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

AI论文降重工具实测与学术规范应对策略

AI论文降重工具实测与学术规范应对策略

/* 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 10:16:21
数字人平台选型指南:2026年趋势与技术解析

数字人平台选型指南:2026年趋势与技术解析

/* 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 10:11:21
Wagtail 多站点与多实例架构怎么选?

Wagtail 多站点与多实例架构怎么选?

Wagtail 多站点与多实例架构怎么选? 【免费下载链接】wagtail A Django content management system focused on flexibility and user experience 项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail 当一个项目要用同一套 Wagtail 源码支撑多个网站…

📅 2026/9/14 10:11:21
MORE NEWS

更多资讯

📰

FastAPI构建RAG知识库API实战指南

1. 项目概述:基于FastAPI构建RAG知识库API在自然语言处理领域,RAG(Retrieval-Augmented Generation)技术正在彻底改变知识密集型任务的处理方式。这个项目将带你用Python生态中最快的Web框架FastAPI,构建一个完整的RAG…

📰

MATLAB实现储能电站与微电网协同优化

1. 项目概述:储能电站与微电网协同优化的MATLAB实现储能电站与微电网的协同优化是当前能源系统研究的热点方向。作为一名长期从事电力系统优化的工程师,我发现MATLAB在这个领域有着独特的优势。通过遗传算法等智能优化方法,我们可以有效解决风…

📰

规范驱动开发(SDD)实战:用OpenSpec和SuperPowers约束AI编程

1. SDD不是TDD的换皮:规格先行的逻辑变了什么1.1 一个让我重新审视SDD的契机我最初系统接触SDD(Spec-Driven Development,基于规范编程)是在开始重度使用AI编码助手之后。项目做中期,一个扎眼的问题越来越频繁&#xf…

📰

离线环境部署Ollama:CentOS 7.9下的GLIBCXX升级与模型迁移

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

📰

模块化太阳能逆变器:实现一电池多用途的能量路由系统

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

📰

reference 速查清单:Grok CLI(非官方版)从安装认证到 Plan Mode 与 MCP 的完整实战指南

reference 速查清单:Grok CLI(非官方版)从安装认证到 Plan Mode 与 MCP 的完整实战指南 【免费下载链接】reference 面向开发者的技术速查清单(Cheat Sheets)集合,整理常见技术、工具与开发流程,帮助快速查阅关键信息,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬