Este repositório contém um trabalho simples de pós-graduação que combina uma aplicação web com um classificador de imagens. A ideia é receber uma imagem de inseto já recortada, extrair características visuais com uma ResNet50 pré-treinada, classificar o recorte com KNN e mostrar imagens parecidas da base.
O projeto serve como demonstração de integração entre framework web, processamento de imagens e aprendizado de máquina. Ele não deve ser tratado como uma solução pronta para uso em campo, não faz diagnóstico agronômico e não substitui identificação profissional de pragas.
- Recebe upload de imagens JPG, JPEG, PNG ou WEBP.
- Classifica recortes de insetos em três classes do dataset.
- Mostra a classe prevista e uma confiança aproximada calculada pelo KNN.
- Exibe as imagens de referência mais parecidas com o recorte enviado.
- Apresenta uma página simples com métricas offline do experimento.
Importante: a aplicação espera uma imagem de inseto já recortada. Ela não detecta automaticamente insetos em uma foto completa da armadilha.
| Sigla | Classe |
|---|---|
| MR | Macrolophus pygmaeus |
| NC | Nesidiocoris tenuis |
| WF | Trialeurodes vaporariorum |
- Python
- Emmett
- PyTorch e torchvision
- scikit-learn
- Pillow
- matplotlib e seaborn
O dataset original contém imagens de armadilhas amarelas e anotações em XML no formato PASCAL VOC. O pipeline do projeto usa essas anotações para gerar recortes dos insetos e treinar o classificador.
Fluxo geral:
- Ler as anotações XML do dataset.
- Recortar os insetos anotados e padronizar cada imagem em 224 x 224 pixels.
- Usar uma ResNet50 pré-treinada como extrator de características.
- Treinar um KNN com métrica de cosseno sobre os embeddings extraídos.
- Avaliar o modelo em um conjunto de teste separado por imagem original.
- Usar os artefatos gerados na aplicação web.
A separação por imagem original evita que recortes da mesma foto da armadilha apareçam ao mesmo tempo no treino e no teste.
Os resultados abaixo foram gerados a partir dos artefatos e métricas presentes no repositório. Eles ajudam a avaliar o comportamento do classificador neste conjunto de dados, mas não significam que o sistema esteja validado para uso real em campo.
- Acurácia: 93,63%
- AUC macro one-vs-rest: 0,9871
- Recortes de treino: 1439
- Recortes de teste: 361
- Imagens originais no treino: 212
- Imagens originais no teste: 52
- Sobreposição de imagens originais entre treino e teste: 0
As métricas detalhadas ficam em reports/metrics.json, e as imagens da matriz de
confusão e da curva ROC ficam em reports/.
app.py Rotas web e tela de upload
classifier.py Preparação da base, extração de características, treino e predição
scripts/pipeline.py Comando para preparar, treinar e avaliar
templates/ Telas HTML
static/app.css Estilos da interface
requirements.txt Dependências do projeto
O repositório inclui o dataset original em yellow-sticky-traps-dataset-main/ e
artefatos treinados em artifacts/. Arquivos de ambiente local, cache, uploads e
zips ficam fora do Git.
O dataset usado neste projeto vem de uma versão com rótulos revisados do Yellow
Sticky Traps Dataset, descrita no README original em
yellow-sticky-traps-dataset-main/README.md.
Segundo a documentação do dataset, essa versão foi criada por Maurice Deserno e Alexia Briassouli, com ajuda de Carolin Vey, a partir do conjunto original "Raw data from Yellow Sticky Traps with insects for training of deep learning Convolutional Neural Network for object detection", publicado por A.T. Nieuwenhuizen e colaboradores.
Para detalhes completos de autoria, artigo, DOI e fonte dos dados, consulte o
README original do dataset dentro da pasta yellow-sticky-traps-dataset-main/.
Crie e ative o ambiente virtual:
python3 -m venv .venv
source .venv/bin/activateInstale as dependências:
pip install -r requirements.txtA aplicação já vem com artefatos treinados. Se quiser regenerar tudo do zero, execute:
python scripts/pipeline.py allTambém é possível rodar cada etapa separadamente:
python scripts/pipeline.py prepare
python scripts/pipeline.py train
python scripts/pipeline.py evaluateAs etapas geram:
data/crops/: recortes dos insetos;data/crops_manifest.csv: manifesto dos recortes;static/reference/: imagens usadas como exemplos na interface;artifacts/: modelo KNN, embeddings e metadados;reports/: métricas e gráficos de avaliação.
Com o ambiente virtual ativo:
emmett developAcesse:
http://127.0.0.1:8000
Na tela inicial você pode enviar uma imagem recortada de inseto, usar exemplos da base e abrir a tela de métricas.
Se a aplicação avisar que os artefatos não existem, rode:
python scripts/pipeline.py allSe o dataset não for encontrado, confirme que a pasta abaixo está na raiz do projeto:
yellow-sticky-traps-dataset-main/
Se o comando emmett develop não for encontrado, ative o ambiente virtual e
reinstale as dependências:
source .venv/bin/activate
pip install -r requirements.txtThis repository contains a simple postgraduate project that combines a web application with an image classifier. The idea is to receive an already cropped insect image, extract visual features with a pre-trained ResNet50, classify the crop with KNN, and show similar images from the dataset.
The project serves as a demonstration of integration between a web framework, image processing, and machine learning. It should not be treated as a ready-to-use field solution, does not provide agronomic diagnosis, and does not replace professional pest identification.
- Receives uploads of JPG, JPEG, PNG, or WEBP images.
- Classifies insect crops into three dataset classes.
- Shows the predicted class and an approximate confidence score calculated by KNN.
- Displays the reference images most similar to the submitted crop.
- Presents a simple page with offline experiment metrics.
Important: the application expects an already cropped insect image. It does not automatically detect insects in a complete photo of the trap.
| Code | Class |
|---|---|
| MR | Macrolophus pygmaeus |
| NC | Nesidiocoris tenuis |
| WF | Trialeurodes vaporariorum |
- Python
- Emmett
- PyTorch and torchvision
- scikit-learn
- Pillow
- matplotlib and seaborn
The original dataset contains images of yellow sticky traps and XML annotations in PASCAL VOC format. The project pipeline uses these annotations to generate insect crops and train the classifier.
General flow:
- Read the dataset XML annotations.
- Crop the annotated insects and standardize each image to 224 x 224 pixels.
- Use a pre-trained ResNet50 as a feature extractor.
- Train a KNN with cosine metric over the extracted embeddings.
- Evaluate the model on a test set separated by original image.
- Use the generated artifacts in the web application.
The separation by original image prevents crops from the same trap photo from appearing in both the training and test sets.
The results below were generated from the artifacts and metrics present in the repository. They help evaluate the behavior of the classifier on this dataset, but they do not mean that the system is validated for real field use.
- Accuracy: 93.63%
- Macro one-vs-rest AUC: 0.9871
- Training crops: 1439
- Test crops: 361
- Original images in training: 212
- Original images in test: 52
- Overlap of original images between training and test: 0
The detailed metrics are in reports/metrics.json, and the confusion matrix and
ROC curve images are in reports/.
app.py Web routes and upload screen
classifier.py Dataset preparation, feature extraction, training, and prediction
scripts/pipeline.py Command to prepare, train, and evaluate
templates/ HTML screens
static/app.css Interface styles
requirements.txt Project dependencies
The repository includes the original dataset in yellow-sticky-traps-dataset-main/
and trained artifacts in artifacts/. Local environment files, cache, uploads,
and zip files are kept out of Git.
The dataset used in this project comes from a version with revised labels of the
Yellow Sticky Traps Dataset, described in the original README at
yellow-sticky-traps-dataset-main/README.md.
According to the dataset documentation, this version was created by Maurice Deserno and Alexia Briassouli, with help from Carolin Vey, based on the original set "Raw data from Yellow Sticky Traps with insects for training of deep learning Convolutional Neural Network for object detection", published by A.T. Nieuwenhuizen and collaborators.
For complete details about authorship, article, DOI, and data source, see the
original dataset README inside the yellow-sticky-traps-dataset-main/ folder.
Create and activate the virtual environment:
python3 -m venv .venv
source .venv/bin/activateInstall the dependencies:
pip install -r requirements.txtThe application already comes with trained artifacts. To regenerate everything from scratch, run:
python scripts/pipeline.py allIt is also possible to run each step separately:
python scripts/pipeline.py prepare
python scripts/pipeline.py train
python scripts/pipeline.py evaluateThe steps generate:
data/crops/: insect crops;data/crops_manifest.csv: crop manifest;static/reference/: images used as examples in the interface;artifacts/: KNN model, embeddings, and metadata;reports/: metrics and evaluation charts.
With the virtual environment active:
emmett developAccess:
http://127.0.0.1:8000
On the home screen, you can upload a cropped insect image, use examples from the dataset, and open the metrics screen.
If the application warns that the artifacts do not exist, run:
python scripts/pipeline.py allIf the dataset is not found, confirm that the folder below is in the project root:
yellow-sticky-traps-dataset-main/
If the emmett develop command is not found, activate the virtual environment and
reinstall the dependencies:
source .venv/bin/activate
pip install -r requirements.txt