ai实战篇|基于ai开放平台实现人脸识别对比功能,超详细教程附带源码(代码片段)

呆呆敲代码的小Y 呆呆敲代码的小Y     2022-12-07     677

关键词:

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------



📢 前言

  • 本篇文章来学习一下怎样使用 Unity实现简单地人脸识别 功能。
  • 关于人脸识别,我们可以选择很多平台的SDK接入Unity来实现人脸识别的功能。
  • 比如百度AI开放平台科大讯飞人脸识别支付宝蚂蚁人脸认证虹软人脸识别算法 等等。
  • 本文中的方法是基于百度AI开放平台实现的,后续有时间也会使用其他平台尝试一下效果如何。

🎬 实战篇 |基于百度AI开放平台实现简易版人脸识别功能


一、获取SDK准备工作

文章部分文档链接如下:

1.1 前往 百度AI开放平台 登录

既然选择了使用 百度AI开放平台的SDK,那我们就需要去官网下载SDK啦!

首先我们需要前往 百度AI开放平台,要登录百度账号。

如果之前有账号则直接登录,没有的话点击去注册一个就好了,这里不多赘述。

1.2 前往 人脸与人体

然后点击 开放能力 -> 人脸与人体 -> 人脸搜索


点击立即使用会跳转到控制台界面,然后点击 公有云服务 -> 应用列表。

1.3 创建一个应用

在 公有云服务 中点击 应用列表。

若此时没有应用,则进行创建。


找不到的小伙伴可以直接点击该链接,看看能不能直达创建应用的网址:https://console.bce.baidu.com/ai/#/ai/face/app/create


点击完之后该应用就创建完毕了,APPIDAPI KEY 以及 Secret Key 要保存好,后面在Unity中也会用到!

1.3 下载人脸识别SDK资源

接下来在 百度AI开放平台 的首页点击 开发与教学 -> SDK下载

选择 人脸识别 -> C# HTTP SDK 点击下载


可能随着时间推移,官方的进入SDK下载的页面会发生改变。

如果改变了不跟我文中位置一致,大家可以在首页自己找找看,只要找到SDK下载的地方就行,一般不会太隐蔽。

也可以点击SDK下载地址直接转入:https://ai.baidu.com/sdk#bfr

1.4 从SDK中取出我们会使用的文件

下载SDK后,解压到本地文件夹中。

之后打开 net35 文件夹,其中 AipSdk.dllNewtonsoft.Json.dll 这两个dll文件,后边会放到Unity3d工程中使用。



1.5 人脸离线识别SDK申请

如果想使用 人脸离线识别 功能则需要单独去申请。本文教程暂时没有用到,不感兴趣的话可以跳过此内容。

点击 开放能力 -> 人脸与人体 -> 人脸识别离线SDK

我这里选择了 Android版 ,最后打算使用一个Android设备进行测试。

大家可以根据自己的需求选择,操作步骤整体差异不大。

可以看到有一个 立即使用技术文档

点击立即使用后会进入下一个页面,让我们填写一些信息 申请SDK

那我们就简单填写一下就好了,填写完之后需要等一段时间审核,我这里第一次的时候等了大概十几分钟就申请好了。


二、Unity端操作

2.1 新建一个Unity工程

新建一个Unity打开后 打开 File>BuildSettings -> PlayerSettings -> OtherSettings

改变Api Compatibility Level.NET2.0,若本来就是则不需要修改。

2.2 导入 人脸识别 .dll文件

Assets下新建一个Plugins文件夹,注意不要拼错单词哦~

将上面讲到的两个文件AipSdk.dllNewtonsoft.Json.dll放入该文件夹。


然后新建一个测试场景和脚本,命名随意。

打开人脸识别的C#官方文档:https://ai.baidu.com/ai-doc/FACE/Ck37c1ri0

文档中的步骤挺详细,可以结合文章与文档共同参考 ~

2.3 新建交互类


定义一个客户端,此时要用到之前创建的应用的 APPIDAPIKeySecretKey

代码如下:

using Baidu.Aip.Face;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FaceRecognitionDemo: MonoBehaviour

    // 设置APPID/AK/SK
    public string APP_ID = "你的 App ID";
    public string API_KEY = "你的 Api Key";
    public string SECRET_KEY = "你的 Secret Key";
    Face client;

    void Start()
    
        client = new Face(API_KEY, SECRET_KEY);
        client.Timeout = 60000;  // 修改超时时间
    

2.4 人脸注册

接下来要进行人脸注册,简单意思就是我们要将几张某个人的照片传到人脸库中,用于下面的人脸识别时使用。

我们先注册几个人脸,官网教程中各个参数说明很清楚,想要了解更多内容也可以在官网仔细查看,我们一步一步来。

人脸注册 返回数据参数详情

人脸注册 返回示例


  "face_token": "2fa64a88a9d5118916f9a303782a97d3",
  "location": 
      "left": 117,
      "top": 131,
      "width": 172,
      "height": 170,
      "rotation": 4
  

注册人脸代码如下:

	// 人脸注册
	public void SignUpFace(string image, string imageType, string groupId, string userId)
	
		var options = new Dictionary<string, object>
		"user_info", "user's info",
		"quality_control", "NORMAL",
		"liveness_control", "LOW"
	;
		// 带参数调用人脸注册
		var result = client.UserAdd(image, imageType, groupId, userId, options);
		Debug.Log(result);
	

2.5 注册人脸 上传到 百度大脑人脸识别库

上面说的人脸注册 有两种方法可以实现,一是可以选择在云端手动创建组然后添加图片,二是可以通过URL方式在Unity中上传,下面都有介绍操作方式。

1.在控制台手动创建组并添加用户

手动创建方法很简单,直接点击新建组然后创建用户,将图片添加上即可!

2.使用脚本代码在Unity中上传人脸库

下面再来简单说一下在Unity中通过url上传的方法。

在Unity项目的Assets下 创建文件夹 StreamingAssets / FaceUpLoad

然后在网上找几张同一个人的图片,用作人脸识别测试时候使用,将下载的图片放到我们创建的文件夹中。

代码如下:

//获取图片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 = "GodY";
            //用户id,一般同一个人的图片放在同一个id下
            string userId = "xiaoY";
 
            //开始注册
            SignUpFace(imageBase64, imageType, groupId, userId);

            yield return new WaitForSeconds(0.6f);
        
    

@@需要换图

注册完后我们可以在百度大脑的控制台找到之前创建的应用的人脸识别库里看到上传的图片

2.6 使用图片进行 人脸对比

上面我们已经将人脸注册到人脸库了,下面就来在Unity中使用一张新的图片来与人脸库中的进行人脸对比。

虽然说上去是进行人脸对比,实际上是使用的人脸搜索的API。

值得注意的是 使用该人脸搜索方法是从我们注册的人脸库中 检测与我们当前想要进行比较的人脸最相似的人脸,所以说我们最好是新建组之后,为想进行识别的人脸单独创建在一个userID会比较好管理!

可以在官网查看更多关于人脸搜索与人脸库管理详细参数:https://ai.baidu.com/ai-doc/FACE/Gk37c1uzc

我们这里使用的应该是 1:N 人脸搜索,人脸对比其实和人脸搜索实现的功能效果差不多。

关于这俩的对比差异,官方也给出了解答,我们就不纠结这个了,这个直接拿来做测试使用就行!

后面感兴趣可以把官方给的样例全部使用测试一遍,看看到底哪个更好用一些 ~

接下来我们另外弄一张之前人脸库里没有的图片保存到FaceDetect文件夹下

编写脚本代码如下:代码中的groupid需要改成自己的人脸识别库中创建的的groupid

userid需要改成自己的人脸识别库中的userid

	public void FaceSearch()
	
		//1.拿到我们放在文件夹中的照片文件
		FileInfo file = new FileInfo(Application.streamingAssetsPath + "/FaceDetect/图片文件名.jpg");
		var stream = file.OpenRead();
		byte[] buffer = new byte[file.Length];
		stream.Read(buffer, 0, Convert.ToInt32(file.Length));//读取图片字节流
		var image = Convert.ToBase64String(buffer);

		//2.使用人脸搜索API进行对比查询
		var imageType = "BASE64";
		var groupIdList = "@@@";//需修改为自己人脸库的组,人脸库注册的组
		
		var options = new Dictionary<string, object>
		"match_threshold", 70,//限制 匹配阈值(设置阈值后,score低于此阈值的用户信息将不会返回)
		"user_id", "@@@",//需修改为自己人脸库的id,在指定某个固定user_id时调用,可不加此部分
	    ;
	    
		var result = client.Search(image, imageType, groupIdList,options);
		Debug.Log(result);
	

对比后会返回一组数据,其中我们只要看score的值,就可以看到人脸的相似度如何

如果score值超过80,就基本认定是同一个人。

检测结果如下:

这样我们基本就实现了一个简单的人脸识别功能,在注册完人脸库之后,就可以自己随便找一些人脸照片进行测试使用啦!

当然这样对使用者来说体验很差,需要一直去看返回的score值来判断人脸识别的结果。

下面就对该功能进行一个整合优化体验给大家做一个参考,更多想法可以自己改进体验哦!


三、将工程优化整合,人性化处理

简单说一下整合优化的思路。

  1. 增加一个打开文件夹选择文件的功能,可以让我们手动选择照片进行对比
  2. 增加一个检测结果相似度的UI显示,优化显示效果
  3. 增加一个对比人脸的选项,可自定义多款人脸对比

搭建一个UI效果如下:

实际识别检测效果如下:

我们可以通过在人脸识别库中添加某个人的人脸照片,就可以实现在Unity中自定义某个人的人脸识别检测!


四、代码一直调用失败问题

4.1 免费领取试用资源

第一次使用的时候代码一直报错,问了客服才知道原来是免费资源没有领取导致的!!所以直接去领取资源吧!

  "error_code": 18,
  "error_msg": "Open api qps request limit reached"

免费资源领取地址:https://console.bce.baidu.com/ai/#/ai/face/overview/index

选择需要领取的资源点击领取。

领取后的资源可以在资源列表中查看!

问客服的地址如下:https://ticket.bce.baidu.com/#/ticket/list

有疑问直接创建工单提问即可。


五、工程源码下载

虽然文章内容不少,但是整体流程很简单。

先建一个交互类,然后注册人脸,就进行人脸识别就可以了!

工程下载地址:https://download.csdn.net/download/zhangay1998/86803920

本文优化后最终效果核心脚本代码展示:

Windows简易版源码如下

using Baidu.Aip.Face;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;

public class FaceRecognitionDemo: MonoBehaviour

	[Header("设置APPID/AK/SK")]
    public string APP_ID = "你的 App ID";
    public string API_KEY = "你的 Api Key";
    public string SECRET_KEY = "你的 Secret Key";
    Face client;

	[Header("UI部分")]
	public Button _selectDocumentBtn;//选择文件按钮
	public Button _faceSearchBtn;//开始检测按钮
	public Image _faceSearchImage;//当前选择的图片
	public Text _faceSearchTxt;//检测结果文本

	private float _faceSearchScore;//最终返回的分数
	private Texture2D m_Tex;
	private OpenFileName ofn;

	void Start()
	
		ofn = new OpenFileName();
		client = new Face(API_KEY, SECRET_KEY);
        client.Timeout = 60000;  // 修改超时时间
		_selectDocumentBtn.onClick.AddListener(OpenFileWin);
		_faceSearchBtn.onClick.AddListener(FaceSearch);

		//StartCoroutine(IEGetStringBase64());
	

	//可优化部分:开始检测换为协程,加一个等待两秒的动画,两秒结束后显示检测结果
    #region 注册人脸部分
    //获取图片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 = "group1";
			//用户id,一般同一个人的图片放在同一个id下
			string userId = "YangMi";

			//开始注册
			SignUpFace(imageBase64, imageType, groupId, userId);
			yield return new WaitForSeconds(0.6f);
		
	

	/// <summary>
	/// 人脸注册
	/// </summary>
	/// <param name="image"></param>
	/// <param name="imageType"></param>
	/// <param name="groupId"></param>
	/// <param name="userId"></param>
	public void SignUpFace(string image, string imageType, string groupId, string userId)
	
		var options = new Dictionary<string, object>
		"user_info", "WuYanZu",
		"quality_control", "NORMAL",
		"liveness_control", "LOW",
		"action_type", "REPLACE"
	;
		// 带参数调用人脸注册
		var result = client.UserAdd(image, imageType, groupId, userId, options);
		Debug.Log("注册完成:" + result);
	
    #endregion

    /// <summary>
    /// 打开文件夹选择想检测的文件
    /// </summary>
    public void OpenFileWin()
	
		ofn.structSize = Marshal.SizeOf(ofn);
		ofn.filter = "All Files\\0*.*\\0\\0";
		ofn.file = new string(new char[256]);
		ofn.maxFile = ofn.file.Length;
		ofn.fileTitle = new string(new char[64]);
		ofn.maxFileTitle = ofn.fileTitle.Length;
		string path = Application.dataPath;
		path = path.Replace('/', '\\\\');
		//默认路径  
		ofn.initialDir = path;
		//ofn.initialDir = "D:\\\\MyProject\\\\UnityOpenCV\\\\Assets";  
		ofn.title = "Open Project";

		ofn.defExt = "xlsx";//显示文件的类型  
							//注意 一下项目不一定要全选 但是0x00000008项不要缺少  
		ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR  

		if (WindowDll.GetOpenFileName(ofn))
		
			Debug.Log("当前选择的文件路径:" + ofn.file);
			SelectImage();
		
	
	/// <summary>
	/// 将选择的图片显示在Image上
	/// </summary>
	public void SelectImage()
    
		//加载
		LoadFromFile(ofn.file);
		//变换格式
		Sprite tempSprite = Sprite.Create(m_Tex, new Rect(0, 0, m_Tex.width, m_Tex.height), new Vector2(10, 10));
		_faceSearchImage.sprite = tempSprite;//赋值
	

	//开始对比
	public void FaceSearch()
	
		//1.拿到我们放在文件夹中的照片文件
		//FileInfo file = new FileInfo(Application.dataPath + &

ai实战篇|基于ai开放平台实现货币识别功能,彻底解决货币盲区

查看详情

ai实战篇|基于ai开放平台实现货币识别功能,彻底解决货币盲区

查看详情

ai实战篇|基于ai开放平台实现植物识别功能,成为行走的百科全书

查看详情

ai实战篇|基于ai开放平台实现植物识别功能,成为行走的百科全书

查看详情

ai实战篇|基于ai开放平台实现货币识别功能,彻底解决货币盲区(代码片段)

...专栏🌲游戏制作专栏推荐:游戏制作🌲Unity实战100例专栏推荐:Unity实战100例 查看详情

基于百度ai开放平台的人脸识别及语音合成(代码片段)

基于百度AI的人脸识别及语音合成课题课题需求(1)人脸识别在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄、性别、颜值等信息,将信息返... 查看详情

qt+百度ai文字识别ocr小工具

基于百度AI开放平台的OCR文字识别小工具,用Qt5编写。实现通用识别,精准识别,表格识别,身份证识别等常用OCR功能。Qt+百度AI文字识别mOCR小工具@目录Qt+百度AI文字识别mOCR小工具介绍编译环境界面功能To-doList介绍基于百度AI开... 查看详情

ai:人脸识别

...一个或者多个人脸,并为人脸标记出边框,同时还可获得基于机器学习技术做出的面部特征预测。可支持的人脸功能有:年龄、性别、头部姿态、微笑检测、胡须检测以及27个面部重要特征点位置等。FaceAPI提供两个主要功能:人... 查看详情

2018虹软视觉ai开放平台开发者大赛,助力开发者梦想起航

...的你是不是也跃跃欲试呢? 现在机会来了,2018虹软AI开放平台开发者大赛9月30日正式上线,不用等待  “1024,智见未来”虹软视觉人工智能开放平台开发者大赛是一个面向全球 查看详情

python+opencv人脸识别身份认证系统设计:专栏总述

...识别身份认证系统(4)—人脸识别本项目的实现机制:基于OpenCV使用Haar级联与dlib库进行人脸检测及实时跟踪,应用LBPH算法开发了一个功能相对完整的人脸识别系统。系统采用sqlite3进行序列化数据存储,能够对陌生人... 查看详情

python实现人脸识别(代码片段)

...识别。先问大家一个问题什么是百度Aip模块?百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中本文写的是使用百度AI的在线接口SDK模块(baidu-aip)进行实现人脸识别除了人脸识别,其他api功能的调... 查看详情

ai抗疫系统是如何做到戴口罩也能识别出人的身份信息的?

...司研发的AI智能人脸识别系统主要是以计算机视觉为核心基于图像识别、行为识别的识别系统。二、要具体了解AI抗疫系统的人脸识别系统,我们先要了解传统的人脸识别系统,通过传统人脸识别系统对比得出AI抗疫中人脸识别系... 查看详情

微信小程序|基于百度ai从零实现人脸识别小程序(代码片段)

...针对互联网上已有的人脸识别小程序项目,很多只是基于手动拍照,然后上传到SDK进行识别。这一过程完全脱离实际场景!无法直接使用!本文项目是基于微信摄像头中的实时视频帧数据,通过实时动态识别... 查看详情

人脸识别完整项目实战:完整项目案例运行演示

一、前言本文是《人脸识别完整项目实战》系列博文第1部分,第一节《完整项目运行演示》,本章内容系统介绍:人脸系统核心功能的运行演示。本内容已经录制成视频课程,详见网易云课堂。整个《人脸识别完整项目实战》... 查看详情

『python开发实战菜鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自己的人脸识别项目(代码片段)

文章目录0x01:引子0x02:环境搭建0x03:开发实战 1.实现人脸检测标记2.人脸特征点提取3.人脸识别验证0x04:后记开源GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition推荐补充阅读:『Python开发实战菜鸟... 查看详情

ai人脸检测/安全帽检测智能分析网关告警消息配置——邮件告警消息配置

...、烟火识别、区域入侵检测、安全帽检测、口罩检测等。基于视频融合平台的丰富能力,可实现告警消息推送功能,将检测到的异常或违规情况(如:发现烟火、车辆违停、危险区域有人员闯入等),通过... 查看详情

ai安全帽识别/人脸识别智能分析网关在easycvr配置告警信息推送

...具有重要的应用意义。将智能分析网关与EasyCVR视频融合平台结合使用,能实现前端接入资源的统一汇聚管理、监控观看、告警推送 查看详情

人脸识别私有化部署:业务系统集成,ai赋能行业

...封装了推理算法,将算法的复杂性隐藏在底部。同时提供开放的http接口输出人脸识别能力,具有语言无关性、平台无关性。业务系统可以通过http接口快速、方便的集成。业务系统集成人脸识别私有化部署流程示例更多查阅:http... 查看详情