【Unity3d】在Unity3d中使用百度AI人脸识别功能

来源:互联网 发布:生活半径 知乎 编辑:程序博客网 时间:2024/04/29 06:49

百度AI开放平台是百度推出的一个人工智能服务平台,该平台提供了很多当下热门技术的解决方案,如人脸识别,语音识别,语音智能等。其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和iOS等,使用C#进行脚本语言开发的Unity3d自然也可以很方便的使用这些SKD。

1、下载人脸识别SDK

首先我们需要下载最新版的SDK,打开人脸识别SDK下载页面,选择C# SDK下载:
SKD下载

下载解压后得到一个叫aip-csharp-sdk-3.0.0的文件夹,其中AipSdk.dll提供了我们进行人脸识别开发需要的API,AipSdk.XML是对DLL的注释。thirdparty中包含了sdk的第三方依赖,Demo中是一些使用示例,可以进行参考。
文件目录

2、导入SDK

由于SDK已经被打包成DLL文件,所以我们导入使用起来也十分方便,只需将解压后的文件夹直接导入到工程即可。当然为了方便管理我们可以将SDK导入到Plugins文件夹中,需要注意的是一定要讲第三方依赖一起导入不然会报错。
Plugins目录

导入后可能会有如下错误:
.Net报错
这是由于我们在Player设置中选择的Api Compatibility Level是.Net 2.0 Subset,即.Net 2.0的子集,这里需要改成.Net 2.0。选择Edit->Project Settings->Player,在Other Settings中将Api Compatibility Level更改为.Net 2.0:
.Net2.0

3、创建应用

下面将以人脸检测为示例简单介绍一下SDK的使用。
使用SDK前我们需要先注册一个百度账号,然后登陆百度AI开放平台,创建一个人脸识别应用。
选择控制台并登录:
选择控制台

在控制台已开通服务中选择人脸识别:
人脸识别

然后点击创建应用,输入应用名,应用类型,接口选择(默认创建人脸识别的应用),和应用描述,点击立即创建,创建完毕后点击查看应用详情查看API Key和Secret Key(点击显示查看)
创建应用

完成创建

应用详情

之后可以选择监控报表来查看应用接口调用情况:
监控报表

4、接口调用

百度AI开放平台提供了人脸识别C#版的详细技术文档,下面以实例来进行简单的调用说明。
使用人脸检测功能我们添加Baidu.Aip.Face命名空间,定义一个Face变量用于调用API:

using Baidu.Aip.Face;private Face client;client = new Face("API Key", "Secret Key")

实例化Face变量时需要填写我们创建的应用的API Key和Secret Key,可以在应用详情中查看。
进行人脸检测时调用FaceDetect方法:

public JObject FaceDetect(byte[] image, Dictionary<string, object> options = null);

该方法需要传入两个参数,被检测的图片和返回的参数配置,其中可选参数options可以使用默认值null,这时只会返回人脸的位置等基本信息。返回值是一个JObject类型,此类型是第三方依赖中提供的一个json类型。详细调用方法为:

byte[] image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");Dictionary<string, object> options = new Dictionary<string, object>(){    {"face_fields", "beauty,age,expression,gender" }};client.FaceDetect(image, options);

options中的face_fields为请求的参数,类型是string,多个项以逗号分开,不能加在逗号和后一项之间加空格,否则无效。详细参数如下表:

参数 类型 描述 face_fields string 包括age、beauty、expression、faceshape、gender、gla-sses、landmark、race、qualities信息,逗号分隔,默认只返回人脸框、概率和旋转角度。 max_face_num number 最多处理人脸数目,默认值1 image byte[] 图像数据

方法返回的JObject包含一个或多个人脸的信息,也可以如下调用:

client.FaceDetect(image);

此时将只会返回最基本的信息,包括日志id,人脸数目,人脸位置,人脸置信度,竖直方向转角,三维左右旋转角,三维俯仰角,平面旋转角。
所有返回值见下表:

参数 类型 是否一定输出 描述 log_id number 是 日志id result_num number 是 人脸数目 result array 是 人脸属性对象的集合 +age number 否 年龄。face_fields包含age时返回 +beauty number 否 美丑打分,范围0-1,越大表示越美。face_fields包含beauty时返回 +location array 是 人脸在图片中的位置 ++left number 是 人脸区域离左边界的距离 ++top number 是 人脸区域离上边界的距离 ++width number 是 人脸区域的宽度 ++height number 是 人脸区域的高度 +face_probability number 是 人脸置信度,范围0-1 +rotation_angle number 是 人脸框相对于竖直方向的顺时针旋转角,[-180,180] +yaw number 是 +pitch number 是 三维旋转之俯仰角度[-90(上), 90(下)] +roll number 是 平面内旋转角[-180(逆时针), 180(顺时针)] +expression number 否 表情,0,不笑;1,微笑;2,大笑。face_fields包含expression时返回 +expression_probability number 否 表情置信度,范围0~1。face_fields包含expression时返回 +faceshape array 否 脸型置信度。face_fields包含faceshape时返回 ++type string 是 脸型:square/triangle/oval/heart/round ++probability number 是 置信度:0~1 +gender string 否 male、female。face_fields包含gender时返回 +gender_probability number 否 性别置信度,范围0~1。face_fields包含gender时返回 +glasses number 否 是否带眼镜,0-无眼镜,1-普通眼镜,2-墨镜。face_fields包含glasses时返回 +glasses_probability number 否 眼镜置信度,范围0~1。face_fields包含glasses时返回 +landmark array 否 4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_fields包含landmark时返回 ++x number 否 x坐标 ++y number 否 y坐标 +landmark72 array 否 72个特征点位置,示例图 。face_fields包含landmark时返回 ++x number 否 x坐标 ++y number 否 y坐标 +race string 否 yellow、white、black、arabs。face_fields包含race时返回 +race_probability number 否 人种置信度,范围0~1。face_fields包含race时返回 +qualities array 否 人脸质量信息。face_fields包含qualities时返回 ++occlusion array 是 人脸各部分遮挡的概率, [0, 1] (待上线) +++left_eye number 是 左眼 +++right_eye number 是 右眼 +++nose number 是 鼻子 +++mouth number 是 嘴 +++left_cheek number 是 左脸颊 +++right_cheek number 是 右脸颊 +++chin number 是 下巴 ++type array 是 真实人脸/卡通人脸置信度 +++human number 是 真实人脸置信度,[0, 1] +++cartoon number 是 卡通人脸置信度,[0, 1]

运行时可能会报错:
运行报错
这是网页端身份安全验证失败导致的,我们需要在程序运行时手动添加安全证书,在Awake方法中加入:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,                           System.Security.Cryptography.X509Certificates.X509Chain chain,                           System.Net.Security.SslPolicyErrors sslPolicyErrors)                {                   return true; // **** Always accept                };

我们可以用Text控件来查看具体的返回值:
TestFace.cs:

using System.Collections.Generic;using System.IO;using Baidu.Aip.Face;using UnityEngine;using UnityEngine.UI;public class TestFace : MonoBehaviour{    public Text debugInfo;    private Face client;    private byte[] image;    private Dictionary<string, object> options;    private void Awake()    {        System.Net.ServicePointManager.ServerCertificateValidationCallback +=               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,                           System.Security.Cryptography.X509Certificates.X509Chain chain,                           System.Net.Security.SslPolicyErrors sslPolicyErrors)               {                   return true; // **** Always accept            };        client = new Face("API Key", "Secret Key");        image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");        options = new Dictionary<string, object>()        {            {"face_fields", "beauty,age,expression,gender" }        };    }    public void StartDetect()    {        var result = client.FaceDetect(image);//, options);        debugInfo.text = result.ToString();    }}

运行结果:
运行结果

By:蒋志杰

原创粉丝点击