1
This commit is contained in:
@@ -0,0 +1,508 @@
|
||||
using AOP.Common.DataConversion;
|
||||
using Baidu.Aip.Face;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SgManager.AI
|
||||
{
|
||||
|
||||
public static class FaceClass
|
||||
{
|
||||
|
||||
|
||||
public static Baidu.Aip.Face.Face getFaceClant()
|
||||
{
|
||||
// 设置APPID/AK/SK
|
||||
var APP_ID = System.Configuration.ConfigurationManager.AppSettings["APP_ID"].ToString();
|
||||
var API_KEY = System.Configuration.ConfigurationManager.AppSettings["API_KEY"].ToString();
|
||||
var SECRET_KEY = System.Configuration.ConfigurationManager.AppSettings["SECRET_KEY"].ToString();
|
||||
var client = new Baidu.Aip.Face.Face(API_KEY, SECRET_KEY);
|
||||
client.Timeout = 60000; // 修改超时时间
|
||||
return client;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据本地路径进行人脸搜索
|
||||
/// </summary>
|
||||
/// <param name="imagePath">本地路径</param>
|
||||
/// <returns></returns>
|
||||
public static object SearchFileFace(String imagePath)
|
||||
{
|
||||
String strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
|
||||
var imageType = "BASE64";
|
||||
var groupIdList = System.Configuration.ConfigurationManager.AppSettings["GroupId"].ToString();
|
||||
// 如果有可选参数
|
||||
var options = new Dictionary<string, object>{
|
||||
{"quality_control", "NORMAL"},
|
||||
{"liveness_control", "NORMAL"},
|
||||
{"max_user_num", 1}
|
||||
};
|
||||
// 带参数调用人脸搜索
|
||||
object result = new object();
|
||||
List<faceResult> frs = new List<faceResult>();
|
||||
try
|
||||
{
|
||||
result = getFaceClant().Search(strbaser64, imageType, groupIdList, options);
|
||||
|
||||
if (result != null)
|
||||
{
|
||||
var data = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(result));
|
||||
String error_msg = data.error_msg;
|
||||
String errorCode = data.error_code;
|
||||
if (error_msg == "SUCCESS")
|
||||
{
|
||||
|
||||
for (int i = 0; i < data.result.user_list.Count; i++)
|
||||
{
|
||||
faceResult fr = new faceResult();
|
||||
fr.user_id = data.result.user_list[i].user_id;
|
||||
fr.user_info = getUserName(fr.user_id);
|
||||
fr.errMess = error_msg;
|
||||
try
|
||||
{
|
||||
string score = data.result.user_list[i].score.ToString();
|
||||
fr.score = double.Parse(score);
|
||||
}
|
||||
catch
|
||||
{
|
||||
fr.score = 0;
|
||||
}
|
||||
if (fr.score > 85)
|
||||
frs.Add(fr);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
faceResult fr = new faceResult();
|
||||
fr.errMess = error_msg;
|
||||
fr.errCode = errorCode;
|
||||
frs.Add(fr);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
faceResult fr = new faceResult();
|
||||
fr.errMess = ex.ToString();
|
||||
frs.Add(fr);
|
||||
}
|
||||
return frs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据URL进行人脸搜索
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <returns></returns>
|
||||
public static object SearchFace(String url)
|
||||
{
|
||||
var image = url;
|
||||
var imageType = "URL";
|
||||
var groupIdList = "WX_Face_TCC";
|
||||
// 如果有可选参数
|
||||
var options = new Dictionary<string, object>{
|
||||
{"quality_control", "NORMAL"},
|
||||
{"liveness_control", "LOW"},
|
||||
{"max_user_num", 1}
|
||||
};
|
||||
// 带参数调用人脸搜索
|
||||
object result = new object();
|
||||
try
|
||||
{
|
||||
result = getFaceClant().Search(image, imageType, groupIdList, options);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<faceResult> frs = new List<faceResult>();
|
||||
if (result != null)
|
||||
{
|
||||
var data = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(result));
|
||||
String error_msg = data.error_msg;
|
||||
if (error_msg == "SUCCESS")
|
||||
{
|
||||
|
||||
for (int i = 0; i < data.result.user_list.Count; i++)
|
||||
{
|
||||
faceResult fr = new faceResult();
|
||||
fr.user_id = data.result.user_list[i].user_id;
|
||||
fr.user_info = getUserName(fr.user_id);
|
||||
|
||||
try
|
||||
{
|
||||
string score = data.result.user_list[i].score.ToString();
|
||||
fr.score = double.Parse(score);
|
||||
}
|
||||
catch
|
||||
{
|
||||
fr.score = 0;
|
||||
}
|
||||
if (fr.score > 85)
|
||||
{
|
||||
frs.Add(fr);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else return null;
|
||||
}
|
||||
return frs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据URL进行人脸搜索 M:N
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <returns></returns>
|
||||
public static object MultiSearchFace(String url)
|
||||
{
|
||||
var image = url;
|
||||
var imageType = "URL";
|
||||
var groupIdList = "WX_Face_TCC";
|
||||
// 如果有可选参数
|
||||
var options = new Dictionary<string, object>{
|
||||
{"quality_control", "NORMAL"},
|
||||
{"liveness_control", "LOW"},
|
||||
{"max_user_num", 10}
|
||||
};
|
||||
// 带参数调用人脸搜索
|
||||
object result = new object();
|
||||
try
|
||||
{
|
||||
result = getFaceClant().MultiSearch(image, imageType, groupIdList, options);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<faceResult> frs = new List<faceResult>();
|
||||
if (result != null)
|
||||
{
|
||||
var data = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(result));
|
||||
String error_msg = data.error_msg;
|
||||
if (error_msg == "SUCCESS")
|
||||
{
|
||||
for (int j = 0; j < data.result.face_list.Count; j++)
|
||||
{
|
||||
for (int i = 0; i < data.result.face_list[j].user_list.Count; i++)
|
||||
{
|
||||
faceResult fr = new faceResult();
|
||||
fr.user_id = data.result.face_list[j].user_list[i].user_id;
|
||||
fr.user_info = getUserName(fr.user_id);
|
||||
fr.errMess = error_msg;
|
||||
try
|
||||
{
|
||||
string score = data.result.face_list[j].user_list[i].score.ToString();
|
||||
fr.score = double.Parse(score);
|
||||
}
|
||||
catch
|
||||
{
|
||||
fr.score = 0;
|
||||
}
|
||||
if (fr.score > 85)
|
||||
{
|
||||
frs.Add(fr);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else return null;
|
||||
}
|
||||
return frs;
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据本地路径进行人脸搜索M:N
|
||||
/// </summary>
|
||||
/// <param name="imagePath"></param>
|
||||
/// <returns></returns>
|
||||
public static object MultiSearchFileFace(String imagePath)
|
||||
{
|
||||
String strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
|
||||
var imageType = "BASE64";
|
||||
var groupIdList = System.Configuration.ConfigurationManager.AppSettings["GroupId"].ToString();
|
||||
// 如果有可选参数
|
||||
var options = new Dictionary<string, object>{
|
||||
{"quality_control", "NORMAL"},
|
||||
{"liveness_control", "LOW"},
|
||||
{"max_user_num", 10},
|
||||
{"max_face_num", 10}
|
||||
};
|
||||
// 带参数调用人脸搜索
|
||||
object result = new object();
|
||||
try
|
||||
{
|
||||
result = getFaceClant().MultiSearch(strbaser64, imageType, groupIdList, options);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<faceResult> frs = new List<faceResult>();
|
||||
if (result != null)
|
||||
{
|
||||
var data = JsonConvert.DeserializeObject<dynamic>(JsonConvert.SerializeObject(result));
|
||||
String error_msg = data.error_msg;
|
||||
if (error_msg == "SUCCESS")
|
||||
{
|
||||
for (int j = 0; j < data.result.face_list.Count; j++)
|
||||
{
|
||||
for (int i = 0; i < data.result.face_list[j].user_list.Count; i++)
|
||||
{
|
||||
faceResult fr = new faceResult();
|
||||
fr.user_id = data.result.face_list[j].user_list[i].user_id;
|
||||
fr.user_info = getUserName(fr.user_id);
|
||||
fr.errMess = error_msg;
|
||||
try
|
||||
{
|
||||
string score = data.result.face_list[j].user_list[i].score.ToString();
|
||||
fr.score = double.Parse(score);
|
||||
}
|
||||
catch
|
||||
{
|
||||
fr.score = 0;
|
||||
}
|
||||
if (fr.score > 85)
|
||||
{
|
||||
frs.Add(fr);
|
||||
//break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else return null;
|
||||
}
|
||||
return frs;
|
||||
}
|
||||
/// <summary>
|
||||
/// 人脸注册
|
||||
/// </summary>
|
||||
/// <param name="user_id"></param>
|
||||
/// <param name="user_card"></param>
|
||||
/// <param name="imagePath"></param>
|
||||
/// <returns></returns>
|
||||
public static string UserAdd(string user_id, string user_card, string imagePath)
|
||||
{
|
||||
String strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
|
||||
var imageType = "BASE64";
|
||||
var groupIdList = System.Configuration.ConfigurationManager.AppSettings["GroupId"].ToString();
|
||||
// 如果有可选参数
|
||||
// 如果有可选参数
|
||||
var options = new Dictionary<string, object>{
|
||||
{"user_info",user_id},
|
||||
{"quality_control", "NORMAL"},
|
||||
{"liveness_control", "LOW"},
|
||||
{"action_type", "REPLACE"}
|
||||
};
|
||||
// 带参数调用人脸搜索
|
||||
object result = new object();
|
||||
try
|
||||
{
|
||||
result = getFaceClant().UserAdd(strbaser64, imageType, groupIdList, user_card, options);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
public static string UserUpdate(string user_id, string user_card, string imagePath)
|
||||
{
|
||||
String strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
|
||||
var imageType = "BASE64";
|
||||
var groupIdList = System.Configuration.ConfigurationManager.AppSettings["GroupId"].ToString();
|
||||
// 如果有可选参数
|
||||
// 如果有可选参数
|
||||
var options = new Dictionary<string, object>{
|
||||
{"user_info",user_id},
|
||||
{"quality_control", "NORMAL"},
|
||||
{"liveness_control", "LOW"},
|
||||
{"action_type", "REPLACE"}
|
||||
};
|
||||
// 带参数调用人脸搜索
|
||||
object result = new object();
|
||||
try
|
||||
{
|
||||
result = getFaceClant().UserUpdate(strbaser64, imageType, groupIdList, user_card, options);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
public static String getUserName(string id)
|
||||
{
|
||||
string userName = "未知用户";
|
||||
switch (id)
|
||||
{
|
||||
|
||||
case "A01844":
|
||||
userName = "张腾云";
|
||||
break;
|
||||
case "A04979":
|
||||
userName = "张延强";
|
||||
break;
|
||||
case "A05352":
|
||||
userName = "王勇C";
|
||||
break;
|
||||
case "A06539":
|
||||
userName = "崔璐峰";
|
||||
break;
|
||||
case "A04984":
|
||||
userName = "杨新民";
|
||||
break;
|
||||
case "A05303":
|
||||
userName = "李文娟";
|
||||
break;
|
||||
case "A04988":
|
||||
userName = "马明";
|
||||
break;
|
||||
case "A06926":
|
||||
userName = "王建峰";
|
||||
break;
|
||||
default:
|
||||
userName = "未知用户";
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
return userName;
|
||||
|
||||
}
|
||||
|
||||
// 在线活体检测
|
||||
public static string FaceVerify(string imagePath)
|
||||
{
|
||||
string token = AccessToken.getAccessToken();
|
||||
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceverify?access_token=" + token;
|
||||
Encoding encoding = Encoding.Default;
|
||||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
||||
request.Method = "post";
|
||||
request.KeepAlive = true;
|
||||
String strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码
|
||||
String str = "[{\"image\":\"" + strbaser64 + "\",\"image_type\":\"BASE64\",\"face_field\":\"quality,human\"}]";
|
||||
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();
|
||||
//Console.WriteLine("在线活体检测:");
|
||||
Console.WriteLine(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
// 人脸注册
|
||||
public static string add(string user_id, string user_card, string imgUrl, string token)
|
||||
{
|
||||
bool first = true;
|
||||
if (string.IsNullOrEmpty(token))
|
||||
{
|
||||
token = AccessToken.getAccessToken();
|
||||
first = false;
|
||||
}
|
||||
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\":\"" + imgUrl + "\",\"image_type\":\"URL\",\"group_id\":\"WX_Face_TCC\",\"user_id\":\"" + user_card + "\",\"user_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();
|
||||
//Console.WriteLine("人脸注册:");
|
||||
//Console.WriteLine(result);
|
||||
var res = JsonConvert.DeserializeObject<dynamic>(result);
|
||||
|
||||
if (result.Contains("Access token invalid or no longer valid") && first)
|
||||
{
|
||||
token = null;
|
||||
add(user_id, user_card, imgUrl, token);
|
||||
}
|
||||
|
||||
if (result.Contains("face is already exist"))
|
||||
result = update(user_id, user_card, imgUrl, token);
|
||||
if (res.error_code == "0")
|
||||
{
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// 人脸更新
|
||||
public static string update(string user_id, string user_card, string imgUrl, string token)
|
||||
{
|
||||
if (string.IsNullOrEmpty(token))
|
||||
token = AccessToken.getAccessToken();
|
||||
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update?access_token=" + token;
|
||||
Encoding encoding = Encoding.Default;
|
||||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
|
||||
request.Method = "post";
|
||||
request.KeepAlive = true;
|
||||
String str = "{\"image\":\"" + imgUrl + "\",\"image_type\":\"URL\",\"group_id\":\"WX_Face_TCC\",\"user_id\":\"" + user_card + "\",\"user_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();
|
||||
if (result.Contains("user is not exist"))
|
||||
result = add(user_id, user_card, imgUrl, token);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static class AccessToken
|
||||
|
||||
{
|
||||
// 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
|
||||
// 返回token示例
|
||||
public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";
|
||||
|
||||
// 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
|
||||
private static String clientId = "百度云应用的AK";
|
||||
// 百度云中开通对应服务应用的 Secret Key
|
||||
private static String clientSecret = "百度云应用的SK";
|
||||
|
||||
public static String getAccessToken()
|
||||
{
|
||||
String authHost = "https://aip.baidubce.com/oauth/2.0/token";
|
||||
HttpClient client = new HttpClient();
|
||||
List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
|
||||
paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
|
||||
paraList.Add(new KeyValuePair<string, string>("client_id", System.Configuration.ConfigurationManager.AppSettings["API_KEY"].ToString()));
|
||||
paraList.Add(new KeyValuePair<string, string>("client_secret", System.Configuration.ConfigurationManager.AppSettings["SECRET_KEY"].ToString()));
|
||||
|
||||
HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
|
||||
String result = response.Content.ReadAsStringAsync().Result;
|
||||
var to = JsonConvert.DeserializeObject<dynamic>(result);
|
||||
Console.WriteLine(result);
|
||||
return to.access_token;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user