using System; using System.Collections.Generic; using System.Net; using System.Text.Json.Serialization; using System.Threading.Tasks; using Amazon.Lambda.Core; using Amazon.Lambda.RuntimeSupport; using Amazon.Lambda.Serialization.SystemTextJson; using Amazon.Rekognition; using Amazon.Rekognition.Model; using Amazon.XRay.Recorder.Handlers.AwsSdk; using Common; namespace rekognition { public class Function { /// /// The default minimum confidence used for detecting labels. /// public const float DEFAULT_MIN_CONFIDENCE = 60f; /// /// The name of the environment variable to set which will override the default minimum confidence level. /// public const string MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME = "MinConfidence"; public const int MaxLabels = 10; private static IAmazonRekognition RekognitionClient { get; } private static float MinConfidence { get; } = DEFAULT_MIN_CONFIDENCE; static Function() { AWSSDKHandler.RegisterXRayForAllServices(); RekognitionClient = new AmazonRekognitionClient(); var environmentMinConfidence = Environment.GetEnvironmentVariable(MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME); if (!string.IsNullOrWhiteSpace(environmentMinConfidence)) { float value; if (float.TryParse(environmentMinConfidence, out value)) { MinConfidence = value; Console.WriteLine($"Setting minimum confidence to {MinConfidence}"); } else { Console.WriteLine( $"Failed to parse value {environmentMinConfidence} for minimum confidence. Reverting back to default of {MinConfidence}"); } } else { Console.WriteLine($"Using default minimum confidence of {MinConfidence}"); } } /// /// The main entry point for the custom runtime. /// /// private static async Task Main() { Func>> handler = FunctionHandler; await LambdaBootstrapBuilder.Create(handler, new SourceGeneratorLambdaJsonSerializer(options => { options.PropertyNameCaseInsensitive = true; })) .Build() .RunAsync(); } /// /// A simple function that takes a string and returns both the upper and lower case version of the string. /// /// /// /// public static async Task> FunctionHandler(ExecutionInput input, ILambdaContext context) { var logger = new ImageRecognitionLogger(input, context); Console.WriteLine($"Looking for labels in image {input.Bucket}:{input.SourceKey}"); var key = WebUtility.UrlDecode(input.SourceKey); var detectResponses = await RekognitionClient.DetectLabelsAsync(new DetectLabelsRequest { MinConfidence = MinConfidence, MaxLabels = MaxLabels, Image = new Image { S3Object = new S3Object { Bucket = input.Bucket, Name = key } } }); await logger.WriteMessageAsync(new MessageEvent {Message = "Photo labels extracted successfully"}, ImageRecognitionLogger.Target.All); return detectResponses.Labels; } } }