Ejemplo n.º 1
0
        public async Task DetectFacesAsync(bool detectFaceAttributes = false, bool detectFaceLandmarks = false)
        {
            try
            {
                if (this.ImageUrl != null)
                {
                    this.DetectedFaces = await FaceServiceHelper.DetectAsync(
                        this.ImageUrl,
                        returnFaceId : true,
                        returnFaceLandmarks : detectFaceLandmarks,
                        returnFaceAttributes : detectFaceAttributes?DefaultFaceAttributeTypes : null).ConfigureAwait(false);
                }
                else if (this.GetImageStreamCallback != null)
                {
                    this.DetectedFaces = await FaceServiceHelper.DetectAsync(
                        this.GetImageStreamCallback,
                        returnFaceId : true,
                        returnFaceLandmarks : detectFaceLandmarks,
                        returnFaceAttributes : detectFaceAttributes?DefaultFaceAttributeTypes : null).ConfigureAwait(false);
                }

                if (this.FilterOutSmallFaces)
                {
                    this.DetectedFaces = this.DetectedFaces.Where(f => CoreUtil.IsFaceBigEnoughForDetection(f.FaceRectangle.Height, this.DecodedImageHeight));
                }
            }
            catch (Exception e)
            {
                ErrorTrackingHelper.TrackException(e, "Face API DetectAsync error");

                this.DetectedFaces = Enumerable.Empty <Face>();

                if (this.ShowDialogOnFaceApiErrors)
                {
                    await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Face detection failed.").ConfigureAwait(false);
                }
            }
            finally
            {
                this.OnFaceDetectionCompleted();
            }
        }
Ejemplo n.º 2
0
        public async Task DescribeAsync()
        {
            try
            {
                if (this.ImageUrl != null)
                {
                    this.AnalysisResult = await VisionServiceHelper.DescribeAsync(this.ImageUrl);
                }
                else if (this.GetImageStreamCallback != null)
                {
                    this.AnalysisResult = await VisionServiceHelper.DescribeAsync(this.GetImageStreamCallback);
                }
            }
            catch (Exception e)
            {
                this.AnalysisResult = new Microsoft.ProjectOxford.Vision.Contract.AnalysisResult();

                if (this.ShowDialogOnFaceApiErrors)
                {
                    await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Vision API failed.");
                }
            }
        }
Ejemplo n.º 3
0
        public async Task FindSimilarPersistedFacesAsync()
        {
            this.SimilarFaceMatches = Enumerable.Empty <SimilarFaceMatch>();

            if (this.DetectedFaces == null || !this.DetectedFaces.Any())
            {
                return;
            }

            List <SimilarFaceMatch> result = new List <SimilarFaceMatch>();

            foreach (Face detectedFace in this.DetectedFaces)
            {
                try
                {
                    SimilarPersistedFace similarPersistedFace = await FaceListManager.FindSimilarPersistedFaceAsync(this.GetImageStreamCallback, detectedFace.FaceId, detectedFace);

                    if (similarPersistedFace != null)
                    {
                        result.Add(new SimilarFaceMatch {
                            Face = detectedFace, SimilarPersistedFace = similarPersistedFace
                        });
                    }
                }
                catch (Exception e)
                {
                    ErrorTrackingHelper.TrackException(e, "FaceListManager.FindSimilarPersistedFaceAsync error");

                    if (this.ShowDialogOnFaceApiErrors)
                    {
                        await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Failure finding similar faces");
                    }
                }
            }

            this.SimilarFaceMatches = result;
        }
Ejemplo n.º 4
0
        public async Task IdentifyFacesAsync()
        {
            try {
                this.IdentifiedPersons = Enumerable.Empty <IdentifiedPerson>();

                Guid[] detectedFaceIds = this.DetectedFaces?.Select(f => f.FaceId).ToArray();
                if (detectedFaceIds != null && detectedFaceIds.Any())
                {
                    List <IdentifiedPerson> result = new List <IdentifiedPerson>();

                    IEnumerable <PersonGroup> personGroups = Enumerable.Empty <PersonGroup>();

                    personGroups = await FaceServiceHelper.GetPersonGroupsAsync(PeopleGroupsUserDataFilter).ConfigureAwait(false);



                    foreach (var group in personGroups)
                    {
                        try
                        {
                            IdentifyResult[] groupResults = await FaceServiceHelper.IdentifyAsync(group.PersonGroupId, detectedFaceIds);

                            foreach (var match in groupResults)
                            {
                                if (!match.Candidates.Any())
                                {
                                    continue;
                                }

                                Person person = await FaceServiceHelper.GetPersonAsync(group.PersonGroupId, match.Candidates[0].PersonId);

                                IdentifiedPerson alreadyIdentifiedPerson = result.FirstOrDefault(p => p.Person.PersonId == match.Candidates[0].PersonId);
                                if (alreadyIdentifiedPerson != null)
                                {
                                    // We already tagged this person in another group. Replace the existing one if this new one if the confidence is higher.
                                    if (alreadyIdentifiedPerson.Confidence < match.Candidates[0].Confidence)
                                    {
                                        alreadyIdentifiedPerson.Person     = person;
                                        alreadyIdentifiedPerson.Confidence = match.Candidates[0].Confidence;
                                        alreadyIdentifiedPerson.FaceId     = match.FaceId;
                                    }
                                }
                                else
                                {
                                    result.Add(new IdentifiedPerson {
                                        Person = person, Confidence = match.Candidates[0].Confidence, FaceId = match.FaceId
                                    });
                                }
                            }
                        }
                        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, "Face API IdentifyAsync error");

                            if (this.ShowDialogOnFaceApiErrors)
                            {
                                await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Failure identifying faces");
                            }
                        }
                    }

                    this.IdentifiedPersons = result;
                }

                this.OnFaceRecognitionCompleted();
            }
            catch (Exception e) {
                Console.WriteLine(e.StackTrace);
                //ErrorTrackingHelper.TrackException(e, "Face API GetPersonGroupsAsync error");

                //if (this.ShowDialogOnFaceApiErrors)
                //{
                //    await ErrorTrackingHelper.GenericApiCallExceptionHandler(e, "Failure getting PersonGroups");
                //}
            }
        }