Bot télégramme et utilisation de Google Cloud Vision

Bonjour à tous! Récemment, j'ai écrit un article sur l'intégration de mon bot avec IBM Watson, et dans cet article, j'examinerai l'intégration avec Google Cloud Vision pour la reconnaissance des chats et décrirai plus en détail l'intérieur de mon bot.

Un peu de contexte:

mon bot a fonctionné avec succès pendant quelques mois en utilisant la reconnaissance IBM Watson, mais un article sur la vision de Google Cloud est apparu sur le hub et il s'est avéré que Google reconnaît mieux les images qu'IBM. Le même jour, je me suis inscrit à la console du développeur de la plate-forme Google Cloud et j'ai commencé à réécrire le bloc de modération de chat dans mon bot.

Après un peu de recherche, j'ai trouvé un exemple approprié en C # sur le github GoogleCloudPlatform . J'ai changé l'authentification de l'exemple et l'ai faite à partir d'un fichier json avec une clé privée, que j'ai prise dans la section "comptes de service" de la console.

code d'autorisation 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;
        }


Ensuite, j'ai refait la modération des images (détection d'étiquette). Dans l'exemple github, DetectLabels fonctionne avec un fichier, et je devais travailler avec le lien que j'ai reçu des serveurs Telegram afin de ne pas stocker de fichiers image. Je sauvegarde uniquement file_id dans la base de données, ce qui donne une bonne augmentation de la vitesse.

code de détection d'étiquette
 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;
        }

Ensuite, je recherche dans les réponses s'il y a une étiquette avec une description du chat, avec une note supérieure à 0,6, et donc, je détermine s'il y a un chat dans l'image transférée au bot:

travailler avec des étiquettes
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
    }
  }
}


Voici le code pour travailler avec l'API Telegram pour obtenir un lien vers une image à partir de file_id, j'ai utilisé la bibliothèque dans le bot de télégramme C # :

télégramme 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;


Et lorsque j'envoie l'image à l'utilisateur à l'aide de sendPhoto, je passe simplement le file_id enregistré au deuxième paramètre.

Ainsi, il s'avère que lorsqu'un utilisateur envoie sa photo d'un chat pour modération (ou utilise thecatapi.com pour cela), j'enregistre uniquement file_id dans la base de données, puis je l'utilise pour obtenir un lien vers l'image sur les serveurs Telegram et l'envoyer aux utilisateurs à l'aide de sendPhoto. Et la reconnaissance d'image avec Google Cloud Vision fonctionne plus précisément qu'avec IBM Watson

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


All Articles