1 工效组合展示

本次实训主要完成工业视觉识别+物联网设备接入+云端项目部署整套流程。通过端侧智能视觉设备采集画面、AI识别分析,再通过物联网平台转发设备数据,最后用云端工具完成项目搭建与部署,实现工业智能可视化监测与设备远程控制。

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

2.1 工具软件安装

安装本次实训所需配套软件与Python视觉依赖库,配置系统环境变量,解决版本兼容问题,确保后续图像处理、代码运行、设备调试工具可以正常使用。

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

搭建本地工业视觉运行环境,配置图像采集参数,完成图片读取、降噪、预处理等基础功能测试。模拟工业场景,验证环境可以正常完成视觉数据采集和简单分析。

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

连接昇腾工业视觉终端设备,完成设备联网与调试。利用终端摄像头实时采集现场画面,实现端侧实时图像采集、视觉分析,展示硬件终端的智能视觉感知能力。

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

3.1 IMA-DS借力

使用IMA-DS智能开发工具,调用内置工业视觉算法模板,复用成熟代码框架,快速搭建视觉识别程序,减少重复开发,提升编码效率。

3.2 运行环境构造

配置算法运行环境,补齐依赖库,适配昇腾终端运行参数,导入测试数据集,完成环境校验,保证代码可以正常编译和运行。

3.3 编码实现

基于模板编写工业视觉识别代码,实现图像采集、预处理、目标识别、结果输出功能。根据实训场景微调代码参数,保证识别效果适配工业场景。

# -*- coding: utf-8 -*-
"""
网络摄像机实时 OCR 文字识别(支持中文,CPU 运行)
用法:
    python ocr_camera.py --image test.jpg                     # 单图测试
    python ocr_camera.py --url "rtsp://用户:密码@IP:554/..."   # 实时识别
窗口操作:q / ESC 退出,s 保存画面。
"""
import argparse
import os
import time
import cv2
import numpy as np

_WIN_FONTS = [
    r"C:\Windows\Fonts\msyh.ttc",     # 微软雅黑
    r"C:\Windows\Fonts\msyhbd.ttc",
    r"C:\Windows\Fonts\simhei.ttf",   # 黑体
    r"C:\Windows\Fonts\simsun.ttc",   # 宋体
]

def load_font(size=22):
    from PIL import ImageFont
    for path in _WIN_FONTS:
        if os.path.exists(path):
            try:
                return ImageFont.truetype(path, size)
            except Exception:
                continue
    print("[警告] 未找到中文字体,画面中文标签可能显示为方块(不影响识别)。")
    return ImageFont.load_default()

def init_ocr():
    from paddleocr import PaddleOCR
    return PaddleOCR(
        use_angle_cls=True,   # 方向分类,提升旋转/竖排识别
        lang="ch",            # 中文+英文
        use_gpu=False,        # CPU 推理
        show_log=False,
    )

def parse_ocr_result(result):
    items = []
    if not result:
        return items
    page = result
    if isinstance(result, list) and len(result) == 1 and isinstance(result[0], list):
        page = result[0]
    for det in page:
        if det is None:
            continue
        try:
            box, (text, score) = det[0], det[1]
        except (TypeError, ValueError, IndexError):
            continue
        pts = np.array(box, dtype=np.int32).reshape(-1, 2)
        items.append((pts, str(text), float(score)))
    return items

def run_ocr_once(ocr, frame):
    return parse_ocr_result(ocr.ocr(frame, cls=True))

def draw_results(img, items, font, fps):
    for pts, _t, _s in items:
        cv2.polylines(img, [pts], True, (0, 255, 0), 2)
    cv2.putText(img, f"FPS: {fps:.1f}", (10, 28),
                cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
    if items:
        from PIL import Image, ImageDraw
        rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        pil = Image.fromarray(rgb)
        draw = ImageDraw.Draw(pil)
        for pts, text, score in items:
            x, y = int(pts[:, 0].min()), int(pts[:, 1].min())
            draw.text((x, max(0, y - 28)), f"{text} ({score:.2f})",
                      font=font, fill=(0, 255, 0))
        img = cv2.cvtColor(np.array(pil), cv2.COLOR_RGB2BGR)
    return img

def open_camera(url):
    cap = cv2.VideoCapture(url, cv2.CAP_FFMPEG)
    if not cap.isOpened():
        return None
    cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
    return cap

def camera_loop(ocr, url, interval, save_dir, font):
    cap = open_camera(url)
    if cap is None:
        print("[错误] 无法打开摄像机,请先用 VLC 测试该地址。")
        return
    print(f"[信息] 已连接:{url}")
    if save_dir:
        os.makedirs(save_dir, exist_ok=True)
    cv2.namedWindow("OCR - 网络摄像机", cv2.WINDOW_NORMAL)
    items, last_ocr, t0, frame_count, fps = [], 0.0, time.time(), 0, 0.0
    while True:
        ok, frame = cap.read()
        if not ok:
            print("[警告] 读取失败,重连...")
            cap.release(); time.sleep(2)
            cap = open_camera(url)
            if cap is None:
                time.sleep(3); continue
            print("[信息] 重连成功。"); continue
        now = time.time(); frame_count += 1
        if now - t0 >= 1.0:
            fps = frame_count / (now - t0); frame_count = 0; t0 = now
        if now - last_ocr >= interval:
            items = run_ocr_once(ocr, frame); last_ocr = now
            for _p, text, score in items:
                print(f"[识别] {text}  置信度 {score:.3f}")
        frame = draw_results(frame, items, font, fps)
        cv2.imshow("OCR - 网络摄像机", frame)
        key = cv2.waitKey(1) & 0xFF
        if key in (ord("q"), 27):
            break
        elif key == ord("s") and save_dir:
            p = os.path.join(save_dir, f"ocr_{time.strftime('%Y%m%d_%H%M%S')}.jpg")
            cv2.imwrite(p, frame); print(f"[保存] {p}")
    cap.release(); cv2.destroyAllWindows()

def image_mode(ocr, image_path, font):
    frame = cv2.imread(image_path)
    if frame is None:
        print("[错误] 无法读取图片。"); return
    items = run_ocr_once(ocr, frame)
    print("\n================ 识别结果 ================")
    for _p, text, score in items:
        print(f"{text}\t置信度 {score:.3f}")
    print("==========================================\n")
    frame = draw_results(frame, items, font, 0)
    cv2.imshow("OCR 结果", frame); cv2.waitKey(0); cv2.destroyAllWindows()

def main():
    ap = argparse.ArgumentParser(description="网络摄像机实时 OCR(中文,CPU)")
    ap.add_argument("--url", default="", help="摄像机 RTSP/HTTP 地址")
    ap.add_argument("--image", default="", help="单图测试路径")
    ap.add_argument("--interval", type=float, default=1.0, help="OCR 间隔秒")
    ap.add_argument("--save", default="", help="保存截图目录")
    args = ap.parse_args()
    if not args.url and not args.image:
        ap.print_help(); return
    print("[信息] 初始化 PaddleOCR(首次自动下载模型)...")
    ocr = init_ocr(); font = load_font(22)
    if args.image:
        image_mode(ocr, args.image, font)
    else:
        camera_loop(ocr, args.url, args.interval, args.save, font)

if __name__ == "__main__":
    main()

3.4 运行测试

本地调试代码,排查报错,连接昇腾终端进行实景测试。测试识别准确率、运行速度,优化程序,最终实现稳定的工业视觉识别功能。

4 IoTDA中转空间构建

4.0 IoTDA构造

登录物联网IoTDA平台,创建实训项目空间,配置设备接入、数据转发权限,搭建云端数据中转环境,为后续设备上云做准备。

4.1 产品及其模型构建

4.1.1 温湿度计

在平台新建温湿度计产品,定义设备数据模型,设置温度、湿度、设备在线状态等属性,配置数据上报和查询功能,完成设备云端建模。

4.1.2 吸顶灯

新建吸顶灯产品,定义灯具开关、亮度、色温等设备属性,配置云端控制指令,支持远程开关灯、调参等控制功能。

4.2 设备实例化应用

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

在对应产品下注册设备实例,获取设备密钥并完成设备绑定。启动模拟设备,测试数据上云,查看平台能否正常接收温湿度数据、查询设备状态。

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

注册吸顶灯设备并完成上云配置。通过云端平台下发控制指令,测试远程开灯、关灯、调光功能,验证设备可正常响应云端命令。

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

5.1 应用项目创建

进入CodeArts云端开发平台,新建智慧路灯项目,规划项目目录与功能模块,初始化项目运行环境。

5.2 代码托管操作

将项目代码上传至云端代码仓库,完成代码托管、版本管理,实现代码云端保存、随时更新与回溯。

5.3 构建任务设立

新建项目构建任务,绑定代码仓库,配置编译环境、依赖参数与触发规则,设置自动化构建条件。

5.4 项目构建实现

启动云端自动构建,平台自动拉取代码、编译、打包。排查构建报错,生成可部署的项目运行安装包。

5.5 项目部署运行

将构建好的智慧路灯项目部署到云端服务器,启动项目并测试功能,验证项目可以正常联网、接收设备数据、实现路灯智能管控,完成整体实训部署。

Logo

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

更多推荐