本文主要介绍Unity3d开发基于百度AISDK的人脸识别功能,主要是对比两张人脸的相似度。
1.准备工作-百度AISDK
(1)首先登陆百度AI,然后在控制台选择人脸识别,如图一
(2)进入后,我们创建一个新应用,应用名称和应用描述随意填写,如图二,图三
(3)在应用列表界面,我们可以看到刚刚创建的应用名称,接入过SDK的小伙伴都知道,这里的AppID,APIKey,SecretKey需要我们记住,这些在后续的开发中都需要用到,如图四
(4)返回百度AI首页,在开发资源中下载人脸识别对应的C#版本SDK,如图五
下载文件解压缩后,在net35文件夹内AipSdk.dll以及Newtonsoft.Json.dll需要在接下来导入Unity工程项目中。
2.项目创建
(1)新建Unity3d工程,先将Api Compatibility Level设置为.Net2.0,如图六
(2)在Assets下新建文件夹Plugins文件夹,我们将下载下来的AipSdk.dll以及Newtonsoft.Json.dll复制到该文件夹下,新建场景FaceDetect,新建C#脚本FaceDetect(调用),Baidu_FaceDetect(封装百度API功能)
如图七
(3)打开官方文档,查看教程,教程位置如图八,图九
(4)相关功能的封装
Baidu_FaceDetect.cs包含人脸注册,人脸更新,人脸删除,人脸搜索,人脸检测,用户信息查询,用户人脸列表查询,用户列表查询,复制用户,删除用户,创建用户组,删除用户组,组列表查询,错误反馈功能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baidu.Aip.Face;
using Newtonsoft.Json.Linq;
namespace YCX_Tool.Baidu_FaceDetect
{
/// <summary>
/// 百度人脸识别
/// </summary>
public class Baidu_FaceDetect
{
/// <summary>
/// api_key
/// </summary>
private string api_key;
public string Api
{
get { return api_key; }
private set { api_key = value; }
}
/// <summary>
/// secret_key
/// </summary>
private string secret_key;
public string Secret
{
get { return secret_key; }
private set { secret_key = value; }
}
/// <summary>
/// 错误编号
/// </summary>
private int error_code;
/// <summary>
/// 错误消息
/// </summary>
private string error_msg;
/// <summary>
/// 单例
/// </summary>
private static Baidu_FaceDetect Instance;
/// <summary>
/// face_client
/// </summary>
private Face face;
public static Baidu_FaceDetect Get_Instance
{
get {
if (Instance == null)
{
Instance = new Baidu_FaceDetect();
}
return Instance;
}
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="api"></param>
/// <param name="secret"></param>
public void Init(string api, string secret)
{
api_key = api;
secret_key = secret;
face = new Face(api_key, secret_key);
face.Timeout=60000;
}
/// <summary>
/// 人脸注册
/// </summary>
/// <param name="image">图片</param>
/// <param name="imageType">图片类型</param>
/// <param name="group_Id">用户组id</param>
/// <param name="user_Id">用户id</param>
/// <returns>注册结果(face_token 图片的唯一标识)(location 人脸在图片的位置)(left 离左边界距离)(top 离上边界距离)(width 人脸区域宽度)(height 人脸区域高度)(rotation 人脸相对竖直方向的旋转角)</returns>
public JObject Face_Register(string image,string imageType,string group_Id,string user_Id)
{
JObject jObject = new JObject();
if (face == null)
{
Debug.LogError("请初始化api和secret");
return jObject;
}
else
{
//user_info 用户资料
//quality_control 图片质量控制 NONE: 不进行控制 LOW:较低的质量要求 NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认 NONE
//liveness_control活体检测控制 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
var options = new Dictionary<string, object> { {"user_info", "MeiNv"},{"quality_control", "NORMAL"},{"liveness_control", "LOW"} };
//避免网络异常造成错误
try
{
jObject=face.UserAdd(image, imageType, group_Id, user_Id, options);
error_code = int.Parse(jObject["error_code"].ToString());
error_msg = jObject["error_msg"].ToString();
Debug.Log("注册成功" + jObject);
return jObject;
}
catch (System.Exception e)
{
Debug.LogError("人脸注册失败" + e.Message);
return jObject;
}
}
}
/// <summary>
/// 人脸更新
/// </summary>
public JObject Face_Update(string image, string imageType, string group_Id, string user_Id)
{
JObject jObject = new JObject();
if (face == null)
{
Debug.LogError("请初始化api和secret");
return jObject;
}
else
{
//user_info 用户资料
//quality_control 图片质量控制 NONE: 不进行控制 LOW:较低的质量要求 NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认 NONE
//liveness_control活体检测控制 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
var options = new Dictionary<string, object> { { "user_info", "MeiNv" }, { "quality_control", "NORMAL" }, { "liveness_control", "LOW" }};
//避免网络异常造成错误
try
{
jObject = face.UserUpdate(image, imageType, group_Id, user_Id, options);
error_code = int.Parse(jObject["error_code"].ToString());
error_msg = jObject["error_msg"].ToString();
Debug.Log("更新成功" + jObject);
return jObject;
}
catch (System.Exception e)
{
Debug.LogError("人脸更新失败" + e.Message);
return jObject;
}
}
}
/// <summary>
/// 人脸删除(删除指定)
/// </summary>
public JObject Face_Delet(string userid, string groupid, string facetoken)
{
JObject jObject = new JObject();
if (face == null)
{
Debug.LogError("请初始化api和secret");
return jObject;
}
else
{
//避免网络异常造成错误
try
{
jObject = face.FaceDelete(userid,groupid, facetoken);
error_code = int.Parse(jObject["error_code"].ToString());
error_msg = jObject["error_msg"].ToString();
Debug.Log("删除成功" + jObject);
return jObject;
}
catch (System.Exception e)
{
Debug.LogError("人脸更新失败" + e.Message);
return jObject;
}
}
}
/// <summary>
/// 人脸搜索
/// </summary>
/// <param name="image">图片</param>
/// <param name="imageType">图片类型</param>
/// <param name="groupIdList">用户组id</param>
/// <returns></returns>
public JObject Face_Search(string image,string imageType,string groupIdList)
{
JObject jObject = new JObject();
if (face == null)
{
Debug.LogError("请初始化api和secret");
return jObject;
}
else
{
try
{
jObject= face.Search(image, imageType, groupIdList);
error_code = int.Parse(jObject["error_code"].ToString());
error_msg = jObject["error_msg"].ToString();
Debug.Log("搜索成功" + jObject);
return jObject;
}
catch (System.Exception e)
{
Debug.Log("人脸检索失败" + e.Message);
return jObject;
}
}
}
/// <summary>
/// 人脸检测
/// </summary>
public void Face_Check()
{
}
/// <summary>
/// 用户查询
/// </summary>
/// <param name="userid"></param>
/// <param name="groupid"></param>
/// <returns></returns>
public JObject User_Search(string userid, string groupid)
{
JObject jObject = new JObject();
if (face == null)
{
Debug.LogError("请初始化api和secret");
return jObject;
}
else
{
try
{
jObject = face.UserGet(userid,groupid);
error_code = int.Parse(jObject["error_code"].ToString());
error_msg = jObject["error_msg"].ToString();
Debug.Log("查询成功" + jObject);
return jObject;
}
catch (System.Exception e)
{
Debug.Log("用户查询失败" + e.Message);
return jObject;
}
}
}
/// <summary>
/// 用户人脸列表查询
/// </summary>
/// <param name="userid"></param>
/// <param name="groupid"></param>
/// <returns></returns>
public JObject User_Faces_Search(string userid, string groupid)
{
JObject jObject = new JObject();
if (face == null)
{
Debug.LogError("请初始化api和secret");
return jObject;
}
else
{
try
{
jObject = face.FaceGetlist(userid, groupid);
error_code = int.Parse(jObject["error_code"].ToString());
error_msg = jObject["error_msg"].ToString();
Debug.Log("用户人脸查询成功" + jObject);
return jObject;
}
catch (System.Exception e)
{
Debug.Log("用户查询失败" + e.Message);
return jObject;
}
}
}
//获取错误代号
public int Error_Code()
{
return error_code;
}
/// <summary>
/// 获取错误描述
/// </summary>
/// <returns></returns>
public string Error_Msg()
{
return error_msg;
}
}
}