最近忽然对物联网开发蛮感兴趣,但无奈物联网内容太高深,我就做一点我能力范围内的事
本文主要介绍unity3d开发基于百度大脑的人脸对比功能,人脸对比的发展方向很多,如果往物联网方向走,可以做成一个刷脸门禁系统,代替传统的指纹门禁系统;其他典型应用场景:如人证合一验证,用户验证等等
主要是对比两张人脸的相似度(下一篇将会实现摄像头画面实施人脸识别,真正实现刷脸功能)
话不多说,接下来就是正文
文末有完整工程
1.准备工作:
首先需要登录百度大脑 <http://ai.baidu.com/>,然后在控制台选择人脸识别
进入后,我们创建一个新应用,应用名称和应用描述随便写,只要自己能辨别就行,创建完后,点击查看应用详情
在应用详情界面,我们可以看到自己的应用名称,AppID、APIKey、SecretKey,这些后续开发是要用到的
然后返回百度大脑首页,在开发资源中下载人脸识别C# SDK
下载后打开net35文件夹,其中AipSdk.dll和Newtonsoft.Json.dll两个引用后续我们要加到Unity3d工程里
2.正式开始:
新建个Unity3d工程,我们需要先将Api Compatibility Level设置成 .NET2.0,
在File>BuildSettings>PlayerSettings>OtherSettings下
此时在Assets下新建一个Plugins文件夹,我们将之前下载的AipSdk.dll和Newtonsoft.Json.dll复制到该文件夹下
新建个场景FaceDetect,新建个C#脚本FaceDetect(命名随意)
此时我们可以打开官方文档,教程很详细
定义一个客户端,此时要用到之前创建的应用的APIKey和SecretKey
using Newtonsoft.Json.Linq; using System.Collections; using
System.Collections.Generic; using System.IO; using UnityEngine; using
Baidu.Aip.Face; using System.Text; using System; using UnityEngine.UI; public
class FaceDetect : MonoBehaviour { public string API_KEY =
"之前创建的应用的API_KEY"; public string SECRET_KEY = "之前创建的应用的SECRET_KEY ";
Face client; void Start() { client = new Face(API_KEY,
SECRET_KEY); } }
首先我们先注册几个人脸,官网教程如下,各个参数说明也很清楚
注册人脸
//人脸注册 public void SignUpFace(string image, string imageType, string groupId,
string userId) { var options = new Dictionary<string, object>{ {"user_info",
"LiYanHong"}, {"quality_control", "NORMAL"}, {"liveness_control", "LOW"} }; //
带参数调用人脸注册 var result = client.UserAdd(image, imageType, groupId, userId,
options); }
注册人脸,其实就是上传图片到百度大脑人脸识别库;如果是上传本地图片,则需获取图片的BASE64字符串或者FACE__TOKEN字符串(这个我没用过,暂时用不上);也可以直接用通过url上传。
我们这里采用上传本地图片
事先在网上下载几张李彦宏(随便你用谁)的图片保存到新建的StreamingAssets文件夹下的FaceUpLoad文件夹下
我们这里采用BASE64字符串,首先我们需要获取到图片的BASE64字符串; 由于百度大脑给我限制的QPS是2,我只能降低注册频率
//获取图片base64字符串,由于QPS限制,此处采用协程降低注册频率 IEnumerator IEGetStringBase64()
{ //获取到每一张图片的路径 string[] picsPathArr =
Directory.GetFiles(Application.streamingAssetsPath + "/FaceDetect/");
//循环获取每张图片的base64字符串 for (int i = 0; i < picsPathArr.Length; i++)
{ //unity会自动生成.meta文件,过滤掉 if
(picsPathArr[i].Contains("meta")) continue; //读取
FileInfo file = new FileInfo(picsPathArr[i]); var stream =
file.OpenRead(); byte[] buffer = new byte[file.Length];
//读取图片字节流 stream.Read(buffer, 0, Convert.ToInt32(file.Length));
//base64字符串 string imageBase64 =
Convert.ToBase64String(buffer); //采用base64字符串方式上传
string imageType = "BASE64"; //用户组 string groupId =
"group1"; //用户id,一般同一个人的图片放在同一个id下 string userId =
"liyanhong"; //开始注册 SignUpFace(imageBase64, imageType,
groupId, userId); yield return new WaitForSeconds(0.6f); }
}
注册完后我们可以在百度大脑的控制台找到之前创建的应用的人脸识别库里看到上传的图片(同样的图片不要重复注册)
注册完后,就是我们核心内容,人脸对比(此功能在官网叫做人脸搜索,人脸对比指的是另一个,意思都一样)
用此图片和人脸库里的图片做对比,官网教程和各个参数说明如下
此时我们另外弄一张之前人脸库里没有的李彦宏的图片保存到FaceDetect文件夹下
对比
//人脸对比 public void FaceSearch() { FileInfo file = new
FileInfo(Application.streamingAssetsPath + "/FaceDetect/001.jpg"); var stream =
file.OpenRead(); byte[] buffer = new byte[file.Length]; //读取图片字节流
stream.Read(buffer, 0, Convert.ToInt32(file.Length)); var image =
Convert.ToBase64String(buffer); var imageType = "BASE64"; //之前注册的组 var
groupIdList = "group1"; var result = client.Search(image, imageType,
groupIdList); Debug.Log(result); }
对比后会返回一组数据,其中我们只要看score的值,我们可以约定,只要score值超过80,就认定是同一个人
如果遇到报错
请添加以下代码
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 }; }
注意:
代码中的groupid需要改成自己的人脸识别库中创建的的groupid
userid需要改成自己的人脸识别库中的userid
如下图,“group1”就是我的groupid
点击group1,在group1下一级就是userid了,如下图,“liyanhong”就是我的userid
最后附上完整工程 <https://pan.baidu.com/s/1R7TkKGKp9HUZ0UyBGhMCeg>,
链接:https://pan.baidu.com/s/1R7TkKGKp9HUZ0UyBGhMCeg 密码:njud
运行前记得填写自己的API_KEY和SECRET_KEY
热门工具 换一换