应用名称:BDFace
AppID;10302766
API Key;edy19uH69lELawKocW7jGhzU
Secret Key;0xTkp1X8AqzxbiyQkURKZGOrbnHQUu0j
===================================
百度AI开放平台是百度推出的一个人工智能服务平台,该平台提供了很多当下热门技术的解决方案,如人脸识别,语音识别,语音智能等。其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和iOS等,使用C#进行脚本语言开发的Unity3d自然也可以很方便的使用这些SKD。
1、下载人脸识别SDK
首先我们需要下载最新版的SDK,打开人脸识别SDK下载页面,选择C# SDK下载:
下载解压后得到一个叫aip-csharp-sdk-3.0.0的文件夹,其中AipSdk.dll提供了我们进行人脸识别开发需要的API,AipSdk.XML是对DLL的注释。thirdparty中包含了sdk的第三方依赖,Demo中是一些使用示例,可以进行参考。
2、导入SDK
由于SDK已经被打包成DLL文件,所以我们导入使用起来也十分方便,只需将解压后的文件夹直接导入到工程即可。当然为了方便管理我们可以将SDK导入到Plugins文件夹中,需要注意的是一定要讲第三方依赖一起导入不然会报错。
导入后可能会有如下错误: 这是由于我们在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:
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")
1
2
3
4
5
实例化Face变量时需要填写我们创建的应用的API Key和Secret Key,可以在应用详情中查看。 进行人脸检测时调用FaceDetect方法:
public JObject FaceDetect(byte[] image, Dictionary
1
该方法需要传入两个参数,被检测的图片和返回的参数配置,其中可选参数options可以使用默认值null,这时只会返回人脸的位置等基本信息。返回值是一个JObject类型,此类型是第三方依赖中提供的一个json类型。详细调用方法为:
byte[] image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");Dictionary
1
2
3
4
5
6
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);
1
此时将只会返回最基本的信息,包括日志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 };
/////////////////////////////////////////////////////////
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Baidu.Aip.Face;
using System.IO;
using Newtonsoft.Json.Linq;
//百度人脸识别接口调用——非子萧
public class FaceTest : MonoBehaviour
{
public Text debugInfo; // 显示debug信息
public Text debugInfo2; // 显示debug信息
public RawImage portrait; // 显示图片
public Texture2D texture; // 用以描绘关键点的图片
private Face client; // 用来调用百度AI接口
private byte[] image; // 检测的图像数据
private Dictionary options; // 返回的数据
private JObject result; // 接收返回的结果
private void Awake()
{
//网页端身份安全验证失败,我们需要在程序运行时手动添加安全证书,在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
};
// 此处填写自己申请的key("Api Key", "Secret Key");
client = new Face("edy19uH69lELawKocW7jGhzU", "0xTkp1X8AqzxbiyQkURKZGOrbnHQUu0j");
}
//人脸检测(检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息)
public void FaceDetect()
{
var path = Application.dataPath + "/xxg1.jpg";
image = File.ReadAllBytes(path);
options = new Dictionary()
{
{"face_fields", "beauty,age,gender" }//返回的人脸信息选项+++
};
result = client.FaceDetect(image, options); // 调用API接口
debugInfo.text = result.ToString(); // 显示debug信息
// 复制原图信息
var width = texture.width;
var height = texture.height;
var mask = new Texture2D(width, height);
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
mask.SetPixel(i, j, texture.GetPixel(i, j));
}
// 根据返回的landmark描绘特征点
var r = result["result"];
foreach (var value in r)
{
var landmarks = value["landmark72"];
foreach (var lm in landmarks)
{
var x = int.Parse(lm["x"].ToString());
var y = height - int.Parse(lm["y"].ToString());
// 绘制点为3个像素点单位的正方形
// 这里其实应该保证绘制的像素点位置在我们检测图片的像素点范围内
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
mask.SetPixel(i, j, Color.red);
}
}
}
}
// 显示描绘特征点之后的图像
mask.Apply();
portrait.gameObject.SetActive(true);
portrait.texture = mask;
}
//人脸对比(该请求用于比对多张图片中的人脸相似度并返回两两比对的得分,可用于判断两张脸是否是同一人的可能性大小。)
public void FaceMatch()
{
//可判断为同一人的相似度分值为80,
var path1 = Application.dataPath + "/l01.jpg";
var image1 = File.ReadAllBytes(path1);
var image2 = File.ReadAllBytes(Application.dataPath + "/l02.jpg");
var image3 = File.ReadAllBytes(Application.dataPath + "/xxg1.jpg");
var images = new byte[][] { image1, image2, image3 };
result = client.FaceMatch(images); // 调用API接口
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸注册(要注册一个新用户,用户id为uid,加入组id为group1, 注册成功后服务端会返回操作的logid:)
public void FaceRegister()
{
var path = Application.dataPath + "/l01.jpg";
var image1 = File.ReadAllBytes(path);
string uid = "ldh01";
string info = "我是大帅哥,华仔";
string groudid = "ldh";
result = client.User.Register(image1, uid, info, new[] { groudid });
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸更新(用于对人脸库中指定用户,更新其下的人脸图像)
public void FaceUpdate()
{
var path = Application.dataPath + "/l02.jpg";
var image1 = File.ReadAllBytes(path);
result = client.User.Update(image1, "ldh01", "ldh", "一如既往的帅");
debugInfo2.text = result.ToString(); // 显示debug信息
}
//人脸认证(用于识别上传的图片是否为指定用户,即查找前需要先确定要查找的用户在人脸库中的id。)
public void FaceVerify()
{
var path = Application.dataPath + "/l03.jpg";
var image1 = File.ReadAllBytes(path);
result = client.User.Verify(image1, "ldh01", new[] { "ldh" }, 1);
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸识别(用于计算指定组内用户,与上传图像中人脸的相似度。识别前提为您已经创建了一个人脸库。)
public void FaceIdentify()
{
var path = Application.dataPath + "/l04.jpg";
var image1 = File.ReadAllBytes(path);
result = client.User.Identify(image1, new[] { "ldh" }, 1, 1);
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸删除(用于从人脸库中删除一个用户。)
public void FaceDelete()
{
result = client.User.Delete("ldh01");
result = client.User.Delete("ldh01", new[] { "ldh" });
debugInfo.text = result.ToString(); // 显示debug信息
}
//用户信息查询(用于查询人脸库中某用户的详细信息。)
public void UserInfo()
{
result = client.User.GetInfo("ldh01");
debugInfo.text = result.ToString(); // 显示debug信息
}
//组列表查询(用于查询用户组的列表。)
public void GroupList()
{
result = client.Group.GetAllGroups(0, 100);
debugInfo.text = result.ToString(); // 显示debug信息
}
//组内用户列表查询(用于查询指定用户组中的用户列表。)
public void GroupUsers()
{
result = client.Group.GetUsers("xxg", 0, 100);
debugInfo.text = result.ToString(); // 显示debug信息
}
//组间复制用户(用于将已经存在于人脸库中的用户添加到一个新的组。)
public void GroupAddUser()
{
//result = client.Group.AddUser(new[] { "toGroupId" }, "uid", "fromGroupId");
result = client.Group.AddUser(new[] { "xxg" }, "ldh01", "ldh");
debugInfo.text = result.ToString(); // 显示debug信息
}
//组内删除用户(用于将用户从某个组中删除,但不会删除用户在其它组的信息。)
public void GroupDeleteUser()
{
result = client.Group.DeleteUser(new[] { "xxg" }, "ldh01");
debugInfo.text = result.ToString(); // 显示debug信息
}
}