Como criar uma pesquisa semântica de imagens com o OpenAI CLIP#
Este guia mostra como criar um mecanismo de pesquisa semântica de imagens usando o OpenAI CLIP e o Flask. Ao combinar embeddings visuais e linguísticos do CLIP com uma busca rápida por similaridade do cosseno usando o NumPy, você pode criar uma interface web que recupera imagens relevantes a partir de consultas em linguagem natural, sem precisar de rótulos ou categorias.
Assista: Como funciona a busca por similaridade | Busca visual usando OpenAI CLIP e o pacote Ultralytics 🎉

O pacote Python da Ultralytics encapsula todo esse fluxo em duas classes, permitindo iniciar um aplicativo de pesquisa funcional ou executar consultas programaticamente com poucas linhas de código. Este guia aborda por que a pesquisa semântica é útil, como ela funciona, como executar o aplicativo web, como pesquisar programaticamente e como configurar os parâmetros.
Por que usar a pesquisa semântica de imagens?#
Criar seu próprio sistema de pesquisa semântica de imagens com CLIP oferece várias vantagens importantes:
- Recursos zero-shot: você não precisa treinar o modelo com seu conjunto de dados. O aprendizado zero-shot do CLIP permite pesquisar qualquer coleção de imagens usando consultas em linguagem natural e formato livre, economizando tempo e recursos.
- Compreensão semelhante à humana: ao contrário da pesquisa por palavras-chave, o CLIP entende o contexto semântico e recupera imagens em resposta a 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: essa abordagem precisa apenas das imagens originais. O CLIP gera embeddings sem exigir anotação manual.
- Pesquisa leve e exata: uma única multiplicação de matrizes normalizadas no NumPy classifica todas as imagens por similaridade do cosseno, fornecendo resultados exatos e resposta em tempo real para milhares de embeddings, sem dependências adicionais de pesquisa para instalar ou gerenciar.
- Aplicações em diferentes domínios: seja para criar um arquivo pessoal de fotos, uma ferramenta de inspiração criativa, um mecanismo de pesquisa de produtos ou um sistema de recomendação de arte, a mesma pilha tecnológica pode ser adaptada com pouquíssimos ajustes.
Como funciona a pesquisa semântica de imagens#
O fluxo combina três componentes, cada um responsável por uma etapa da transformação de imagens e textos em resultados classificados:
- O 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. Isso permite comparar diretamente textos e imagens usando a similaridade do cosseno.
- O NumPy armazena os embeddings das imagens em um único array e os compara com um embedding de consulta por meio de uma multiplicação de matrizes, retornando os vetores mais próximos por similaridade do cosseno sem dependências adicionais de indexação.
- O Flask oferece uma interface web simples para enviar consultas em linguagem natural e exibir imagens semanticamente correspondentes do índice.

Como imagens e textos são representados no mesmo espaço vetorial, a recuperação é zero-shot: você só precisa dos dados de imagem e de um bom prompt, sem rótulos ou categorias.
Execute o aplicativo web de pesquisa semântica#
A classe SearchApp inicia toda a interface Flask. Na primeira execução, ela baixa um conjunto de imagens de exemplo, cria o índice de embeddings e disponibiliza uma página na qual você pode digitar uma consulta e ver os resultados classificados.
Aviso sobre o caminho das imagens
Se você estiver usando suas próprias imagens, forneça o caminho absoluto para o diretório de imagens. Caso contrário, talvez as imagens não apareçam na página da web devido às limitações do Flask no envio de arquivos.
from ultralytics import solutions
app = solutions.SearchApp(
data="images", # substitua por um caminho para criar o mecanismo de pesquisa com suas próprias imagens
device="cpu", # configure o dispositivo de processamento, por exemplo, "cpu" ou "cuda"
)
app.run(debug=False) # Você também pode usar o argumento `debug=True` para testarPesquise imagens programaticamente#
A classe VisualAISearch executa todas as operações de back-end sem a camada web:
- Carrega ou cria um índice de embeddings a partir de imagens locais.
- Extrai embeddings de imagens e textos usando CLIP.
- Executa uma pesquisa por similaridade usando a similaridade do cosseno.
Chame o mecanismo de pesquisa com uma consulta em linguagem natural para obter uma lista de nomes de arquivos de imagem correspondentes, classificados por similaridade:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # substitua por um caminho para criar o mecanismo de pesquisa com suas próprias imagens
device="cpu", # configure o dispositivo de processamento, por exemplo, "cpu" ou "cuda"
)
results = searcher("a dog sitting on a bench")
# Resultados classificados:
# - 000000546829.jpg | Similarity: 0.3269
# - 000000549220.jpg | Similarity: 0.2899
# - 000000517069.jpg | Similarity: 0.2761
# - 000000029393.jpg | Similarity: 0.2742
# - 000000534270.jpg | Similarity: 0.2680Configure os parâmetros do VisualAISearch#
A tabela abaixo apresenta os parâmetros disponíveis para VisualAISearch:
| Argumento | Tipo | Padrão | Descrição |
|---|---|---|---|
data | str | 'images' | Caminho para o diretório de imagens a ser indexado e pesquisado. |
device | str | 'cpu' | Dispositivo usado para inferência do CLIP (por exemplo, cpu, cuda, 0). |
Para pesquisar coleções de imagens em escala de produção sem gerenciar arquivos locais, você pode organizar e versionar suas imagens na Ultralytics Platform antes de indexá-las com o CLIP.
Conclusão#
Com o CLIP e o pacote Python da Ultralytics, você pode criar um mecanismo de pesquisa semântica de imagens zero-shot com poucas linhas de código, seja como aplicativo web Flask ou como back-end de pesquisa programático. A partir daí, configure data para usar seu próprio diretório de imagens e indexá-lo; depois, explore outras soluções da Ultralytics para ampliar seus fluxos de trabalho de visão computacional.
Perguntas frequentes#
O CLIP (Pré-treinamento contrastivo de linguagem e imagem) é um modelo desenvolvido pela OpenAI que aprende a conectar informações visuais e linguísticas. Ele é treinado com um enorme conjunto de dados de imagens associadas a legendas em linguagem natural. Esse treinamento permite mapear imagens e textos para um espaço de embeddings compartilhado, possibilitando compará-los diretamente por similaridade vetorial.
O que diferencia o CLIP é sua capacidade de generalização. Em vez de ser treinado apenas para rótulos ou tarefas específicas, ele aprende a partir da própria linguagem natural. Isso permite lidar com consultas flexíveis, como "um homem andando de jet ski" ou "uma paisagem onírica surreal", tornando-o útil para tudo, desde classificação até pesquisa semântica criativa, sem precisar de novo treinamento.
Depois que o CLIP converte suas imagens em embeddings, o pacote Ultralytics aplica normalização L2 e os armazena em um único array do NumPy. Uma multiplicação de matrizes classifica uma consulta ao calcular a similaridade do cosseno entre o embedding da consulta e o embedding de cada imagem; em seguida, as pontuações são ordenadas. Essa busca por força bruta é exata e rápida para coleções de imagens típicas, sem dependências adicionais de bancos de dados vetoriais para instalar ou gerenciar.
Embora o CLIP tenha sido desenvolvido pela OpenAI, o pacote Python da Ultralytics reúne a geração de embeddings, a indexação e a pesquisa por similaridade do cosseno em um fluxo completo de pesquisa semântica de imagens, pronto para usar com poucas linhas de código:
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # substitua por um caminho para criar o mecanismo de pesquisa com suas próprias imagens device="cpu", # configure o dispositivo de processamento, por exemplo, "cpu" ou "cuda" ) results = searcher("a dog sitting on a bench")Esta implementação de alto nível cuida de:
- Geração de embeddings de imagens e textos com CLIP.
- Criação e gerenciamento de índices de embeddings.
- Pesquisa semântica eficiente com similaridade do cosseno.
- Carregamento de imagens com base em diretórios e visualização.
Sim. A configuração atual usa Flask com um front-end HTML básico, mas você pode substituí-lo pelo seu próprio HTML ou criar uma interface mais dinâmica com React, Vue ou outra estrutura de front-end. O Flask pode atuar como API de back-end para sua interface personalizada.
Não diretamente. Uma solução simples é extrair quadros individuais dos vídeos (por exemplo, um a cada segundo), tratá-los como imagens independentes e enviá-los ao sistema. Assim, o mecanismo de pesquisa pode indexar semanticamente momentos visuais dos seus vídeos.