예제 #1
0
        public async Task <List <Face> > GetFacesForPerson(Person person, PersonGroup group)
        {
            try
            {
                person.Faces.Clear();

                if (person.FaceIds?.Count > 0)
                {
                    foreach (var faceId in person.FaceIds)
                    {
                        var face = await GetFaceForPerson(person, group, faceId);

                        person.Faces.Add(face);
                    }

                    return(person.Faces);
                }

                return(default(List <Face>));
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #2
0
        public Task <Face> GetFaceForPerson(Person person, PersonGroup group, string persistedFaceId)
        {
            try
            {
                var tcs = new TaskCompletionSource <Face> ();

                Client.GetPersonFaceWithPersonGroupId(group.Id, person.Id, persistedFaceId, (mpoFace, error) =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    var face = mpoFace.ToFace();

                    tcs.SetResult(face);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #3
0
        public Task <Person> CreatePerson(string personName, PersonGroup group, string userData = null)
        {
            try
            {
                var result = Client.CreatePerson(group.Id, personName, userData);

                var id = result.PersonId.ToString();

                if (string.IsNullOrEmpty(id))
                {
                    throw new Exception("CreatePersonResult returned invalid person Id");
                }

                var person = new Person
                {
                    Name     = personName,
                    Id       = id,
                    UserData = userData
                };

                group.People.Add(person);

                return(Task.FromResult(person));
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                throw;
            }
        }
예제 #4
0
        public Task DeleteFace(Person person, PersonGroup group, Face face)
        {
            try
            {
                var tcs = new TaskCompletionSource <bool> ();

                Client.DeletePersonFaceWithPersonGroupId(group.Id, person.Id, face.Id, error =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    if (person.Faces.Contains(face))
                    {
                        person.Faces.Remove(face);
                    }

                    tcs.SetResult(true);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #5
0
        public Task <PersonGroup> CreatePersonGroup(string groupName, string userData = null)
        {
            try
            {
                var personGroupId = Guid.NewGuid().ToString();

                Client.CreatePersonGroup(personGroupId, groupName, userData);

                var group = new PersonGroup
                {
                    Name     = groupName,
                    Id       = personGroupId,
                    UserData = userData
                };

                Groups.Add(group);

                return(Task.FromResult(group));
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                throw;
            }
        }
예제 #6
0
        public Task UpdatePerson(Person person, PersonGroup group, string personName, string userData = null)
        {
            try
            {
                var tcs = new TaskCompletionSource <bool> ();

                Client.UpdatePersonWithPersonGroupId(group.Id, person.Id, personName, userData, error =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    person.Name     = personName;
                    person.UserData = userData;

                    tcs.SetResult(true);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #7
0
        public Task <Person> CreatePerson(string personName, PersonGroup group, string userData = null)
        {
            try
            {
                var tcs = new TaskCompletionSource <Person> ();

                Client.CreatePersonWithPersonGroupId(group.Id, personName, userData, (result, error) =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    tcs.FailTaskByCondition(string.IsNullOrEmpty(result.PersonId), "CreatePersonResult returned invalid person Id");
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    var person = new Person
                    {
                        Name     = personName,
                        Id       = result.PersonId,
                        UserData = userData
                    };

                    group.People.Add(person);

                    tcs.SetResult(person);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #8
0
        public Task <VerifyResult> Verify(Face face, Person person, PersonGroup personGroup)
        {
            try
            {
                var tcs = new TaskCompletionSource <VerifyResult> ();

                Client.VerifyWithFaceId(face.Id, person.Id, personGroup.Id, (verifyResult, error) =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    var result = new VerifyResult
                    {
                        IsIdentical = verifyResult.IsIdentical,
                        Confidence  = verifyResult.Confidence
                    };

                    tcs.SetResult(result);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #9
0
        public Task TrainGroup(PersonGroup personGroup)
        {
            try
            {
                var tcs = new TaskCompletionSource <bool> ();

                Client.TrainPersonGroupWithPersonGroupId(personGroup.Id, error =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    tcs.SetResult(true);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #10
0
        public Task TrainGroup(PersonGroup personGroup)
        {
            try
            {
                Client.TrainPersonGroup(personGroup.Id);

                return(Task.FromResult(true));
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                throw;
            }
        }
예제 #11
0
        public async Task <List <IdentificationResult> > Identify(PersonGroup group, Face face, int maxNumberOfCandidates = 1)
        {
            try
            {
                //ensure people are loaded for this group
                await GetPeopleForGroup(group);

                return(await IdentifyInternal(group, new Face [] { face }, maxNumberOfCandidates));
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #12
0
        Task <List <IdentificationResult> > IdentifyInternal(PersonGroup group, Face [] detectedFaces, int maxNumberOfCandidates = 1)
        {
            try
            {
                var results = new List <IdentificationResult> ();
                var tcs     = new TaskCompletionSource <List <IdentificationResult> > ();

                var detectedFaceIds = detectedFaces.Select(f => f.Id).ToArray();

                Client.IdentifyWithPersonGroupId(group.Id, detectedFaceIds, maxNumberOfCandidates, async(identifyResults, error) =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    foreach (MPOIdentifyResult result in identifyResults)
                    {
                        var face = detectedFaces.FirstOrDefault(f => f.Id == result.FaceId);

                        foreach (MPOCandidate candidate in result.Candidates)
                        {
                            var person = await GetPerson(group, candidate.PersonId);

                            var identifyResult = new IdentificationResult
                            {
                                Person     = person,
                                Face       = face,
                                Confidence = candidate.Confidence
                            };

                            results.Add(identifyResult);
                        }
                    }

                    tcs.SetResult(results);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #13
0
        public Task UpdatePersonGroup(PersonGroup personGroup, string groupName, string userData = null)
        {
            try
            {
                Client.UpdatePersonGroup(personGroup.Id, groupName, userData);

                personGroup.Name     = groupName;
                personGroup.UserData = userData;

                return(Task.FromResult(true));
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                throw;
            }
        }
예제 #14
0
        public Task UpdatePerson(Person person, PersonGroup group, string personName, string userData = null)
        {
            try
            {
                Client.UpdatePerson(group.Id, UUID.FromString(person.Id), personName, userData);

                person.Name     = personName;
                person.UserData = userData;

                return(Task.FromResult(true));
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                throw;
            }
        }
예제 #15
0
        public Task <Person> GetPerson(PersonGroup group, string personId)
        {
            try
            {
                //if people are already loaded for this group try to find it there...
                if (group.People?.Count > 0)
                {
                    var person = group.People.FirstOrDefault(p => p.Id == personId);

                    if (person != null)
                    {
                        return(Task.FromResult(person));
                    }
                }

                var tcs = new TaskCompletionSource <Person> ();

                Client.GetPersonWithPersonGroupId(group.Id, personId, (mpoPerson, error) =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    var person = mpoPerson.ToPerson();

                    //add them to the group?
                    group.People.Add(person);

                    tcs.SetResult(person);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #16
0
        public Task AddFaceForPerson(Person person, PersonGroup group, Face face, UIImage photo, string userData = null, float quality = .8f)
        {
            var tcs = new TaskCompletionSource <bool> ();

            try
            {
                var faceRect = face.FaceRectangle.ToMPOFaceRect();

                using (var jpgData = photo.AsJPEG(quality))
                {
                    Client.AddPersonFaceWithPersonGroupId(group.Id, person.Id, jpgData, userData, faceRect, (result, error) =>
                    {
                        tcs.FailTaskIfErrored(error.ToException());
                        tcs.FailTaskByCondition(string.IsNullOrEmpty(result?.PersistedFaceId), "AddPersistedFaceResult returned invalid face Id");
                        if (tcs.IsNullFinishCanceledOrFaulted())
                        {
                            return;
                        }

                        face.Id = result.PersistedFaceId;
                        face.UpdatePhotoPath();

                        person.Faces.Add(face);

                        face.SavePhotoFromSource(photo);

                        tcs.SetResult(true);
                    }).Resume();
                }

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #17
0
        public Task <List <Person> > GetPeopleForGroup(PersonGroup group, bool forceRefresh = false)
        {
            try
            {
                if (group.People?.Count > 0 && !forceRefresh)
                {
                    return(Task.FromResult(group.People));
                }

                var tcs = new TaskCompletionSource <List <Person> > ();

                Client.ListPersonsWithPersonGroupId(group.Id, (mpoPeople, error) =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    var people = new List <Person> (
                        mpoPeople.Select(p => p.ToPerson())
                        );

                    group.People.Clear();
                    group.People.AddRange(people);

                    tcs.SetResult(people);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }
예제 #18
0
        public Task <PersonGroup> CreatePersonGroup(string groupName, string userData = null)
        {
            try
            {
                var tcs = new TaskCompletionSource <PersonGroup> ();

                var personGroupId = Guid.NewGuid().ToString();

                Client.CreatePersonGroupWithId(personGroupId, groupName, userData, error =>
                {
                    tcs.FailTaskIfErrored(error.ToException());
                    if (tcs.IsNullFinishCanceledOrFaulted())
                    {
                        return;
                    }

                    var group = new PersonGroup
                    {
                        Name     = groupName,
                        Id       = personGroupId,
                        UserData = userData
                    };

                    Groups.Add(group);

                    tcs.SetResult(group);
                }).Resume();

                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                throw;
            }
        }