写点什么

自学记录鸿蒙 API 13:实现多目标识别 Object Detection

作者:李游Leo
  • 2024-12-29
    北京
  • 本文字数:2709 字

    阅读完需:约 9 分钟

自学记录鸿蒙API 13:实现多目标识别Object Detection

起步:什么叫多目标识别?

无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习 HarmonyOS 最新的 Object Detection API(API 13),一步步探索如何实现多目标识别应用,并通过亲手完成一个完整的项目来验证自己的学习成果。



先思考

在深入学习之前,我认真思考了这一技术的潜在应用场景:

  1. 智能图像分类:对用户拍摄的图片进行智能分类,比如区分风景、建筑、人物等。

  2. 工业检测:识别生产线上产品的质量问题,如瑕疵或异常。

  3. 无人零售:分析购物场景中的商品分布,提高商品推荐精度。

  4. 交通监控:检测车辆和行人,实现交通状况分析。

  5. AR 互动:结合多目标识别技术,实现与周围物体的实时交互。



你还别说,我认识到多目标识别的广阔潜力,同时也促使我更加系统地理解其背后的实现逻辑。


第一阶段:了解 Object Detection API 的功能

HarmonyOS 的 Object Detection API 提供了以下能力:

  • 目标类别识别:识别图像中目标的类别,如风景、动物、植物等。

  • 边界框生成:为识别的目标生成精确的边界框,便于后续处理。

  • 高精度置信度:为每个目标提供置信度分数,衡量识别结果的可靠性。

  • 多目标支持:能够在单张图片中同时检测多个目标对象。

这种强大的功能正是我此次学习和实践的重点。


第二阶段:项目初始化与权限配置

为了确保多目标识别服务能够正常运行,我首先配置了项目的权限文件。以下是必要的权限配置:

{  "module": {    "abilities": [      {        "name": "ObjectDetectionAbility",        "permissions": [          "ohos.permission.INTERNET",          "ohos.permission.READ_MEDIA",          "ohos.permission.WRITE_MEDIA"        ]      }    ]  }}
复制代码

通过这些配置,我的项目能够读取用户的图片文件,并与 HarmonyOS 的 AI 服务接口交互。



第三阶段:多目标识别核心功能实现

初始化与销毁检测器

多目标识别服务需要初始化一个检测器实例,同时在不再使用时销毁该实例以释放资源。以下是相关代码:

import { objectDetection } from '@kit.CoreVisionKit';
let detector: objectDetection.ObjectDetector | undefined = undefined;
async function initializeDetector() { detector = await objectDetection.ObjectDetector.create(); console.info('多目标识别检测器初始化成功');}
async function destroyDetector() { if (detector) { await detector.destroy(); console.info('多目标识别检测器已销毁'); }}
复制代码

加载图片并处理检测

实现多目标识别的核心在于加载图片并调用 process 方法进行检测:

async function detectObjects(imageUri: string) {    if (!detector) {        console.error('检测器未初始化');        return;    }
const pixelMap = await loadPixelMap(imageUri); const request = { inputData: { pixelMap }, scene: visionBase.SceneMode.FOREGROUND, };
const response = await detector.process(request);
if (response.objects.length === 0) { console.info('未检测到任何目标'); } else { response.objects.forEach((object, index) => { console.info(`目标 ${index + 1}:类别 - ${object.labels[0]}, 置信度 - ${object.score}`); }); }
pixelMap.release();}
复制代码

辅助方法:加载图片

import { fileIo } from '@kit.CoreFileKit';import { image } from '@kit.ImageKit';
async function loadPixelMap(imageUri: string): Promise<image.PixelMap> { try { console.info(`加载图片: ${imageUri}`);
// 打开图片文件 const fileDescriptor = await fileIo.open(imageUri, fileIo.OpenMode.READ_ONLY); const imageSource = image.createImageSource(fileDescriptor.fd);
// 创建PixelMap对象 const pixelMap = await imageSource.createPixelMap();
// 关闭文件资源 await fileIo.close(fileDescriptor);
console.info('PixelMap加载成功'); return pixelMap; } catch (error) { console.error('加载图片失败:', error); throw new Error('加载PixelMap失败'); }}
复制代码

第四阶段:用户界面设计

为了使用户可以方便地选择图片并查看检测结果,我利用 ArkUI 设计了一个简单的用户界面:

import { View, Text, Button } from '@ohos.arkui';
export default View.create({ build() { return { type: "flex", flexDirection: "column", children: [ { type: Text, content: "多目标识别应用", style: { fontSize: "20vp", textAlign: "center", marginTop: "20vp" }, }, { type: Button, content: "选择图片", style: { height: "50vp", marginTop: "10vp" }, onClick: this.onSelectImage, }, { type: Button, content: "检测目标", style: { height: "50vp", marginTop: "10vp" }, onClick: this.onDetectObjects, }, ], }; },
onSelectImage() { this.imageUri = '/data/media/sample_image.jpg'; console.info('图片已选择:', this.imageUri); },
async onDetectObjects() { await detectObjects(this.imageUri); },});
复制代码

第五阶段:性能优化与功能扩展

性能优化

  1. 分辨率调节:降低图片分辨率以减少处理时间。

  2. 并行处理:利用多线程同时处理多张图片。

  3. 缓存机制:缓存已处理的图片结果,避免重复计算。

功能扩展

  1. 目标类型可视化:在图片上绘制检测到的目标边界框。

  2. 分类统计:统计不同类别目标的数量。

  3. 实时检测:结合相机模块实现实时多目标识别。


最后的感悟

通过此次学习和实践,我不仅掌握了多目标识别 API 的基本功能,还深刻认识到其广阔的应用场景。在未来的开发中,我计划探索更多创新的实现方式,例如结合语音助手,通过语音控制触发目标识别,或与其他 AI 能力结合,开发更加智能的解决方案。

如果你也对多目标识别感兴趣,不妨从这些基础功能开始,一步步实现自己的创意!

当然如果你也在这一领域研究,不妨关注我,我们一起进步~!

发布于: 刚刚阅读数: 4
用户头像

李游Leo

关注

全栈开发工程师、全栈讲师、华为HDE 2022-07-14 加入

原百度、时趣互动、乐视高级前端(软件)开发工程师。后在北京一所当地大学任教,主要职务是教学主任,也为网易云课堂微专业的前端课程负责人。

评论

发布
暂无评论
自学记录鸿蒙API 13:实现多目标识别Object Detection_鸿蒙_李游Leo_InfoQ写作社区