Android App开发教学: 利用MediaPipe实现即时脸部侦测功能

news2024/9/20 23:30:10

前言

在Android开发中,实现即时脸部侦测功能是一个具有挑战性且引人注目的任务。幸运的是,Google的MediaPipe库为我们提供了一个简单且高效的解决方案。MediaPipe是一个开源的跨平台机器学习框架,可以用于各种视觉计算任务,包括脸部侦测。在本篇教学中,我们将使用MediaPipe库来实现一个即时脸部侦测功能的Android应用。

我期待这个教学能够为Android开发者们带来新的灵感和挑战,开启更加创新和丰富多彩的应用开发之旅。让我们一同开始这个令人兴奋的探索之旅吧!

下载Tensorflow 范例代码

由于此次的教学需要用到Camera进行获取影像,因此需要应用Camera的相关App代码,我为大家推荐一个快速上手的范例 TFLite Model Maker 0.3.2,利用此范例的object_detection代码进行MediaPipe脸部侦测代码整合,即可快速获得结果。

使用Android Studio开启Tensorflow范例内的object_detection专案。

Android Studio安装MediaPipe的facedetection库

以下环境是在Windows 10下建置

a.       在app -> build.gradle -> dependencies区块添加文件添加。

implementation 'com.google.mediapipe:solution-core:latest.release'
implementation 'com.google.mediapipe:facedetection:latest.release'​

设定完后记得,点击Sync Now进行同步,完成之后,MediaPipe的facedetection库套件就成功加入项目内。

MediaPipe的facedetection Android Java范例代码

MediaPipe提供了Android Java的绘框范例代码,看官们只要按照以下几点设定及修改代码,即可成功将face detection结果呈现。

至mediapipe的Github下载FaceDetectionResultImageView.java 代码,此代码进行绘框动作。
 

b. 在app -> java 新增一个mediapipe资料夹,并将下载的java档案添加,并修改FaceDetectionResultImageView.java档案,将原本的package com.google.mediapipe.examples.facedetection;改为package org.tensorflow.lite.examples.detection.mediapipe;。

在res -> layout -> xml档案修改UI设计,增加一个FrameLayout,id为preview_display_layout 。

在DetectorActivity.java档案下进行以下修改

import com.google.mediapipe.formats.proto.LocationDataProto;
import com.google.mediapipe.solutions.facedetection.FaceDetection;
import com.google.mediapipe.solutions.facedetection.FaceDetectionOptions;
import com.google.mediapipe.solutions.facedetection.FaceDetectionResult;
import com.google.mediapipe.solutions.facedetection.FaceKeypoint;
Import org.tensorflow.lite.examples.detection.mediapipe.FaceDetectionResultImageView;

在DetectorActivity class内增加代码

private FaceDetection faceDetection;
private FaceDetectionResultImageView imageView;

在onPreviewSizeChosen增加代码

imageView = new FaceDetectionResultImageView(this);
setupStaticImageModePipeline();​

增加setupStaticImageModePipeline函式

private void setupStaticImageModePipeline() {
    // Initializes a new MediaPipe Face Detection solution instance in the static image mode.
faceDetection =
new FaceDetection(
this,
FaceDetectionOptions.builder()
.setStaticImageMode(true)
.setModelSelection(0)
.setMinDetectionConfidence(1.0f)
.build());
// Connects MediaPipe Face Detection solution to the user-defined
FaceDetectionResultImageView.
faceDetection.setResultListener(
faceDetectionResult -> {
logNoseTipKeypoint(faceDetectionResult, /*faceIndex=*/ 0, /*showPixelValues=*/ true);
imageView.setFaceDetectionResult(faceDetectionResult);
runOnUiThread(() -> imageView.update());
});
faceDetection.setErrorListener((message, e) -> Log.e("MediaPipe", "MediaPipe Face
Detection error:" + message));
// Updates the preview layout.
FrameLayout frameLayout = findViewById(R.id.preview_display_layout);
FrameLayout frameLayout1 = findViewById(R.id.container);
frameLayout1.setVisibility(View.GONE);
frameLayout.removeAllViewsInLayout();
imageView.setImageDrawable(null);
frameLayout.addView(imageView);
imageView.setVisibility(View.VISIBLE);
}

增加logNoseTipKeypoint函式

private void logNoseTipKeypoint(
          FaceDetectionResult result,
          int faceIndex,
          boolean showPixelValues
  ) {
    if (result.multiFaceDetections().isEmpty()) {
      return;
    }
    LocationDataProto.LocationData.RelativeKeypoint noseTip =
            result
                    .multiFaceDetections()
                    .get(faceIndex)
                    .getLocationData()
                    .getRelativeKeypoints(FaceKeypoint.NOSE_TIP);
    if (showPixelValues) {
      int width = result.inputBitmap().getWidth();
      int height = result.inputBitmap().getHeight();
      Log.i(
              "MediaPipe",
              String.format(
                      "MediaPipe Face Detection nose tip coordinates (pixel values): x=%f, 
                      y=%f",noseTip.getX() * width, noseTip.getY() * height));
    } else {
      Log.i(
              "MediaPipe",
              String.format(
                      "MediaPipe Face Detection nose tip normalized coordinates (value range: 
                [0, 1]):"+ " x=%f, y=%f",noseTip.getX(), noseTip.getY()));
    }
  }

在processImage增加代码

faceDetection.send(croppedBitmap);

结果显示

结语

透过以上的教学,相信各位已经能够成功透过Android Studio轻松地将Tensorflow 范例与MediaPipe库进行结合,并使用脸部侦测功能;这让想使用MediaPipe进行应用的看官们提供更多的功能应用选择,希望这篇教学能够帮助各位看官们入门使用MediaPipe库,并激发看官们在Android开发中探索更多有趣应用的想像力,有问题的看官们欢迎联系我,我们一同讨论。

喜欢我的帖子,请帮我按个”收藏”,我们下回见。

 Q&A

1.MediaPipe库支援的Android版本是多少?

      Ans:MediaPipe库支援Android 5.0及以上版本。

2.如何在Android项目中添加其他视觉计算任务,例如手部跟踪?

     Ans:添加其他视觉计算任务与本篇教学类似。首先,你需要查找MediaPipe库中相应的模型,然后在Android项目中集成并使用这些模型。具体步骤与脸部侦测类似,此部分下一篇博文会介绍,近请期待。

3.MediaPipe库在运行时是否需要联网?

      Ans:MediaPipe库不需要联网,因为它使用的模型和资源都包含在项目中,透过Edge端进行推论。

4.MediaPipe库的运行效率如何?

      Ans:MediaPipe库在设计上注重运行效率,并且可以利用GPU来加速计算,因此通常具有较高的处理速度和良好的实时性能。

5.是否可以在MediaPipe库的基础上扩展更多视觉计算任务?

      Ans:是的,你可以在MediaPipe库的基础上扩展更多视觉计算任务,只需要添加相应的模型和处理代码。

欢迎登录大大通,查看更多精彩内容吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#泛型委托,约束

一、泛型委托 泛型的委托有很多&#xff0c;但掌握常见的泛型委托应用即可 委托可以定义它自己的类型参数。 引用泛型委托的代码可以指定类型参数以创建封闭式构造类型。 public delegate void Del<T>(T t);//Del<T> 是一个泛型委托 public static void Notify…

音频剪辑怎么剪?这4种裁剪方法快学起来

无论是音乐创作、播客录制还是专业的声音设计&#xff0c;高质量的音频剪辑都是创造引人入胜作品的关键。 然而&#xff0c;对于初学者或是专业人士而言&#xff0c;找到合适的音频剪辑工具&#xff0c;并掌握其使用方法&#xff0c;是通往成功道路上的第一步。 那么&#xf…

Python数据库操作必备:事务隔离级别全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据库操作中&#xff0c;事务隔离是保证数据一致性和并发控制的重要机制。事务隔离级别决定了一个事务可以看到其他事务的哪些更改&#xff0c;常见的隔离级别包括未提交读&#xff08;Read Uncommitted&…

Java海康门禁设备 对接人脸下发API

海康门禁机设备API接口对接 引言&#xff1a; 我本人在对接海康门禁机设备的时候遇到了两个 问题1&#xff1a;人脸下发失败的问题&#xff0c;是根据官方的Demo&#xff0c;遇到的问题&#xff0c;可以参考一下 这个问题我排查了很久&#xff0c;最终发现是海康给的Demo里面…

EasyX自学笔记3(割草游戏2)

在上一篇笔记之中我们还留有许多bug&#xff0c;如派蒙不会转头、派蒙是鬼没影子、斜向速度过快、会跑出界外的问题在此一并处理。 在上一章里我们知道需要玩家类、敌人类、子弹类三种&#xff0c;但是其包含的是他们的运行逻辑和变量。而播放动画帧也有许多函数我们也将其封装…

学习Java的日子 Day68 jQuery操作节点,Bootstrap

jQuery 1.jQuery操作DOM DOM为文档提供了一种结构化表示方法&#xff0c;通过该方法可以改变文档的内容和展示形式 在访问页面时&#xff0c;需要与页面中的元素进行交互式的操作。在操作中&#xff0c;元素的访问是最频繁、最常用的&#xff0c;主要包括对元素属性attr、内容…

《Hadoop大数据技术与实践》+ 数仓版本

基础概念 随着数字化时代的到来&#xff0c;数据量的爆炸性增长使得传统的数据处理和分析方法变得不够高效&#xff0c;因此大数据技术应运而生。 数据分类 结构化数据&#xff1a;固定格式的SQL数据库等半结构化数据&#xff1a;json非结构化数据&#xff1a;图片、音视频 …

探索sqlmap的奥秘:Python中的强大SQL注入检测工具

文章目录 **探索sqlmap的奥秘&#xff1a;Python中的强大SQL注入检测工具**第一部分&#xff1a;背景介绍第二部分&#xff1a;sqlmap是什么&#xff1f;第三部分&#xff1a;如何安装sqlmap&#xff1f;第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第…

Grafana+Influxdb(Prometheus)+Apache Jmeter搭建可视化性能测试监控平台

此性能测试监控平台&#xff0c;架构可以是&#xff1a; GrafanaInfluxdbJmeterGrafanaPrometheusJmeter Influxdb和Prometheus在这里都是时序性数据库 在测试环境中&#xff0c;压测数据对存储和持久化的要求不高&#xff0c;所以这里的组件可以都通过docker-compose.yml文件…

制氧机在造纸工业中的作用

在现代造纸工业中&#xff0c;制氧机扮演着至关重要的角色&#xff0c;为整个生产流程带来了诸多显著的优势和改进。 制氧机能够优化纸浆的漂白过程。传统的漂白方法可能效果不佳&#xff0c;且对环境造成较大压力。而通过制氧机制备的高纯度氧气参与漂白反应&#xff0c;能大大…

Langchain pandas agent - Azure OpenAI account

题意&#xff1a;Langchain pandas代理 - Azure OpenAI账户 问题背景&#xff1a; I am trying to use Langchain for structured data using these steps from the official document. 我正在尝试使用 Langchain 处理结构化数据&#xff0c;按照官方文档中的这些步骤进行操作…

软件测试第2章 黑盒测试和白盒测试对比

目录 一、黑盒测试 二、白盒测试 三、黑盒测试 VS 白盒测试 一、黑盒测试 1、它只检查程序功能是否能按照需求规格说明书的规定正常使用&#xff0c;程序是否能适当地接受输入数据而产生正确的输出信息。 2、黑盒测试也称功能测试&#xff0c;通过测试来检测每个功能是否能…

《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark

1.简介 按照以前的讲解和分享路数&#xff0c;宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…

文件上传漏洞(三,靶场详解)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 靶场环境搭建及pass-1.pass-2请转到&#xff1a;文件上传漏洞&#xff08;二&#xff0c;靶场搭建及漏洞利用&#xff09; 一&#xff0c;pass-3。 查看源码可知&#xff0c…

OJ-0815

题目 示例1 输入 bb1234aa 输出 10示例2 输入 bb12-34aa 输出 -31示例3 输入 bb0012-0034aa 输出 -31题解 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);long res 0;String s scanner…

在WinCC(TIA Portal)项目中,如何正确的使用面板,模板,弹出窗口和滑入窗口?

WinCC(TIA Portal)中提供了许多设计元素和组态对象,使得组态工作变得简单,文档中简要介绍了这些内容. WinCC(TIA Portal) 中提供了许多设计元素和组态对象&#xff0c;使得组态工作变得简单,文档中简要介绍了这些内容。 在 WinCC(TIA Portal) 中使用以下选项有助于提高组态过程…

git是什么/基本指令

git作用 去中心化&#xff0c; 分布式版本控制器 新增术语&#xff1a;仓库区&#xff0c; 工作区&#xff0c; 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…

电商SaaS聚水潭上市“求解”

时隔半年之后&#xff0c;电商ERP龙头聚水潭&#xff0c;再次向港交所递交主板上市申请&#xff0c;中金公司、摩根大通成为其联席保荐人。作为辅助电商商家运营的SaaS&#xff0c;其所提供的服务&#xff0c;主要包括库存分配、店铺管理、客户服务等诸多项目。作为国内最大的电…

机械行业数字化生产供应链产品解决方案(七)

在机械行业的数字化生产供应链产品解决方案中&#xff0c;通过全面部署物联网&#xff08;IoT&#xff09;传感器、智能分析平台和自动化控制系统&#xff0c;实现对生产设备的实时监控和数据采集&#xff0c;并结合大数据和人工智能技术进行深度分析&#xff0c;从而优化生产调…

AI绘画Stable Diffusion可以帮我做室内设计啦!把AI出图 应用到工作当中已经是人人必备的技能啦!

哈喽大家好&#xff0c;我是画画的小强 今天给大家带来个有意思教程&#xff0c;就是AI绘画Stable Diffusion 辅助帮我做室内设计&#xff01; 在本篇文章中我们可以把Stable Diffusion 当做一个小的渲染器来用&#xff0c;帮助我们快速出图&#xff0c;以及快速的出概念的创…