private List <FaceDetail> FilterFaces(List <FaceDetail> faceDetails, RecognitionRequest request)
        {
            if (faceDetails == null)
            {
                return(faceDetails);
            }
            var results = faceDetails;

            if (request.Age.HasValue)
            {
                results = results.Where(f =>
                                        f.AgeRange?.High >= (request.Age.Value + _ageBuffer) &&
                                        f.AgeRange?.Low <= (Math.Max(0, request.Age.Value + _ageBuffer))).ToList();
            }

            if (request.IsMale.HasValue)
            {
                var genderType = request.IsMale.Value ? GenderType.Male : GenderType.Female;
                results = results.Where(f =>
                                        f?.Gender?.Value == genderType && f?.Gender?.Confidence >= _confidenceRequired).ToList();
            }

            if (request.IsSmiling.HasValue)
            {
                results = results.Where(f =>
                                        f?.Smile?.Value == request.IsSmiling.Value && f?.Smile?.Confidence >= _confidenceRequired).ToList();
            }

            return(results);
        }
        public async Task TraverseFor(Settings settings)
        {
            var request = new ListObjectsRequest()
            {
                BucketName = settings.BucketName,
                Prefix     = settings.SourcePrefix
            };
            var objects  = new List <Amazon.S3.Model.S3Object>();
            var response = await _s3Client.ListObjectsAsync(request);

            objects.AddRange(response.S3Objects);
            while (response.IsTruncated)
            {
                request.Marker = response.NextMarker;
                response       = await _s3Client.ListObjectsAsync(request);

                objects.AddRange(response.S3Objects);
            }
            foreach (var s3Object in objects)
            {
                var extension = s3Object.Key.Substring(s3Object.Key.LastIndexOf(".") + 1);
                if (!_acceptedExtensions.Any(x => x.Equals(extension, StringComparison.InvariantCultureIgnoreCase)))
                {
                    continue;
                }
                var recognitionRequest = new RecognitionRequest()
                {
                    Age       = settings.Age,
                    IsSmiling = settings.IsSmiling,
                    IsMale    = settings.IsMale
                };
                var result = await _faceRecogniser.Recognise(settings.BucketName, s3Object.Key, recognitionRequest);

                if (result.IsFound)
                {
                    await _objectUploader.UploadObjectAsync(settings.BucketName, s3Object.Key, $"{settings.DestinationPrefix}/{s3Object.Key.GetFileFromKey()}");
                }
            }
        }
        public async Task <RecognitionResult> Recognise(string bucketName, string key, RecognitionRequest request)
        {
            var client       = new AmazonRekognitionClient(_configuration.GetSection("AWS:AccessKey").Value.ToString(), _configuration.GetSection("AWS:SecretKey").Value.ToString(), Amazon.RegionEndpoint.APSoutheast2);
            var faceResponse = await client.DetectFacesAsync(new DetectFacesRequest
            {
                Image = new Image
                {
                    S3Object = new Amazon.Rekognition.Model.S3Object
                    {
                        Bucket = bucketName,
                        Name   = key
                    }
                },
                Attributes = new List <string> {
                    "ALL"
                }
            });

            List <FaceDetail> faceDetails = faceResponse?.FaceDetails;

            if (faceDetails != null)
            {
                var results = FilterFaces(faceDetails, request);
                if (results.Any())
                {
                    Console.WriteLine($"Found at least one person in {key.GetFileFromKey()} meeting the criteria.");
                    return(new RecognitionResult()
                    {
                        IsFound = true,
                        IsAlone = results.Count() == 1 && faceDetails.Count() == 1
                    });
                }
            }

            return(new RecognitionResult()
            {
                IsFound = false,
                IsAlone = false
            });
        }