具身智能视觉识别实训报告
具身智能实训复盘:从海康相机 OCR 到昇腾边缘检测,再到华为云 IoTDA + CodeArts 一条龙落地
摘要:本文记录一次"具身智能工业视觉分析与物联监护"综合实训的完整踩坑过程。五天时间,我亲手把四套华为/海康的工具链串了起来:用 Python + 海康工业相机跑通实时 OCR 文字识别;用昇腾 Atlas 200I DK A2 开发板借力 ascend-devkit 样例做 YOLOv5 摄像头实时检测;在华为云 IoTDA 上建产品、定物模型、用 MQTT 模拟设备做发布/订阅联调;最后用 CodeArts 把"智慧路灯"Spring Boot 应用构建成 jar 并本地跑起来。每个环节都附了真实截图和关键代码,末尾有踩坑总结,希望能帮到同样在做这套实训的同学。
一、实训背景与目标
这次实训的主题是具身智能工业视觉分析与物联监护应用,说白了就是"让机器能看、能认、能上报、能被远程控制"。整体分两条技术主线:
- 工业视觉主线:相机取图 → 智能分析(OCR / 目标检测)→ 结果可视化
- 物联监护主线:设备接入华为云 → 数据上报 / 命令下发 → 边缘或云端应用联动
我最终要落地四件事,也是文章的四个主体章节:
| 模块 | 核心任务 | 用到的主要工具 |
| — | — | — |
| 模块一 | 海康工业相机 + Python 实时 OCR 文字识别 | 海康 MVS、PaddleOCR、OpenCV |
| 模块二 | 昇腾开发板 + YOLOv5 摄像头实时目标检测 | Atlas 200I DK A2、ascend-devkit、JupyterLab |
| 模块三 | 华为云 IoTDA 产品/物模型构建 + MQTT 联调 | 华为云、IoTDA、MQTT 客户端 |
| 模块四 | CodeArts 智慧路灯应用构建与本地部署 | CodeArts、Maven、Spring Boot |
成品效果先看两张图(对应实训报告里的"成品结果 1 / 2"):
二、环境清单(照着配少走弯路)
硬件
- 海康工业相机 MV-CS060-10UC-PRO(600 万像素、USB3.0)
- 华为昇腾 Atlas 200I DK A2 开发者套件(出厂烧录 Ubuntu 22.04.5 LTS aarch64 系统卡)
- 上位机一台(Windows,Python 3.x,无独显所以用 CPU 推理)
软件 / 平台
- 海康 MVS 客户端 V2.2.0
- Python 依赖:
opencv-python、numpy、paddleocr、ctypes - MobaXterm(SSH 登录开发板,IP
192.168.137.100) - 华为云账号(已完成实名认证)、IoTDA 标准版实例、CodeArts 项目
- 本地 JDK:
jdk1.8.0_192
三、模块一:Python + 海康工业相机实时 OCR
3.1 安装 MVS 客户端、连接相机
海康机器人官网下 MVS(我用的是 V2.2.0),装好驱动后用 USB3.0 把相机连上上位机。MVS 里能直接枚举到设备,看到型号、序列号、GUID 这些信息,还能实时预览取流是否正常。我这台的型号就是图里那个 MV-CS060-10UC-PRO。

3.2 搭建 PaddleOCR 环境
pip install opencv-python numpy paddleocr
PaddleOCR 第一次跑会自动下载 PP-OCR 中英文模型。我这里故意不开 GPU(上位机没独显):
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False)
use_angle_cls=True:开文本方向分类,斜着拍的字也能认lang="ch":中文识别use_gpu=False:纯 CPU 推理,实测速度够用
3.3 代码实现(核心思路)
海康相机通过官方 SDK 的 MyCameraControlClass 封装类来取流。这里有一个很关键的坑:OpenCV 的 putText 画不了中文。所以我自己建了一个"简中→英文"的映射字典,识别到中文后先翻成英文再画框,显示才不会乱码。
核心流程(依据实训截图整理,关键片段):
import cv2
import numpy as np
from paddleocr import PaddleOCR
from MyCameraControlClass import MvCamera, MV_GIGE_DEVICE, MV_USB_DEVICE
# 中文 -> 英文,避免 cv2 绘制中文乱码
ch2en = {
"光源": "light source",
"新光": "new light",
"原光": "original light",
"含套件": "including kit",
"不含套件": "without kit",
}
# 1) 枚举 + 打开相机 + 开始取流
cam = MvCamera()
dev_list = ...
cam.MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, dev_list)
cam.MV_CC_CreateHandle(handle, dev_info)
cam.MV_CC_OpenDevice() # 独占方式打开
cam.MV_CC_StartGrabbing()
# 2) OCR 初始化(CPU 推理)
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False)
while True:
ret, frame = cam.get_frame()
# 3) 提速:镜像 + 50% 缩放后进 OCR
mini = cv2.flip(frame, 1)
mini = cv2.resize(mini, (0, 0), fx=0.5, fy=0.5)
result = ocr.ocr(mini, cls=True)
for line in result:
box, (text, score) = line
# 4) 坐标还原:先放大 2 倍,再镜像翻回原图尺寸
box = [[x * 2, y * 2] for x, y in box]
box = mirror_back(box)
cv2.polylines(frame, [np.int32(box)], True, (0, 255, 0), 2)
label = ch2en.get(text, text)
cv2.putText(frame, f"{label} {score:.2f}", ...,
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.imshow("cam + OCR", frame)
取流与初始化的完整代码贴在下面两张图里,比上面片段更全:


3.4 运行效果
识别时终端会同步打印"识别中文 + 置信度"。实测对"光源"“新光”"原光"这类字样,置信度能到 0.6 ~ 0.95,绿框 + 英文标签实时叠加在画面里,效果就是文章开头那张成品图。
四、模块二:昇腾 Atlas 200I DK A2 + YOLOv5 检测
4.1 借力 ascend-devkit 样例
开发板上电后进到自带的 ascend-devkit 欢迎页,里面有主页、文档、在线课程、在线实验、论坛、代码仓几个入口。在线实验里直接给了 YOLOv5 目标检测的开箱即用样例,我偷懒直接借力,省掉了自己训练 + 转 om 模型的流程。

4.2 JupyterLab 环境搭建
用 MobaXterm 通过 SSH 登录开发板:
主机: 192.168.137.100
用户: HwHiAiUser
登录后跑 jupyter lab,服务在 8888 端口,日志里会打印带 token 的访问链接。把链接复制到本机浏览器即可进 JupyterLab。

4.3 编码:camera 模式实时推理
打开 samples/notebooks/01-yolov5 样例,main.ipynb 支持 image / camera / video 三种推理模式。我把它改成摄像头实时模式:
infer_mode = 'camera' # 摄像头实时推理
# yolo.om 是 YOLOv5 转好的昇腾模型格式
infer_camera(model, labels_dict, cfg)
工程里还有 det_utils.py、转好的 yolo.om 模型、coco 类别文件,结构如图:

4.4 运行效果
notebook 一跑,摄像头画面里就用绿框标出目标并显示类别和置信度,能稳定识别 person、bottle 等。这部分的成品就是文章开头那张 YOLOv5 检测图。

五、模块三:华为云 IoTDA 物联中转
5.1 账号与实例
先注册华为云账号、做个人实名认证,然后进"统一身份认证 → 我的凭证"拿 API 凭证(IAM 用户名、账号 ID、项目 ID),我用的区域是华北-北京四 cn-north-4。接入信息里确认平台支持 MQTTS(8883)、MQTT(1883) 等协议。


接着在 IoTDA 控制台开一个标准版实例(我取名"咕咕嘎嘎"),状态显示"运行中"就算中转空间搭好了。

5.2 产品与物模型
建了两个产品:
- 温湿度计:
T&H服务,属性temperature(温度)、humidity(湿度) - 智能吸顶灯:
Light服务(属性lightproportion亮度比例、V电压)+Color服务(属性colornow当前颜色、命令"设置颜色")

5.3 MQTT 模拟联调(Publish / Subscribe)
这是模块三里最关键的一步,正好对应你说的"温湿度 Publish 上报、吸顶灯 Subscribe 接收"。
温湿度计(Publish 上报):注册直连设备后,用 MQTT 客户端按 device_id / 密钥 接入,向
$oc/devices/{device_id}/sys/properties/report 周期上报温湿度。平台设备列表显示在线,物模型能看到 temperature=26.8、humidity=62.5 的实时值。


吸顶灯(Subscribe 接收命令):设备侧 Subscribe 订阅命令主题,平台下发"设置颜色"命令,设备回 {"code":0,"message":"success"}。平台日志完整记录了"属性上报→下发命令→设备响应"全过程,colornow 也更新成了 green。


六、模块四:CodeArts 智慧路灯构建与部署
6.1 项目创建与代码托管
CodeArts 里基于"智慧路灯"模板建项目 streetlight,平台自动配好代码仓、制品仓。源码托管在 master 分支,是个标准 Maven 结构的 Spring Boot 应用,核心是通过 IoTDA 数据接入服务读路灯设备数据。
6.2 编译构建
建构建任务 streetlight-26913855,步骤:环境准备 → 代码检出 → Maven 构建 → 上传软件包到软件发布库,产物名 huawei-0.0.1-SNAPSHOT.jar。手动触发后日志一路绿到底,最后 Finished: SUCCESS;软件发布库里也生成了多个版本的 jar 制品。


6.3 本地部署与踩坑(重点)
把 jar 下到本地 Windows,先配 JAVA_HOME 指向 jdk1.8.0_192:

然后 java -jar huawei-0.0.1-SNAPSHOT.jar 启动。第一个坑来了:
login status: HTTP/1.1 401
java.lang.NullPointerException
一开始以为是 jar 坏了,其实是访问凭证没配。在浏览器开 http://127.0.0.1:8080/index.html,到"参数设置"里填齐这些字段就通了:
- 数据接入服务访问密钥 ID / 密钥
- 通道名称(如
lightChannel) - 资源空间 APPID
- API 凭证(账号名 / IAM 用户名 / 密码)
- 项目 ID、产品 ID



配完保存,应用顺利从 IoTDA 拉到设备数据,智慧路灯跑起来了——实训全部内容收工。
七、总结与心得
- 视觉和物联是两半,串起来才是"具身智能":前面相机/OCR、开发板检测解决"能看能认",后面 IoTDA + CodeArts 解决"能上报能被控",补齐了感知到执行的闭环。
- 借力官方样例能省大把时间:昇腾的 ascend-devkit 在线实验、CodeArts 的智慧路灯模板,都是现成的,先把样例跑通再改,比从零搭快得多。
- 两个最常见坑:OpenCV 画不了中文(用中英映射字典绕开)、Spring Boot 启动 401(多半是云平台凭证没填)。
- 真机数据比想像中稳:温湿度、颜色命令、目标检测置信度跑下来都符合预期,说明这套工具链在工程上是能直接用的。
参考资料 / 工具入口
- 海康机器人 MVS 客户端(官网下载)
- PaddleOCR 官方文档
- 华为云 IoTDA、CodeArts 文档中心
- 昇腾 ascend-devkit 在线实验(Atlas 200I DK A2)
更多推荐



所有评论(0)