Unity 百度平台实现 简单的人脸识别系统
代码很简单没有难度,都有注解,随便 看一看 就会了。
要使用百度 AI 平台 需要注册 创建应用 和下载 相关SDK文件。
老规矩,直接上代码:
人脸识别系统
BttonCaptureClick() 方法需要 Button 搭载使用。
IEGetStringBase64() 本地图片上传 百度AI 开放平台 需要先执行一遍
SignUpFace() 人脸检测 这个方法 检测的是 百度平台的图片 活性、质量、数量等自定义参数(可忽略)
FaceSearch() 人脸校对 校对的 是 百度平台和本地图片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baidu.Aip.Face;
using UnityEditor.PackageManager;
using System;
using System.IO;
using UnityEngine.UI;
/// <summary>
/// 人脸识别系统
/// </summary>
public class FaceDetect_ZH : MonoBehaviour
{
// 设置APPID/AK/SK
public string APP_ID = "19944561";
public string _API_KEY = "syGQbK0C9bv5uffhUYWBGNpg";
public string _SECRET_KEY = "1pL6uolwMnXqkIZsPI0iPS2sazLU3uyn";
//截取摄像头实时画面
[Header("捕获Camera")]
public Camera _CaptureCamre;
[Header("返回字符串")]
public Text _ReturnString;
private Face _Client;
void Start()
{
_Client = new Face(_API_KEY, _SECRET_KEY);
// 修改超时时间
_Client.Timeout = 6000;
//StartCoroutine(IEGetStringBase64());
//FaceSearch();
}
/// <summary>
/// 人脸检测
/// </summary>
/// <param 图片信息="_Iamge"></param>
/// <param 图片类型="_ImageType"></param>
/// <param 用户组="_GroupID"></param>
/// <param 用户ID="_UserID"></param>
public void SignUpFace(string _Iamge, string _ImageType, string _GroupID, string _UserID)
{
//可选参数
var _Options = new Dictionary<string, object>
{
{"_User_Info","Maddie" },
{"_Quality_Control","NORMAL"},
// NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率)
//NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
//HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
{ "_Liveness","Low"}
};
//带参数调用人脸注册
var _Result = _Client.UserAdd(_Iamge, _ImageType, _GroupID, _UserID, _Options);
}
/// <summary>
/// 本地图片上传 百度AI 开放平台
/// </summary>
/// <returns></returns>
//获取图片base64字符串,由于QPS限制,此处采用协程降低注册频率
IEnumerator IEGetStringBase64()
{
//获取到每一张图片的路径
string[] _PicsPathArr = Directory.GetFiles(Application.streamingAssetsPath + "/FaceUpLoad/");
//循环获取每张图片的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 = "GroupMaddie";
//用户id,一般同一个人的图片放在同一个id下
string _UserId = "Maddie";
//开始注册
SignUpFace(_ImageBase64, _ImageType, _GroupId, _UserId);
yield return new WaitForSeconds(0.6f);
}
}
/// <summary>
/// 人脸校对
/// </summary>
public void FaceSearch()
{
//路径查询
FileInfo _File = new FileInfo(Application.streamingAssetsPath + "/FaceDetect/C.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 = "GroupMaddie";
var _Options = new Dictionary<string, object>{
{"face_field", "age"},
{"max_face_num", 2},
{"face_type", "LIVE"},
{"liveness_control", "LOW"} };
//返回的数据 (可用于解析)
var _Result = _Client.Search(_Image, _ImageType, _GroupIDList, _Options);
Debug.Log(_Result);
}
/// <summary>
/// 屏幕捕获
/// </summary>
public void CaptureScreen()
{
Texture2D _ScreenShot;
RenderTexture _RenderTex = new RenderTexture(1920, 1080, 1);
_CaptureCamre.targetTexture = _RenderTex;
_CaptureCamre.Render();
RenderTexture.active = _RenderTex;
_ScreenShot = new Texture2D(1920, 1080, TextureFormat.RGB24, false);
_ScreenShot.ReadPixels(new Rect(0, 0, 1920, 1080), 0, 0);
_ScreenShot.Apply();
string _FileName = Application.streamingAssetsPath + "/CameraFaceDetect/" + "CameraFace.jpg";
//保存到本地
byte[] _JpgData = _ScreenShot.EncodeToJPG();
File.WriteAllBytes(_FileName, _JpgData);
//人脸对比
CameraFaceSearch(_FileName);
}
/// <summary>
/// 实时捕获图像与人脸对比
/// </summary>
/// <param 捕获图像地址="_FileName"></param>
public void CameraFaceSearch(string _FileName)
{
FileInfo _File = new FileInfo(_FileName);
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 = "GroupMaddie";
var _Result = _Client.Search(_Image, _ImageType, _GroupIdList);
_ReturnString.text = _Result.ToString();
Debug.Log(_Result);
}
/// <summary>
/// 屏幕捕获检测对比
/// </summary>
public void BttonCaptureClick()
{
_ReturnString.text = null;
CaptureScreen();
}
}
实时画面获取
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 实时画面获取
/// </summary>
public class CaptureCamre_ZH : MonoBehaviour
{
[HideInInspector]
//WebCam纹理是实时视频输入渲染到的纹理
public WebCamTexture _WebTex;
[HideInInspector]
public string _DiviceName;
//显示摄像头画面
public RawImage _RawImage;
void Start()
{
StartCoroutine(IECallCamera());
}
/// <summary>
/// 外接摄像头调用
/// </summary>
/// <returns></returns>
private IEnumerator IECallCamera()
{
//请求授权在iOS上使用网络摄像头或麦克风
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
//检查用户是否已授权在网络播放器中使用摄像头或麦克风
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
//返回可用设备的列表
WebCamDevice[] _WebCamDevices = WebCamTexture.devices;
_DiviceName = _WebCamDevices[0].name;
//设置摄像机 摄像区域
_WebTex = new WebCamTexture(_DiviceName, 1920, 1080, 20);
//开始摄像
_WebTex.Play();
//图形赋值
_RawImage.texture = _WebTex;
}
}
}
Score 值大于 90 就认定为 是 同一个人。
下载好相应的SDK 解压之后需要把这两个支持库 放到Unity Assets 文件夹下。
暂时先这样吧,如果实在看不明白就留言,看到我会回复的。
也可以在百度 AI平台查看其相关文档和教程。
路长远兮,与君共勉。