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); }
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); }
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); }
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, }); }
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); }