具身智能工业视觉分析与物联监护应用演练
具身智能工业视觉分析与物联监护应用演练
1 工效组合展示
本节展示本次实训的整体工位组合。工作台由笔记本开发机、显示器、USB 工业相机与昇腾 Atlas 200I DK A2 开发板组成:画面左上为本机摄像头实时取景,右侧终端为基于 PaddleOCR 的汉字识别程序运行结果,二者与昇腾工业视觉终端协同,构成"图像采集—模型识别—结果输出"的完整演示链路,直观体现了具身智能在工业现场"人机协同、眼脑一体"的应用形态。

2 具身智能工业视觉获取与分析应用
2.1 工具软件安装
首先在 Windows 开发机上完成基础工具链安装:远程终端工具 MobaXterm 22.2、文件传输工具 FileZilla、以及海康机器人工业视觉客户端 MVS STD 4.2.2。安装后在设备管理器中确认 USB3 Vision 工业相机被正确枚举识别;随后将网卡 IPv4 地址静态配置为 192.168.137.100,与昇腾终端处于同一网段,为后续直连调试做好准备。



2.2 工业视觉环境构建与应用
通过 VSCode 远程开发方式连接 Atlas 200I DK A2 开发者套件,完成工业视觉开发环境构建。借助远端 Python 环境与昇腾 AI 软件栈(CANN),可在本机编辑代码的同时直接调用开发板算力进行调试,实现"本地编码、远端运行"的高效开发模式。

2.3 昇腾工业视觉终端应用展现
使用 MobaXterm 通过 SSH 登录昇腾开发板(root@192.168.137.100),在板端启动 Jupyter Notebook 服务并从浏览器访问。选取 Atlas 200I A2 官方样例仓中的 YOLOx 目标检测样例,按文档完成模型转换(PyTorch→OM)与推理脚本运行,验证了昇腾终端的端侧推理能力,工业视觉算法可以在端侧高效执行。




3 具身智能工业视觉识别快速编码实现

3.1 IMA-DS借力
本节借助 AI 大模型(IMA-DS)辅助学习与开发:通过查阅 Python 官方 venv 文档并向大模型提问,快速掌握了在不使用 conda 的前提下,于 Windows、纯 CPU 环境中创建 Python 虚拟环境并完成中文 OCR 识别程序开发的完整方法——即用 python -m venv 创建独立环境,用 pip 安装 PaddleOCR 及其依赖,再结合 OpenCV 调用本机摄像头实现拍照识别汉字。

3.2 运行环境构造
使用 python -m venv venv 命令创建独立虚拟环境,并通过 venv\Scripts\activate 激活。创建完成后,项目目录下会出现独立的 venv 文件夹,该环境与系统 Python 完全隔离,有效避免了依赖版本冲突。


3.3 编码实现
完整代码如下。程序基于 PaddleOCR 实现,支持两种运行模式:不带参数运行时打开本机摄像头,按【空格键】或【s】拍照并识别汉字;带图片路径参数运行时直接识别本地图片。考虑到 Windows 控制台的中文兼容性,程序启动时统一将标准输出重配置为 UTF-8 编码;由于 OpenCV 原生无法绘制中文,识别框与文字标注借助 PIL 中文字体完成,最终将文字区域、识别内容及置信度实时标注在画面上。
# -*- coding: utf-8 -*-
"""
中文 OCR 文字识别程序(CPU 版 / Windows / 非 conda)
功能:
1. 直接运行(不带参数):打开摄像头,按【空格键】或【s】拍照识别汉字
2. 识别本地图片:python ocr_camera.py 图片路径.jpg
使用前提:
- 已安装 Python 3.9 ~ 3.11(推荐 3.11)
- 已用 pip 安装 paddlepaddle、paddleocr、opencv-python 等依赖
"""
import os
import sys
# Windows 控制台输出中文时避免乱码
if sys.platform == "win32":
try:
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")
except Exception:
pass
import cv2
import numpy as np
from paddleocr import PaddleOCR
from PIL import Image, ImageDraw, ImageFont
def get_chinese_font(size=22):
"""加载 Windows 自带的中文字体(用于在图片上写中文)"""
candidates = [
"C:/Windows/Fonts/msyh.ttc", # 微软雅黑
"C:/Windows/Fonts/simhei.ttf", # 黑体
"C:/Windows/Fonts/simsun.ttc", # 宋体
]
for path in candidates:
if os.path.exists(path):
try:
return ImageFont.truetype(path, size)
except Exception:
continue
return ImageFont.load_default()
def draw_result(image_bgr, ocr_lines):
"""把识别到的文字框和文字画到图片上"""
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(image_rgb)
draw = ImageDraw.Draw(pil_img)
font = get_chinese_font(22)
for line in ocr_lines:
box = line[0] # 文本框的四个顶点坐标
text = line[1][0] # 识别出来的文字
score = line[1][1] # 置信度(0~1,越高越可信)
pts = [(int(p[0]), int(p[1])) for p in box]
draw.polygon(pts, outline=(0, 255, 0), width=2) # 画绿色边框
x, y = pts[0][0], pts[0][1] - 28
if y < 0:
y = pts[0][1]
label = f"{text} ({score:.2f})"
draw.text((x, y), label, fill=(255, 0, 0), font=font) # 写红色文字
return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
def print_result(ocr_lines):
"""在控制台(黑色窗口)里打印识别结果"""
print("\n" + "=" * 40)
print("识别结果:")
for i, line in enumerate(ocr_lines, 1):
text = line[1][0]
score = line[1][1]
print(f" {i}. {text} (置信度 {score:.2f})")
print("=" * 40 + "\n")
def recognize_image(ocr, image_bgr, show=True):
"""识别一张图片里的文字"""
result = ocr.ocr(image_bgr, cls=True)
lines = result[0] if result else []
if not lines:
print("未识别到文字,请调整角度、光线或距离后再试。")
return None
print_result(lines)
if show:
annotated = draw_result(image_bgr, lines)
cv2.imshow("OCR Result (按任意键关闭)", annotated)
cv2.waitKey(0)
return lines
def open_camera():
"""尝试打开摄像头(先试编号 0,再试编号 1)"""
for idx in [0, 1]:
cap = cv2.VideoCapture(idx, cv2.CAP_DSHOW) # Windows 下用 DSHOW 打开更快
if cap.isOpened():
return cap
return None
def run_camera(ocr):
"""打开摄像头,实时预览,按键拍照识别"""
cap = open_camera()
if cap is None:
print("【错误】无法打开摄像头!请确认摄像头已连接、未被其他程序占用。")
return
print("\n操作说明:")
print(" 按【空格键】或【s】 = 拍照并识别")
print(" 按【q】 = 退出程序\n")
while True:
ret, frame = cap.read()
if not ret:
print("【错误】读取摄像头画面失败。")
break
cv2.imshow("Camera (Space=识别, q=退出)", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
elif key == ord(" ") or key == ord("s"):
print("正在识别,请稍候...")
recognize_image(ocr, frame)
cap.release()
cv2.destroyAllWindows()
def main():
print("=" * 50)
print(" 中文 OCR 文字识别程序(CPU 版)")
print("=" * 50)
# 初始化 OCR 引擎(第一次运行会自动下载中文模型,需要联网)
print("正在加载 OCR 模型,首次运行会自动下载,请耐心等待...")
ocr = PaddleOCR(use_angle_cls=True, lang="ch", show_log=False)
print("模型加载完成!\n")
if len(sys.argv) > 1:
# 用法二:识别本地图片
image_path = sys.argv[1]
if not os.path.exists(image_path):
print(f"【错误】找不到图片文件:{image_path}")
return
print(f"正在识别图片:{image_path}")
image = cv2.imread(image_path)
if image is None:
print("【错误】无法读取该图片,请确认是 jpg/png 等常见格式。")
return
recognize_image(ocr, image)
else:
# 用法一:打开摄像头
run_camera(ocr)
cv2.destroyAllWindows()
print("程序已退出。")
if __name__ == "__main__":
main()

上图为程序运行的实际识别效果:摄像头拍摄中文文本后,PaddleOCR 完成检测与识别,绿色框标出文字区域并输出结果与置信度。
3.4 运行测试

运行程序后,首次执行会自动下载 PaddleOCR 中文识别模型,稍候片刻即可加载完成。摄像头窗口正常弹出,对准书本上的汉字按【空格键】拍照,控制台随即输出识别结果及各条目置信度,结果图中以绿框标注出每个文字区域。经不同角度、不同光线条件多次测试,程序运行稳定,对印刷体汉字识别准确率高,验证了虚拟环境构造与编码实现的正确性。
4 IoTDA中转空间构建
4.1 IoTDA构造
登录华为云控制台,开通设备接入服务 IoTDA 并创建标准实例 yy(华北-北京四)。




在 IoTDA 控制台依次创建"温湿度计"与"智能吸顶灯"两个产品,接入协议均采用 MQTT,产品模型通过导入 JSON 文件方式快速生成,如图所示。
4.2 产品及其模型构建
4.2.1 温湿度计
创建产品"温湿度计",定义服务 T&H 并添加两个属性:temperature(decimal,可读可写,表示环境温度)与 humidity(decimal,可读,表示环境湿度),用于描述设备上报的环境温湿度数据。

4.2.2 吸顶灯
创建产品"智能吸顶灯",定义服务 Light,属性包括 LightIntensity(亮度,decimal,可读可写)、power(功率,decimal,可读)、color(颜色,string,可读可写),并添加命令 turn_power 用于远程开关灯,构成"属性上报 + 命令下发"的完整物模型。

4.3 设备实例化应用
4.3.1 温湿度计设备注册及模拟测试
注册设备"卧室的温湿度计",获得设备标识后,使用 MQTT 客户端工具连接华为云 IoT 平台,设备随即显示在线。向属性上报主题 $oc/devices/{device_id}/sys/properties/report 发布 JSON 报文,上报 temperature 26.5、humidity 55,平台侧设备详情页实时刷新出最新数值,验证了设备数据上行链路的正确性。



4.3.2 吸顶灯设备注册及模拟测试
以同样方式注册设备"卧室的吸顶灯"并通过 MQTT 工具模拟上线。通过发布属性报文设置 LightIntensity 320、power 120.5、color BLUE 等属性值,设备详情页均能正确展示;再通过平台侧下发 turn_power 命令,模拟终端可正常收到命令并回执,验证了命令下行链路。至此,"设备—平台—应用"的双向数据通道全部打通。




5 CodeArts智慧路灯快速构建与部署
5.1 应用项目创建
登录华为云 CodeArts,新建 Scrum 项目 IoT_Streetlight_Demo;随后在"按模板新建"中搜索官方提供的 IoT_Streetlight_Demo 智慧路灯模板(基于华为云 IoT 最佳实践),选择"按模板新建"完成项目初始化,自动生成代码仓与配套的构建、部署资源。


5.2 代码托管操作
进入代码托管服务,可以看到模板自动创建的 IoT_Streetlight_Demo 代码仓,包含 src 源码目录、pom.xml 构建脚本、README 等文件,master 分支提交记录完整,后续的构建与部署均基于该仓库进行。

5.3 构建任务设立
在持续交付中新建构建任务,代码源选择 _repo 下的 IoT_Streetlight_Demo 仓库 master 分支;构建模板选择 Maven,与该 Java 工程的构建方式相匹配。


5.4 项目构建实现
点击执行构建,任务自动完成环境准备、代码拉取与 Maven 构建,日志显示工程成功编译并打包出 IoT_Streetlight-1.0.0-SNAPSHOT.jar,构建产物同步上传至软件发布库。

5.5 项目部署运行
构建任务执行成功,环境准备、代码拉取、执行构建、Maven 构建、上传软件包到软件发布库等步骤全部通过并显示 SUCCESS;随后通过部署任务将应用发布运行,完成智慧路灯应用从代码提交到构建上线的一站式闭环。

6 实训总结
本次实训围绕"视觉感知—智能识别—物联互联"三条主线展开:首先搭建了由 MobaXterm、MVS、VSCode 组成的开发工具链,完成昇腾 Atlas 200I DK A2 工业视觉终端的环境构建与 YOLOx 样例验证;随后在 Windows、纯 CPU 环境下,借助 venv 虚拟环境与大模型辅助编码,实现了基于 PaddleOCR 的摄像头汉字识别程序;最后基于华为云 IoTDA 完成产品与物模型定义、设备注册与 MQTT 模拟联调,并通过 CodeArts 一站式完成智慧路灯应用的创建、代码托管、构建与部署。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)