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