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

举报
李游Leo 发表于 2024/12/29 22:33:25 2024/12/29
【摘要】 多目标识别技术广泛应用于动物识别、智能相册分类和工业检测等领域。本文通过学习HarmonyOS的Object Detection API(API 13),详细介绍了如何实现一个多目标识别应用,涵盖从项目初始化、核心功能实现到用户界面设计的全过程。重点探讨了目标类别识别、边界框生成、高精度置信度等关键功能,并分享了性能优化与功能扩展的经验。最后,作者总结了学习心得,并展望了未来结合语音助手等创新应用

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

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

1735478315986.jpg


先思考

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

  1. 智能图像分类:对用户拍摄的图片进行智能分类,比如区分风景、建筑、人物等。
  2. 工业检测:识别生产线上产品的质量问题,如瑕疵或异常。
  3. 无人零售:分析购物场景中的商品分布,提高商品推荐精度。
  4. 交通监控:检测车辆和行人,实现交通状况分析。
  5. AR互动:结合多目标识别技术,实现与周围物体的实时交互。

3ef96d81c71042fabf362f8036024c67~tplv-tt-origin-web_gif.jpeg

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


第一阶段:了解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能力结合,开发更加智能的解决方案。

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。