private async static Task <Dictionary <string, double> > IdentifyImage(string imagePath, string groupId)
        {
            Dictionary <string, double> nameList = new Dictionary <string, double>();

            using (FileStream stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
            {
                IList <DetectedFace> faces = await _client.Face.DetectWithStreamAsync(stream, true, false, null, RecognitionModel.Recognition02);

                if (faces.Any())
                {
                    List <Guid>            faceIds = faces.Select(face => face.FaceId.Value).ToList();
                    IList <IdentifyResult> results = await _client.Face.IdentifyAsync(faceIds, groupId);

                    Person[] people = await Task.WhenAll(results
                                                         .Where(identifyResult => identifyResult.Candidates.Any())
                                                         .Select(async identifyResult =>
                    {
                        IdentifyCandidate candidate = identifyResult.Candidates.First();
                        Microsoft.Azure.CognitiveServices.Vision.Face.Models.Person person = await _client.PersonGroupPerson.GetAsync(groupId, candidate.PersonId);
                        return(new Person()
                        {
                            Confidence = candidate.Confidence,
                            Name = person.Name
                        });
                    }
                                                                 )
                                                         );

                    nameList = people.ToDictionary(person => person.Name, person => person.Confidence);
                }
            }
            return(nameList);
        }
예제 #2
0
        private async Task TagImage(string groupId, string filePath)
        {
            using (var imageStream = File.OpenRead(filePath))
            {
                IList <DetectedFace> faces = await faceClient.Face.DetectWithStreamAsync(imageStream);

                IEnumerable <Guid?> faceIds = faces.Select(f => f.FaceId);

                IList <IdentifyResult> results = await faceClient.Face.IdentifyAsync(faceIds.ToList(), groupId);

                List <string> personNames = new List <string>();

                foreach (IdentifyResult result in results)
                {
                    if (result.Candidates.Any())
                    {
                        IdentifyCandidate topCandidate = result.Candidates.First();
                        Person            person       = await faceClient.PersonGroupPerson.GetAsync(groupId, topCandidate.PersonId);

                        personNames.Add(person.Name);
                    }
                }
                ApplyTag(filePath, personNames);
            }
        }
        public async Task <List <Identification> > ExtractTopCandidate(IList <IdentifyResult> identities, IList <DetectedFace> faces)
        {
            var result = new List <Identification>();

            foreach (var face in faces)
            {
                var identifyResult = identities.Where(i => i.FaceId == face.FaceId).FirstOrDefault();

                var identification = new Identification
                {
                    Person = new Person {
                        Name = "Unknown"
                    },
                    Confidence     = 1,
                    Face           = face,
                    IdentifyResult = identifyResult
                };

                result.Add(identification);

                if (identifyResult != null && identifyResult.Candidates.Count > 0)
                {
                    // Get top 1 among all candidates returned
                    IdentifyCandidate candidate = identifyResult.Candidates[0];

                    var person = await _faceClient.PersonGroupPerson.GetAsync(_personGroupId, candidate.PersonId);

                    identification.Person     = person;
                    identification.Confidence = candidate.Confidence;
                }
            }

            return(result);
        }
예제 #4
0
            public async Task <List <Identification> > Identify(string personGroupId, StorageFile file)
            {
                var result = new List <Identification>();

                try
                {
                    var faces = await Detect(file);

                    var faceIds = faces.Select(face => face.FaceId.GetValueOrDefault()).ToList();

                    if (faceIds.Count == 0)
                    {
                        Debug.WriteLine("No Faces Found");
                        return(result);
                    }

                    TrainingStatusType status = await IsTrainingComplete(personGroupId);

                    IList <IdentifyResult> identities = new List <IdentifyResult>();
                    if (status != TrainingStatusType.Failed)
                    {
                        identities = await _faceClient.Face.IdentifyAsync(personGroupId, faceIds);
                    }

                    foreach (var face in faces)
                    {
                        var identifyResult = identities.Where(i => i.FaceId == face.FaceId).FirstOrDefault();

                        var identification = new Identification
                        {
                            Person = new Person {
                                Name = "Unknown"
                            },
                            Confidence     = 1,
                            Face           = face,
                            IdentifyResult = identifyResult
                        };

                        result.Add(identification);

                        if (identifyResult != null && identifyResult.Candidates.Count > 0)
                        {
                            // Get top 1 among all candidates returned
                            IdentifyCandidate candidate = identifyResult.Candidates[0];

                            var person = await _faceClient.PersonGroupPerson.GetAsync(personGroupId, candidate.PersonId);

                            identification.Person     = person;
                            identification.Confidence = candidate.Confidence;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }

                return(result);
            }
예제 #5
0
        private DetectedPerson GetPersonFromResult(IdentifyResult result, List <Person> persons)
        {
            if (result.Candidates.Count == 0)
            {
                return(null);
            }
            IdentifyCandidate candidate = result.Candidates
                                          .OrderByDescending(c => c.Confidence)
                                          .First();

            Person person = persons.FirstOrDefault(p => p.PersonId == candidate.PersonId);

            return(person == null ? null : new DetectedPerson()
            {
                Name = person.Name,
                Confidence = candidate.Confidence,
            });
        }
예제 #6
0
        public double Recognize(string siteId, out string name)
        {
            FaceClient faceClient = new FaceClient(new ApiKeyServiceClientCredentials("<Subscription Key>"))
            {
                Endpoint = "<API Endpoint>"
            };

            ReadImageStream(siteId, out Stream imageStream);

            // Detect faces in the image
            IList <DetectedFace> detectedFaces = faceClient.Face.DetectWithStreamAsync(imageStream).Result;

            // Too many faces detected
            if (detectedFaces.Count > 1)
            {
                name = string.Empty;
                return(0);
            }

            IList <Guid> faceIds = detectedFaces.Select(f => f.FaceId.Value).ToList();

            // Identify faces
            IList <IdentifyResult> identifiedFaces = faceClient.Face.IdentifyAsync(faceIds, "<Person Group ID>").Result;

            // No faces identified
            if (identifiedFaces.Count == 0)
            {
                name = string.Empty;
                return(0);
            }

            // Get the first candidate (candidates are ranked by confidence)
            IdentifyCandidate candidate = identifiedFaces.Single().Candidates.FirstOrDefault();

            // Find the person
            Person person = faceClient.PersonGroupPerson.GetAsync("", candidate.PersonId).Result;

            name = person.Name;

            return(candidate.Confidence);
        }