Busca Semântica de Imagens com OpenAI CLIP e Meta FAISS
Introdução
Este guia te orienta na construção de um motor de busca semântica de imagens usando OpenAI CLIP, Meta FAISS e Flask. Ao combinar os poderosos embeddings visuais-linguísticos do CLIP com a busca eficiente de vizinhos mais próximos do FAISS, podes criar uma interface web funcional onde recuperas imagens relevantes usando consultas em linguagem natural.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉
Pré-visualização da Busca Semântica de Imagens

Como funciona
- CLIP usa um codificador de visão (por exemplo, ResNet ou ViT) para imagens e um codificador de texto (baseado em Transformer) para linguagem, projetando ambos no mesmo espaço de embedding multimodal. Isto permite a comparação direta entre texto e imagens usando similaridade de cosseno.
- FAISS (Facebook AI Similarity Search) cria um índice dos embeddings de imagem e permite a recuperação rápida e escalável dos vetores mais próximos a uma determinada consulta.
- Flask fornece uma interface web simples para enviar consultas em linguagem natural e exibir imagens semanticamente correspondentes a partir do índice.
Esta arquitetura suporta busca zero-shot, o que significa que não precisas de rótulos ou categorias, apenas dados de imagem e um bom prompt.
Aviso de Caminho da Imagem
Se estiveres a usar as tuas próprias imagens, certifica-te de fornecer um caminho absoluto para o diretório de imagens. Caso contrário, as imagens podem não aparecer na página web devido às limitações de servir ficheiros do Flask.
from ultralytics import solutions
app = solutions.SearchApp(
# data = "path/to/img/directory" # Optional, build 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 testingClasse VisualAISearch
Esta classe executa todas as operações de backend:
- Carrega ou cria um índice FAISS a partir de imagens locais.
- Extrai embeddings de imagem e texto usando o CLIP.
- Executa a busca de similaridade usando a similaridade de cosseno.
Aviso de Caminho da Imagem
Se estiveres a usar as tuas próprias imagens, certifica-te de fornecer um caminho absoluto para o diretório de imagens. Caso contrário, as imagens podem não aparecer na página web devido às limitações de servir ficheiros do Flask.
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build search engine with your own images
device="cuda" # 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.2680Parâmetros da VisualAISearch
A tabela abaixo descreve os parâmetros disponíveis para a VisualAISearch:
| Argumento | Tipo | Predefinição | Descrição |
|---|---|---|---|
data | str | 'images' | Caminho para o diretório de imagens usado para busca de similaridade. |
| Argumento | Tipo | Predefinição | Descrição |
|---|---|---|---|
device | str | None | Especifica o dispositivo para inferência (por exemplo, cpu, cuda:0 ou 0). Permite que os usuários selecionem entre CPU, uma GPU específica ou outros dispositivos de computação para a execução do modelo. |
Vantagens da Busca Semântica de Imagens com CLIP e FAISS
Construir o teu próprio sistema de busca semântica de imagens com CLIP e FAISS oferece várias vantagens atraentes:
-
Capacidades Zero-Shot: Não precisas de treinar o modelo no teu conjunto de dados específico. O aprendizado zero-shot do CLIP permite que faças consultas de busca em qualquer conjunto de dados de imagem usando linguagem natural de forma livre, poupando tempo e recursos.
-
Compreensão Semelhante à Humana: Ao contrário dos motores de busca baseados em palavras-chave, o CLIP compreende o contexto semântico. Ele pode recuperar imagens baseadas em consultas abstratas, emocionais ou relacionais, como "uma criança feliz na natureza" ou "um horizonte de cidade futurista à noite".

-
Sem Necessidade de Rótulos ou Metadados: Sistemas de busca de imagem tradicionais requerem dados cuidadosamente rotulados. Esta abordagem só precisa de imagens em bruto. O CLIP gera embeddings sem precisar de qualquer anotação manual.
-
Busca Flexível e Escalável: O FAISS permite uma busca rápida de vizinhos mais próximos mesmo com grandes conjuntos de dados. Está otimizado para velocidade e memória, permitindo uma resposta em tempo real mesmo com milhares (ou milhões) de embeddings.

-
Aplicações Cross-Domain: Quer estejas a construir um arquivo de fotos pessoal, uma ferramenta de inspiração criativa, um motor de busca de produtos ou até um sistema de recomendação de arte, esta stack adapta-se a domínios diversos com ajustes mínimos.
FAQ
Como é que o CLIP compreende tanto imagens como texto?
CLIP (Contrastive Language Image Pretraining) é um modelo desenvolvido pela OpenAI que aprende a conectar informações visuais e linguísticas. É treinado num conjunto de dados massivo de imagens emparelhadas com legendas em linguagem natural. Este treino permite mapear tanto imagens como texto para um espaço de embedding partilhado, para que possas compará-los diretamente usando a similaridade vetorial.
Por que o CLIP é considerado tão poderoso para tarefas de IA?
O que faz o CLIP destacar-se é a sua capacidade de generalizar. Em vez de ser treinado apenas para rótulos ou tarefas específicas, ele aprende com a própria linguagem natural. Isto permite lidar com consultas flexíveis como “um homem a andar de jet ski” ou “uma paisagem onírica surreal”, tornando-o útil para tudo, desde classificação até à busca semântica criativa, sem necessidade de re-treino.
O que faz exatamente o FAISS neste projeto (Busca Semântica)?
FAISS (Facebook AI Similarity Search) é um toolkit que te ajuda a pesquisar através de vetores de alta dimensão de forma muito eficiente. Uma vez que o CLIP transforma as tuas imagens em embeddings, o FAISS torna rápido e fácil encontrar as correspondências mais próximas para uma consulta de texto, perfeito para a recuperação de imagens em tempo real.
Why use the Ultralytics Python package if CLIP and FAISS are from OpenAI and Meta?
Embora o CLIP e o FAISS sejam desenvolvidos pela OpenAI e pela Meta, respetivamente, o pacote Python da Ultralytics simplifica a sua integração num pipeline completo de busca semântica de imagens num fluxo de trabalho de 2 linhas que simplesmente funciona:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build search engine with your own images
device="cuda" # 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.2680Esta implementação de alto nível gere:
- Geração de embeddings de imagem e texto baseada em CLIP.
- Criação e gestão de índices FAISS.
- Busca semântica eficiente com similaridade de cosseno.
- Carregamento de imagens baseado em diretórios e visualização.
Posso personalizar o frontend desta aplicação?
Sim. A configuração atual usa Flask com um frontend HTML básico, mas podes substituí-lo pelo teu próprio HTML ou construir uma IU mais dinâmica com React, Vue ou outro framework de frontend. O Flask pode servir como a API de backend para a tua interface personalizada.
É possível pesquisar através de vídeos em vez de imagens estáticas?
Não diretamente. Uma solução simples é extrair frames individuais dos teus vídeos (por exemplo, um a cada segundo), tratá-los como imagens autónomas e alimentá-los no sistema. Desta forma, o motor de busca pode indexar semanticamente momentos visuais dos teus vídeos.