Este projeto implementa um sistema de recuperação e classificação de imagens utilizando a técnica Bag of Visual Words (BoVW) com diferentes extratores de características: histogramas de cores, algoritmo ORB e ResNet50.
O Bag of Visual Words é uma técnica inspirada na área de processamento de linguagem natural que representa imagens como "sacolas de palavras visuais". O processo consiste em:
- Extrair características locais das imagens
- Agrupar essas características em clusters (vocabulário visual)
- Representar cada imagem como um histograma de frequência dessas "palavras visuais"
- Utilizar essa representação para recuperação e classificação de imagens
Referência: Visual Bag of Words - MIT
Representação estatística da distribuição de cores em uma imagem. Utiliza-se a distribuição dos canais RGB para caracterizar a imagem.
Detector e descritor de características locais rápido e eficiente, invariante a rotação e parcialmente invariante a mudanças de iluminação.
Referência: ORB Feature Detection - OpenCV
ResNet50 (Residual Network com 50 camadas) é uma arquitetura de rede neural convolucional profunda que utiliza conexões residuais (skip connections) para facilitar o treinamento de redes muito profundas. No contexto deste projeto, utilizamos ResNet50 pré-treinada na ImageNet como extrator de características.
Características principais:
- 50 camadas de profundidade
- Utiliza blocos residuais que adicionam a entrada à saída
- Pré-treinada em milhões de imagens (ImageNet)
- Excelente para transfer learning e extração de características
Referências:
Algoritmo de agrupamento não supervisionado usado para criar o vocabulário visual, agrupando características similares em clusters.
Referência: K-Means - Scikit-learn
O F-Score, ou F1-Score, é uma métrica de avaliação que combina precisão e recall em uma única medida. É a média harmônica entre precisão e recall, sendo particularmente útil quando há desbalanceamento de classes.
Fórmula:
Por que F-Score?
- Fornece uma visão equilibrada entre precisão e recall
- Mais informativo que a acurácia quando há classes desbalanceadas
- Valor entre 0 e 1, onde 1 indica desempenho perfeito
- Penaliza modelos que têm alta precisão mas baixo recall (ou vice-versa)
Referências:
Método utilizado neste projeto:
Este projeto utiliza uma abordagem de Content-Based Image Retrieval (CBIR) ao invés de um classificador supervisionado tradicional. O método funciona da seguinte forma:
-
Cálculo de Similaridade: Para cada imagem de consulta (query), calcula-se a similaridade de cosseno entre seu histograma BoVW e todos os histogramas do banco de dados
-
Recuperação k-NN: Retorna as k imagens mais similares (top-k mais próximas)
-
Classificação Implícita: A "classificação" acontece considerando as classes das imagens mais similares recuperadas
Por que Similaridade de Cosseno?
- Invariante à magnitude: Compara a direção dos vetores, não o tamanho
- Eficiente para alta dimensionalidade: Funciona bem com histogramas BoVW
- Interpretável: Valores entre -1 e 1, onde 1 = idêntico
- Rápido computacionalmente: Produto escalar normalizado
Nota sobre SVM: A literatura tradicional de BoVW frequentemente menciona SVM como classificador. Embora SVM seja excelente para este tipo de problema, este projeto optou por uma abordagem de recuperação por similaridade, que é igualmente válida e mais adequada para cenários onde:
- Não há necessidade de treinar um modelo explicitamente
- Novas classes podem ser adicionadas sem retreinamento
- O objetivo é encontrar imagens similares, não apenas classificar
Referências:
- Python 3.8 ou superior
- pip
Este projeto inclui um script de inicialização do ambiente virtual. Para executá-lo:
bash init_venv.shEste script irá:
- Criar um ambiente virtual Python
- Instalar todas as dependências necessárias listadas em
requirements.txt - Configurar o ambiente para execução do notebook
Para visualizar e executar o notebook image_manipulate.ipynb, recomenda-se instalar a extensão Jupyter no VS Code:
- Abra o VS Code
- Vá para a aba de extensões (Ctrl+Shift+X)
- Procure por "Jupyter"
- Instale a extensão oficial da Microsoft
Links úteis:
Após a instalação, ative o ambiente virtual:
source venv/bin/activateAgora você está pronto para executar o notebook e visualizar/reproduzir os resultados!
O notebook image_manipulate.ipynb está organizado nas seguintes seções:
- Exemplo Local com Girassóis: Demonstração inicial com dataset de girassóis
- Estudo Abrangente com CALTECH-101: Avaliação completa usando dataset Caltech-101
- Extração de Características:
- Histogramas de cores
- ORB (Oriented FAST and Rotated BRIEF)
- ResNet50 (CNN pré-treinada)
- Criação de Dicionários Visuais: K-means clustering
- Geração de Histogramas BoVW: Representação das imagens
- Fusão Multi-features: Combinação de diferentes características
- Recuperação e Avaliação: CBIR usando similaridade de cosseno e métricas de desempenho (Precision, Recall, F1-Score)
Figura: Extração de histogramas de cores RGB de uma imagem
Figura: Keypoints e descritores ORB detectados em uma imagem - pontos de interesse invariantes a rotação
Figura: Visualização das características extraídas pela ResNet50 - representação de alto nível
Figura: Comparação de desempenho entre diferentes combinações de features (Histograma, ORB, ResNet50)
O estudo de ablação mostra que:
- ResNet50 isoladamente obtém os melhores resultados
- A combinação de features (fusão) pode melhorar o desempenho em algumas classes
- Histogramas de cores sozinhos têm desempenho limitado para classes complexas
O projeto utiliza o dataset Caltech-101, que contém: Caltech - Official site
- 101 categorias de objetos
- Aproximadamente 40 a 800 imagens por categoria
- Total de cerca de 9.000 imagens
- Grande variabilidade intra-classe
- Desafio: classes desbalanceadas
Porém, foi feito um recorte do dataset total contendo apenas
butterflypandapigeonrevolverstrawberrysunflower
Baseado nos resultados obtidos no notebook, o sistema apresentou as seguintes métricas:
Configuração testada:
- Extrator: ResNet50
- Tamanho do vocabulário: 500 palavras visuais
- Método de recuperação: Similaridade de Cosseno (CBIR)
- Avaliação: Top-k retrieval (k=10)
Resultados Globais: Executado no notebook, o sistema alcançou resultados variados dependendo da configuração de features utilizadas.
A matriz de confusão gerada no notebook mostra:
Figura 1: Matriz de confusão do sistema de recuperação no dataset Caltech-101
Pontos Fortes:
- Classes com padrões visuais distintos (como "faces", "airplanes", "motorbikes") apresentaram alta precisão
- A diagonal principal mostra boa classificação para a maioria das classes
- Baixa confusão entre classes semanticamente distantes
Pontos Fracos:
- Algumas classes com poucos exemplos de treino apresentaram desempenho inferior
- Confusão entre classes visualmente similares (ex: diferentes tipos de animais)
- Classes com grande variabilidade intra-classe tiveram menor F1-score
Figura 2: Heatmap dos F1-Scores por classe - cores mais quentes indicam melhor desempenho
O sistema de recuperação de imagens baseado em BoVW com ResNet50 demonstrou ser eficaz para a tarefa de classificação e recuperação de imagens por similaridade, apresentando os seguintes aspectos:
Aspectos Positivos:
-
Transfer Learning Eficiente: O uso de ResNet50 pré-treinada permitiu extrair características discriminativas sem necessidade de treinar uma rede do zero
-
Robustez a Variações: O sistema mostrou-se relativamente robusto a variações de pose, iluminação e escala presentes no Caltech-101
-
Escalabilidade: A abordagem BoVW permite processar grandes volumes de dados de forma eficiente
-
Interpretabilidade: Os histogramas de palavras visuais fornecem uma representação interpretável das imagens
Aspectos a Melhorar:
-
Classes Desbalanceadas: O desempenho varia significativamente entre classes com diferentes números de exemplos de treino
-
Similaridade Visual: Classes visualmente similares ainda apresentam taxa de confusão relativamente alta
-
Tamanho do Vocabulário: O trade-off entre tamanho do vocabulário e desempenho poderia ser mais explorado
-
Fusão de Features: A combinação de múltiplos extratores (histogramas + ORB + ResNet50) mostrou potencial, mas os pesos ótimos requerem experimentação
Comparado com métodos mais simples (apenas histogramas de cores ou ORB), o uso de ResNet50 como extrator de características apresentou:
- Melhor generalização para classes não vistas
- Maior capacidade representacional devido às características de alto nível
- F1-Score superior na maioria das classes
-
Dependência do Pré-treinamento: O desempenho está limitado pela qualidade do pré-treinamento da ResNet50 no ImageNet
-
Custo Computacional: A extração de características via ResNet50 é computacionalmente intensiva
-
Hiperparâmetros: O estudo não realizou busca exaustiva de hiperparâmetros (tamanho do vocabulário, valor de k no top-k retrieval, etc.)
O sistema implementado demonstra que a abordagem Bag of Visual Words combinada com características deep learning (ResNet50) é viável e eficaz para classificação de imagens em cenários com múltiplas classes.
Os resultados obtidos sugerem que:
- A qualidade das características extraídas é mais importante que a complexidade do classificador
- O balanceamento de classes deve ser tratado adequadamente
- A fusão de múltiplas características pode melhorar o desempenho, mas requer ajuste cuidadoso
Recomendações para trabalhos futuros:
- Experimentar com diferentes arquiteturas de CNN (EfficientNet, Vision Transformers)
- Implementar técnicas de balanceamento de classes (oversampling, SMOTE)
- Explorar métodos de ensemble combinando múltiplos classificadores
- Utilizar fine-tuning da ResNet50 no dataset específico
- Implementar busca de hiperparâmetros mais sistemática (Grid Search, Bayesian Optimization)
O notebook contém diversas visualizações incluindo:
- Exemplos de imagens por categoria
- Histogramas de características
- Matriz de confusão
- Curvas de aprendizado
- Exemplos de classificações corretas e incorretas
Para visualizar todas as análises e resultados detalhados, execute o notebook image_manipulate.ipynb.
- Bag-of-Words Model in Computer Vision
- Deep Residual Learning for Image Recognition (ResNet Paper)
- Keras Applications - ResNet50
- Scikit-learn: Machine Learning in Python
- OpenCV Python Tutorials
- Caltech-101 Dataset
Este projeto é disponibilizado para fins educacionais e de pesquisa.