Ultralytics YOLO27:

Como criar uma pesquisa semântica de imagens com o OpenAI CLIP#

Este guia mostra como criar um motor de pesquisa semântica de imagens usando OpenAI CLIP e Flask. Ao combinar embeddings visuais-linguísticos do CLIP com uma pesquisa rápida de similaridade do cosseno baseada em NumPy, podes criar uma interface web que obtém imagens relevantes a partir de consultas em linguagem natural, sem necessidade de rótulos ou categorias.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Página web do Flask com uma visão geral dos resultados da pesquisa semântica

O pacote Python da Ultralytics encapsula todo este pipeline em duas classes, para que possas lançar uma aplicação de pesquisa funcional ou executar consultas programaticamente em poucas linhas. Este guia aborda por que motivo a pesquisa semântica é útil, como funciona, como executar a aplicação web, como pesquisar programaticamente e como configurar os parâmetros.

Porquê usar a pesquisa semântica de imagens?#

Criar o teu próprio sistema de pesquisa semântica de imagens com CLIP oferece várias vantagens relevantes:

  • Capacidades zero-shot: não precisas de treinar o modelo com o teu conjunto de dados. O aprendizado zero-shot do CLIP permite consultar qualquer coleção de imagens com linguagem natural livre, poupando tempo e recursos.
  • Compreensão semelhante à humana: ao contrário da pesquisa por palavras-chave, o CLIP compreende o contexto semântico e obtém imagens a partir de consultas abstratas, emocionais ou relacionais, como "uma criança feliz na natureza" ou "o horizonte de uma cidade futurista à noite".
  • Sem rótulos ou metadados: esta abordagem precisa apenas de imagens brutas. O CLIP gera embeddings sem qualquer anotação manual.
  • Pesquisa leve e exata: uma única multiplicação de matrizes normalizadas no NumPy ordena todas as imagens por similaridade do cosseno, fornecendo resultados exatos com resposta em tempo real para milhares de embeddings e sem dependências adicionais de pesquisa para instalar ou gerir.
  • Aplicações em vários domínios: quer estejas a criar um arquivo pessoal de fotografias, uma ferramenta de inspiração criativa, um motor de pesquisa de produtos ou um sistema de recomendação de arte, a mesma stack adapta-se com ajustes mínimos.

Como funciona a pesquisa semântica de imagens#

O pipeline combina três componentes, cada um responsável por uma etapa da transformação de imagens e texto em resultados ordenados:

  • CLIP usa um codificador visual (por exemplo, ResNet ou ViT) para imagens e um codificador de texto (baseado em Transformer) para linguagem, projetando ambos no mesmo espaço de embeddings multimodal. Isto permite comparar diretamente texto e imagens usando a similaridade do cosseno.
  • NumPy armazena os embeddings das imagens como um único array e ordena-os em relação a um embedding de consulta com uma multiplicação de matrizes, devolvendo os vetores mais próximos por similaridade do cosseno sem qualquer dependência adicional de indexação.
  • Flask fornece uma interface web simples para enviar consultas em linguagem natural e apresentar imagens correspondentes semanticamente a partir do índice.

Fluxo de trabalho de obtenção de imagens com OpenAI Clip

Como as imagens e o texto são projetados no mesmo espaço vetorial, a obtenção é zero-shot: não precisas de rótulos nem categorias, apenas de dados de imagem e de um bom prompt.

Executar a aplicação web de pesquisa semântica#

A classe SearchApp lança a interface Flask completa. Na primeira execução, descarrega um conjunto de imagens de exemplo, cria o índice de embeddings e disponibiliza uma página onde podes escrever uma consulta e ver os resultados ordenados.

Aviso sobre o caminho das imagens

Se estiveres a usar as tuas próprias imagens, certifica-te de que forneces um caminho absoluto para o diretório de imagens. Caso contrário, as imagens poderão não aparecer na página web devido às limitações do Flask no fornecimento de ficheiros.

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

Pesquisar imagens programaticamente#

A classe VisualAISearch executa todas as operações de backend sem a camada web:

  • Carrega ou cria um índice de embeddings a partir de imagens locais.
  • Extrai embeddings de imagens e texto usando CLIP.
  • Executa a pesquisa de similaridade usando a similaridade do cosseno.

Chama o pesquisador com uma consulta em linguagem natural para obter uma lista de nomes de ficheiros de imagem correspondentes, ordenados por similaridade:

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

Configurar os parâmetros do VisualAISearch#

A tabela abaixo apresenta os parâmetros disponíveis para VisualAISearch:

ArgumentoTipoPredefiniçãoDescrição
datastr'images'Caminho para o diretório de imagens a indexar e pesquisar.
devicestr'cpu'Dispositivo usado para a inferência do CLIP (por exemplo, cpu, cuda, 0).
Gere os teus dados na cloud

Para pesquisar coleções de imagens à escala de produção sem gerir ficheiros locais, podes organizar e versionar as tuas imagens na Ultralytics Platform antes de as indexar com CLIP.

Conclusão#

Com o CLIP e o pacote Python da Ultralytics, podes criar um motor de pesquisa semântica de imagens zero-shot em poucas linhas, como aplicação web Flask ou backend de pesquisa programático. A partir daqui, aponta data para o teu próprio diretório de imagens para o indexar e, em seguida, explora outras Ultralytics Solutions para desenvolver os teus fluxos de trabalho de visão computacional.

Perguntas frequentes#

  • CLIP (Pré-treino contrastivo de linguagem e imagem) é um modelo desenvolvido pela OpenAI que aprende a associar informação visual e linguística. É treinado com um conjunto de dados massivo de imagens acompanhadas por legendas em linguagem natural. Este treino permite-lhe mapear imagens e texto para um espaço de embeddings partilhado, para que os possas comparar diretamente usando a similaridade vetorial.

  • O que distingue o CLIP é a sua capacidade de generalização. Em vez de ser treinado apenas para rótulos ou tarefas específicas, aprende com a própria linguagem natural. Isto permite-lhe lidar com consultas flexíveis como "um homem a andar de jet ski" ou "uma paisagem onírica surrealista", tornando-o útil para tudo, desde classificação até pesquisa semântica criativa, sem necessidade de novo treino.

  • Depois de o CLIP transformar as tuas imagens em embeddings, o pacote da Ultralytics aplica-lhes normalização L2 e armazena-os num único array NumPy. Uma consulta é ordenada com uma multiplicação de matrizes que calcula a similaridade do cosseno entre o embedding da consulta e cada embedding de imagem e, em seguida, ordena as pontuações. Esta pesquisa por força bruta é exata e rápida para coleções de imagens típicas, sem dependências adicionais de bases de dados vetoriais para instalar ou gerir.

  • Embora o CLIP seja desenvolvido pela OpenAI, o pacote Python da Ultralytics encapsula a geração de embeddings, a indexação e a pesquisa por similaridade do cosseno num pipeline completo de pesquisa semântica de imagens, acessível através de poucas linhas de código que funcionam diretamente:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # replace with a path to build the search engine with your own images
        device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    Esta implementação de alto nível trata de:

    • Geração de embeddings de imagens e texto baseada em CLIP.
    • Criação e gestão do índice de embeddings.
    • Pesquisa semântica eficiente com similaridade do cosseno.
    • Carregamento de imagens baseado em diretórios e visualização.
  • Sim. A configuração atual usa Flask com um frontend HTML básico, mas podes substituí-lo pelo teu próprio HTML ou criar uma interface de utilizador mais dinâmica com React, Vue ou outro framework de frontend. O Flask pode funcionar como a API de backend da tua interface personalizada.

  • Não diretamente. Uma solução simples é extrair fotogramas individuais dos teus vídeos (por exemplo, um a cada segundo), tratá-los como imagens independentes e introduzi-los no sistema. Desta forma, o motor de pesquisa pode indexar semanticamente momentos visuais dos teus vídeos.

Comentários