FaceCF应用程序主要是学习HiAI Engine中的CV引擎,制作的一款手机APP,利用CV图片人脸检测人脸属性人脸比对,对手机中的照片进行处理。识别出相册中单人照片、给出单人照片的人物属性、再识别出同一个人物的照片。

主要学习内容

这个代码集专注于HiAi Engine的CV引擎学习与使用。不相关的概念和代码块将被忽略,并提供给您简单地复制和粘贴。

开发基础能力要求

DevEco IDE介绍

DevEco IDE(简称IDE)是华为消费者业务为开发者提供的集成开发环境,旨在帮助开发者快捷、方便、高效使用华为EMUI开放能力。IDE基于Android Studio功能扩展(以插件形式提供),当前已上线开放能力为智慧服务(HUAWEI HiAI),Camera、安全服务、远程真机调试、APP CloudTest等,其中Huawei HiAI功能主要包括HiAI Engine、HiAI Foundation(AI模型分析、AI模型转换、业务类生成)、AI模型市场等,安全服务功能主要包括人脸认证、iTrustee、泛支付等。

下载DevEco

如何使用HiAI功能

点击"华为终端开放能力"面板中的HiAI,进入HiAI功能,选择人脸比对。如下图所示:

下载人脸比对Demo到本地,在Android Studio中import该项目,后面的开发在此基础上进行。

验证例子程序是否可用

要测试例子程序是否正常工作,将Apk下载到Android手机中,输入两张人物图像进行相似度比对。

在本节主要介绍DevEco下载的人脸比对代码,后面功能开发在此基础上进行:

概述

通过识别并提取人脸特征,对人像进行高精度比对,给出置信度分数,判断对象是否为同一个人。当两张同一人的照片时,可以看见其比对结果为同一个人,置信分数较高;当两张比对图片为不同一个人照片时,可以看见其比对结果为非同一个人,置信分数很低。

在使用人脸比对API时,主要用到下面人脸比对的相关类

//加载Frame类 import com.huawei.hiai.vision.visionkit.common.Frame; //加载人脸比对类 import com.huawei.hiai.vision.face.FaceComparator; //加载人脸比对结果类 import com.huawei.hiai.vision.visionkit.face.FaceCompareResult; //加载连接服务的静态类 import com.huawei.hiai.vision.common.VisionBase; //加载连接服务的回调函数 import com.huawei.hiai.vision.common.ConnectionCallback;

应用VisionBase静态类进行初始化,异步拿到服务的连接

VisionBase.init(MainActivity.this,new ConnectionCallback(){ @Override public void onServiceConnect() { Log.i(LOG_TAG, "onServiceConnect "); } @Override public void onServiceDisconnect() { Log.i(LOG_TAG, "onServiceDisconnect"); } });

定义人脸比对实例,将此工程的Context当做入参

FaceComparator faceComparator = new FaceComparator(mContext);

将需进行比对图像的bitmap放入frame中

frame1.setBitmap(bitmap1); frame2.setBitmap(bitmap2);

调用faceCompare方法得到结果

JSONObject jsonObject = faceComparator.faceCompare(frame1, frame2, null); FaceCompareResult result = faceComparator.convertResult(jsonObject); float score = faceComparator.getScore(); boolean isSamePerson = faceComparator.isSamePerson();

概述

人脸属性是表征人脸特征的一系列生物特性,具有很强的自身稳定性和个体差异性,标识了人的身份。它包括性别、肤色 、年龄、表情等。算法用于将图片中表征人脸特征的属性,可以应用于APP个性化美肤,产品推荐等场景。

在使用标签检测API时,将实现标签检测的相关的类添加至工程

//加载Frame类 import com.huawei.hiai.vision.visionkit.common.Frame; //加载人脸表情属性结果类 import com.huawei.hiai.vision.visionkit.face.FaceAttributesInfo; //加载人脸表情属性检测detector类 import com.huawei.hiai.vision.face.FaceAttributesDetector; //加载连接服务的静态类 import com.huawei.hiai.vision.common.VisionBase; //加载连接服务的回调函数 import com.huawei.hiai.vision.common.ConnectionCallback;

应用VisionBase静态类进行初始化,异步拿到服务的连接

VisionBase.init(MainActivity.this,new ConnectionCallback(){ @Override public void onServiceConnect() { Log.i(LOG_TAG, "onServiceConnect "); } @Override public void onServiceDisconnect() { Log.i(LOG_TAG, "onServiceDisconnect"); } });

定义detector实例,将此工程的Context当做入参

FaceAttributesDetector faceabelDetector = new FaceAttributesDetector (MainActivity.this);

定义frame

Frame frame = new Frame();

将需进行标签检测图像的bitmap放入frame中

frame.setBitmap(bitmap);

调用detect方法得到标签检测结果

JSONObject result = faceabelDetector.detectFaceAttributes(frame, null);

通过convertResult将json字符串转为java类的形式

List<FaceAttributesInfo> faceAttributes = faceabelDetector.convertResultEx(jsonLabel);

概述

检测图片中的人脸,返回高精度人脸矩形框坐标。该功能可作为关键模块,实现人脸对应用程序、屏幕的启动或关闭等功能。可通过对人脸特征及位置的定位,实现对人脸特定位置的美化修饰。广泛应用于各类人脸识别场景,如人脸解锁、人脸聚类、美颜等场景中。

在使用人脸检测API时,将实现人脸检测的相关的类添加至工程

//加载Frame类 import com.huawei.hiai.vision.visionkit.common.Frame; //加载人脸检测结果类 import com.huawei.hiai.vision.visionkit.face.detector.Face; import com.huawei.hiai.vision.visionkit.face.FaceLandmark; import com.huawei.hiai.vision.visionkit.common. BoundingBox; //加载人脸检测detector类 import com.huawei.hiai.vision.face.detector.FaceDetector; //加载连接服务的静态类 import com.huawei.hiai.vision.common.VisionBase; //加载连接服务的回调函数 import com.huawei.hiai.vision.common.ConnectionCallback;

应用VisionBase静态类进行初始化,异步拿到服务的连接

VisionBase.init(MainActivity.this,newConnectionCallback() { @Override public void onServiceConnect () { Log.i(LOG_TAG, "onServiceConnect "); } @Override public void onServiceDisconnect () { Log.i(LOG_TAG, "onServiceDisconnect"); } });

定义detector实例,将此工程的Context当做入参

FaceDetector faceDetector = new FaceDetector(MainActivity.this);

定义frame

Frame frame = new Frame();

将需进行标签检测图像的bitmap放入frame中

frame.setBitmap(bitmap);

调用detect方法得到人脸检测结果

JSONObject jsonFace = faceDetector.detect(frame, 10, null);

通过convertResult将json字符串转为java类的形式

List<Face> faces = faceDetector.convertResult(jsonFace);

页面布局activity_main.xml

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btnPerson1" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClickButton" android:text="person1" /> <Button android:id="@+id/btnPerson2" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClickButton" android:text="person2" /> <Button android:id="@+id/btnstarCompare" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClickButton" android:text="start" /> <ImageView android:id="@+id/imgViewPerson1" android:layout_width="210dp" android:layout_height="170dp" android:layout_gravity="center" app:srcCompat="@mipmap/ic_launcher_round" /> <ImageView android:id="@+id/imgViewPerson2" android:layout_width="210dp" android:layout_height="170dp" android:layout_gravity="center" app:srcCompat="@mipmap/ic_launcher_round" /> <TextView android:id="@+id/result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:text="Is The Same Person?" android:textSize="15dp" /> </LinearLayout>

布局图片如下:

调用HIAI的人脸检测判定图片中人物个数

Frame frame1 = new Frame(); frame1.setBitmap(mBitmapPerson1); JSONObject faceListJsonObject1 = faceDetector.detect(frame1, null); pic1ListResult = faceDetector.convertResult(faceListJsonObject1); Frame frame2 = new Frame(); frame2.setBitmap(mBitmapPerson2); JSONObject faceListJsonObject2 = faceDetector.detect(frame2, null); pic2ListResult = faceDetector.convertResult(faceListJsonObject2);

调用HIAI的人脸属性获取人物性别

JSONObject jsonObject1 = faceAttributes.detectFaceAttributes(frame1, null); FaceAttributesInfo faceAttributesInfo1 = faceAttributes.convertResult(jsonObject1); PERSON1_SEX = faceAttributesInfo1.getSex(); frame2.setBitmap(mBitmapPerson2); JSONObject jsonObject2 = faceAttributes.detectFaceAttributes(frame2, null); FaceAttributesInfo faceAttributesInfo2 = faceAttributes.convertResult(jsonObject2); PERSON2_SEX = faceAttributesInfo2.getSex();

调用HIAI的人脸对比判定是否为同一个人

Frame frame1 = new Frame(); frame1.setBitmap(mBitmapPerson1); Frame frame2 = new Frame(); frame2.setBitmap(mBitmapPerson2); JSONObject jsonObject = faceComparator.faceCompare(frame1, frame2, null);

祝贺您,您已经成功地通过HUAWEI AR Engine所提供CV图片人脸检测、人脸属性、人脸比对,对手机中的照片进行处理。识别出相册中单人照片、给出单人照片的人物属性、再识别出同一个人物的照片。

深入学习

通过HUAWEI AR Engine中提供的接口API进行更多的尝试,去构建更多丰富有趣的应用

文档地址

https://developer.huawei.com/consumer/cn/devservice/doc/

已复制代码