Android AI应用开发:物体检测

基于Google ML模型开发Android物体检测应用

A. 项目描述

ML Kit的默认模型在物体检测方面表现非常出色。当你将图像传递给物体检测器时,它会返回一个物体列表,其中包含边界框,这些边界框可用于确定图像中物体可能的位置。

本项目首先对图像中的物体进行分类检测,获取分类物体的位置区域,然后结合图像标记,逐个获取单个物体的标签。

B. 开发工具

  • Android Studio Koala
  • Kotlin
  • Gradle 8.7

C. 代码设计

界面设计

界面上方是一个ImageView,用于呈现示例图片;用户点击中间按钮,调用物体检测处理代码;待处理完毕,将结果展示在下方的 TextView 中。

物体检测处理

ML Kit物体检测器提供多种物体检测方法,这些方法由ObjectDetectorOptions对象控制。该检测器是一个强大的API,不仅可以检测物体,还能在视频流中跟踪它们,实现逐帧跟踪功能。

kotlin 复制代码
val options =
            ObjectDetectorOptions.Builder()
                .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
                .enableMultipleObjects()
                .build()

创建物体检测器,将Bitmap转换为InputImage,并使用物体检测器进行处理。 这将在成功时返回检测到的物体列表,或在失败时返回异常物体。

kotlin 复制代码
val objectDetector = ObjectDetection.getClient(options)
            var image = InputImage.fromBitmap(bitmap!!, 0)
            txtOutput.text = ""
            objectDetector.process(image)
                    .addOnSuccessListener { detectedObjects ->
                        // 任务执行成功
                        getLabels(bitmap, detectedObjects, txtOutput)
                        bitmap?.apply{
                            img.setImageBitmap(drawWithRectangle(detectedObjects))
                        }

                    }
                    .addOnFailureListener { e ->
                        // 任务执行失败
                        Log.e("MainActivity", e.toString())
                    }

用户点击按钮后,调用物体检测器以获取图像中物体的边界框。然后,使用这些边界框裁剪图像,得到定义的子图像,并将其传递给图像标记器。

标记物体

使用已有的边界框创建新的临时图像(croppedBitmap),将其传递给图像标记器,并返回结果。重复此操作以处理每个边界框(即每个物体),以获取每个检测到物体的详细标签!

kotlin 复制代码
val labeler =
        ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
    for(obj in objects) {
        val bounds = obj.boundingBox
        val croppedBitmap = Bitmap.createBitmap(
            bitmap,
            bounds.left,
            bounds.top,
            bounds.width(),
            bounds.height()
        )
        var image = InputImage.fromBitmap(croppedBitmap!!, 0)
        labeler.process(image)
            .addOnSuccessListener { labels ->
                // 任务执行成功
                var labelText = ""
                if(labels.isNotEmpty()) {
                    labelText = txtOutput.text.toString()
                    for (thisLabel in labels){
                        labelText += thisLabel.text + " , "
                    }
                    labelText += "\n"
                } else {
                    labelText = "Not found." + "\n"
                }
                txtOutput.text = labelText.toString()
            }
    }

该代码遍历每个检测到的物体,使用边界框创建名为croppedBitmap的新位图。接下来,它使用一个设置了默认选项的图像标记器(称为labeler)处理新图像。处理成功后,从标签中获取多个结果,并将这些标签写入逗号分隔的字符串,最终呈现在TextView中。

D. 项目演示

E. 项目源码

关注公众号『数字森林』,后台发送关键字:物体检测,获取项目源码。

相关推荐
无心水14 分钟前
【程序员AI入门:模型】19.开源模型工程化全攻略:从选型部署到高效集成,LangChain与One-API双剑合璧
人工智能·langchain·开源·ai入门·程序员ai开发入门·程序员的 ai 开发第一课·程序员ai入门
有梦想的攻城狮15 分钟前
大语言模型与多模态模型比较
人工智能·语言模型·自然语言处理·llm·大语言模型
九章云极AladdinEdu1 小时前
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
java·开发语言·人工智能·深度学习·测试工具·负载均衡·transformer
量子-Alex1 小时前
【目标检测】RT-DETR
人工智能·目标检测·计算机视觉
2201_754918411 小时前
OpenCV 图像透视变换详解
人工智能·opencv·计算机视觉
羽星_s2 小时前
文本分类任务Qwen3-0.6B与Bert:实验见解
人工智能·bert·文本分类·ai大模型·qwen3
摸鱼仙人~2 小时前
TensorFlow/Keras实现知识蒸馏案例
人工智能·tensorflow·keras
浊酒南街2 小时前
TensorFlow之微分求导
人工智能·python·tensorflow
羽凌寒2 小时前
曝光融合(Exposure Fusion)
图像处理·人工智能·计算机视觉
lucky_lyovo2 小时前
机器学习-特征工程
人工智能·机器学习