HarmonyOS 鸿蒙Next中视觉识别如何识别物体的名称

HarmonyOS 鸿蒙Next中视觉识别如何识别物体的名称 视觉识别如何识别物体的具体名称,例如用户选择一张食物照片,里面有香蕉,苹果,牛奶等,我希望识别可以具体到一个特定类型的物品(香蕉,苹果,牛奶等)。这种该怎么实现

10 回复

使用 objectDetection 模块检测图像中的物体类别并获取其边界框

import { objectDetection, visionBase } from '[@kit](/user/kit).CoreVisionKit';
// 实例化检测器并处理图像
let detector: objectDetection.ObjectDetector = new objectDetection.ObjectDetector();
let request: visionBase.Request = { pixelMap: this.chooseImage };
detector.detect(request).then((response: objectDetection.ObjectDetectionResponse) => {
  let objects = response.objects; // 包含所有检测到的物体信息
});

结合华为ML Kit的图像分类能力(需额外集成 @kit.ImageClassificationKit),对多目标识别得到的每个物体区域进行二次分类

import { imageClassification } from '[@kit](/user/kit).ImageClassificationKit';
// 截取物体区域图像
let cropOptions: image.CropArea = { 
  x: boundingBox.x, 
  y: boundingBox.y, 
  width: boundingBox.width, 
  height: boundingBox.height 
};
let cropPixelMap = await image.createPixelMap(cropArea, this.chooseImage);
// 调用分类模型
let classifier = imageClassification.createClassifier();
let classificationResult = await classifier.classify(cropPixelMap);

更多关于HarmonyOS 鸿蒙Next中视觉识别如何识别物体的名称的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


通过Core Vision Kit的objectDetection模块可以实现多目标识别,但是Core Vision Kit预定义的标签仅支持到食物层级,无法直接识别具体‘香蕉’这种名称。你试试结合OCR识别:

通过boundingBox坐标裁剪出食物区域图像:

const region = obj.boundingBox; // 获取边界框

const croppedImage = cropImage(imageSource, region); // 自定义裁剪函数

可通过OCR提取文字确定具体名称:

import { ocr } from '@kit.CoreVisionKit';

const ocrRequest = new visionBase.Request();

ocrRequest.image = croppedImage;

const ocrResponse = await ocr.TextDetector.detect(ocrRequest);

console.log(`识别文本:${ocrResponse.text}`); // 输出包装上的文字

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

objectDetection多目标检测的api,我看过,只能识别到大的分类,

MindSpore Lite使用.ms格式模型进行推理。
对于第三方框架模型,比如cnn(支持物品识别)、TensorFlow、TensorFlow Lite、Caffe、ONNX等,可以使用MindSpore Lite提供的模型转换工具转换为.ms模型,使用方法可参考推理模型转换

转化为.ms模型之后就可以使用MindSpore Lite识别照片中具体物品名称了。

感谢回答,我自己再研究一下,

您描述的需求属于图像分类 (Image Classification) 和更精确的目标检测 (Object Detection) 任务。MindSpore Lite 正是用于完成这类任务的工具。

实现方案概述

整个实现流程可以概括为以下几步,这也是文档中提到的开发流程:

  1. 选择并准备模型:选择一个预训练好的、能够识别多种物品(尤其是食物)的AI模型。
  2. 集成推理引擎:在您的应用中集成 MindSpore Lite,作为运行模型的核心引擎。
  3. 处理用户输入:获取用户选择的图片,并进行预处理(缩放、归一化等),使其符合模型的输入要求。
  4. 执行推理:将处理好的图片输入模型,由 MindSpore Lite 进行计算。
  5. 解析输出:获取模型输出的结果(通常是每个类别的概率),解析出最可能的几个物品名称。

详细开发步骤(基于鸿蒙文档内容)

鸿蒙文档提供了两种方式的指南:《使用MindSpore Lite实现图像分类(C/C++)》和《使用MindSpore Lite实现图像分类(ArkTS)》。您可以根据您的应用开发技术栈选择其一。

方式一:使用 Native(C/C++)开发(高性能,适用于复杂计算)

文档名:《mindspore-guidelines-based-native.md

  1. 环境准备

    • 确保 DevEco Studio >= 4.1,SDK >= API 11。
  2. 选择模型

    • 您需要一个预训练好的图像分类模型(.ms 格式)。例如,可以选择在 ImageNet 数据集上预训练的模型(可识别1000种常见物体,包括各种食物),或者寻找专门针对食物识别的模型。
    • 根据文档提示,如果找到的是其他格式(如 TensorFlow 的 .pb 或 PyTorch 的 .pt),需要使用 MindSpore Lite 模型转换工具 将其转换为 .ms 格式。
    • 将转换好的模型文件(如 mobilenetv2.ms)放入项目的 resources/rawfile/ 目录下。
  3. 编写代码

    • 初始化 MindSpore Lite:加载模型,创建推理会话(Session)。
    • 图片预处理
      • 读取图片:使用系统接口获取用户选择图片的 URI 或路径。
      • 解码与变换:将图片解码为像素数据,然后进行缩放、裁剪至模型要求的输入尺寸(如 224x224),并进行颜色通道转换(BGR2RGB)、归一化(如像素值从 [0, 255] 缩放到 [-1, 1] 或 [0, 1])等操作。这个过程需要您使用系统API(如 PixelMap)或第三方库(如 stb_image)来实现。
    • 执行推理
      • 将预处理后的图片数据填充到模型的输入 Tensor 中。
      • 调用 session.Run() 进行推理。
    • 解析结果
      • 获取输出 Tensor,它是一个概率数组。例如,一个长度为1000的数组,每个值代表模型认为图片属于对应类别(如“香蕉”、“苹果”)的概率。
      • 找到最大概率值的索引:这个索引号对应着类别标签。
      • 查询标签文件:模型本身不存储名称,只输出索引。您需要一个与模型训练时对应的 labels.txt 文件(例如 ImageNet 的标签文件),通过索引去这个文件中查找对应的具体物品名称(如 “banana”, “apple”)。
      • 显示结果:将识别出的名称和置信度展示给用户。

方式二:使用 ArkTS(JS)开发(更便捷,与UI结合更紧密)

文档名:《mindspore-guidelines-based-js.md

步骤与 Native 方式类似,但使用的是 @ohos.ai.mindSporeLite 这个 ArkTS API,与鸿蒙的 UI 开发范式结合更简单。

  1. 环境准备:同上。
  2. 选择模型:同上,将 .ms 模型放入 resources/rawfile/
  3. 编写代码(关键代码来自文档片段):
    • 导入模块import mindSporeLite from '@ohos.ai.mindSporeLite';
    • 加载模型
      let modelBuffer = await context.resourceManager.getRawFileContent('mobilenetv2.ms');
      let model = mindSporeLite.loadModelFromBuffer(modelBuffer);
      
    • 获取用户图片(文档中示例):
      let photoPicker = new photoAccessHelper.PhotoViewPicker();
      photoPicker.select(photoSelectOptions, async (err, photoSelectResult) => {
        if (err) { ... return; }
        this.uris = photoSelectResult.photoUris;
        // 使用 fileIo.openSync 和 fileIo.readSync 读取图片文件数据
        let file = fileIo.openSync(this.uris[0], fileIo.OpenMode.READ_ONLY);
        let inputBuffer = new ArrayBuffer(4096000);
        let readLen = fileIo.readSync(file.fd, inputBuffer);
        // 使用 PixelMap 对图片进行预处理(缩放、裁剪等)
        // ... (这里需要详细的预处理代码)
      });
      
    • 执行推理与解析结果
      • 创建输入 Tensor 并填入预处理后的数据。
      • model.run(inputTensor, outputTensor)
      • outputTensor 中获取数据,并同样通过查询 labels.txt 文件来将索引转换为具体名称。

总结与建议

步骤 关键动作 说明
1. 模型 获取或转换一个 .ms 格式的预训练图像分类模型 这是核心,模型的能力决定了能识别哪些物品。
2. 集成 在代码中集成 MindSpore Lite 使用提供的 API 加载和运行模型。
3. 预处理 将用户图片处理成模型需要的输入格式 非常重要的一步,直接影响识别准确性。包括解码、缩放、裁剪、归一化等。
4. 推理 调用 run 方法 MindSpore Lite 负责计算。
5. 后处理 解析结果,查询标签文件 将模型输出的数字索引转换成人类可读的物品名称。

如何识别得更准?

  • 模型选择:选择在大型数据集(如 ImageNet)上训练好的、精度高的模型(如 MobileNetV2, EfficientNet-Lite)。
  • 专用模型:如果您的应用只针对食物,可以寻找专门在食物数据集上训练的模型,准确率会远高于通用模型。
  • 预处理:务必保证预处理流程与模型训练时的流程完全一致(相同的尺寸、相同的归一化方式)。

根据鸿蒙文档,实现“识别照片中具体物品名称”的功能是完全可行的,MindSpore Lite 提供了所需的核心推理能力。您需要做的就是按照开发步骤,准备模型、编写代码并将其集成到您的应用中。

好的,明白了,我自己研究一下,

在HarmonyOS Next中,视觉识别通过集成HMS Core ML Kit的物体检测能力实现。系统使用端侧AI模型分析图像,提取特征并与预训练模型比对,直接返回识别到的物体名称。开发者可通过ML Kit接口调用识别功能,无需依赖网络,支持常见物体类别。

在HarmonyOS Next中,可以通过集成AI视觉识别能力实现物体名称识别。推荐使用华为提供的ML Kit视觉识别服务,具体步骤如下:

  1. 在DevEco Studio中配置ML Kit依赖,引入图像分类能力。
  2. 通过设备相机或本地图库获取图像数据。
  3. 调用ML Kit的ImageClassificationAnalyzer类进行识别,返回结果会包含识别到的物体名称及置信度。
  4. 根据置信度阈值筛选结果,提取具体物品名称(如香蕉、苹果等)。

示例代码可参考华为开发者文档中的图像分类部分,需注意模型支持的物体类别范围。

回到顶部