具身智能工业视觉实战全记录:昇腾 YOLOv5 目标检测 + 海康相机 EasyOCR + 华为云 IoTDA 与 CodeArts 智慧路灯部署

本文记录一次完整的 具身智能工业视觉 + 物联网 实训过程,覆盖工业相机采集、YOLOv5 目标检测、EasyOCR 文字识别、华为云 IoTDA 设备接入与 CodeArts 智慧路灯部署五大环节,内容可直接复现。

目录


一、整体概览

本次实训围绕「工业视觉」与「物联网」两条主线展开,技术栈如下:

模块核心技术作用
工业视觉采集USB3 Vision / MVS / 昇腾开发板相机驱动、画面采集、远程环境
目标检测YOLOv5(昇腾算力)实时识别画面中的人物、座椅等目标
文字识别海康相机 + EasyOCR实时 OCR 识别并标注置信度
物联平台华为云 IoTDA + MQTT.fx设备建模、注册、数据上报与指令下发
应用部署华为云 CodeArts智慧路灯项目构建与 Spring Boot 部署

在这里插入图片描述
在这里插入图片描述

二、具身智能工业视觉获取与分析应用

2.1 工具软件安装

本阶段完成工业视觉相关驱动与工具的部署安装,具体包括:

  • USB3 Vision 工业相机驱动:安装后设备管理器中正常显示 USB3 Vision Camera 设备,驱动生效;
  • MVS 机器视觉客户端:可成功识别并连接工业相机,输出实时采集画面;
  • USB RNDIS6 网卡驱动:适配昇腾开发板的 USB 网络连接;
  • MobaXterm 远程终端工具:为后续开发板调试提供连接支持。

在这里插入图片描述
在这里插入图片描述

2.2 工业视觉环境构建与应用

配置本地以太网静态 IP,地址设为 192.168.137.101,子网掩码 255.255.255.0,使本地电脑与昇腾开发板处于同一网段,保障网络互通。

通过 MobaXterm 以 SSH 方式登录开发板,进入样例代码目录执行启动脚本,排查脚本权限与格式问题后,成功启动 Jupyter Notebook 服务。终端输出服务访问地址与认证令牌,搭建起远程开发的工业视觉运行环境。

在这里插入图片描述

2.3 昇腾工业视觉终端应用展现

在浏览器访问 Jupyter 服务地址进入 JupyterLab 界面,运行 YOLOv5 目标检测样例代码。程序基于昇腾算力加载 YOLO 模型,对实时画面进行推理,可识别画面中的人物、座椅等物体,用绿色检测框标注目标位置,同时输出识别类别与对应置信度,直观展现昇腾终端的工业视觉实时检测效果。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

3.1 IMA-DS 借力

依托 IMA-DS 工业视觉开发套件完成海康 USB 工业相机的硬件层适配。套件内置相机驱动与图像采集接口,可直接对接 EasyOCR 文字识别算法。对应开发文档明确了 Windows CPU 环境下的相机适配方案与编码框架,快速打通工业相机的图像采集底层链路,为后续 OCR 识别开发提供硬件接入与采集能力支撑。

3.2 运行环境构造

# 创建虚拟环境
python -m venv ocr_env

# 激活虚拟环境(Windows)
ocr_env\Scripts\activate

# 安装依赖包
pip install easyocr opencv-python pillow numpy

3.3 编码实现

核心流程:初始化 SDK → 枚举设备 → 创建句柄 → 打开设备 → 连续取流 → Bayer 转 BGR → 隔帧 OCR → 绘制标注 → 释放资源。

# 导入需要的库
import sys
import os
from ctypes import *
sys.path.append("./MvImport")
from MvImport.MvCameraControl_class import *
import cv2
import numpy as np
import easyocr

# ===================== 初始化OCR模型 =====================
reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)

# ===================== 主函数:相机采集+OCR识别 =====================
def main():
    # 初始化SDK
    MvCamera.MV_CC_Initialize()

    # 枚举设备
    deviceList = MV_CC_DEVICE_INFO_LIST()
    tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
    ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
    if ret != 0:
        print("枚举设备失败 ret[0x%x]" % ret)
        return
    if deviceList.nDeviceNum == 0:
        print("未找到相机")
        return
    print("找到 %d 台相机" % deviceList.nDeviceNum)

    # 选择第0号设备
    cam = MvCamera()
    stDeviceList = cast(deviceList.pDeviceInfo[0], POINTER(MV_CC_DEVICE_INFO)).contents

    # 创建句柄
    ret = cam.MV_CC_CreateHandle(stDeviceList)
    if ret != 0:
        print("创建句柄失败 ret[0x%x]" % ret)
        return

    # 打开设备
    ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
    if ret != 0:
        print("打开设备失败 ret[0x%x]" % ret)
        cam.MV_CC_DestroyHandle()
        return

    # 设置触发模式为关闭(连续采集)
    cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)

    # 开始取流
    cam.MV_CC_StartGrabbing()
    stOutFrame = MV_FRAME_OUT()
    memset(byref(stOutFrame), 0, sizeof(stOutFrame))
    print("相机已启动,按键盘 q 关闭窗口退出程序")

    frame_count = 0
    last_result = []  # 缓存最近一次OCR结果

    while True:
        # 获取一帧图像,超时1000ms
        ret = cam.MV_CC_GetImageBuffer(stOutFrame, 1000)
        if ret == 0:
            stFrameInfo = stOutFrame.stFrameInfo
            width = stFrameInfo.nWidth
            height = stFrameInfo.nHeight

            # 原始Bayer数据转numpy数组
            img_data = string_at(stOutFrame.pBufAddr, stFrameInfo.nFrameLen)
            img = np.ndarray(buffer=img_data, dtype=np.uint8, shape=(height, width))
            # Bayer转彩色BGR
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BAYER_RG2BGR)

            # 缩小用于显示和OCR(大幅提升速度)
            display_w = 960
            display_h = int(height * display_w / width)
            img_small = cv2.resize(img_rgb, (display_w, display_h))

            # 每隔5帧做一次OCR,避免卡顿
            frame_count += 1
            if frame_count % 5 == 0:
                last_result = reader.readtext(img_small)
                # 把识别到的文字打印到cmd窗口
                for bbox, text, conf in last_result:
                    print(f"识别文字:{text}  置信度:{round(conf, 2)}")

            # 在缩小图上绘制OCR结果
            for bbox, text, conf in last_result:
                pts = np.array(bbox, np.int32)
                cv2.polylines(img_small, [pts], True, (0, 255, 0), 2)
                cv2.putText(img_small, text,
                            (int(bbox[0][0]), int(bbox[0][1]) - 5),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

            cv2.imshow("海康USB相机 OCR预览", img_small)
            cam.MV_CC_FreeImageBuffer(stOutFrame)

        # 检测键盘按键
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break

    # 释放资源
    cam.MV_CC_StopGrabbing()
    cam.MV_CC_CloseDevice()
    cam.MV_CC_DestroyHandle()
    MvCamera.MV_CC_Finalize()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

3.4 运行测试

程序运行后,工业相机实时采集画面,识别到的文字用绿色框标注,控制台同步输出识别内容与置信度,整体运行稳定,按键盘 q 键即可退出。
在这里插入图片描述
在这里插入图片描述


四、IoTDA 中转空间构建

本章使用华为云 IoTDA 物联网平台搭建设备接入的中转空间,完成温湿度计、吸顶灯两类设备的模型搭建、设备注册和模拟测试,验证终端设备和平台之间的数据上报、指令下发链路是否通畅。

4.0 IoTDA 简介

IoTDA 是面向物联网场景的设备管理与数据中转平台,相当于终端设备和上层应用之间的「中转站」。它具备以下能力:

  • 支持各类设备统一接入;
  • 自定义设备型号(产品)功能;
  • 存储设备上报的数据;
  • 向设备下发远程控制命令;
  • 监控设备在线状态、身份校验。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.1 产品及其模型构建

在 IoTDA 平台分别创建温湿度计、吸顶灯两类设备产品,完成各自的物模型定义与发布,同步在对应产品下完成设备实例注册。全部配置完成后,在平台设备列表页可查看所有已建设备,页面展示设备状态、设备名称、设备标识码、所属产品、节点类型等信息。

在这里插入图片描述在这里插入图片描述

4.1.1 温湿度计

先在平台新建温湿度计自定义产品,选择直连设备接入方式,填写产品基础信息。接着定义产品物模型,新增温湿度采集服务,添加温度、湿度两个浮点型属性,分别设置单位为摄氏度和 % RH,配置完成后保存并发布物模型。

模型发布后,在该产品下注册名为「大温湿度计」的设备实例,注册完成后设备列表自动生成对应条目,平台为设备分配唯一的设备标识码与设备 ID,作为后续设备接入的身份凭证,节点类型标注为直连设备。

在这里插入图片描述

4.1.2 吸顶灯

按照相同流程创建吸顶灯产品,同样采用直连设备接入方案。定义设备控制服务,添加布尔型的开关状态属性,配置状态上报与命令下发的交互规则,完成后发布产品物模型。

模型发布完成后,注册「大吸顶灯」设备实例,设备列表同步更新对应记录,生成专属设备标识信息,节点类型为直连设备。
在这里插入图片描述

4.2 设备实例化应用

使用 MQTT.fx 客户端模拟真实设备接入 IoTDA 平台,分别完成温湿度计、吸顶灯的设备联调测试,验证设备与平台之间数据上报、指令下发的双向通信链路。

在这里插入图片描述
在这里插入图片描述

4.2.1 温湿度计设备注册及模拟测试

通过 MQTT.fx 配置平台 Broker 地址、端口与温湿度计的设备身份凭证,完成设备接入。向平台上报温度 23、湿度 35 的属性数据后,平台设备详情页显示设备在线,物模型数据与上报值一致,验证温湿度数据上报链路正常。

在这里插入图片描述
在这里插入图片描述

4.2.2 吸顶灯设备注册及模拟测试

完成吸顶灯的 MQTT 接入并订阅平台命令主题,在平台侧下发开关、功率控制指令,设备端可正常接收;设备上报灯光状态数据后,平台物模型同步更新,验证远程控制与状态上报的双向链路通畅。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、CodeArts 智慧路灯快速构建与部署

5.1 应用项目创建

登录华为云 CodeArts 开发平台,依次完成项目与代码仓库的创建。首先新建项目时选择适配物联网项目的开发模板,搭建项目管理与协作框架;随后创建代码仓库,在官方模板库中选用 IoT_Streetlight_Demo 智慧路灯 Java 示例模板,该模板内置路灯应用的基础代码结构与依赖配置,选中后完成仓库初始化,为后续智慧路灯应用的开发与部署提供基础环境。

在这里插入图片描述

在这里插入图片描述

5.2 代码托管操作

仓库创建完成后,智慧路灯项目代码托管在 CodeArts 代码托管服务中。仓库默认 master 分支,包含完整的 Java 项目结构,有源码目录 src、Maven 配置文件 pom.xml、项目说明文档等文件,同时记录了提交次数、分支数量等仓库信息,支持代码版本管理,可直接对接后续构建部署流水线。

在这里插入图片描述

5.3 构建任务设立

在 CodeArts 构建服务中新建构建任务,配置任务基础信息:填写构建任务名称,选定所属的智慧路灯项目,代码源选择平台内置 Repo,关联对应的智慧路灯代码仓库,完成配置后即可进入下一步构建参数设置。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 项目构建实现

构建任务执行完成,环境准备、代码检出、Maven 构建、软件包上传全流程执行成功,构建日志显示最终状态为 SUCCESS,项目 jar 包已成功上传至发布库。

在这里插入图片描述

5.5 项目部署运行

将构建好的应用 jar 包下载到本地,在 PowerShell 中执行以下命令启动 Spring Boot 服务:

java -jar smartlight.jar

服务启动后访问智慧路灯 Web 页面,可进行设备注册、参数设置等操作,完成项目部署运行。

在这里插入图片描述
在这里插入图片描述


六、总结

本次实训完整走通了「工业视觉 → 文字识别 → 物联平台 → 应用部署」的技术链路,主要收获如下:

  1. 工业视觉采集:掌握了 USB3 Vision 相机驱动、MVS 客户端、昇腾开发板网络配置及 Jupyter 远程环境搭建;
  2. 目标检测:基于昇腾算力运行 YOLOv5 实现对实时画面的目标检测与置信度输出;
  3. OCR 识别:通过 IMA-DS 套件 + EasyOCR 完成海康相机实时文字识别,掌握了 Bayer 数据转换、隔帧推理等优化技巧;
  4. 物联平台:熟悉了 IoTDA 的产品建模、设备注册、MQTT 接入及双向通信链路验证;
  5. 应用部署:掌握了 CodeArts 从代码托管、构建到 Spring Boot 部署运行的完整流程。

整个过程技术栈跨度较大,但各环节环环相扣,是一套较完整的「端—边—云」一体化实践案例。


标签:华为云 IoTDA CodeArts 昇腾 YOLOv5 EasyOCR 工业视觉 具身智能 MQTT 智慧路灯 Spring Boot

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐