当前位置: 首页 > article >正文

自学记录鸿蒙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能力结合,开发更加智能的解决方案。

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

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


http://www.kler.cn/a/457597.html

相关文章:

  • 呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音
  • 二、CSS基础
  • Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
  • AWS EMR基础知识
  • Alist-Sync-Web 网盘自动同步,网盘备份相互备份
  • 一个hive插入数据失败的问题
  • 学习测试day1
  • ClickHouse 日常操作记录
  • 跟着问题学18——大模型基础transformer详解(2)多头自注意力机制
  • Linux 使用入门指南
  • 如何在 Spring Boot 中配置数据库?
  • 【bluedroid】A2dp Source播放流程源码分析(3)
  • C#控件开发2—流动管道
  • 小猫咪抽奖系统源码1.11(有卡密功能)
  • 【潜意识Java】探寻Java子类构造器的神秘面纱与独特魅力,深度学习子类构造器特点
  • 4. 指针和动态内存
  • Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 【13】Selenium+Python UI自动化测试 集成日志(某积载系统实例-07)
  • 【学习笔记】ChatGPT原理与应用开发——基础科普
  • No.29 笔记 | CTF 学习干货
  • C++ 设计模式:策略模式(Strategy Pattern)
  • 「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
  • 【Spring】基于注解的Spring容器配置——@Scope注解
  • 如何通过采购管理系统提升供应链协同效率?
  • Android Bluetooth 问题:BluetoothAdapter enable 方法失效
  • 【2025最新计算机毕业设计】基于SpringBoot的网上服装商城系统(高质量项目,可定制)【提供源码+答辩PPT+文档+项目部署】