示例#1
0
        public void InsertInfo(AppBodyFaceInfo appbody)
        {
            string sqltext = "INSERT INTO RBApp.PersonVisitInfo (GroupId,PersonId,PersonName,PersonNameKana,LocationId,VisitCount) "
                             + "VALUES (@p1,@p2,@p3,@p4,@p5,@p6)";
            SqlConnection conn = new SqlConnection(sqlConnString);

            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqltext, conn);
                AddSqlParameter(ref cmd, "@p1", SqlDbType.NVarChar, appbody.groupId);
                AddSqlParameter(ref cmd, "@p2", SqlDbType.NVarChar, appbody.visitor_id);
                AddSqlParameter(ref cmd, "@p3", SqlDbType.NVarChar, appbody.visitor_name);
                AddSqlParameter(ref cmd, "@p4", SqlDbType.NVarChar, appbody.visitor_name_kana);
                AddSqlParameter(ref cmd, "@p5", SqlDbType.NVarChar, appbody.locationId);
                AddSqlParameter(ref cmd, "@p6", SqlDbType.Int, int.Parse(appbody.visit_count));
                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception)
            {
                conn.Close();
            }
        }
示例#2
0
        public AppResult GetInfo(AppBodyFaceInfo appbody)
        {
            AppResult appResult = new AppResult();
            ApiResult apiResult = new ApiResult();

            string sqltext = "SELECT PersonId,PersonName,PersonNameKana,VisitCount "
                             + "FROM RBApp.PersonVisitInfo WHERE GroupId = @p1 AND PersonId = @p2 AND LocationId = @p3";
            SqlConnection conn = new SqlConnection(sqlConnString);

            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqltext, conn);
                AddSqlParameter(ref cmd, "@p1", SqlDbType.NVarChar, appbody.groupId);
                AddSqlParameter(ref cmd, "@p2", SqlDbType.NVarChar, appbody.visitor_id);
                AddSqlParameter(ref cmd, "@p3", SqlDbType.NVarChar, appbody.locationId);
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    reader.Read();
                    appbody.visitor_name_kana = reader.GetString(2);
                    int visitCount = reader.GetInt32(3);
                    reader.Close();
                    conn.Close();
                    appbody.visit_count = (visitCount + 1).ToString();
                    UpdateInfo(appbody);
                }
                else
                {
                    reader.Close();
                    conn.Close();
                    appbody.visit_count = "1";
                    InsertInfo(appbody);
                }

                apiResult.IsSuccessStatusCode = true;
            }
            catch (Exception ex)
            {
                conn.Close();
                apiResult.IsSuccessStatusCode = false;
                apiResult.Message             = ex.Message;
            }

            appResult.apiResult = apiResult;
            appResult.appBody   = appbody;

            return(appResult);
        }
示例#3
0
        public void UpdateInfo(AppBodyFaceInfo appbody)
        {
            string sqltext = "UPDATE RBApp.PersonVisitInfo SET VisitCount = @p4 "
                             + "WHERE GroupId = @p1 AND PersonId = @p2 AND LocationId = @p3";
            SqlConnection conn = new SqlConnection(sqlConnString);

            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqltext, conn);
                AddSqlParameter(ref cmd, "@p1", SqlDbType.NVarChar, appbody.groupId);
                AddSqlParameter(ref cmd, "@p2", SqlDbType.NVarChar, appbody.visitor_id);
                AddSqlParameter(ref cmd, "@p3", SqlDbType.NVarChar, appbody.locationId);
                AddSqlParameter(ref cmd, "@p4", SqlDbType.Int, int.Parse(appbody.visit_count));
                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception)
            {
                conn.Close();
            }
        }
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }