public async Task <List <FaceSendInfo> > IdentifyOrAddPersonWithEmotionsAsync(string groupName, double confidence) { var time = DateTime.Now; //We also add emotions var facesInfo = new List <FaceSendInfo>(); foreach (var f in this.DetectedFaces) { var fsi = new FaceSendInfo(); var e = CoreUtil.FindEmotionForFace(f, this.DetectedEmotion); fsi.faceId = f.FaceId.ToString(); fsi.age = f.FaceAttributes.Age; fsi.faceRecHeight = f.FaceRectangle.Height; fsi.faceRecLeft = f.FaceRectangle.Left; fsi.faceRecTop = f.FaceRectangle.Top; fsi.faceRecWidth = f.FaceRectangle.Width; fsi.gender = f.FaceAttributes.Gender; fsi.smile = f.FaceAttributes.Smile; fsi.beard = f.FaceAttributes.FacialHair.Beard; fsi.moustache = f.FaceAttributes.FacialHair.Moustache; fsi.sideburns = f.FaceAttributes.FacialHair.Sideburns; fsi.glasses = f.FaceAttributes.Glasses.ToString(); fsi.headYaw = f.FaceAttributes.HeadPose.Yaw; fsi.headRoll = f.FaceAttributes.HeadPose.Roll; fsi.headPitch = f.FaceAttributes.HeadPose.Pitch; fsi.anger = e.Scores.Anger; fsi.contempt = e.Scores.Contempt; fsi.disgust = e.Scores.Disgust; fsi.fear = e.Scores.Fear; fsi.happiness = e.Scores.Happiness; fsi.neutral = e.Scores.Neutral; fsi.sadness = e.Scores.Sadness; fsi.surprise = e.Scores.Surprise; fsi.timeStamp = time; fsi.facesNo = this.DetectedFaces.Count(); facesInfo.Add(fsi); } var newPersonID = Guid.NewGuid(); //Move to initialization try { var g = await FaceServiceHelper.CreatePersonGroupIfNoGroupExists(groupName); groupId = g.PersonGroupId; } catch (Exception e) { // Catch errors with individual groups so we can continue looping through all groups. Maybe an answer will come from // another one. ErrorTrackingHelper.TrackException(e, "Problem creating group"); if (this.ShowDialogOnFaceApiErrors) { await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Problem creating group"); } } List <IdentifiedPerson> ipresult = new List <IdentifiedPerson>(); // Compute Face Identification and Unique Face Ids //We need to map detected faceID with actual personID (Identified face) try { IdentifyResult[] groupResults = await this.IdentifyFacesAsync(groupId); foreach (var f in this.DetectedFaces) { if (groupResults != null && groupResults.Where(gr => gr.FaceId == f.FaceId).Any() && groupResults.Where(gr => gr.FaceId == f.FaceId).FirstOrDefault().Candidates.Any()) { var candidates = groupResults.Where(gr => gr.FaceId == f.FaceId).FirstOrDefault().Candidates.OrderByDescending(ca => ca.Confidence); var fi = facesInfo.Where(fin => fin.faceId == f.FaceId.ToString()).FirstOrDefault(); int i = 0; Person p = new Person(); foreach (var can in candidates) { switch (i) { case 0: fi.can1id = can.PersonId.ToString(); fi.can1conf = can.Confidence; p = await FaceServiceHelper.GetPersonAsync(groupId, can.PersonId); fi.can1name = p.Name; if (can.Confidence >= confidence) { ipresult.Add(new IdentifiedPerson() { Person = p, Confidence = can.Confidence, FaceId = f.FaceId }); if (p.PersistedFaceIds.Length == 248) { Guid persistedFaceId = p.PersistedFaceIds.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); await FaceServiceHelper.DeletePersonFaceAsync(groupId, can.PersonId, persistedFaceId); } try { await FaceServiceHelper.AddPersonFaceAsync(groupId, can.PersonId, await this.GetImageStreamCallback(), "", f.FaceRectangle); } catch (Exception e) { // Catch errors with individual groups so we can continue looping through all groups. Maybe an answer will come from // another one. ErrorTrackingHelper.TrackException(e, "Problem adding face to group"); if (this.ShowDialogOnFaceApiErrors) { await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Problem adding face to group"); } } } else { //create new Guy if confidence not sufficient SimilarFaceMatch result = await GetSimilarFace(f); //using (var db = new KioskDbContext()) //{ // Blogs.ItemsSource = db.Blogs.ToList(); //} await CreatePerson(facesInfo, newPersonID, f); } break; case 1: fi.can2id = can.PersonId.ToString(); fi.can2conf = can.Confidence; p = await FaceServiceHelper.GetPersonAsync(groupId, can.PersonId); fi.can2name = p.Name; break; case 2: fi.can3id = can.PersonId.ToString(); fi.can3conf = can.Confidence; p = await FaceServiceHelper.GetPersonAsync(groupId, can.PersonId); fi.can3name = p.Name; break; case 3: fi.can4id = can.PersonId.ToString(); fi.can4conf = can.Confidence; p = await FaceServiceHelper.GetPersonAsync(groupId, can.PersonId); fi.can4name = p.Name; break; } i++; } } else { //if no candidate we also need to create new person await CreatePerson(facesInfo, newPersonID, f); } try { await FaceServiceHelper.TrainPersonGroupAsync(groupId); } catch (Exception e) { // Catch error with training of group ErrorTrackingHelper.TrackException(e, "Problem training group"); if (this.ShowDialogOnFaceApiErrors) { await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Problem training group"); } } } } catch (Exception e) { // Catch error with training of group ErrorTrackingHelper.TrackException(e, "Problem with cognitive services"); if (this.ShowDialogOnFaceApiErrors) { await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Problem with cognitive services"); } } return(facesInfo); }