public AppResult DetectFace(byte[] buffer, AppBodyFaceInfo appbody) { AppResult appResult = new AppResult(); ApiResult apiResult = new ApiResult(); // HTTP Client var client = new HttpClient(); var queryString = HttpUtility.ParseQueryString(string.Empty); // Request headers client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", faceApiKey); // Request parameters queryString["returnFaceId"] = "true"; queryString["returnFaceLandmarks"] = "false"; queryString["returnFaceAttributes"] = "age,gender,smile,glasses,headPose,facialHair"; var uri = $"{faceApiEndpoint}/detect?" + queryString; // Call REST API var content = new ByteArrayContent(buffer); content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); var response = client.PostAsync(uri, content); response.Wait(); apiResult.IsSuccessStatusCode = response.Result.IsSuccessStatusCode; if (apiResult.IsSuccessStatusCode) { var resdata = response.Result.Content.ReadAsStringAsync(); resdata.Wait(); apiResult.Result = resdata.Result.ToString(); JArray ja_result = (JArray)JsonConvert.DeserializeObject(apiResult.Result); JObject faceAttributes = null; if (ja_result.Count > 0) { appbody.visitor_faceId = (string)ja_result[0]["faceId"]; faceAttributes = (JObject)ja_result[0]["faceAttributes"]; int age = (int)faceAttributes["age"]; appbody.age = age.ToString(); appbody.gender = (string)faceAttributes["gender"]; double smile = (double)faceAttributes["smile"]; if (smile >= smileConfidence) { appbody.smile = "true"; } else { appbody.smile = "false"; } string glasses = (string)faceAttributes["glasses"]; if (glasses == "NoGlasses") { appbody.glasses = "false"; } else if (glasses.Length > 0) { appbody.glasses = "true"; } else { appbody.glasses = "false"; } double facialHair_moustache = (double)faceAttributes["facialHair"]["moustache"]; double facialHair_beard = (double)faceAttributes["facialHair"]["beard"]; double facialHair_sideburns = (double)faceAttributes["facialHair"]["sideburns"]; if (facialHair_moustache >= facialHairConfidence || facialHair_beard >= facialHairConfidence) { appbody.facialHair = "true"; } else { appbody.facialHair = "false"; } } else { appbody.age = ""; appbody.gender = ""; appbody.smile = ""; appbody.glasses = ""; appbody.facialHair = ""; } } else { apiResult.Message = response.Result.ToString(); } appResult.apiResult = apiResult; appResult.appBody = appbody; return(appResult); }
public AppResult IdentifyFace(AppBodyFaceInfo appbody) { AppResult appResult = new AppResult(); ApiResult apiResult = new ApiResult(); // Request parameters var client = new HttpClient(); // Request headers client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", faceApiKey); var uri = $"{faceApiEndpoint}/identify"; // Request body JObject jo_reqest = new JObject(); jo_reqest["personGroupId"] = appbody.groupId; JArray ja_faceIds = new JArray(); ja_faceIds.Add(appbody.visitor_faceId); jo_reqest["faceIds"] = ja_faceIds; jo_reqest["maxNumOfCandidatesReturned"] = 1; byte[] byteData = Encoding.UTF8.GetBytes((string)JsonConvert.SerializeObject(jo_reqest)); // Call REST API var content = new ByteArrayContent(byteData); content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = client.PostAsync(uri, content); response.Wait(); apiResult = new ApiResult(); apiResult.IsSuccessStatusCode = response.Result.IsSuccessStatusCode; if (apiResult.IsSuccessStatusCode) { var resdata = response.Result.Content.ReadAsStringAsync(); resdata.Wait(); apiResult.Result = resdata.Result.ToString(); } else { apiResult.Message = response.Result.ToString(); appResult.apiResult = apiResult; appResult.appBody = appbody; return(appResult); } string result = apiResult.Result; JArray ja_result = (JArray)JsonConvert.DeserializeObject(result); JArray candidates = (JArray)ja_result[0]["candidates"]; if (candidates.Count > 0) { double confidence = (double)candidates[0]["confidence"]; string s_personId = (string)candidates[0]["personId"]; confidence = Math.Floor(confidence * 100) / 100; string s_condidence = confidence.ToString(); ApiResult apiResult2 = getPerson(appbody.groupId, s_personId); if (apiResult2.IsSuccessStatusCode) { JObject jo_result = (JObject)JsonConvert.DeserializeObject(apiResult2.Result); appbody.visitor_name = (string)jo_result["name"]; } appbody.visitor_id = s_personId; appbody.face_confidence = s_condidence; } appResult.apiResult = apiResult; appResult.appBody = appbody; return(appResult); }
public JArrayString ProcessMessage(RbAppMasterCache rbappmc, RbAppRouterCache rbapprc, RbHeader rbh, string rbBodyString) { string sqlConnString = string.Empty; string storageAccount = string.Empty; string storageKey = string.Empty; string storageContainer = string.Empty; string faceApiEndpoint = string.Empty; string faceApiKey = string.Empty; bool success = true; JArray ja_messages = new JArray(); RbMessage message = new RbMessage(); // RbAppLog var appName = Path.GetFileNameWithoutExtension(this.GetType().Assembly.Location); string storageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", rbappmc.StorageAccount, rbappmc.StorageKey); RbAppLog RbAppLog = new RbAppLog(); RbAppLog.Initialize(storageConnectionString, "RbAppLog", appName); // Get appinfo JObject jo_appInfo = (JObject)JsonConvert.DeserializeObject(rbappmc.AppInfo); var p1 = jo_appInfo["SqlConnString"]; if (p1 != null) { sqlConnString = (string)p1; } var p2 = jo_appInfo["StorageAccount"]; if (p2 != null) { storageAccount = (string)p2; } var p3 = jo_appInfo["StorageKey"]; if (p3 != null) { storageKey = (string)p3; } var p4 = jo_appInfo["FaceStorageContainer"]; if (p4 != null) { storageContainer = (string)p4; } var p5 = jo_appInfo["FaceApiEndpoint"]; if (p5 != null) { faceApiEndpoint = (string)p5; } var p6 = jo_appInfo["FaceApiKey"]; if (p6 != null) { faceApiKey = (string)p6; } JObject jo_input = (JObject)JsonConvert.DeserializeObject(rbBodyString); AppBodyWhenError appBodyWhenError = new AppBodyWhenError(); if (rbh.MessageId == "init") { AppBodyInit appBody = new AppBodyInit(); appBody.storageAccount = storageAccount; appBody.storageContainer = storageContainer; appBody.storageKey = storageKey; message.RbBody = appBody; } else if (rbh.MessageId == "getFaceInfo") { AppBodyFaceInfo appBody = new AppBodyFaceInfo(); appBody.visitor = (string)jo_input["visitor"]; appBody.groupId = (string)jo_input["groupId"]; appBody.locationId = (string)jo_input["locationId"]; if (appBody.locationId == null || appBody.locationId == string.Empty) { appBody.locationId = "all"; } // Get image data stream string fileName = (string)jo_input["blobFileName"]; string deleteFile = (string)jo_input["deleteFile"]; BlobData blobData = new BlobData(storageAccount, storageKey, storageContainer); try { byte[] buffer = blobData.GetStream(fileName); // Delete File if (deleteFile == "true") { blobData.Delete(fileName); } // Get Confidence threshold double faceConfidence = 0; try { faceConfidence = (double)jo_appInfo["FaceConfidence"]; } catch { faceConfidence = 0.5; } double smileConfidence = 0; try { smileConfidence = (double)jo_appInfo["SmileConfidence"]; } catch { smileConfidence = 0.5; } double facialHairConfidence = 0; try { facialHairConfidence = (double)jo_appInfo["FacialHairConfidence"]; } catch { facialHairConfidence = 0.5; } // Call Face API (Detection) FaceDetection fd = new FaceDetection(faceApiEndpoint, faceApiKey, smileConfidence, facialHairConfidence); AppResult appResult1 = fd.DetectFace(buffer, appBody); appBody = appResult1.appBody; if (appResult1.apiResult.IsSuccessStatusCode) { // Call Face API (Identification) FaceIdentification fi = new FaceIdentification(faceApiEndpoint, faceApiKey, faceConfidence); AppResult appResult2 = fi.IdentifyFace(appBody); appBody = appResult2.appBody; if (appResult2.apiResult.IsSuccessStatusCode) { if (appBody.visitor_id != string.Empty) { PersonDbData personDbData = new PersonDbData(sqlConnString, rbh.AppId); AppResult appResult3 = personDbData.GetInfo(appBody); if (appResult3.apiResult.IsSuccessStatusCode) { appBody = appResult3.appBody; } else { success = false; appBodyWhenError.error_message = appResult3.apiResult.Message; RbAppLog.WriteError("E001", appResult3.apiResult.Message); } } } else { // Set success "true" even if identification doesn't succeed rbh.ProcessingStack = "** Notice ** Face identification missed."; RbAppLog.WriteError("E002", appResult2.apiResult.Message); } } else { success = false; appBodyWhenError.error_message = appResult1.apiResult.Message; RbAppLog.WriteError("E003", appResult1.apiResult.Message); } if (success) { appBody.success = "true"; message.RbBody = appBody; } else { appBodyWhenError.success = "false"; message.RbBody = appBodyWhenError; } } catch (Exception ex) { appBodyWhenError.error_message = ex.Message; RbAppLog.WriteError("E004", ex.ToString()); appBodyWhenError.success = "false"; message.RbBody = appBodyWhenError; } } else if (rbh.MessageId == "registerFace") { AppBodyRegResult appBody = new AppBodyRegResult(); appBody.visitor = (string)jo_input["visitor"]; appBody.groupId = (string)jo_input["groupId"]; appBody.locationId = (string)jo_input["locationId"]; if (appBody.locationId == null || appBody.locationId == string.Empty) { appBody.locationId = "all"; } appBody.visitor_name = (string)jo_input["visitor_name"]; appBody.visitor_name_kana = (string)jo_input["visitor_name_kana"]; // Check Person Group existence ApiResult apiResult1 = new ApiResult(); apiResult1.IsSuccessStatusCode = true; PersonGroup personGroup = new PersonGroup(faceApiEndpoint, faceApiKey, appBody.groupId); if (!personGroup.GetGroupExistence()) { // Create Person Group apiResult1 = personGroup.CreatePersonGroup(); } if (apiResult1.IsSuccessStatusCode) { // Create Person Person person = new Person(faceApiEndpoint, faceApiKey, appBody.groupId); ApiResult apiResult2 = person.CreatePerson(appBody.visitor_name); if (apiResult2.IsSuccessStatusCode) { // Extract PersonId JObject joRsult2 = (JObject)JsonConvert.DeserializeObject(apiResult2.Result); appBody.visitor_id = (string)joRsult2["personId"]; // Get image data stream string fileName = (string)jo_input["blobFileName"]; string deleteFile = (string)jo_input["deleteFile"]; BlobData blobData = new BlobData(storageAccount, storageKey, storageContainer); try { byte[] buffer = blobData.GetStream(fileName); // Delete File if (deleteFile == "true") { blobData.Delete(fileName); } // Add Face to the Person ApiResult apiResult3 = person.AddPersonFace(appBody.visitor_id, buffer); if (apiResult3.IsSuccessStatusCode) { appBody.success = "true"; personGroup.TrainPersonGroup(); AppBodyFaceInfo appBodyFaceInfo = new AppBodyFaceInfo(); appBodyFaceInfo.visitor = appBody.visitor; appBodyFaceInfo.groupId = appBody.groupId; appBodyFaceInfo.locationId = appBody.locationId; appBodyFaceInfo.visitor_id = appBody.visitor_id; appBodyFaceInfo.visitor_name = appBody.visitor_name; appBodyFaceInfo.visitor_name_kana = appBody.visitor_name_kana; appBodyFaceInfo.visit_count = "1"; PersonDbData personDbData = new PersonDbData(sqlConnString, rbh.AppId); personDbData.InsertInfo(appBodyFaceInfo); } else { success = false; appBodyWhenError.error_message = apiResult3.Message; RbAppLog.WriteError("E005", apiResult3.Message); } } catch (Exception ex) { if (ex.Message.Length > 100) { appBodyWhenError.error_message = ex.Message.Substring(0, 100); } else { appBodyWhenError.error_message = ex.Message; } appBodyWhenError.success = "false"; message.RbBody = appBodyWhenError; RbAppLog.WriteError("E006", ex.ToString()); } } else { success = false; appBodyWhenError.error_message = apiResult2.Message; RbAppLog.WriteError("E007", apiResult2.Message); } } else { success = false; appBodyWhenError.error_message = apiResult1.Message; RbAppLog.WriteError("E008", apiResult1.Message); } if (success) { appBody.success = "true"; message.RbBody = appBody; } else { appBodyWhenError.success = "false"; message.RbBody = appBodyWhenError; } } message.RbHeader = rbh; string json_message = JsonConvert.SerializeObject(message); JObject jo = (JObject)JsonConvert.DeserializeObject(json_message); ja_messages.Add(jo); JArrayString jaString = new JArrayString(ja_messages); return(jaString); }