ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在 Edge 部署 Custom Vision 对象检测器:IoT-For-Beginners 零售库存项目实战指南

在 Edge 部署 Custom Vision 对象检测器:IoT-For-Beginners 零售库存项目实战指南 在 Edge 部署 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 第五项目零售 · 第 2 课“从 IoT 设备检查库存”的开发者讲解如何把上一课训练好的对象检测器object detector像图像分类器一样部署到 Edge边缘设备导出为紧凑模型compact model、构建成 Docker 容器、通过 Azure IoT Edge 推送到本地网络并让 Wio Terminal 或 Raspberry Pi 等 IoT 设备通过内网 REST API 调用它来完成货架库存盘点。完成本文学习后你将掌握自定义视觉模型 Edge 化部署的完整链路并能基于边界框bounding box结果编写库存计数与去重逻辑。任务总览把对象检测器搬到 Edge本课的课后作业assignment.md英文原文见 5-retail/lessons/2-check-stock-device/assignment.md要求你在上一个项目中你已经在 Edge 上部署了图像分类器。请对你的对象检测器做同样的事情将其导出为紧凑模型并在 Edge 上运行然后让你的 IoT 设备访问这个 Edge 版本。也就是说对象检测器不再把图片发送到云端 Custom Vision 服务进行推理而是把推理模型放到你的本地网络如 Raspberry Pi、Linux 虚拟机或 Wio Terminal 所在的同一局域网内的一台 Linux 机器上IoT 设备直接向该 Edge 端点发起 HTTP 请求即可得到检测结果。这与上一项目中 在 Edge 上运行水果检测器 的做法完全同构只是把“图像分类”换成“对象检测”。任务的评估标准Rubric如下评估维度优秀Exemplary合格Adequate待改进Needs Improvement在 Edge 上部署对象检测器能使用正确的紧凑域compact domain、导出对象检测器并在 Edge 上成功运行能使用正确的紧凑域并导出对象检测器但未能在 Edge 上运行既未使用正确的紧凑域也未导出对象检测器更未在 Edge 上运行从评分标准可以看出本作业有三个硬性里程碑选对紧凑域 → 成功导出模型 → 在 Edge 上真正跑起来。下面依次拆解。为什么要把对象检测器放到 Edge在零售库存场景中把检测模型放在本地而非云端有明确收益详见 在 Edge 上运行水果检测器 的“Edge computing”一节速度请求只在本地网络内传输数据不需要穿越互联网到云数据中心时延显著更低离线可用本地网络连通性差或网络费用昂贵时如偏远门店依然可以工作成本云端推理按调用计费Edge 推理把“图片发送 云端计算 结果回传”的开销变成本地开销长期可降低云资源用量隐私与安全货架图片可能包含顾客、员工等敏感信息不出本地网络分析完成即删降低数据泄露风险。对象检测比图像分类更需要 Edge 化——摄像头可能长时间持续抓拍货架如果每一帧都传到云端做对象检测带宽与费用都非常可观。而 Edge 部署后IoT 设备调用的是本机/局域网上的容器不再需要 Prediction-Key安全性由内网自身的访问控制来保障见 在 Edge 上运行水果检测器 的说明。第一步准备 IoT Edge 设备Edge 部署依赖 Azure IoT Edge。需要先在 IoT Hub 中注册一个带--edge-enabled标志的设备参见 在 Edge 上运行水果检测器az iot hub device-identity create --edge-enabled \ --device-id 你的-edge-设备名 \ --hub-name hub_name然后取得该设备的连接字符串并配置到运行 IoT Edge 运行时的机器上az iot hub device-identity connection-string show --device-id 你的-edge-设备名 \ --output table \ --hub-name hub_nameIoT Edge 运行时只运行Linux 容器因此用 Raspberry Pi 作为 Edge 设备时Pi OSDebian Linux 变体可直接承载用 Windows 时可在 Linux 虚拟机中安装运行时用 macOS 时可在云上创建一台装有 IoT Edge 的 Linux 虚拟机参考 vm-iotedge.md。第二步把对象检测器项目切换到紧凑域并导出Custom Vision 可以生成两类模型标准模型与紧凑模型compact model。紧凑模型通过剪枝、量化等手段大幅缩小体积使其小到足以在 IoT 设备上下载部署。这是本作业“正确的紧凑域”要求的由来——只有先切换到 compact 域并重新训练导出的模型才适合 Edge。与图像分类项目使用Food (compact)域类似对象检测项目需要在其项目设置Settings → Domains中选择对象检测对应的紧凑域Custom Vision 中对象检测项目默认使用 General 域其紧凑版本为General (compact)并在Export Capabilities中确认选择了Basic platforms (Tensorflow, CoreML, ONNX, ...)然后保存更改并用Train重新训练完整步骤见 在 Edge 上运行水果检测器。训练完成后进入Performance标签页选中刚用紧凑域训练的最新迭代点击顶部的Export按钮选择DockerFileLinux 计算机/Windows/虚拟机选Linux版Raspberry Pi 选ARM (Raspberry Pi 3)版点击Export生成文件再点击Download下载 zip 包并解压。解压得到的是 Custom Vision 生成的容器化部署包一个 DockerFile 承载模型的应用程序代码 一个可调用模型的 REST API。第三步构建镜像并推送到容器仓库镜像构建与推送流程与图像分类器完全相同见 在 Edge 上运行水果检测器。先创建并配置 Azure Container RegistryACR# 创建sku 用 Basic 即可注意名称全局唯一 az acr create --resource-group 资源组 --sku Basic --name Registry 名称 # 登录 az acr login --name Registry 名称 # 开启 admin 模式以便生成密码 az acr update --admin-enabled true --name Registry 名称 # 生成密码并记下 PASSWORD az acr credential renew --password-name password --output table --name Registry 名称在解压后的模型目录中构建并打 tag--platform在 Raspberry Pi 上用linux/armhf其余用linux/amd64若在 Edge 设备本机构建可省略默认取当前平台docker build --platform linux/amd64 -t Registry 名称.azurecr.io/detector:v1 .把镜像推到仓库docker push Registry 名称.azurecr.io/detector:v1推送完成后可用az acr repository list --name Registry 名称验证镜像是否已在仓库中列出。 对象检测导出的镜像其内部承载的 REST 服务是 Custom Vision 容器规范下的检测接口与分类容器不同检测容器会返回boundingBox。你可以参考上一项目导出分类容器后打印出的日志iotedge logs 模块名中显示的监听端口与路由来确认实际端点见 在 Edge 上运行水果检测器。第四步用 deployment.json 把模块部署到 EdgeIoT Edge 通过**部署清单deployment manifest**描述要下发到 Edge 设备的模块。仓库中已经给出了完整可用的示例文件 code-deployment/deployment/deployment.json其结构与上一项目 README 中展示的 deployment.json 定义 一致关键点如下$edgeAgent的runtime.settings.registryCredentials填入 ACR 的用户名、密码与地址Registry 名称.azurecr.io让 Edge 运行时能够从私有仓库拉取镜像systemModulesedgeAgent与edgeHub两个系统模块固定使用mcr.microsoft.com/azureiotedge-agent:1.1与mcr.microsoft.com/azureiotedge-hub:1.1镜像modules自定义模块示例中名为ImageClassifier做对象检测时可改名为ObjectDetector镜像改为Registry 名称.azurecr.io/detector:v1其中createOptions通过ExposedPorts/PortBindings把容器内的 80 端口映射到宿主机的 80 端口供同网络的 IoT 设备访问$edgeHub的routesupstream: FROM /messages/* INTO $upstream负责把设备消息上送到云端。把Container registry name清单中有多处与密码替换后执行下发命令az iot edge set-modules --device-id 你的-edge-设备名 \ --content deployment.json \ --hub-name hub_nameSSH 登录 Edge 设备后用iotedge list查看模块是否runningNAME STATUS DESCRIPTION CONFIG ObjectDetector running Up 2 minutes Registry 名称.azurecr.io/detector:v1 edgeAgent running Up 2 minutes mcr.microsoft.com/azureiotedge-agent:1.1 edgeHub running Up 2 minutes mcr.microsoft.com/azureiotedge-hub:1.1看到ObjectDetector处于running状态即完成了作业的第三个里程碑“在 Edge 上运行”。第五步验证 Edge 上的检测服务在 Edge 设备上用curl直接发一张本地图片验证服务是否正常参考上一项目 验证图像分类器curl --location \ --request POST http://Edge 设备 IP 或主机名/detect \ --header Content-Type: image/png \ --data-binary 图片文件与云端不同的是这个请求不需要携带 Prediction-Key——因为请求没有经过 Azure 资源安全边界由内网自身管理。第六步让 IoT 设备调用 Edge 版检测器零售项目第 2 课提供了两种设备的接入指南Wio TerminalArduinoRaspberry Pi / 虚拟 IoT 设备。以 Python 侧为例把图片分类的调用换成对象检测的调用核心差异在于方法名与结果处理参考 code-detect/pi/stock-counter/app.py 与 code-detect/virtual-iot-device/stock-counter/app.py# 分类器classify_image每个标签只返回一个结果 results predictor.classify_image(project_id, iteration_name, image) # 对象检测器detect_image返回多个结果含边界框 results predictor.detect_image(project_id, iteration_name, image) threshold 0.3 predictions list(p for p in results.predictions if p.probability threshold) for p in predictions: print(f{p.tag_name}:\t{p.probability * 100:.2f}%)对象检测器会同时返回多个候选框因此必须用threshold过滤低置信度的误检。完整可运行代码见 app.pyPi。在 Custom Vision 的Predictions标签页中可以看到每个检测框以红色矩形叠加在图片上并标注置信度。理解边界框库存计数的基础对象检测结果除了标签与概率还返回边界框bounding box——即模型认为对象所在的矩形区域。边界框由 4 个值定义top、left、height、width全部是 0~1 之间的比例值以图片宽高为分母坐标原点在图片左上角详见 check-stock-device 第 2 课 README。以 600×800 像素的图片为例边界框从顶部往下 320 像素开始 →top 0.4从左侧 240 像素开始 →left 0.4高度 240 像素 →height 0.3宽度 120 像素 →width 0.2坐标值Top0.4Left0.4Height0.3Width0.2使用 0~1 的比例值意味着无论图片缩放到多大边界框的相对位置与相对大小都不变便于跨分辨率处理。边界框还能用来剔除不合理检测对象检测器可能对同一个物体给出重叠的多个框例如 78.3% 的大框里套着一个 64.3% 的小框。由于一罐番茄酱不可能装进另一罐里代码可以通过计算框的重叠面积来丢弃低置信度重复框。零售项目第 2 课的计数代码 app.pyPi 版计数 正是这么做的用shapely.geometry.Polygon把每个预测框转成多边形两两求交集面积若交集面积超过“较小框面积 × 重叠阈值”则把其中一个框标记删除overlap_threshold 0.002 def create_polygon(prediction): left prediction.bounding_box.left top prediction.bounding_box.top right left prediction.bounding_box.width bottom top prediction.bounding_box.height return Polygon([(left, top), (right, top), (right, bottom), (left, bottom)]) to_delete [] for i in range(0, len(predictions)): polygon_1 create_polygon(predictions[i]) for j in range(i 1, len(predictions)): polygon_2 create_polygon(predictions[j]) overlap polygon_1.intersection(polygon_2).area smallest_area min(polygon_1.area, polygon_2.area) if overlap (overlap_threshold * smallest_area): to_delete.append(predictions[i]) break for d in to_delete: predictions.remove(d) print(fCounted {len(predictions)} stock items)去重后剩余的框数量即为货架上的商品数量——这就是“用对象检测器数库存”的实现核心。代码还会把保留的边界框用 PIL 在原始图片上绘制出来并保存方便人工核对见 app.py。用 Edge 检测结果迭代模型Edge 部署的一个副作用是Edge 上的检测请求不会出现在 Custom Vision 的 Predictions 标签页中图片不出内网自然不经过云端。要利用真实场景数据改进模型需要先收集 IoT 设备拍摄的图片再在云端重新标注与重训确保已经用 IoT 设备拍摄了一批覆盖真实场景的图片在 Custom Vision 的Predictions标签页选中图片逐个检查红色边界框用边界框四角的手柄调整大小标签错误则用X移除并改加正确标签框内没有物体则用垃圾桶按钮删除关闭编辑器后图片会从Predictions移入Training Images重复处理所有预测结果点击Train重训发布新迭代后把 IoT 设备代码中的迭代 URL 更新为新迭代地址重新部署代码并测试完整步骤见 check-stock-device 第 2 课 README。与图像分类器“打标签即可”不同对象检测的重训必须逐框审查——因为边界框的位置与大小本身就是模型的监督信号。进阶挑战作业之外还提供了两个可选的进阶方向见 check-stock-device 第 2 课 README检测错放商品用多个商品标签训练模型当识别出与货架预期不符的商品时让应用发出告警基于边界框判断摆放位置对同一货架上的商品设置边界框位置限制检测出商品被放错位置例如婴儿玉米罐出现在番茄酱区。完成后的清理本课是该零售项目的最后一课。由于 Azure Container Registry 不是免费服务完成作业并验证通过后记得按 clean-up.md 的指引清理云资源先完成作业再清理。关键结论对象检测器 Edge 化与图像分类器完全同构切到正确的紧凑域重训 → 导出 DockerFile → 构建并推送镜像 → deployment.json 下发 → IoT 设备访问内网端点正确使用紧凑域、成功导出、成功在 Edge 运行是作业评分的三个硬性门槛Edge 端点不需要 Prediction-Key安全边界由内网承担对象检测结果中的 0~1 归一化边界框是计数、去重与错放检测的通用数据基础仓库中 app.py 给出了基于shapely的完整去重计数实现可直接复用。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表