using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
using System.Net;
|
using System.Text;
|
using System.Threading.Tasks;
|
using FaceAI;
|
|
namespace WIDESEAWCS_Common
|
{
|
public class BaiDuFaceHelper
|
{
|
#region 人脸识别API
|
/// <summary>
|
/// 获取AccessToken
|
/// </summary>
|
/// <returns></returns>
|
public static string GetAccessToken()
|
{
|
//string url = string.Format("https://aip.baidubce.com/oauth/2.0/token?client_id={0}&client_secret={1}&grant_type={2}", "TqFQHXSNt6Z7cPQ4vDBfBNjq", "0cli6I6s8JFz3qM1Czi5ciRpDqrJuVvm", "client_credentials");
|
//string returnStr = BDWebRequest(url, "", "POST");
|
|
//NLog.LogManager.GetCurrentClassLogger().Trace("百度人脸识别返回:" + returnStr);
|
//BDToken token = JsonConvert.DeserializeObject<BDToken>(returnStr);
|
//token.getdate = DateTime.Now.ToString();
|
|
//return token.access_token;
|
|
|
var str = "24.83aee44079e5a27530bc72d5ec7049a3.2592000.1746152354.282335-118294290";
|
return str;
|
}
|
|
public static string BDWebRequest(string url, string data, string method)
|
{
|
try
|
{
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
|
request.Method = string.IsNullOrEmpty(method) ? "POST" : method.ToUpper();
|
request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22";
|
request.ServicePoint.Expect100Continue = false;
|
request.Timeout = 1000 * 60;
|
request.ContentType = "application/x-www-form-urlencoded";
|
if (!string.IsNullOrEmpty(method) && method.ToUpper() == "POST" && !string.IsNullOrEmpty(data))
|
{
|
byte[] byteArray = Encoding.UTF8.GetBytes(data);
|
request.ContentLength = byteArray.Length;
|
using (Stream myRequestStream = request.GetRequestStream())
|
{
|
myRequestStream.Write(byteArray, 0, byteArray.Length);
|
}
|
}
|
HttpWebResponse myHttpWebResponse = (HttpWebResponse)request.GetResponse();
|
using (Stream response = myHttpWebResponse.GetResponseStream())
|
{
|
using (StreamReader reader = new StreamReader(response, Encoding.UTF8))
|
{
|
return reader.ReadToEnd();
|
}
|
}
|
}
|
catch { return ""; }
|
}
|
|
|
/// <summary>
|
/// 人脸检测与属性分析
|
/// </summary>
|
/// <returns></returns>
|
public static string FaceDetect(string path)
|
{
|
string token = GetAccessToken();
|
string host = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=" + token;
|
var imgbase64 = GetFileContentAsBase64(path);
|
Encoding encoding = Encoding.Default;
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
request.Method = "POST";
|
request.KeepAlive = true;
|
String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\"}";
|
byte[] buffer = encoding.GetBytes(str);
|
request.ContentLength = buffer.Length;
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
string result = reader.ReadToEnd();
|
|
NLog.LogManager.GetCurrentClassLogger().Trace("人脸检测与属性分析:" + result);
|
return result;
|
}
|
|
/// <summary>
|
/// 创建用户人脸识别组
|
/// </summary>
|
/// <returns></returns>
|
public static string GroupAdd(string group)
|
{
|
string token = GetAccessToken();
|
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add?access_token=" + token;
|
Encoding encoding = Encoding.Default;
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
request.Method = "post";
|
request.KeepAlive = true;
|
String str = "{\"group_id\":\"" + group + "\"}";
|
byte[] buffer = encoding.GetBytes(str);
|
request.ContentLength = buffer.Length;
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
string result = reader.ReadToEnd();
|
NLog.LogManager.GetCurrentClassLogger().Trace("创建用户组:" + result);
|
return result;
|
}
|
|
/// <summary>
|
/// 获取文件base64编码
|
/// </summary>
|
/// <param name="path">文件路径</param>
|
/// <returns>base64编码信息,不带文件头</returns>
|
//public static string GetFileContentAsBase64(string path)
|
//{
|
// using (FileStream filestream = new FileStream(path, FileMode.Open))
|
// {
|
// byte[] arr = new byte[filestream.Length];
|
// filestream.Read(arr, 0, (int)filestream.Length);
|
// string base64 = Convert.ToBase64String(arr);
|
// return base64;
|
// }
|
//}
|
public static string GetFileContentAsBase64(string filePath)
|
{
|
// 只保留文件名,避免路径错误
|
string fileName = Path.GetFileName(filePath);
|
|
// 获取文件的完整路径
|
string fullPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image", fileName);
|
|
if (!File.Exists(fullPath))
|
{
|
throw new FileNotFoundException("文件不存在:" + fullPath);
|
}
|
|
using (FileStream filestream = new FileStream(fullPath, FileMode.Open, FileAccess.Read))
|
{
|
byte[] arr = new byte[filestream.Length];
|
filestream.Read(arr, 0, arr.Length);
|
return Convert.ToBase64String(arr);
|
}
|
}
|
|
|
|
/// <summary>
|
/// 人脸注册
|
/// </summary>
|
/// <returns></returns>
|
public static CreateUserResult AddUser(BDUserInfo info)
|
{
|
string token = GetAccessToken();
|
var imgbase64 = GetFileContentAsBase64(info.ImgPath);
|
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + token;
|
Encoding encoding = Encoding.Default;
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
request.Method = "POST";
|
request.KeepAlive = true;
|
String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
|
byte[] buffer = encoding.GetBytes(str);
|
request.ContentLength = buffer.Length;
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
string result = reader.ReadToEnd();
|
|
NLog.LogManager.GetCurrentClassLogger().Trace("人脸注册:" + result);
|
CreateUserResult res = JsonConvert.DeserializeObject<CreateUserResult>(result);//需要将log_id和face_token保存到用户表中,在人脸删除中需要用到
|
|
return res;
|
}
|
|
/// <summary>
|
/// 人脸删除(删除用户的某一张人脸,如果该用户只有一张人脸图片,则同时删除用户。)
|
/// </summary>
|
/// <returns></returns>
|
public static string DeleteUserImg(DeleteUserImg info)
|
{
|
string token = GetAccessToken();
|
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete?access_token=" + token;
|
Encoding encoding = Encoding.Default;
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
request.Method = "POST";
|
request.KeepAlive = true;
|
String str = "{\"face_token\":\"" + info.face_token + "\",\"log_id\":\"" + info.log_id + "\",\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\"}";
|
byte[] buffer = encoding.GetBytes(str);
|
request.ContentLength = buffer.Length;
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
string result = reader.ReadToEnd();
|
|
NLog.LogManager.GetCurrentClassLogger().Trace("人脸删除:" + result);
|
return result;
|
}
|
|
/// <summary>
|
/// 用户删除
|
/// </summary>
|
/// <returns></returns>
|
public static string DeleteUser(DeleteUserImg info)
|
{
|
string token = GetAccessToken();
|
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete?access_token=" + token;
|
Encoding encoding = Encoding.Default;
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
request.Method = "POST";
|
request.KeepAlive = true;
|
String str = "{\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\"}";
|
byte[] buffer = encoding.GetBytes(str);
|
request.ContentLength = buffer.Length;
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
string result = reader.ReadToEnd();
|
|
NLog.LogManager.GetCurrentClassLogger().Trace("用户删除:" + result);
|
return result;
|
}
|
|
/// <summary>
|
/// 人脸搜索
|
/// </summary>
|
/// <returns></returns>
|
public static SearchResult FaceSearch(string path, string group_id_list)
|
{
|
string token = GetAccessToken();
|
var imgbase64 = GetFileContentAsBase64(path);
|
|
string host = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" + token;
|
Encoding encoding = Encoding.Default;
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
request.Method = "POST";
|
request.KeepAlive = true;
|
String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id_list\":\"" + group_id_list + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
|
byte[] buffer = encoding.GetBytes(str);
|
request.ContentLength = buffer.Length;
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
string result = reader.ReadToEnd();
|
|
NLog.LogManager.GetCurrentClassLogger().Trace("人脸搜索:" + result);
|
SearchResult searchResult = JsonConvert.DeserializeObject<SearchResult>(result);
|
|
return searchResult;
|
}
|
#endregion
|
|
}
|
|
|
/// <summary>
|
/// token获取信息
|
/// </summary>
|
public class BDToken
|
{
|
/// <summary>
|
/// 认证token
|
/// </summary>
|
public string access_token { get; set; }
|
/// <summary>
|
/// Access Token的有效期(秒为单位,有效期30天)
|
/// </summary>
|
public int expires_in { get; set; }
|
/// <summary>
|
/// 获取时间
|
/// </summary>
|
public string getdate { get; set; }
|
}
|
|
/// <summary>
|
/// 人脸注册信息
|
/// </summary>
|
public class BDUserInfo
|
{
|
/// <summary>
|
/// 图片路径(总数据大小应小于10M,分辨率应小于1920*1080)
|
/// </summary>
|
public string ImgPath { get; set; }
|
/// <summary>
|
/// 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制48B
|
/// </summary>
|
public string group_id { get; set; }
|
/// <summary>
|
/// 用户id(由数字、字母、下划线组成),对应系统账号
|
/// </summary>
|
public string user_id { get; set; }
|
}
|
/// <summary>
|
/// 人脸注册时返回对象
|
/// </summary>
|
public class CreateUserResult
|
{
|
/// <summary>
|
/// 检索成功返回0
|
/// </summary>
|
public int error_code { get; set; }
|
public string error_msg { get; set; }
|
/// <summary>
|
/// 请求标识码,随机数,唯一
|
/// </summary>
|
public string log_id { get; set; }
|
public CreateUser result { get; set; }
|
}
|
public class CreateUser
|
{
|
/// <summary>
|
/// 人脸图片的唯一标识
|
/// </summary>
|
public string face_token { get; set; }
|
}
|
|
/// <summary>
|
/// 人脸搜索时返回的对象
|
/// </summary>
|
public class SearchResult
|
{
|
/// <summary>
|
/// 检索成功返回0
|
/// </summary>
|
public int error_code { get; set; }
|
public string error_msg { get; set;}
|
public UserResult result { get; set;}
|
|
}
|
public class UserResult
|
{
|
public string face_token { get; set; }
|
public List<User_List> user_list { get; set;}
|
}
|
public class User_List
|
{
|
public string user_id { get; set; }
|
/// <summary>
|
/// 用户的匹配得分,80分以上可以判断为同一人
|
/// </summary>
|
public string score { get; set;}
|
}
|
/// <summary>
|
/// 人脸删除的入参对象(只删除某一张图片,如果该用户只有一张图片,那该用户整体删除
|
/// </summary>
|
public class DeleteUserImg
|
{
|
/// <summary>
|
/// 请求标识码,随机数,唯一
|
/// </summary>
|
public string log_id { get; set;}
|
/// <summary>
|
/// 用户id(由数字、字母、下划线组成),长度限制48B
|
/// </summary>
|
//public string user_id { get; set;}
|
public string user_id { get; set;}
|
/// <summary>
|
/// 用户组id(由数字、字母、下划线组成) 长度限制48B,删除指定group_id中的user_id信息
|
/// </summary>
|
public string group_id { get; set;}
|
/// <summary>
|
/// 需要删除的人脸图片token,(由数字、字母、下划线组成)长度限制64B
|
/// </summary>
|
public string face_token { get; set;}
|
}
|
}
|