Telegram bot dan penggunaan Google Cloud Vision

Halo semuanya! Baru-baru ini saya menulis artikel tentang mengintegrasikan bot saya dengan IBM Watson, dan dalam artikel ini saya akan mempertimbangkan integrasi dengan Google Cloud Vision untuk pengenalan kucing dan menjelaskan secara lebih rinci bagian dalam bot saya.

Sedikit latar belakang:

Bot saya bekerja cukup sukses selama beberapa bulan menggunakan pengakuan IBM Watson, tetapi kemudian sebuah artikel tentang google cloud vision muncul di hub dan ternyata Google mengenali gambar lebih baik daripada IBM. Pada hari yang sama, saya mendaftar untuk konsol pengembang platform cloud Google dan mulai menulis ulang blok moderasi kucing di bot saya.

Setelah sedikit mencari, saya menemukan contoh yang cocok di C # pada github GoogleCloudPlatform . Saya mengubah otentikasi dari contoh dan membuatnya dari file json dengan kunci pribadi, yang saya ambil di bagian "akun layanan" pada konsol.

kode otorisasi dalam 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;
        }


Selanjutnya, saya redid moderasi gambar (deteksi label). Dalam contoh github, DetectLabels berfungsi dengan file, dan saya harus bekerja dengan tautan yang saya terima dari server Telegram agar tidak menyimpan file gambar. Saya hanya menyimpan file_id dalam database, yang memberikan peningkatan kecepatan yang baik.

kode deteksi label
 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;
        }

Lalu saya mencari di Responses jika ada label dengan deskripsi kucing, dengan peringkat lebih dari 0,6, dan dengan demikian, saya menentukan apakah ada kucing dalam gambar yang ditransfer ke bot:

bekerja dengan label
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
    }
  }
}


Berikut adalah kode untuk bekerja dengan API Telegram untuk mendapatkan tautan ke gambar dari file_id, saya menggunakan perpustakaan di bot C # telegram :

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;


Dan ketika saya mengirim gambar ke pengguna menggunakan sendPhoto, saya hanya meneruskan file_id yang disimpan ke parameter kedua.

Jadi, ternyata ketika seorang pengguna mengirim fotonya tentang kucing untuk moderasi (atau menggunakan thecatapi.com untuk ini), saya hanya menyimpan file_id dalam database dan kemudian menggunakannya untuk mendapatkan tautan ke gambar di server Telegram dan mengirimkannya kepada pengguna menggunakan sendPhoto. Dan pengenalan gambar dengan Google cloud vision bekerja lebih akurat daripada dengan IBM Watson

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


All Articles