Este projeto treina um modelo de deep learning baseado no EfficientNetB0 para classificação binária de imagens dermatológicas (benigno vs maligno ou outra definição de classes conforme suas pastas). O pipeline inclui limpeza de nomes de arquivos, carregamento dos datasets, data augmentation, tratamento de desbalanceamento com class weights, treinamento em duas fases (transfer learning + fine-tuning) e avaliação do modelo.
cancer_treino/— imagens para treinocarcer_val/— imagens para validaçãocancer_teste/— imagens para testebest_model.h5— checkpoint do melhor modelo (AUC)modelo_final.keras— modelo final salvo
As imagens são automaticamente renomeadas para evitar erros com acentos e caracteres especiais.
O código usa unicodedata para sanitizar nomes dos arquivos, garantindo compatibilidade:
- Remove acentos
- Substitui caracteres inválidos
- Evita falhas no
image_dataset_from_directory
Utiliza tf.keras.utils.image_dataset_from_directory, com:
label_mode='binary'image_size=(224,224)batch_size = 16
Os datasets são cacheados e prefetchados para desempenho.
Os pesos das classes são calculados usando:
compute_class_weight('balanced', ...)Isso ajuda quando há desbalanceamento entre classes.
Inclui:
- Flip horizontal
- Rotação leve
- Zoom aleatório
- Ajuste de contraste
O modelo é composto por:
- Transfer Learning com EfficientNetB0 congelado
- Camada
GlobalAveragePooling2D Dropout(0.3)Dense(1, activation='sigmoid')
O preprocessamento usa:
from tensorflow.keras.applications.efficientnet import preprocess_input- Base congelada
- LR =
1e-4
- Libera últimas 40 camadas da EfficientNet
- LR =
1e-5
Callbacks incluídos:
EarlyStoppingModelCheckpointReduceLROnPlateau
O modelo é avaliado em cima do conjunto de teste usando:
- AUC
- Accuracy
- Matriz de confusão
- Classification Report (precision, recall, f1-score)
- ROC Curve + Youden J para threshold ideal
O threshold calculado substitui o padrão 0.5.
A função inferir_imagem:
- Carrega o modelo
- Preprocessa a imagem (OpenCV)
- Aplica EfficientNet preprocess
- Retorna a probabilidade e a classe prevista
Uso:
prob, classe = inferir_imagem("modelo_final.keras", "pe.jpeg")- Python 3.10+
- TensorFlow 2.12+
- NumPy
- Matplotlib
- Seaborn
- scikit-learn
- OpenCV (cv2)
pip install tensorflow tensorflow-addons numpy matplotlib seaborn scikit-learn opencv-python- Evite pastas com acentos, espaços ou caracteres especiais.
- Para aumentar desempenho, coloque o dataset em SSD quando possível.
- A VRAM pode limitar o batch size no fine-tuning.
- Ajuste o número de camadas liberadas conforme sua GPU.
Projeto derivado de pipeline otimizado para classificação dermatológica de imagens com EfficientNet.
Caso queira, posso gerar:
- README com imagens
- README em inglês
- README para GitHub com badges
- Versão reduzida
- Versão super detalhada