HarmonyOS 鸿蒙Next中视觉识别如何识别物体的名称
HarmonyOS 鸿蒙Next中视觉识别如何识别物体的名称 视觉识别如何识别物体的具体名称,例如用户选择一张食物照片,里面有香蕉,苹果,牛奶等,我希望识别可以具体到一个特定类型的物品(香蕉,苹果,牛奶等)。这种该怎么实现
使用 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
找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 正是用于完成这类任务的工具。
实现方案概述
整个实现流程可以概括为以下几步,这也是文档中提到的开发流程:
- 选择并准备模型:选择一个预训练好的、能够识别多种物品(尤其是食物)的AI模型。
- 集成推理引擎:在您的应用中集成 MindSpore Lite,作为运行模型的核心引擎。
- 处理用户输入:获取用户选择的图片,并进行预处理(缩放、归一化等),使其符合模型的输入要求。
- 执行推理:将处理好的图片输入模型,由 MindSpore Lite 进行计算。
- 解析输出:获取模型输出的结果(通常是每个类别的概率),解析出最可能的几个物品名称。
详细开发步骤(基于鸿蒙文档内容)
鸿蒙文档提供了两种方式的指南:《使用MindSpore Lite实现图像分类(C/C++)》和《使用MindSpore Lite实现图像分类(ArkTS)》。您可以根据您的应用开发技术栈选择其一。
方式一:使用 Native(C/C++)开发(高性能,适用于复杂计算)
文档名:《mindspore-guidelines-based-native.md》
-
环境准备:
- 确保 DevEco Studio >= 4.1,SDK >= API 11。
-
选择模型:
- 您需要一个预训练好的图像分类模型(
.ms
格式)。例如,可以选择在 ImageNet 数据集上预训练的模型(可识别1000种常见物体,包括各种食物),或者寻找专门针对食物识别的模型。 - 根据文档提示,如果找到的是其他格式(如 TensorFlow 的
.pb
或 PyTorch 的.pt
),需要使用 MindSpore Lite 模型转换工具 将其转换为.ms
格式。 - 将转换好的模型文件(如
mobilenetv2.ms
)放入项目的resources/rawfile/
目录下。
- 您需要一个预训练好的图像分类模型(
-
编写代码:
- 初始化 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 开发范式结合更简单。
- 环境准备:同上。
- 选择模型:同上,将
.ms
模型放入resources/rawfile/
。 - 编写代码(关键代码来自文档片段):
- 导入模块:
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视觉识别服务,具体步骤如下:
- 在DevEco Studio中配置ML Kit依赖,引入图像分类能力。
- 通过设备相机或本地图库获取图像数据。
- 调用ML Kit的
ImageClassificationAnalyzer
类进行识别,返回结果会包含识别到的物体名称及置信度。 - 根据置信度阈值筛选结果,提取具体物品名称(如香蕉、苹果等)。
示例代码可参考华为开发者文档中的图像分类部分,需注意模型支持的物体类别范围。