public async Task <ModerationResponse> AnalyzeImage(byte[] imageBytes)
        {
            var channel = new Grpc.Core.Channel(ImageAnnotatorClient.DefaultEndpoint.Host, Credentials.ToChannelCredentials());

            try
            {
                var client = ImageAnnotatorClient.Create(channel);

                var image = Image.FromBytes(imageBytes);

                var response = await client.DetectSafeSearchAsync(image);

                var moderationResponse = new ModerationResponse();

                moderationResponse.ModerationScores = new[] {
                    new ModerationScore()
                    {
                        Category = $"Adult", Score = ConvertLikelyhood(response.Adult)
                    },
                    new ModerationScore()
                    {
                        Category = $"Medical", Score = ConvertLikelyhood(response.Medical)
                    },
                    new ModerationScore()
                    {
                        Category = $"Spoof", Score = ConvertLikelyhood(response.Spoof)
                    },
                    new ModerationScore()
                    {
                        Category = $"Violent", Score = ConvertLikelyhood(response.Violence)
                    }
                };

                moderationResponse.Pass = !moderationResponse.ModerationScores.Any(s => s.Score > .40F);

                return(moderationResponse);
            }
            catch (Exception ex)
            {
                return(new ModerationResponse()
                {
                    Pass = false,
                    ModerationScores = new[] { new ModerationScore()
                                               {
                                                   Category = $"ServerError:{ex.Message}", Score = 100
                                               } }
                });
            }
            finally
            {
                await channel.ShutdownAsync();
            }
        }
        public async Task <ModerationResponse> AnalyzeImage(MemoryStream imageStream)
        {
            using (var client = new AmazonRekognitionClient(Endpoint))
            {
                var request = new DetectModerationLabelsRequest()
                {
                    Image = new Image()
                    {
                        Bytes = imageStream
                    },
                    MinConfidence = 0 //do this so that scores are always returned?
                };

                var awsResponse = await client.DetectModerationLabelsAsync(request);

                var response = new ModerationResponse();

                if (awsResponse.HttpStatusCode != System.Net.HttpStatusCode.OK)
                {
                    response.Pass             = false;
                    response.ModerationScores = new[] { new ModerationScore()
                                                        {
                                                            Category = $"ServerError:{awsResponse.HttpStatusCode}", Score = 100
                                                        } };
                }
                else
                {
                    if (awsResponse.ModerationLabels.Any(s => s.Confidence >= 50))
                    {
                        response.Pass = false;
                    }
                    else
                    {
                        response.Pass = true;
                    }

                    response.ModerationScores = awsResponse.ModerationLabels
                                                .Select(m => new ModerationScore()
                    {
                        Category = $"{m.ParentName}:{m.Name}",
                        Score    = m.Confidence
                    });
                }

                return(response);
            }
        }
        public async Task <ModerationResponse> AnalyzeImage(byte[] imageBytes, string imageName)
        {
            var client = new RestClient(String.Format(API_URL_FORMAT, AzureRegion));

            client.AddDefaultHeader(API_KEY_HEADER, ApiKey);

            var request = new RestRequest(API_ENDPOINT, Method.POST);

            request.AddParameter(DetermineMimeType(imageName), imageBytes, ParameterType.RequestBody);

            var apiResponse = await client.ExecuteTaskAsync <AzureModerationResponse>(request);

            var response = new ModerationResponse();

            if (apiResponse.ResponseStatus != ResponseStatus.Completed || !apiResponse.IsSuccessful)
            {
                response.Pass             = false;
                response.ModerationScores = new[] { new ModerationScore()
                                                    {
                                                        Category = $"ServerError:{apiResponse.StatusDescription}", Score = 100
                                                    } };
            }
            else
            {
                response.Pass = !(apiResponse.Data.IsImageAdultClassified || apiResponse.Data.IsImageRacyClassified);

                var list = new List <ModerationScore>();

                list.Add(new ModerationScore {
                    Category = "Adult", Score = apiResponse.Data.AdultClassificationScore
                });

                list.Add(new ModerationScore {
                    Category = "Racy", Score = apiResponse.Data.RacyClassificationScore
                });

                response.ModerationScores = list;
            }

            return(response);
        }