IoT-For-Beginners 制造与加工篇:用 IoT + AI 打造水果质量检测系统(Custom Vision 与边缘部署实战)
IoT-For-Beginners 制造与加工篇用 IoT AI 打造水果质量检测系统Custom Vision 与边缘部署实战【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本文基于开源课程 IoT-For-Beginners 的制造与加工Manufacturing and Processing模块对应 4 课内容展开。该模块聚焦一个真实工业场景食品到达中央仓库或加工厂后需要按质量分拣而传统人工分拣成本高昂。文章将带你走完一条完整技术链路——用 Azure Custom Vision 训练图像分类器识别水果成熟度 → 通过 IoT 设备拍照并调用云端模型 → 把模型以容器形式部署到 Azure IoT Edge 在本地网络推理 → 用接近传感器自动触发整个检测流程。读完本文你将掌握图像分类、云边协同架构与 IoT 多设备消息流设计这三项核心实战能力并能在 Wio Terminal、Raspberry Pi 或虚拟设备上复现这套水果质量检测原型。一、模块背景从人工分拣到 AI 驱动的食品质量检测食品运抵中央仓库或加工厂后往往不会立即发往超市而是需要经过若干加工步骤其中最常见的就是按质量分拣。这一流程过去完全依赖人工田间由采摘工只摘成熟果实工厂里果实沿传送带行进员工手动剔除碰伤或腐烂的果子。课程作者曾以暑期工身份采摘并分拣草莓直言这绝不是一份有趣的工作。更现代的方案开始依赖 IoT 分拣。最早的一批设备如 Weco 的分拣机使用光学传感器检测农产品品质例如剔除青番茄。这类设备可以部署在农场收割机上也可以部署在加工厂里。随着人工智能AI与机器学习ML的进步分拣机可以更进一步使用经过训练的 ML 模型区分水果与异物石块、泥土、昆虫检测水果品质不只是碰伤还包括疾病的早期发现与其他作物问题。 术语解释ML model机器学习模型指的是对机器学习软件在一组数据上进行训练后的产物。例如你可以训练一个 ML 模型区分成熟与未成熟的番茄然后用它对新图片进行判断。本模块的 4 节课正是围绕这一目标展开训练水果质量检测器——训练基于图像的 AI 模型以检测水果质量从 IoT 设备检查水果质量——在 IoT 设备上调用该模型在边缘运行水果检测器——让模型运行在本地网络的 IoT 设备上而非云端用传感器触发水果质量检测——设计完整的多设备检测系统原型。 注意这些课程会使用部分云资源。如果你不打算完成本项目的全部课程务必参考仓库根目录的 clean-up.md 清理已创建的资源避免产生持续费用。二、第 1 课训练水果质量图像分类器2.1 为什么要用 ML 分拣食品养活全球人口并不容易尤其是要控制在人人负担得起的价格。最大成本之一是劳动力因此农民越来越倾向于用自动化和 IoT 工具降低人力成本。机械收割虽省成本却带来一个缺点——收割时的分拣能力下降。并非所有作物都均匀成熟比如番茄在大部分可收割时藤上仍会有青果。虽然提前采收是浪费但对农民而言用机械全部采收、之后再处理未熟果更便宜也更容易。自动化收割把分拣从田间转移到了工厂食品在长传送带上行进成队员工逐一挑出不合格品。第一代自动分拣机使用光学传感器识别颜色通过杠杆或气流把青番茄推进废料箱红番茄则继续在传送带网络中前行。最新一代分拣机则利用 AI 与 ML训练出的模型不仅能区分明显的颜色差异青 vs 红还能识别指示疾病或碰伤的细微外观差异。2.2 图像分类与机器学习基础传统编程是输入数据 → 应用算法 → 得到输出。机器学习则反过来从数据和已知输出出发让算法从中学习。学习过程称为training训练输入与已知输出合称training data训练数据。例如给模型数百万张未熟香蕉图片作为输入训练数据、输出标记为unripe再给数百万张成熟香蕉图片、输出标记为ripe。ML 算法基于这些数据生成模型之后你给模型一张新香蕉图片它就会预测这张图是熟还是生。关键特征ML 模型不给出二值答案而是给出概率。比如模型预测某张香蕉图成熟的概率 99.7%、未熟概率 0.3%你的代码取最高概率判定其为成熟。这类用于识别图像的 ML 模型称为image classifier图像分类器。2.3 迁移学习小样本训练的秘密要成功训练图像分类器通常需要海量图片但有一个例外transfer learning迁移学习。当一个分类器已在数百万乃至数十亿张杂图上学过之后你可以复用它只用一小批新图就能重新训练出效果不错的新模型——因为它的内部已经非常擅长识别形状、颜色和模式。这就像儿童形状书一旦认识了半圆、矩形和三角形就能根据组合方式认出帆船或猫——分类器认识形状迁移学习教它什么组合代表船、猫或一根成熟的香蕉。2.4 使用 Azure Custom Vision 训练分类器Custom Vision 是微软提供的一站式云端图像分类器训练工具只需少量图片即可训练通过 Web 门户、Web API 或 SDK 上传图片并给每张图打上tag标签随后训练、测试满意后发布为可通过 Web API/SDK 调用的版本。 每个分类最少可只使用 5 张图片但更多更好至少 30 张效果更佳。Custom Vision 属于 Azure Cognitive Services 系列提供免费层足以完成建模、训练与开发测试。2.4.1 用 Azure CLI 创建认知服务资源首先在fruit-quality-detector资源组中创建两个认知服务资源训练与预测分开# 创建免费层训练资源 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 locationlocation替换为创建资源组时使用的位置F0为免费层 SKU若你的任一认知服务已占用免费账户则改用S0--yes表示同意认知服务条款。2.4.2 创建与训练图像分类器项目在 Custom Vision 门户创建项目命名fruit-quality-detector务必绑定刚才创建的fruit-quality-detector-training资源并选择Classification分类项目类型、Multiclass多类分类类型与Food食物域。训练数据采集要注意三点图片纯净每张图最好只有果实本身背景保持一致或广泛多样且不能出现与熟/生特异性相关的东西。课程举了一个经典反例某皮肤癌分类器训练时癌变痣照片旁都放了直尺测尺寸结果模型近乎 100% 识别的是图片里的尺子而非癌变痣。分辨率适配图像分类器运行在很低的分辨率上。Custom Vision 可接收最大 10240×10240 的图片但实际以 227×227 训练与推理——大图会被缩小因此被分类对象必须在图中占据足够大的面积。样本量每个标签至少 5 张训练图越多越好另需几张独立测试图。图片应为 PNG/JPEG、小于 6MB。若用 iPhone 拍摄的高分辨率 HEIC 图需要转换并可能缩小。仓库在 4-manufacturing/lessons/1-train-fruit-detector/images 提供了成熟/未熟香蕉的示例图片。随后上传图片并分别打上ripe/unripe标签选择Quick Training快速训练开始训练几分钟即可完成。2.5 测试与再训练训练完成后用未参与训练的测试图验证。测试结果以概率形式展示。若结果不理想可以在 Custom Vision 的Predictions页基于快速测试中保存的预测图片修正标签后重新训练每次训练产生一个新iteration迭代版本直到效果满意。课程还提示学习者关注模型评估中的Precision、Recall、AP指标含义。 课后挑战试试用训练过的香蕉模型去识别草莓图片、充气香蕉、穿香蕉服的人甚至《辛普森一家》里的黄色卡通角色观察预测结果——这能直观体会分类器不懂语义、只认概率的特性。三、第 2 课从 IoT 设备检查水果质量3.1 相机传感器基础相机传感器就是可连接到 IoT 设备的摄像头可拍静态图像或流式视频。多数相机传感器采用图像传感器每个像素是一个光电二极管镜头把影像聚焦到传感器上成千上万的光电二极管记录落在其上的光并转换为像素数据。这类传感器学名Active-Pixel SensorAPS最常见的类型是CMOS互补金属氧化物半导体传感器相机属于数字传感器通常借助通信库以 SPI 等协议传输数据——图片数据量远大于温度传感器输出的单个数值因此需要高吞吐协议。3.2 用 IoT 设备拍照与调用云端分类器本课为三种硬件提供了分步指南见 2-check-fruit-from-deviceArduino / Wio Terminal见 wio-terminal-camera.mdRaspberry Pi见 pi-camera.md虚拟设备见 virtual-device-camera.md仓库源码佐证——Raspberry Pi 端完整实现了拍照 → 解析 URL → 调用 Custom Vision 预测 API链路app.pyfrom picamera import PiCamera from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient from msrest.authentication import ApiKeyCredentials camera PiCamera() camera.resolution (640, 480) camera.rotation 0 time.sleep(2) image io.BytesIO() camera.capture(image, jpeg) image.seek(0) 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}%)可以看到预测 URL 形如https://location.api.cognitive.microsoft.com/customvision/v3.0/Prediction/id/classify/iterations/Iteration2/image代码通过按/切分 URL 自动提取endpoint、project_id 与 iteration_name并将Prediction-key放入请求头。这也说明发布迭代后若迭代名变化需要同步更新代码中的 URL。Wio Terminal 端则用 C/Arduino 实现相同逻辑main.cpp按下 WIO_KEY_C 按键后camera.startCapture()拍照、camera.readImageToBuffer()读入内存缓冲再通过HTTPClient以application/octet-stream上传图片、携带Prediction-Key头请求预测端点最后用 ArduinoJson 解析predictions数组打印各标签概率。3.3 发布模型迭代模型在 Custom Vision 中每次训练产生一个新iteration迭代用于追踪不同数据集训练的版本。在Performance页选中最新迭代点击Publish将其发布到fruit-quality-detector-prediction预测资源默认命名为Iteration2。发布后点击Prediction URL按钮可拿到两项关键连接信息预测 API 的 URL上文的.../image端点Prediction-Key 值——调用模型时必须携带的安全密钥只有持有该密钥的应用才被允许使用模型其余一律被拒绝。3.4 用设备实拍图改进模型用 IoT 设备相机拍摄的分类效果往往不如用电脑上传的图片因为训练数据与推理数据的分布不同手机拍的训练图在清晰度、锐度、色彩上与设备相机拍的有明显差异。改进方法是在 Custom Vision 门户的Predictions页用设备实拍图重新训练模型必要时可删除全部原始训练图重来发布新迭代后更新代码中的端点 URL 并重跑反复迭代直至满意。课程进一步建议真实场景中可使用训练 API 直接基于设备拍摄的图片训练模型以解决训练数据与设备实拍不匹配的问题。四、第 3 课把水果检测器搬到边缘4.1 为什么需要边缘计算上一课中设备把图片经互联网发给云端分类。这些调用耗时、花钱且对部分图像数据存在隐私隐患。边缘计算把数据处理放在云的边缘——你的内部网络——尽可能靠近数据产生的地方。优点速度——动作发生在设备所在网络内无需跨互联网调用数据走内部网络、传输距离更短。例如数据从欧洲跨大西洋光缆到美国云端至少 28ms还不算信号转换时间。边缘计算还降低网络流量减少带宽拥塞导致的延迟。远程可用性——在连接受限、无连接或持续联网太贵的场景人道主义灾区、发展中国家依然可用。降低成本——数据采集、存储、分析与触发动作都在边缘完成减少云服务用量。近年来出现了专门面向边缘计算的设备如英伟达 Jetson Nano 这类 AI 加速板可在不足 100 美元的硬件上用 GPU 跑 AI 负载。隐私与安全——数据留在本网不上云分析后无需存储大幅降低泄露风险适合医疗数据、监控录像等敏感信息。隔离不安全设备——有已知安全缺陷的设备可挂在独立网络上通过网关边缘设备中转数据。兼容异构设备——只能走 HTTP 或仅有蓝牙的设备无法直连 IoT Hub 时可由边缘设备充当网关代为转发。缺点即云的相对优势扩展性与灵活性——云可按需实时增删服务器边缘扩容需手动增加设备。可靠性与韧性——云有多地多服务器冗余与灾难恢复边缘达到同等冗余需大量投入与配置。维护——云服务商负责系统维护与更新。工程实践上IoT 系统往往需要云 边缘的混合架构按系统、客户与维护者的需求各取所长。4.2 Azure IoT Edge 与容器Azure IoT Edge 是内置在 IoT Hub 中的服务用来把工作负载从云迁移到边缘先把某台设备配置为边缘设备再从云端向它部署代码。部署到 IoT Edge 的软件称为modules模块默认会运行edgeAgent、edgeHub两个与 IoT Hub 通信的系统模块图像分类器作为额外业务模块部署。IoT Edge 以container容器方式运行代码。容器是自包含的应用与宿主机其他程序隔离通过开放端口对外提供服务。Custom Vision 导出的分类器可直接作为容器运行容器内的 REST API 与云端版本一致——只需把端点指向运行容器的边缘设备即可。4.3 注册并设置边缘设备在fruit-quality-detector资源组创建 IoT Hub 后注册边缘设备比普通设备多一个--edge-enabled标志az iot hub device-identity create --edge-enabled \ --device-id fruit-quality-detector-edge \ --hub-name hub_name az iot hub device-identity connection-string show --device-id fruit-quality-detector-edge \ --output table \ --hub-name hub_name注意IoT Edge 运行时只运行 Linux 容器。可在 Linux 或 WindowsLinux 虚拟机上运行。Raspberry Pi 运行受支持的 Debian 系 Linux可直接安装运行时macOS 用户可按 vm-iotedge.md 在云端创建 Linux VM 作为边缘设备。4.4 导出紧凑模型并构建容器Custom Vision 可生成两种模型标准模型与compact紧凑模型后者通过多种技术压缩体积小到可下载部署到 IoT 设备。做法是在项目Settings中把域切换为Food (compact)确认Export Capabilities选中Basic platforms (Tensorflow, CoreML, ONNX, ...)保存后重新快速训练然后在Performance页对最新紧凑迭代执行Export → DockerFile在 Linux 电脑 / Windows / VM 上跑 IoT Edge → 选Linux版在 Raspberry Pi 上跑 → 选ARM (Raspberry Pi 3)版。下载解压后内含 DockerFile、模型托管应用代码与 REST API需要构建并推送容器。容器注册中心使用 Azure Container Registry注意此服务不免费完成后务必按 clean-up.md 清理资源# 创建容器注册中心名称仅限字母数字需全局唯一 az acr create --resource-group fruit-quality-detector \ --sku Basic \ --name Container registry name # 登录并开启 admin 模式以生成密码 az acr login --name Container registry name az acr update --admin-enabled true --name Container registry name # 重新生成并记录密码 az acr credential renew --password-name password \ --output table \ --name Container registry name # 在解压的模型目录中构建容器Pi 用 linux/armhf其余用 linux/amd64 docker build --platform platform -t Container registry name.azurecr.io/classifier:v1 . # 推送并验证 docker push Container registry name.azurecr.io/classifier:v1 az acr repository list --output table --name Container registry name 若直接在边缘设备本机构建可省略--platformLinux / Raspberry Pi OS 上可能需要sudo。构建输出可见镜像基于python:3.7-slim安装numpy~1.17.5、tensorflow~2.0.2、flask~1.1.2、pillow~7.2.0与mscviplib依赖最终把模型托管为 Flask 应用。4.5 编写部署清单并部署模块部署通过deployment manifest部署清单实现——一份 JSON 文档列出要部署到边缘设备的模块。仓库提供了完整可直接修改的模板deployment.json核心结构如下{ content: { modulesContent: { $edgeAgent: { properties.desired: { schemaVersion: 1.1, runtime: { type: docker, settings: { minDockerVersion: v1.25, registryCredentials: { ClassifierRegistry: { username: Container registry name, password: Container registry password, address: Container registry name.azurecr.io } } } }, systemModules: { edgeAgent: { type: docker, settings: { image: mcr.microsoft.com/azureiotedge-agent:1.1 } }, edgeHub: { type: docker, status: running, restartPolicy: always, settings: { image: mcr.microsoft.com/azureiotedge-hub:1.1, createOptions: {\HostConfig\:{\PortBindings\:{\5671/tcp\:[{\HostPort\:\5671\}],\8883/tcp\:[{\HostPort\:\8883\}],\443/tcp\:[{\HostPort\:\443\}]}}} } } }, modules: { ImageClassifier: { version: 1.0, type: docker, status: running, restartPolicy: always, settings: { image: Container registry name.azurecr.io/classifier:v1, createOptions: {\ExposedPorts\: {\80/tcp\: {}},\HostConfig\: {\PortBindings\: {\80/tcp\: [{\HostPort\: \80\}]}}} } } } } }, $edgeHub: { properties.desired: { schemaVersion: 1.1, routes: { upstream: FROM /messages/* INTO $upstream }, storeAndForwardConfiguration: { timeToLiveSecs: 7200 } } } } } }要点说明registryCredentials中的ClassifierRegistry提供容器注册中心凭据用户名、密码、地址供边缘设备拉取私有镜像系统模块edgeAgent/edgeHub来自mcr.microsoft.com其中edgeHub通过HostConfig.PortBindings暴露 5671AMQP、8883MQTT、443HTTPS端口业务模块ImageClassifier使用你推送到注册中心的classifier:v1镜像并把容器内80 端口映射到宿主机 80 端口供后续 HTTP 调用$edgeHub的路由把消息一律送往云端$upstreamtimeToLiveSecs: 7200表示消息离线暂存 2 小时。将清单中三处Container registry name与密码替换后执行部署az iot edge set-modules --device-id fruit-quality-detector-edge \ --content deployment.json \ --hub-name hub_name4.6 验证与调用边缘分类器SSH 连上边缘设备后用iotedge list查看模块状态应看到ImageClassifier、edgeAgent、edgeHub均running用iotedge logs ImageClassifier查看日志——成功时会输出Loading model...Success!、Loading labels...2 found. Success!Flask 服务监听http://0.0.0.0:80/。用 curl 直接测试本地图片分类注意边缘容器无需 Prediction-Key因为走的是内网安全由内部网络策略保证curl --location \ --request POST http://IP address or name/image \ --header Content-Type: image/png \ --data-binary file_Name返回 JSON 中predictions数组按概率给出各标签例如ripe概率 0.9996、unripe概率 0.0004。设备侧调用也相应简化仓库中 app.py 用requests直接 POST 图片字节流到边缘设备的/image端点即可无需 SDK 与密钥。4.7 边缘部署的取舍需要注意边缘分类器不会回传预测图片到 Custom Vision 的 Predictions 页——这是预期行为因为图片从未离开本地网络。隐私与离线可用是边缘部署的收益代价是模型再训练需要另想办法收集、人工重新标注图片。课程建议读者思考如何设计图片回传重训方案。 课后挑战对比边缘调用与云端调用的延迟。边缘的网络跳数更短可能更快但边缘硬件算力不如云也可能更慢——用计时实验验证并研究专用硬件加速边缘 AI 推理的方案。五、第 4 课用传感器触发水果质量检测5.1 复杂 IoT 应用的架构思维IoT 应用通常不是单设备采集 → 上云的简单模型而是多设备协同传感器采集物理世界数据 → 做出决策 → 通过执行器或可视化反作用于物理世界。课程给出一个通用的things → insights → actions抽象Things物设备从传感器采集数据可能经边缘服务解释如图像分类器解读图像随后把数据发往 IoT 服务Insights洞察来自无服务器应用或对存储数据的分析Actions行动向设备下发命令或可视化数据供人决策。以发动机为例发动机thing发送温度数据 → 评估发动机是否运行正常insight→ 据此提前安排维护计划action。在 第 4 课 README 中这一模式被落到水果质检原型上对应组件与职责如下表层次内容Things检测传送带上水果到达的探测器拍照并分类的相机运行分类器的边缘设备告警未熟果的设备Insights决定是否检查水果成熟度存储成熟度分类结果判断是否需要发出未熟果告警Actions命令设备拍照并用图像分类器检查命令设备发出未熟果告警架构设计时还必须持续审视数据与安全设备收发哪些数据如何加密与保护如何控制设备与云服务的访问权限 该原型完全可以用单台设备实现内置拍照触发逻辑与 LED 控制仅用 IoT Hub 统计未熟果数量与配置设备课程拆分为多设备是为了演示大规模 IoT 应用的概念。5.2 用接近传感器触发检测设备需要一个触发信号来指示水果就位、可以分类。一个方案是用测距判断水果是否到达传送带上的正确位置。接近传感器通过发射激光或红外等电磁辐射再探测物体反弹的信号用发射与回波之间的时间计算距离。你可能早就在用它们智能手机贴耳时自动熄屏防误触靠的正是接近传感器。三种硬件对应的实现指南Arduino / Wio Terminal见 wio-terminal-proximity.mdRaspberry Pi见 pi-proximity.md虚拟设备见 virtual-device-proximity.md仓库为三套硬件都提供了测距源码code-proximity例如树莓派侧distance_sensor.py读取距离传感器数值Wio Terminal 侧则以 PlatformIO 工程实现。5.3 定义消息结构经验与陷阱原型中多个组件相互通信接近传感器把测距结果发往 IoT Hub → IoT Hub 向相机设备下发拍照命令 → 图像分类结果回传 IoT Hub → IoT Hub 向带 LED 的设备下发告警命令。在动手前先把消息结构定义清楚是资深开发者的共识——无数 bug 源于实际发送的数据与期望的数据不一致。以温度数据为例字段命名就该统一{ temperature: 20.7 }还是{ temp: 20.7 }同时要考虑单位°C 还是 °F消费级设备若允许用户切换显示单位务必保证上云数据的单位始终一致。课程还以火星气候轨道探测器因单位错误损失 1.25 亿美元的案例提醒读者单位问题的代价。对水果质检原型还有一个典型决策点触发逻辑放在设备端还是云端设备测得距离后是由设备自行判断水果够近再发消息让 IoT Hub 触发分类还是只上报测距值、由云端决定答案取决于场景决策在云端 → 需要发送多个测距值消息量大IoT Hub 费用与带宽成本上升工厂可能有数百万设备还可能拖慢设备决策在设备端 → 需要提供配置手段来微调触发距离。没有放之四海皆准的答案这正是 IoT 开发者必须理解业务与数据的原因。5.4 用开发板模拟多设备Raspberry Pi / 虚拟设备单板计算机可同时运行多个应用用多个 Python 文件每个IoT 设备一个在不同终端会话中运行即可模拟多设备。注意部分硬件被多个应用同时访问时会不可用。微控制器无法并行运行多个应用所有设备的逻辑必须放进单个应用。建议为每个 IoT 设备建一个类如DistanceSensor、ClassifierCamera、LEDController各自提供setup/loop方法由主函数调用命令集中处理再分发给相应设备类主loop中按各设备处理周期协调时序如 A 设备每 1 秒处理、B 设备每 10 秒处理就用 1 秒延迟加计数器调度。5.5 走向生产环境原型是最终生产系统的基础但两者有显著差异加固组件——采用能耐受工厂噪声、高温、振动与应力的工业级硬件内部通信——部分组件直连互发数据避免绕道云端仅把需要存储的数据上云直连或通过网关设备在边缘运行部分 IoT 服务配置化——不同工厂、不同水果需要的触发距离不同不应硬编码而应通过云端配置如设备孪生 device twin下发自动剔除——生产级系统用自动化装置替代 LED 告警来移除未熟果。 课后挑战把前面几个项目如冷链运输温控车辆追踪套入 things/insights/actions 参考架构设计一个融合多能力的更复杂方案画出架构并列出所有设备、服务、传输数据与安全隐私考量。六、资源清理与延伸阅读第 4 课是本项目最后一课完成课程与作业后务必清理云服务Azure Container Registry、IoT Hub、Custom Vision 资源等均可能产生费用操作步骤见仓库根目录的 clean-up.md。关于云资源清理的更多说明可参考 docs/troubleshooting.md 与 TROUBLESHOOTING.md。本模块的完整课程源码、图片与作业分布在课程讲义4-manufacturing/lessons/1-train-fruit-detector/README.md、2-check-fruit-from-device/README.md、3-run-fruit-detector-edge/README.md、4-trigger-fruit-detector/README.md设备端代码code-classify调用云端/边缘分类器与code-proximity距离传感器触发目录部署模板deployment.json训练示例图香蕉成熟/未熟图片见 1-train-fruit-detector/images延伸学习建议深入理解容器与 OS 级虚拟化进一步阅读 Azure IoT 参考架构文档学习 IoT Hub 设备孪生device twins机制以支撑生产级配置下发工业自动化场景可关注 OPC-UA 这类机器间通信协议。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考