Telegram bot y uso de Google Cloud Vision

Hola a todos! Recientemente escribí un artículo sobre la integración de mi bot con IBM Watson, y en este artículo consideraré la integración con Google Cloud Vision para el reconocimiento de gatos y describiré con más detalle el interior de mi bot.

Un poco de historia:

mi bot funcionó con bastante éxito durante un par de meses utilizando el reconocimiento de IBM Watson, pero luego apareció un artículo sobre Google Cloud Vision en el centro y resultó que Google reconoce las imágenes mejor que IBM. El mismo día, me inscribí en la consola del desarrollador de la plataforma en la nube de Google y comencé a reescribir el bloque de moderación cat en mi bot.

Después de un poco de búsqueda, encontré un ejemplo adecuado en C # en el github GoogleCloudPlatform . Cambié la autenticación del ejemplo y lo hice desde un archivo json con una clave privada, que tomé en la sección "cuentas de servicio" de la consola.

código de autorización en c #
private VisionService service;
        private string _JsonPath = @"C:\BOTS\fcatsbot\json.json";       
        private VisionService CreateAuthorizedClient(string JsonPath)
        {
            GoogleCredential credential =
                GoogleCredential.FromStream(new FileStream(JsonPath, FileMode.Open));            
            // Inject the Cloud Vision scopes
            if (credential.IsCreateScopedRequired)
            {
                credential = credential.CreateScoped(new[]
                {
                    VisionService.Scope.CloudPlatform
                });
            }
            var res = new VisionService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                GZipEnabled = false
            });
            return res;
        }


A continuación, rehice la moderación de las imágenes (detección de etiquetas). En el ejemplo de github, DetectLabels funciona con un archivo, y tuve que trabajar con el enlace que recibí de los servidores de Telegram para no almacenar archivos de imagen. Guardo solo file_id en la base de datos, lo que da un buen aumento en la velocidad.

código de detección de etiqueta
 private async Task<IList<AnnotateImageResponse>> DetectLabels(
            VisionService vision, string imageUrl)
        {
            // Convert image to Base64 encoded for JSON ASCII text based request   
            MemoryStream ms = new MemoryStream();
            using (var client = new HttpClient())
            {
                Stream imageBytes = await client.GetStreamAsync(imageUrl);
                imageBytes.CopyTo(ms);
            }
            byte[] imageArray = ms.ToArray();
            string imageContent = Convert.ToBase64String(imageArray);
            // Post label detection request to the Vision API
            // [START construct_request]
            var responses = vision.Images.Annotate(
                new BatchAnnotateImagesRequest()
                {
                    Requests = new[] {
                    new AnnotateImageRequest() {
                        Features = new []
                        { new Feature()
                            { Type =
                          "LABEL_DETECTION"}
                            },
                        Image = new Image() { Content = imageContent }
                    }
               }
                }).Execute();
            ms.Dispose();
            return responses.Responses;
        }

Luego busco en Respuestas si hay una etiqueta con una descripción del gato, con una calificación de más de 0.6, y así, determino si hay un gato en la imagen transferido al bot:

trabajar con etiquetas
foreach (var response in responses.Responses)
{
  foreach (var label in response.LabelAnnotations)
  {
    double _score = label.Score == null ? 0 : Convert.ToDouble(label.Score.Value);
    var class = label.Description.Trim();
    if (class .Contains("kitten") || class .Contains("cat") ) && (_score > 0.60))
    {
      HasCatOrKittenClass = true;//moderation OK
    }
  }
}


Aquí está el código para trabajar con la API de Telegram para obtener un enlace a una imagen desde file_id, utilicé la biblioteca en C # telegram bot :

telegram getFile
var file = await MainParams.TGBot.GetFileAsync(fileid);
var file_path = file.FilePath;
var urlImage = "https://api.telegram.org/file/bot" + MainParams.bot_token + "/" + file_path;


Y cuando envío la imagen al usuario usando sendPhoto, simplemente paso el file_id guardado al segundo parámetro.

Por lo tanto, resulta que cuando un usuario envía su foto de gato para moderación (o usa thecatapi.com para esto), guardo solo file_id en la base de datos y lo uso más adelante para obtener un enlace a la imagen en los servidores de Telegram y enviarla a los usuarios usando sendPhoto. Y el reconocimiento de imágenes con Google Cloud Vision funciona con mayor precisión que con IBM Watson

Source: https://habr.com/ru/post/es399877/


All Articles