Telegramm-Bot und Verwendung von Google Cloud Vision

Hallo allerseits! Kürzlich habe ich einen Artikel über die Integration meines Bots in IBM Watson geschrieben. In diesem Artikel werde ich die Integration in Google Cloud Vision zur Erkennung von Katzen in Betracht ziehen und die Innenseiten meines Bots genauer beschreiben.

Ein kleiner Hintergrund:

Mein Bot arbeitete einige Monate lang recht erfolgreich mit der IBM Watson-Erkennung, aber dann erschien ein Artikel über Google Cloud Vision auf dem Hub und es stellte sich heraus, dass Google Bilder besser erkennt als IBM. Am selben Tag habe ich mich für die Entwicklerkonsole der Google Cloud-Plattform angemeldet und begonnen, den Katzenmoderationsblock in meinem Bot neu zu schreiben.

Nach einigem Suchen habe ich in C # auf dem GoogleCloudPlatform-Github ein geeignetes Beispiel gefunden . Ich habe die Authentifizierung aus dem Beispiel geändert und sie aus einer JSON-Datei mit einem privaten Schlüssel erstellt, die ich im Abschnitt "Dienstkonten" der Konsole verwendet habe.

Autorisierungscode in 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;
        }


Als nächstes habe ich die Moderation von Bildern überarbeitet (Etikettenerkennung). Im Github-Beispiel arbeitet DetectLabels mit einer Datei, und ich musste mit dem Link arbeiten, den ich von Telegrammservern erhalten habe, um keine Bilddateien zu speichern. Ich speichere nur file_id in der Datenbank, was eine gute Geschwindigkeitssteigerung ergibt.

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

Dann suche ich in Antworten, ob es ein Etikett mit einer Beschreibung der Katze mit einer Bewertung von mehr als 0,6 gibt, und stelle somit fest, ob auf dem Bild eine Katze vorhanden ist, die auf den Bot übertragen wurde:

Arbeit mit Etiketten
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
    }
  }
}


Hier ist der Code für die Arbeit mit der Telegramm-API, um einen Link zu einem Bild von file_id zu erhalten. Ich habe die Bibliothek in C # -Telegramm- Bot verwendet :

Telegramm 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;


Und wenn ich das Bild mit sendPhoto an den Benutzer sende, übergebe ich einfach die gespeicherte file_id an den zweiten Parameter.

Wenn ein Benutzer sein Foto einer Katze zur Moderation sendet (oder thecatapi.com dafür verwendet), speichere ich nur file_id in der Datenbank und verwende es dann, um einen Link zum Bild auf Telegrammservern zu erhalten und es mit sendPhoto an Benutzer zu senden. Die Bilderkennung mit Google Cloud Vision funktioniert genauer als mit IBM Watson

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


All Articles