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; } public static object SearchFileFace(String imagePath) { String strbaser64 = ConvertDataFormatAndImage.ImageToByte64String(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg); // 图片的base64编码 var imageType = "BASE64"; var groupIdList = "SNEC_0"; // 如果有可选参数 var options = new Dictionary{ {"quality_control", "NORMAL"}, {"liveness_control", "NORMAL"}, {"max_user_num", 1} }; // 带参数调用人脸搜索 object result = new object(); List frs = new List(); try { result = getFaceClant().Search(strbaser64, imageType, groupIdList, options); if (result != null) { var data = JsonConvert.DeserializeObject(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; } public static object SearchFace(String url) { var image = url; var imageType = "URL"; var groupIdList = "SNEC_0"; // 如果有可选参数 var options = new Dictionary{ {"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 frs = new List(); if (result != null) { var data = JsonConvert.DeserializeObject(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; } 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\":\"SNEC_0\",\"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(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\":\"SNEC_0\",\"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> paraList = new List>(); paraList.Add(new KeyValuePair("grant_type", "client_credentials")); paraList.Add(new KeyValuePair("client_id", System.Configuration.ConfigurationManager.AppSettings["API_KEY"].ToString())); paraList.Add(new KeyValuePair("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(result); Console.WriteLine(result); return to.access_token; } } }