)
使用 Python SDK 从 Raspberry Pi 与虚拟 IoT 设备调用 Custom Vision 图像分类器IoT-For-Beginners 水果质检实战【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文基于微软开源课程《IoT for Beginners》IoT-For-Beginners第 4 章制造方向第 2 课《从 IoT 设备检查水果质量》中的“单板计算机图像分类”小节整理对应课程文件为4-manufacturing/lessons/2-check-fruit-from-device/single-board-computer-classify-image.md。本课场景是把上一课在 Azure Custom Vision 中训练好的“成熟/未成熟水果”图像分类模型从 IoT 设备端通过 Python SDK 真实调用起来Raspberry Pi或虚拟 IoT 设备先拍照再将 JPEG 图像字节流发送到云端分类服务最终在终端打印每个标签的置信度百分比。读完本篇你将掌握 Custom Vision Python 预测 SDK 的完整接入流程包括 Prediction URL 的解析、ApiKeyCredentials 鉴权、classify_image 调用与结果解析并能理解模型迭代发布与再训练的闭环思路。一、本节在整个课程中的位置本课第 16 课处于 IoT 项目“制造水果质量检测”的第二个环节。整体链路是第 1 课在 Custom Vision 门户中用成熟/未成熟香蕉图片训练图像分类器详见4-manufacturing/lessons/1-train-fruit-detector/README.md第 2 课本课用摄像头传感器在设备端拍照并调用云端分类器返回质量判定后续课程把分类器部署到边缘Azure IoT Edge、用分类结果触发执行器如剔除次品。本小节解决的正是“调用”这一步如何从 Raspberry Pi 或虚拟 IoT 设备把拍到的图片发送给 Custom Vision 并读取分类结果。课程 README4-manufacturing/lessons/2-check-fruit-from-device/README.md还说明了发布模型迭代与获取 Prediction URL 的前置步骤本节代码依赖这些云侧准备。二、前置条件摄像头拍照与模型发布2.1 设备端已经能拍照在进入本节之前你需要先按上一环节的指引完成摄像头采集Raspberry Pi参见 pi-camera.md使用picamera库驱动 CSI 摄像头虚拟 IoT 设备参见 virtual-device-camera.md通过 CounterFit 模拟摄像头Wio TerminalArduino参见 wio-terminal-camera.md。拍照代码在仓库的code-camera目录中。以虚拟设备版为例code-camera/virtual-iot-device/fruit-quality-detector/app.pyfrom counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000) import io from counterfit_shims_picamera import PiCamera camera PiCamera() camera.resolution (640, 480) camera.rotation 0 image io.BytesIO() camera.capture(image, jpeg) image.seek(0) with open(image.jpg, wb) as image_file: image_file.write(image.read())要点counterfit_shims_picamera.PiCamera是与真机picameraAPI 完全一致的模拟实现因此同一份应用代码可以在两种环境无缝切换camera.resolution (640, 480)指定采集分辨率camera.rotation 0指定旋转角度根据安装方位可改为 90/180/270图像先写入内存流io.BytesIO()image.seek(0)把读写指针拨回起点之后既可供上传分类也可落盘保存为image.jpg便于调试。 在 Raspberry Pi 真机上代码会在camera.capture()前调用time.sleep(2)给摄像头模块留出自动曝光和白平衡稳定时间避免首帧过暗或偏色。2.2 在 Custom Vision 中发布模型并获取 Prediction URL调用云端模型前必须在 Custom Vision 门户CustomVision.ai完成“发布迭代”打开fruit-quality-detector项目进入Performance页签在侧边Iterations列表选择最新的迭代例如训练改进后得到的Iteration 2点击该迭代的Publish按钮在Publish Model对话框中把Prediction resource选为上一课创建的fruit-quality-detector-prediction预测资源发布名保持Iteration2发布完成后点击Prediction URL按钮从If you have an image file区域复制两样东西Prediction URL形如https://location.api.cognitive.microsoft.com/customvision/v3.0/Prediction/id/classify/iterations/Iteration2/imagePrediction-Key调用模型时必须携带的密钥未携带正确密钥的请求会被拒绝。⚠️ 每次训练都会生成新的迭代号。若发布了新的迭代如Iteration3设备端代码里的 URL 也需要同步更新——这正是后文把 URL 拆成“端点 项目 ID 迭代名”三部分、便于维护的原因。三、安装 Custom Vision Python 预测 SDKCustom Vision 提供了官方 Python SDK通过 Pip 即可安装文档原文给出的安装命令pip3 install azure-cognitiveservices-vision-customvision该包依赖msrest微软 REST 客户端基础库其中msrest.authentication.ApiKeyCredentials负责把 API 密钥放入请求头完成鉴权。若使用虚拟 IoT 设备请确保终端中已激活 Python 虚拟环境.venv后再安装与运行保持依赖隔离。四、编写分类调用代码逐步拆解以fruit-quality-detector/app.py为例将以下内容逐段加入拍照代码之后。仓库中的完整成品可直接参考Raspberry Pi 版code-classify/pi/fruit-quality-detector/app.py虚拟 IoT 设备版code-classify/virtual-iot-device/fruit-quality-detector/app.py4.1 导入 SDK 模块在app.py顶部加入from msrest.authentication import ApiKeyCredentials from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClientApiKeyCredentials用于构造携带Prediction-key请求头的凭据对象CustomVisionPredictionClient预测客户端类负责与 Custom Vision 端点通信。4.2 配置 URL 与密钥prediction_url prediction_url prediction_key prediction key把prediction_url和prediction key分别替换为 2.2 节复制的地址与密钥。4.3 拆分 Prediction URLPrediction URL 是为直接调用 REST 端点设计的而 Python SDK 需要分开使用其中的端点、项目 ID 与迭代名。按/切分并提取parts prediction_url.split(/) endpoint https:// parts[2] project_id parts[6] iteration_name parts[9]对照https://location.api.cognitive.microsoft.com/customvision/v3.0/Prediction/id/classify/iterations/Iteration2/image的下标parts[2]是主机名location.api.cognitive.microsoft.comparts[6]是项目 IDparts[9]是已发布迭代名Iteration2。这样做的好处是更换迭代时只需更新prediction_url一处无需改动其他逻辑。4.4 构造预测客户端prediction_credentials ApiKeyCredentials(in_headers{Prediction-key: prediction_key}) predictor CustomVisionPredictionClient(endpoint, prediction_credentials)in_headers{Prediction-key: prediction_key}把密钥包装进每次请求的请求头CustomVisionPredictionClient则以“端点 凭据”为参数实例化之后所有预测调用都会自动携带鉴权信息。4.5 发送图片并获取结果image.seek(0) results predictor.classify_image(project_id, iteration_name, image)image.seek(0)把字节流指针拨回开头此前保存image.jpg时已读到末尾确保把完整 JPEG 数据发送出去。classify_image(project_id, iteration_name, image)返回分类结果对象results其predictions列表包含所有标签的置信度。4.6 输出预测结果for prediction in results.predictions: print(f{prediction.tag_name}:\t{prediction.probability * 100:.2f}%)逐条遍历results.predictionsprediction.tag_name标签名如ripe、unripeprediction.probability0–1 之间的浮点数0 表示 0% 匹配1 表示 100% 匹配因此乘以 100 并保留两位小数得到百分比。 图像分类器会为所有训练过的标签返回置信度而非只返回“命中”的那一个所有标签概率之和通常为 100%softmax 归一化。解读时应取概率最高的标签作为最终判定。五、运行与预期输出保持摄像头对准水果真实水果、合适的图片集或虚拟设备下在 CounterFit 页面上传/显示的图片运行python app.py终端将输出形如(.venv) ➜ fruit-quality-detector python app.py ripe: 56.84% unripe: 43.16%上例中模型判定当前香蕉为**成熟ripe**的概率约 56.8%未成熟unripe约 43.1%。与此同时在 Custom Vision 门户的Predictions页签中可以看到本次上传的图片及其分类置信度用于人工核对。下面是课程中展示的调用真实效果的截图——同一张香蕉图片在 Custom Vision 中分别以 56.8% 与 43.1% 判定为 ripe / unripe英文原版图片位于 images/custom-vision-banana-prediction.png。六、从源码看完整的端到端调用链合并拍照与分类逻辑后虚拟设备版完整应用code-classify/virtual-iot-device/fruit-quality-detector/app.py的执行顺序如下from counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000) import io from counterfit_shims_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 image io.BytesIO() camera.capture(image, jpeg) image.seek(0) with open(image.jpg, wb) as image_file: image_file.write(image.read()) 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}%)从中可以看到清晰的五段式链路初始化CounterFit/PiCamera→ 采集 JPEG → 拆分 URL 构造客户端 → 上传分类 → 遍历输出。Raspberry Pi 版code-classify/pi/fruit-quality-detector/app.py仅把 CounterFit 初始化与counterfit_shims_picamera换成真实的picamera其余代码完全一致体现了课程刻意保持两种硬件路径代码等价的设计。七、识别准确率不高时改进模型闭环从 IoT 设备摄像头拍到的图预测结果往往不如用电脑上传训练图时准确。原因是训练数据与预测数据分布不一致训练用的是手机拍摄的高清图而设备摄像头拍出的图在分辨率、锐度、色彩、光照上都有差异参见 images/banana-picture-compare.png 左右两图的对比。改进思路详见课程 README 的Improve the model一节是“用设备拍图反哺训练”形成数据闭环用你的 IoT 设备分别拍摄多张成熟与未成熟水果的图片回到 Custom Vision 门户的Predictions页签把预测偏差大的设备照片作为新训练数据加入重新训练模型若设备图与原始训练图差异过大可在Training Images页签选中并删除旧图悬停图片出现勾选框点击勾选即可选中/取消训练出新迭代并发布参考 2.2 节步骤发布名如Iteration3更新代码中的prediction_url指向新迭代名重新运行重复以上步骤直到预测结果符合预期。课程还给出了一个延伸挑战尝试改变设备代码中的采集分辨率与光照条件观察预测质量的变化并思考若要把该设备作为产品卖给农场或工厂如何保证其输出在长期运行中保持一致。八、小结本小节将 Custom Vision 图像分类器真正接到了 IoT 设备上关键知识点可归纳为环节技术要点仓库证据依赖安装pip3 install azure-cognitiveservices-vision-customvision课程文档原文鉴权ApiKeyCredentials(in_headers{Prediction-key: ...})code-classify/virtual-iot-device/fruit-quality-detector/app.pyURL 解析split(/)提取 endpoint / project_id / iteration_name同上推理调用predictor.classify_image(project_id, iteration_name, image)同上结果解析prediction.probability * 100转百分比同上模型发布Performance 页签 → Publish → Prediction URL4-manufacturing/lessons/2-check-fruit-from-device/README.md至此“从设备拍照 → 云上分类 → 终端输出质量判定”的最小闭环已跑通。后续课程将在此基础上把分类器下沉到边缘设备、并用分类结果驱动自动化剔除形成完整的智能水果质检产线。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考