Bot de telegrama e uso do Google Cloud Vision

Olá pessoal! Recentemente, escrevi um artigo sobre a integração do meu bot com o IBM Watson e, neste artigo, considerarei a integração com o Google Cloud Vision para reconhecimento de gatos e descreverei com mais detalhes o interior do meu bot.

Um pouco de histórico:

meu bot funcionou com êxito por alguns meses usando o reconhecimento do IBM Watson, mas um artigo sobre a visão da nuvem do Google apareceu no hub e descobriu que o Google reconhece imagens melhor do que a IBM. No mesmo dia, me inscrevi no console do desenvolvedor da plataforma em nuvem do Google e comecei a reescrever o bloco de moderação de gatos no meu bot.

Após algumas pesquisas, encontrei um exemplo adequado em C # no github GoogleCloudPlatform . Mudei a autenticação do exemplo e fiz de um arquivo json com uma chave privada, que peguei na seção "contas de serviço" do console.

código de autorização em 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;
        }


Em seguida, refiz a moderação das imagens (detecção de etiqueta). No exemplo do github, o DetectLabels trabalha com um arquivo, e eu precisava trabalhar com o link que recebi dos servidores Telegram para não armazenar arquivos de imagem. Eu salvo apenas file_id no banco de dados, o que dá um bom aumento na velocidade.

código de detecção 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;
        }

Em seguida, procuro em Respostas se houver um rótulo com uma descrição do gato, com uma classificação superior a 0,6 e, assim, determino se há um gato na imagem transferido para o bot:

trabalhar com 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
    }
  }
}


Aqui está o código para trabalhar com a API do Telegram para obter um link para uma imagem de file_id, usei a biblioteca no bot de telegrama C # :

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


E quando envio a imagem ao usuário usando o sendPhoto, apenas passo o file_id salvo para o segundo parâmetro.

Assim, acontece que quando um usuário envia sua foto de gato por moderação (ou usa thecatapi.com para isso), eu salvo apenas file_id no banco de dados e o uso posteriormente para obter um link para a imagem nos servidores Telegram e enviá-la aos usuários usando sendPhoto. E o reconhecimento de imagens com o Google Cloud Vision funciona com mais precisão do que com o IBM Watson

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


All Articles