#我的鸿蒙开发手记# 关于学习——昇思推理框架服务:MindSpore Lite Kit技术解析与实践 原创

一行袋码
发布于 2025-5-4 19:57
浏览
1收藏

一、背景

在AI技术大规模落地的进程中,模型推理框架作为连接算法研究与产业应用的关键枢纽,正面临前所未有的技术挑战。传统云端推理模式受限于网络延迟、数据隐私和算力成本,已难以满足智能制造、自动驾驶、移动医疗等场景的实时性需求。MindSpore Lite Kit作为华为昇腾生态体系中的重要推理框架,通过全场景协同架构、极简推理引擎和硬件级安全机制,正在重塑边缘智能计算范式。

二、使用场景

++图像分类++:最基础的计算机视觉应用,属于有监督学习类别,如给定一张图像(猫、狗、飞机、汽车等等),判断图像所属的类别。
++目标检测++:您可以使用预置目标检测模型,检测标识摄像头输入帧中的对象并添加标签,并用边框标识出来。
++图像分割++:图像分割可用于检测目标在图片中的位置或者图片中某一像素是输入何种对象的。

三、使用MindSpore Lite实现图像分类(ArkTS)

第一步本示例程序中使用的图像分类模型文件为mobilenetv2.ms,链接如下:"https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite/1.5/mobilenetv2.ms"放置在entry/src/main/resources/rawfile工程目录下。

#我的鸿蒙开发手记# 关于学习——昇思推理框架服务:MindSpore Lite Kit技术解析与实践-鸿蒙开发者社区
第二步:文件夹路径如下

#我的鸿蒙开发手记# 关于学习——昇思推理框架服务:MindSpore Lite Kit技术解析与实践-鸿蒙开发者社区

第三步:目录内容如下

entry/src/main/ets/pages/ImageClassify.ets:

@Entry
@Component
struct ImageClassifyPage {
  @State selectedImage: PixelMap | null = null;
  @State topResults: Array<{label: string, confidence: number}> = [];

  build() {
    Column() {
      Button("选择图片")
        .onClick(() => this.pickImage())
      
      if (this.selectedImage) {
        Image(this.selectedImage)
          .width(300)
          .height(300)
      }
      
      List({ space: 10 }) {
        ForEach(this.topResults, (item) => {
          ListItem() {
            ClassResultItem({ label: item.label, confidence: item.confidence })
          }
        })
      }
    }
  }
}

entry/src/main/ets/model/ModelLoader.ets:

import { mindSporeLite } from '@kit.MindSporeLiteKit';

export async function createInferenceSession(): Promise<mindSporeLite.Model> {
  const context: mindSporeLite.Context = {
    target: ['cpu'],
    cpu: { threadNum: 4 }
  };

  const modelBuffer = await loadModel();
  return mindSporeLite.loadModelFromBuffer(modelBuffer, context);
}

entry/src/main/ets/utils/ImageUtils.ets

import { image } from '@kit.ImageKit';

export async function processImage(pixelMap: image.PixelMap): Promise<Float32Array> {
  const normalizedData = new Float32Array(224 * 224 * 3);
  
  // 裁剪+缩放
  await pixelMap.scale(256 / pixelMap.getImageInfo().width, 256 / pixelMap.getImageInfo().height);
  await pixelMap.crop({ x: 16, y: 16, size: { width: 224, height: 224 } });
  
  // 读取像素数据
  const pixelBuffer = new ArrayBuffer(224 * 224 * 4);
  await pixelMap.readPixelsToBuffer(pixelBuffer);
  
  // 归一化处理
  const uint8Array = new Uint8Array(pixelBuffer);
  let offset = 0;
  for (let i = 0; i < uint8Array.length; i += 4) {
    normalizedData[offset++] = (uint8Array[i] / 255 - 0.485) / 0.229;  // R
    normalizedData[offset++] = (uint8Array[i+1] / 255 - 0.456) / 0.224; // G 
    normalizedData[offset++] = (uint8Array[i+2] / 255 - 0.406) / 0.225; // B
  }
  
  return normalizedData;
}

syscap.json 系统能力声明

{
  "devices": {
    "general": ["default"]
  },
  "development": {
    "addedSysCaps": [
      "SystemCapability.AI.MindSporeLite",
      "SystemCapability.Multimedia.Image",
      "SystemCapability.FileManagement.File.IO"
    ]
  }
}

module.json5 (模块配置)

{
  "module": {
    "name": "entry",
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "用于访问用户选择的图片"
      },
      {
        "name": "ohos.permission.MEDIA_LOCATION",
        "reason": "获取图片地理位置信息"
      }
    ],
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/EntryAbility/EntryAbility.ets",
        "visible": true
      }
    ]
  }
}

四、测试验证

在DevEco Studio中连接设备,点击Run entry,编译Hap,有如下显示:

Launching com.samples.mindsporelitearktsdemo
$ hdc shell aa force-stop com.samples.mindsporelitearktsdemo
$ hdc shell mkdir data/local/tmp/xxx
$ hdc file send C:\Users\xxx\MindSporeLiteArkTSDemo\entry\build\default\outputs\default\entry-default-signed.hap "data/local/tmp/xxx" 
$ hdc shell bm install -p data/local/tmp/xxx
$ hdc shell rm -rf data/local/tmp/xxx
$ hdc shell aa start -a EntryAbility -b com.samples.mindsporelitearktsdemo

五、可以启用NPU加速

// 修改ModelLoader.ets中的context配置
const context: mindSporeLite.Context = {
  target: ['npu', 'gpu'], // 优先使用NPU
  cpu: { threadNum: 2 }
};

六、结语

通过以上案例我们可以实现昇思推理框架服务,欢迎讨论

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2025-5-5 23:28:27修改
收藏 1
回复
举报
回复
    相关推荐