Beispiel #1
0
        public async Task <ActionResult> Emotions()
        {
            var personGroupId = Request["PersonGroupId"];
            var model         = new IdentifyFacesModel();

            var groups = await FaceClient.ListPersonGroupsAsync();

            model.PersonGroups = groups.Select(g => new SelectListItem
            {
                Value = g.PersonGroupId,
                Text  = g.Name
            }).ToList();

            if (Request.HttpMethod == "GET")
            {
                return(View(model));
            }

            Face[]           faces   = new Face[] { };
            Guid[]           faceIds = new Guid[] { };
            IdentifyResult[] results = new IdentifyResult[] { };

            await RunOperationOnImage(async stream =>
            {
                var emotionsType = new[] { FaceAttributeType.Emotion };
                faces            = await FaceClient.DetectAsync(stream, returnFaceAttributes: emotionsType);
                faceIds          = faces.Select(f => f.FaceId).ToArray();

                if (faceIds.Length > 0)
                {
                    results = await FaceClient.IdentifyAsync(personGroupId, faceIds);
                }
            });

            if (faceIds.Length == 0)
            {
                model.Error = "No faces detected";
                return(View(model));
            }

            foreach (var result in results)
            {
                var identifiedFace = new IdentifiedFace();
                identifiedFace.Face = faces.FirstOrDefault(f => f.FaceId == result.FaceId);

                foreach (var candidate in result.Candidates)
                {
                    var person = await FaceClient.GetPersonAsync(personGroupId, candidate.PersonId);

                    identifiedFace.PersonCandidates.Add(person.PersonId, person.Name);
                }

                model.IdentifiedFaces.Add(identifiedFace);
                identifiedFace.Color = Settings.ImageSquareColors[model.IdentifiedFaces.Count];
            }

            model.ImageDump = GetInlineImageWithIdentifiedFaces(model.IdentifiedFaces);

            return(View(model));
        }
        private async Task <List <IdentifiedFace> > IdentifyFaces(string imageUrl)
        {
            var result = new List <IdentifiedFace>();

            var faces = await _faceClient.Face.DetectWithUrlAsync(imageUrl);

            var faceIds         = faces.Where(face => face.FaceId.HasValue).Select(face => face.FaceId.Value).ToArray();
            var identifiedFaces = await _faceClient.Face.IdentifyAsync(faceIds, PersonGroupId);

            foreach (var identifyResult in identifiedFaces)
            {
                var identifiedFace = new IdentifiedFace
                {
                    DetectedFace = faces.FirstOrDefault(x => x.FaceId == identifyResult.FaceId)
                };

                if (identifyResult.Candidates.Any())
                {
                    var candidate   = identifyResult.Candidates.First();
                    var candidateId = candidate.PersonId;
                    var person      = await _faceClient.PersonGroupPerson.GetAsync(PersonGroupId, candidateId);

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

                result.Add(identifiedFace);
            }

            return(result);
        }
        public async Task <ActionResult> Identify()
        {
            var personGroupId = Request["PersonGroupId"];
            var model         = new IdentifyFacesModel();

            var groups = await FaceClient.ListPersonGroupsAsync();

            model.PersonGroups = groups.Select(g => new SelectListItem
            {
                Value = g.PersonGroupId,
                Text  = g.Name
            }).ToList();

            if (Request.HttpMethod == "GET")
            {
                return(View(model));
            }

            try
            {
                Face[]           faces   = new Face[] { };
                Guid[]           faceIds = new Guid[] { };
                IdentifyResult[] results = new IdentifyResult[] { };

                await RunOperationOnImage(async stream =>
                {
                    faces   = await FaceClient.DetectAsync(stream);
                    faceIds = faces.Select(f => f.FaceId).ToArray();

                    if (faceIds.Count() > 0)
                    {
                        results = await FaceClient.IdentifyAsync(personGroupId, faceIds);
                    }
                });

                if (faceIds.Length == 0)
                {
                    model.Error = "No faces detected";
                    //return View("ConfirmationPage", model);
                }

                foreach (var result in results)
                {
                    var identifiedFace = new IdentifiedFace();
                    identifiedFace.Face = faces.FirstOrDefault(f => f.FaceId == result.FaceId);

                    foreach (var candidate in result.Candidates)
                    {
                        await RunOperationOnImage(async stream =>
                        {
                            var person = await FaceClient.GetPersonAsync(personGroupId, candidate.PersonId);
                            identifiedFace.PersonCandidates.Add(person.PersonId, person.Name);
                        });

                        // var person = await FaceClient.GetPersonAsync(personGroupId, candidate.PersonId);
                        // identifiedFace.PersonCandidates.Add(person.PersonId, person.Name);
                    }

                    identifiedFace.Color = Settings.ImageSquareColors[model.IdentifiedFaces.Count];

                    model.IdentifiedFaces.Add(identifiedFace);
                }
            }
            catch {
                model.Error = "No faces detected, Please try again";
            }
            model.ImageDump = GetInlineImageWithFaces(model.IdentifiedFaces.Select(x => x.Face));
            TempData.Add("MyTempData", model);
            return(RedirectToAction("ConfirmationPage"));
        }
        public async Task <ActionResult> Attributes()
        {
            var personGroupId = Request["PersonGroupId"];
            var model         = new IdentifyFacesModel();

            var groups = await FaceClient.ListPersonGroupsAsync();

            model.PersonGroups = groups.Select(g => new SelectListItem
            {
                Value = g.PersonGroupId,
                Text  = g.Name
            }).ToList();
            model.PersonGroups.Insert(0, new SelectListItem {
                Text = "", Value = ""
            });

            if (Request.HttpMethod == "GET")
            {
                return(View(model));
            }

            Face[]           faces   = new Face[] { };
            Guid[]           faceIds = new Guid[] { };
            IdentifyResult[] results = new IdentifyResult[] { };
            var faceAttributeTypes   = new[] {
                FaceAttributeType.Accessories, FaceAttributeType.Age, FaceAttributeType.Blur,
                FaceAttributeType.Exposure, FaceAttributeType.FacialHair, FaceAttributeType.Gender,
                FaceAttributeType.Glasses, FaceAttributeType.Hair, FaceAttributeType.HeadPose,
                FaceAttributeType.Makeup, FaceAttributeType.Noise, FaceAttributeType.Occlusion,
                FaceAttributeType.Smile
            };

            await RunOperationOnImage(async stream =>
            {
                faces   = await FaceClient.DetectAsync(stream, returnFaceAttributes: faceAttributeTypes);
                faceIds = faces.Select(f => f.FaceId).ToArray();

                if (faceIds.Length > 0 && !string.IsNullOrEmpty(personGroupId))
                {
                    results = await FaceClient.IdentifyAsync(personGroupId, faceIds);
                }
            });

            if (faceIds.Length == 0)
            {
                model.Error = "No faces detected";
                return(View(model));
            }

            if (!string.IsNullOrEmpty(personGroupId))
            {
                foreach (var result in results)
                {
                    var identifiedFace = new IdentifiedFace();
                    identifiedFace.Face = faces.FirstOrDefault(f => f.FaceId == result.FaceId);

                    foreach (var candidate in result.Candidates)
                    {
                        var person = await FaceClient.GetPersonAsync(personGroupId, candidate.PersonId);

                        identifiedFace.PersonCandidates.Add(person.PersonId, person.Name);
                    }

                    identifiedFace.Color = Settings.ImageSquareColors[model.IdentifiedFaces.Count];
                    model.IdentifiedFaces.Add(identifiedFace);
                }
            }
            else
            {
                foreach (var face in faces)
                {
                    var identifiedFace = new IdentifiedFace {
                        Face = face
                    };
                    model.IdentifiedFaces.Add(identifiedFace);

                    identifiedFace.Color = Settings.ImageSquareColors[model.IdentifiedFaces.Count];
                }
            }

            model.ImageDump = GetInlineImageWithIdentifiedFaces(model.IdentifiedFaces);

            return(View(model));
        }