Um aplicativo de pesquisa de imagens que usa a API Vision e o AutoML Vision

Neste artigo, mostramos como usar a API Vision e o AutoML Vision para potencializar seu aplicativo de classificação e pesquisa de imagens. Quando combinados com outros serviços do Google Cloud, esses serviços facilitam:

  • a pesquisa de objetos e cenas detectados dentro de imagens;
  • a classificação de imagens em categorias diferentes com base em rótulos de imagens detectadas;
  • o uso de categorias e rótulos de imagens como atributos de pesquisa.

Na API Vision, a tecnologia dos modelos de aprendizado profundo do Google é usada para oferecer recursos de visão computacional avançados, que incluem os itens a seguir:

  • Detecção de rótulos
  • Detecção de rostos e pontos de referência
  • Reconhecimento óptico de caracteres (OCR, na sigla em inglês)
  • Detecção de conteúdo explícito

Use o AutoML Vision e treine modelos de alta qualidade para realizar a detecção de rótulos personalizados com a pesquisa de arquitetura neural e o aprendizado por transferência de última geração do Google. Com essas tecnologias, é possível usar os dados de treinamento para criar seu próprio modelo de visão com um mínimo de habilidade em machine learning.

É possível integrar esses recursos a aplicativos novos e atuais por meio de uma API REST.

Para ver como criar o aplicativo descrito neste artigo, consulte Como criar um aplicativo de pesquisa de imagens usando a API Vision e o AutoML Vision.

Como usar a detecção de rótulos para tornar as imagens pesquisáveis

A detecção de rótulos é um recurso de anotação de imagens na API Vision e no AutoML Vision. Com esse recurso, é feita a predição dos rótulos mais apropriados para descrever uma imagem. Também é possível identificar amplos conjuntos de objetos em milhares de categorias diferentes de objetos e retornar uma anotação de rótulo ou cada rótulo detectado em uma imagem. Os itens a seguir também são retornados:

  • Identificador de rótulo: um código de entidade opaco para o rótulo, como "/m/0bt9lr".
  • Descrição do rótulo: uma descrição textual do rótulo, como "cão".
  • Pontuação de confiança: é um número associado a cada anotação de rótulo retornada, representando a avaliação da API Vision sobre a acurácia do rótulo. A pontuação de confiança varia de 0 (nenhuma) a 1 (muito alta).

Com o AutoML Vision, é possível fornecer conjuntos de dados rotulados para treinar modelos que executem a detecção de rótulos personalizados com seus rótulos. Ao combinar a detecção de rótulos com um índice de pesquisa, você torna as imagens pesquisáveis de novas maneiras. O diagrama abaixo representa uma dessas abordagens:

Detecção de rótulos e índice de pesquisa

Nesta arquitetura de solução:

  1. Um usuário faz upload de uma imagem de um aplicativo cliente para um bucket do Cloud Storage.
  2. Quando uma nova imagem chega ao intervalo, o Pub/Sub gera uma notificação.
  3. A notificação do Pub/Sub contém os novos detalhes do arquivo de imagem, e o tópico do Pub/Sub usado para as notificações é configurado para entrega por push no endpoint do App Engine.
  4. O back-end do App Engine agora está ciente do novo arquivo. O App Engine chama a API Vision na imagem de que foi feito o upload para processar e adicionar rótulos a ela. Esses rótulos também são adicionados ao índice de pesquisa.
  5. Opcional: rótulos personalizados são adicionados ao índice de pesquisa pelo App Engine por meio do AutoML Vision.
  6. Opcional: o App Engine chama o AI Platform para classificar imagens em categorias definidas pelo usuário usando os rótulos detectados. A categoria também é adicionada ao índice de pesquisa.
  7. Pesquise os rótulos das imagens detectadas usando a API Search do App Engine. Nessa API, há várias funções, incluindo pesquisa por palavras-chave e pesquisa de atributos.

Como usar rótulos para a pesquisa de atributos

A pesquisa de atributos é uma maneira de expor os rótulos da API Vision e do AutoML Vision, chamados de rótulos de imagem neste artigo, em uma interface de pesquisa. Quando você usa a pesquisa de atributos, os rótulos das imagens e as contagens dos rótulos são apresentados ao lado dos resultados da pesquisa como um atributo de pesquisa navegável. Depois de iniciar uma pesquisa geral por palavras-chave por meio da consulta de campos de índice diferentes, os usuários podem usar o atributo de pesquisa para refinar os resultados da pesquisa para imagens que contenham rótulos de imagem específicos.

A interface de pesquisa também detalha quantos resultados estão contidos em cada refinamento de rótulo. A pesquisa de atributos é particularmente eficaz quando os resultados incluem um grande número de rótulos comuns.

Exemplo de pesquisa de atributos

Quando você pesquisa imagens usando uma palavra-chave simples, como "cidade", os resultados da pesquisa têm milhares de imagens. Nesse caso, é preciso adicionar palavras-chave para filtrar os resultados, mas talvez você não saiba quais palavras-chave acrescentar. A pesquisa de atributos ajuda você a escolher por meio da coleta de outros rótulos anexados a imagens encontradas com a palavra-chave "cidade". Esses rótulos são tratados como atributos, e aqueles que ocorrem com frequência são exibidos em uma lista de candidatos para seleção.

Por exemplo, com uma pesquisa facetada, você pode ver uma lista com os 10 principais rótulos normalmente anexados às imagens dos resultados da pesquisa. Assim, você seleciona palavras-chave adicionais nessa lista. Na captura de tela a seguir, veja um exemplo implantado.

pesquisa de atributo implantada

Nessa captura de tela, vemos a exposição de rótulos de imagem como atributos de pesquisa. Quando um usuário realiza uma pesquisa, os rótulos de imagem detectados do conjunto de documentos correspondentes são apresentados ao lado dos resultados da pesquisa como um atributo de pesquisa clicável. Nesse exemplo, é exposto o atributo de rótulo da imagem. Com a seleção de um dos links do rótulo da imagem, o refinamento da consulta de pesquisa é acionado, sendo retornadas apenas imagens que tenham o rótulo selecionado, como "paisagem urbana" ou "noite".

Além disso, os rótulos de imagem são adicionados a um campo de índice de documento com a API Search do App Engine. Este exemplo também exibe categorias de imagem predeterminadas (os atributos Mapped Category e Most Similar Category) como listas de palavras-chave adicionais. Na seção a seguir, explicamos como implementar esse recurso.

Como usar rótulos para classificação de imagens

Às vezes, pode ser conveniente que seu aplicativo exponha rótulos diretamente. Em outros momentos, em vez de expor os rótulos diretamente, convém classificar imagens de rótulos detectados em categorias predeterminadas.

Por exemplo, é possível permitir que os usuários procurem imagens que correspondam a categorias predeterminadas, como "natureza" ou "paisagens urbanas", além de pesquisar os rótulos de imagem diretamente. Nesse caso, use rótulos de imagem de maneiras diferentes para conseguir a categoria de imagem mais apropriada.

Para habilitar esse cenário, use a API Vision e o AutoML Vision:

  • A detecção de rótulos da API Vision é ideal para o caso em que a API faz o reconhecimento das suas categorias e as retorna como rótulos de imagem. A detecção de rótulos também é útil quando seu aplicativo processa imagens associadas a diversos temas, que podem se beneficiar da compreensão geral da API Vision.

    Nesses dois casos, é possível usar os rótulos de imagem retornados pela API Vision para determinar contextos de categorias mais abrangentes. Por exemplo, rótulos de imagens como "poluição", "fábrica", "aterro" e "iceberg" poderiam ser usados para determinar uma categoria mais ampla, como "mudança climática". Para mais informações, consulte Como classificar imagens com a API Vision, adiante neste documento.

  • O AutoML Vision é ideal para a classificação personalizada de imagens com conjuntos de treinamento rotulados fornecidos pelo usuário. Com o recurso personalizado de detecção de rótulos do AutoML Vision, são retornados rótulos definidos pelo usuário, incluídos no conjunto de treinamento, que podem ser usados para criar categorias de imagem personalizadas.

    Se a detecção de rótulos da API Vision não retornar rótulos apropriados para sua tarefa de categorização, recomendamos o uso do AutoML Vision para treinar um modelo de imagem personalizado. Para mais informações, consulte Como classificar imagens com o AutoML Vision, adiante neste documento.

Como classificar imagens com a API Vision

A API Vision detecta objetos de milhares de categorias diferentes, específicas e abstratas. Essa compreensão geral pode ser usada para classificar imagens em categorias predeterminadas que são úteis para o aplicativo.

Para ativar esse cenário, é preciso implementar um método para associar os rótulos de imagem da API Vision a categorias específicas. As seções a seguir descrevem dois métodos possíveis:

  • Correlação de um rótulo detectado a uma categoria predeterminada
  • Uso de vetores de palavras para encontrar uma categoria semelhante

Nas duas abordagens, use a API Vision para conseguir um contexto apropriado à classificação das imagens.

Como correlacionar rótulos detectados a categorias predeterminadas

Imagine que você está desenvolvendo um site que vende imagens em um banco de fotos. É possível que sua interface do usuário permita a pesquisa ou busca de imagens em categorias predefinidas, como vida selvagem, natureza e paisagens urbanas. Quando a API Vision retorna "girafa", "elefante" ou "savana" como rótulos de imagem, você quer que a imagem seja organizada automaticamente na categoria vida selvagem.

A detecção de rótulos da API Vision retorna conjuntos amplos de categorias em imagens, não pontuações para categorias predeterminadas específicas. Um método simples de correlacionar rótulos a categorias é correlacionar os rótulos da API Vision a categorias específicas, em que a categoria é associada a um ou mais rótulos específicos da API Vision. Para o restante da solução, esse método é chamado de associação fixa entre rótulos e categorias. Nesse esquema, os rótulos que a API Vision retorna são comparados com a lista de palavras que definem cada categoria e a imagem associada à categoria mais adequada, conforme determinado pela pontuação de confiança do rótulo de imagem.

A API Vision retorna um ou mais rótulos para uma imagem. Para cada imagem, os rótulos detectados são comparados a palavras que definem uma determinada categoria. Quando há uma ou mais correspondências diretas, a pontuação de confiança da API Vision para cada rótulo correspondente é somada, criando uma pontuação de confiança para cada categoria. Essa pontuação é uma representação numérica do nível de precisão alcançado pelas palavras na definição de uma categoria predeterminada, associada a determinada imagem retornada pelos rótulos da API Vision A categoria com o maior valor de confiança é escolhida como a categoria da imagem e incluída no índice de pesquisa. No caso de empate, pode-se incluir a imagem nas categorias de qualificação ou definir outra heurística para correlacionar a imagem a uma única categoria, de maneira exclusiva.

O diagrama a seguir ilustra essa abordagem para um pequeno conjunto de categorias predeterminadas.

correlação de categorias predeterminadas

A correlação de rótulos detectados a categorias funciona bem quando você tem certeza de que pode antecipar os rótulos de imagem específicos associados a cada categoria. Em outras palavras, é provável que seu conjunto de palavras que define várias categorias predeterminadas contenha uma alta porcentagem de rótulos retornados. Por exemplo, se as imagens tiverem alguma combinação de "cachorro", "gato" ou "ave" detectada como rótulos, é fácil definir uma categoria predeterminada para "animais", por meio da definição da sua categoria, usando esses rótulos exatos. Quando um grande número de rótulos é retornado para imagens, fica cada vez mais difícil determinar como mapear esses rótulos para categorias específicas. No exemplo anterior, se "cavalo" é detectado como um rótulo, mas não "cachorro", "gato" ou "pássaro", a imagem não é classificada corretamente, porque "cavalo" não faz parte do conjunto de palavras que define a categoria "animais".

Outra limitação é que os rótulos de imagem detectados podem estar relacionados a várias categorias, complicando ainda mais o processo de correspondência da imagem com a categoria de maior pontuação. Por exemplo, se várias categorias compartilham mapeamentos fixos semelhantes entre rótulos e categorias, cada uma delas receberá a mesma contribuição para as pontuações de confiança de categoria desses rótulos de imagem. Quando é importante colocar imagens em categorias exclusivas, é necessário encontrar mapeamentos de rótulos exclusivos para cada categoria com o objetivo de aumentar a diferenciação entre as pontuações. No entanto, pode ser difícil identificar rótulos exclusivos para correspondência exata.

Como usar vetores de palavras para encontrar a categoria mais apropriada

Dependendo da variedade de rótulos detectados retornados pela API Vision, pode ser difícil criar correlações fixas entre rótulos e categorias. Nesse caso, use outra abordagem que meça similaridades conceituais entre rótulos, em vez de comparar diretamente os respectivos valores.

Considere um exemplo em que "pássaro", "papagaio", "vertebrado" e "fauna" são retornados como rótulos de imagem detectados. Esses rótulos podem ser comparados a outros representativos associados ao seguinte conjunto de categorias pré-determinadas:

Categoria Rótulo 1 Rótulo 2 Rótulo 3 Rótulo 4 Rótulo 5 Similar?
Animal gato animal periquito canino cavalo Sim
Veículo automóvel caminhão carro bonde navio Não

Nenhum dos rótulos de categoria nesta tabela corresponde precisamente aos rótulos de imagem retornados, mas a categoria Animal é, de longe, a mais apropriada conceitualmente. Ou seja, os rótulos detectados se parecem mais com as palavras que definem a categoria Animal do que com as palavras que definem a categoria Veículo. Você quer que seu sistema reconheça essa similaridade e classifique corretamente a imagem como Animal.

As técnicas de processamento de linguagem natural geralmente dependem da transformação de palavras individuais em representações vetoriais. Manipule matematicamente esses vetores para identificar correlações entre palavras. Dicionários pré-treinados de incorporação de palavras, como o word2vec ou o GloVe, já converteram palavras comuns em representações vetoriais de números reais. O uso dessas representações vetoriais possibilita o cálculo de pontuações de similaridade entre rótulos de imagem e de categoria. A categoria com a pontuação de similaridade mais próxima da imagem é associada à imagem.

Como calcular vetores de imagem e de categoria com o GloVe

Para gerar vetores de números reais para imagens, os rótulos detectados são convertidos em representações vetoriais equivalentes com o GloVe e depois reduzidos a um único vetor combinado pela soma dos vetores de cada palavra. Usando o exemplo anterior, esse método converteria os rótulos de imagem detectados ("pássaro", "papagaio", "vertebrado" e "fauna") em vetores de palavras individuais. O vetor de palavras combinadas para a imagem é criado por meio da combinação linear dos vetores de palavras individuais para cada pontuação de rótulo. Dessa maneira, uma única imagem com vários rótulos é transformada em um vetor combinado que representa o respectivo significado semântico geral.

Um vetor combinado também é calculado para cada categoria usando a soma dos vetores de palavras que melhor representam a categoria. Esse vetor combinado não precisa ter todas as palavras que definem a categoria e é um subconjunto relevante. Para converter palavras em vetores para imagens e categorias, os rótulos de imagem e os elementos de categoria precisam estar presentes em embeddings pré-treinados do GloVe.

O número de palavras que definem cada categoria pode variar. Quando várias palavras são usadas para uma categoria, a soma dos vetores de palavras se aproxima de uma semântica combinada para todas as palavras da categoria. Usar uma única palavra para uma categoria também é válido.

Ao selecionar palavras para gerar o vetor combinado para uma categoria, evite o uso de palavras que tenham significado semelhante nas categorias. Manter essas palavras dificulta a retirada da ambiguidade entre as categorias. Portanto, escolha palavras que descrevam as categorias de maneira exclusiva. Como exemplo hipotético, as palavras "concreto" e "asfalto" podem ser muito semelhantes para eliminar a ambiguidade entre as categorias Edifícios e Estradas. Por outro lado, "casa" e "rua" têm maior probabilidade de serem diferenciadas.

O número e o valor das palavras que definem várias categorias são diferentes em cada situação. Faça experiências e execute testes usando combinações diferentes para encontrar o melhor resultado.

Como calcular a similaridade entre vetores de imagem e categoria

Para classificar uma imagem com uma categoria específica, você pode calcular a semelhança de cosseno entre o vetor de imagem combinado e cada vetor de categoria combinado. Quanto maior a semelhança, melhor a correlação entre imagem e categoria. O diagrama a seguir ilustra esse processo:

como calcular a similaridade entre vetores de imagem e categoria

Aqui, vetores de palavras do GloVe são usados para calcular vetores combinados de imagem e categoria. A semelhança de cosseno entre os vetores combinados de imagem e categoria é usada para julgar equivalência. Nesse caso, as pontuações semânticas são relativamente próximas, 0.75, indicando que picture.jpg pode ser associado de maneira útil à categoria Animais.

Para implementar essa abordagem, implante um modelo simples do TensorFlow no AI Platform. O modelo aceita rótulos detectados da API Vision, converte os rótulos detectados em uma representação vetorial combinada e calcula a similaridade de cosseno para cada vetor de categoria combinado. O modelo do TensorFlow usa embeddings de palavras pré-treinadas para vetorizar os rótulos de imagem e categoria que não exigem outros treinamentos.

No diagrama a seguir, mostramos uma arquitetura de solução atualizada que incorpora o AI Platform:

arquitetura que incorpora ML

Como acionar o back-end do App Engine

O acionamento do back-end do App Engine é semelhante à abordagem anterior, em que foram usadas correlações fixas entre rótulos e categorias. Nessa abordagem, uma nova imagem enviada para um bucket do Cloud Storage aciona o endpoint do App Engine. O endpoint acionado solicita a detecção de rótulo para a imagem usando a API Vision e chama um modelo de predição no AI Platform para converter os rótulos da imagem em uma representação vetorial. O modelo de predição calcula uma pontuação de similaridade de cossenos para o vetor de imagem e para cada vetor de categoria. A categoria com a maior similaridade é aplicada à imagem e gravada no índice de pesquisa.

Diferenças entre métodos

Nas capturas de tela a seguir, veja a diferença entre derivar categorias de correlações fixas entre rótulos e categorias (captura de tela à esquerda) e derivar categorias usando vetores de palavras (captura de tela à direita).

mapeamentos entre rótulos e categorias vetores de palavras

Neste exemplo, Mapped Category: animals (Categoria mapeada: animais), que usa uma correlação fixa entre rótulo e categoria, é definida pelo seguinte conjunto de palavras: "dog", "cat", "fish", "horse", "animal", "bird", "parrot" e "budgie" ("cão", "gato", "peixe", "cavalo", "animal", "pássaro", "papagaio" e "periquito", respectivamente). Para cat.jpg, o Vision retornou os seguintes rótulos: "fauna", "wildlife" e "zoo" ("fauna", "selvagem" e "zoológico").

Quando o valor de atributo Mapped Category: animals é selecionado na captura de tela à esquerda, falta a imagem de um gato. Mapped Category: animals representa uma abordagem fixa entre rótulos e categorias. Como nenhum rótulo do Vision corresponde aos elementos da categoria, a imagem não está associada à categoria animais, o que exige correspondências exatas para calcular as pontuações de similaridade da categoria. Nesse caso, a pontuação de similaridade de categoria entre imagem e categoria é zero. Não há sobreposição entre elementos de rótulo e de categoria.

Na captura de tela da direita, que incorpora vetores de palavras do GloVe, é possível ver a imagem de gato em Most Similar Category: animals. Ao usar vetores de palavras, os elementos que definem Most Similar Category: animals, ou seja, "animal", "creature", "species" and "pet" ("animal", "criatura", "espécie" e "animal de estimação"), são transformados em um vetor de categoria combinado. Da mesma forma, os rótulos de imagem retornados por cat.jpg, ou seja, "fauna", "wildlife" e "zoo" ("fauna", "vida selvagem" e "zoológico"), são transformados em um vetor de imagem combinada. Como a semelhança de cosseno entre os vetores combinados de imagem e categoria é suficientemente próxima, eles são determinados como tendo semelhança semântica legítima. Ou seja, os rótulos de imagem cat.jpg são muito semelhantes aos elementos de categoria de animais para o modelo do TensorFlow colocar a imagem de gato na categoria correta, mesmo que o rótulo preciso de "gato" não seja retornado.

Nas duas capturas de tela, os contadores mostrados ao lado dos valores do atributo refletem o total de ocorrências de determinado rótulo no conjunto de resultados exibido. Isso explica por que a captura de tela à direita exibe animals(1) (animais) dentro do atributo Mapped Category (Categoria mapeada), enquanto a captura à esquerda indica que cat.jpg não foi correlacionado diretamente a animals usando correlações fixas entre rótulos e categorias.

Como classificar imagens com o AutoML Vision

Embora a detecção de rótulos da API Vision detecte amplos conjuntos de categorias em uma imagem, seus requisitos podem incluir categorias que a API Vision não detecta. Essas categorias podem incluir rótulos altamente específicos sobre o domínio, como aqueles para casos de uso especializados, por exemplo, categorizar peças próprias de máquinas. Nesse caso, recomendamos usar o AutoML Vision para treinar um modelo de imagem personalizado com um conjunto de dados fornecido pelo usuário.

Ao treinar modelos de imagem personalizados usando o AutoML Vision, verifique se as imagens de treinamento são adequadas a ele, além de representarem as imagens usadas na predição. Para ilustrar esse requisito, é improvável que um modelo de imagem destinado a detectar animais, mas treinado apenas com imagens de criaturas de quatro patas, identifique um pássaro como um animal. Para fins de comparação, a detecção de rótulos da API Vision é ampla o suficiente para explicar essa diferença, retornando "animal" como um rótulo específico ou retornando rótulos relacionados que podem resultar na categoria correta. Consulte Como classificar imagens com a API Vision, descrito anteriormente neste documento.

No diagrama a seguir, há uma arquitetura de solução que integra o AutoML Vision ao aplicativo de pesquisa de imagem. No exemplo abaixo, os rótulos definidos pelo usuário em seu conjunto de dados de treinamento são usados diretamente como categorias de imagem.

arquitetura que incorpora o AutoML Vision

Nesta abordagem, como na classificação da API Vision, o endpoint do App Engine é acionado por uma nova imagem enviada por upload para um bucket do Cloud Storage. O endpoint acionado solicita a detecção do rótulo personalizado da imagem usando o AutoML Vision. O rótulo da imagem com a maior pontuação de confiança é atribuído como categoria de imagem e incluído no índice de pesquisa.

O AutoML Vision pode ser usado com a API Vision para aproveitar a funcionalidade combinada. Por exemplo, é possível usar a detecção de rótulos da API Vision para pesquisar atributos em temas amplos e o AutoML Vision para categorizar imagens com base em rótulos personalizados.

A seguir