1. 项目背景与痛点

在鸿蒙应用开发中,AI 能力的集成往往是一个痛点。虽然 MindSpore Lite 支持端侧推理,但模型转换(OMG 工具)、算子兼容性以及 NPU 调度对于普通开发者来说门槛较高,且会显著增加应用包体积和运行时功耗。

如果你的应用场景对实时性要求在 500ms 左右(如健身教学、姿态评估),且希望复用 Python 生态中成熟的 AI 模型(如 OpenPose、YOLO),那么“端侧采集 + 边侧计算”的异构架构是最佳选择。

本项目 “元始太极” 正是基于这一理念构建的 OpenHarmony 原生 AI 太极智能姿态评估系统。它利用 HarmonyOS Next 的原生能力(Camera、Sensor、软总线)进行感知与交互,将复杂的骨骼提取任务交给局域网内的 Python 服务器,实现了低延迟、高精度的太极教学体验。


2. 系统架构设计

本系统采用经典的 “端-边-云” 分层架构,充分发挥不同设备的优势:

  1. 端(Client - HarmonyOS):负责视频采集、传感器防抖监测、UI 渲染以及分布式协同。

  2. 边(Edge - Python):运行 Flask 服务与 AI 模型,负责高性能的骨骼关键点提取。

  3. 云(Cloud - Node.js):负责用户数据管理与多端 Web 看板的数据同步。


3. 核心工作原理

系统的核心闭环流程如下:

  1. 采集:HarmonyOS 端通过 Camera Kit 采集视频流,并按帧截取图片。

  2. 传输:将图片压缩为 JPEG 并转为 Base64,通过 HTTP POST 发送给 Python 边缘服务器。

  3. 推理:Python 端收到图片,调用 AI 模型提取 17 个骨骼关键点。

  4. 评分:基于“向量空间动态锚点匹配算法”计算当前姿态与标准太极动作的相似度。

  5. 反馈:将骨骼坐标与评分返回给端侧,端侧在 Canvas 上绘制骨架并提供语音/震动反馈。


4. 关键技术实现

4.1 鸿蒙端:实时采集与传感器联动

DetectionPage.ets 中,我们不仅处理视频流,还利用 Sensor 子系统监测用户手机的稳定性,防止因设备晃动导致识别不准。

// DetectionPage.ets 核心逻辑
import sensor from '@ohos.sensor';
import { ApiService } from '../services/ApiService';
​
@Entry
@Component
struct DetectionPage {
  @State isDeviceStable: boolean = true;
​
  aboutToAppear() {
    // 启动加速度传感器监听
    sensor.on(sensor.SensorId.ACCELEROMETER, (data) => {
      // 计算合加速度,判断是否抖动
      let acceleration = Math.sqrt(data.x * data.x + data.y * data.y + data.z * data.z);
      if (Math.abs(acceleration - 9.8) > 2.0) {
         this.isDeviceStable = false;
      } else {
         this.isDeviceStable = true;
      }
    }, { interval: 100000000 }); // 100ms 采样
  }
​
  // 发送图片进行检测
  async startDetection(imageBase64: string) {
    if (!this.isDeviceStable) {
       promptAction.showToast({ message: '请保持设备稳定' });
       return;
    }
    // 调用 Python 接口
    const result = await ApiService.getInstance().post('/api/process_base64', {
       image: imageBase64
    });
    // 渲染骨架
    this.drawSkeleton(result.pose_dic);
  }
}

4.2 边缘侧:Python + AI 推理

服务端使用 Flask 搭建,能够直接处理来自鸿蒙端的 Base64 图片流。这种方式完全规避了复杂的模型转换过程,让你能直接使用 PyTorch/TensorFlow 的原版模型。

# app.py 核心接口
@app.route("/api/process_base64", methods=["POST"])
def process_image_base64():
    data = request.json or {}
    img_base64 = data.get("image")
    
    # 1. Base64 解码
    if "," in img_base64:
        img_base64 = img_base64.split(",")[1]
    img_data = base64.b64decode(img_base64)
    
    # 2. 保存为临时文件或直接转换 numpy 数组
    nparr = np.frombuffer(img_data, np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    
    # 3. OpenPose 推理 (image_processor 封装了模型调用)
    result = image_processor.process_cv2_image(img)
    
    return jsonify({
        "people_count": result["people_count"],
        "pose_dic": result["pose_dic"], # 返回关键点坐标
        "score": result["score"]        # 返回评分
    })

4.3 核心算法:向量空间动态锚点匹配

传统的欧氏距离匹配误差较大,我们自研了 加权余弦相似度算法。将人体骨骼抽象为向量,计算用户动作向量与标准库向量的夹角余弦值:

$$
S_{cos} = \frac{\vec{v}_{user} \cdot \vec{v}_{std}}{||\vec{v}_{user}|| \times ||\vec{v}_{std}||}
$$

该算法能有效消除用户身高、体型差异带来的影响,实现“千人千面”的精准评分。


5. 鸿蒙原生特色:分布式协同

利用 HarmonyOS 的分布式软总线技术,我们实现了“一人练,多人看”的场景。通过 @ohos.data.distributedDataObject,主练设备的评分数据可以毫秒级同步到局域网内的平板或 Web 端。

// DistributedService.ets
import distributedDataObject from '@ohos.data.distributedDataObject';
​
export class DistributedService {
  private sessionId: string = "taiji_session_001";
  private object: distributedDataObject.DistributedDataObject;
​
  init() {
    this.object = distributedDataObject.create(this.context, { score: 0, status: 'idle' });
    this.object.setSessionId(this.sessionId);
    
    // 监听数据变更(来自其他设备)
    this.object.on('change', (sessionId, fields) => {
       console.info(`收到协同数据: ${fields}`);
    });
  }
​
  // 同步当前评分
  syncScore(score: number) {
    this.object['score'] = score; // 自动同步到所有组网设备
  }
}

6. 总结

本项目展示了 HarmonyOS 5.0 在 AIoT 领域的强大潜力。通过结合 Python 强大的生态与 HarmonyOS 灵活的分布式能力,我们不仅解决了端侧算力瓶颈,还创造了全新的多端协同教学场景。

如果你也在做鸿蒙 AI 开发,不妨尝试这种 “端侧原生交互 + 边侧 Python 计算” 的模式,既高效又灵活!


文章要求说明:

  • 本文原创,基于 HarmonyOS 5.0+ 开发。

  • 涉及技术:ArkTS, Python, 分布式软总线。

  • 发布时间:2026年1月。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐