Skip to content

Latest commit

Β 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🫁 ThoraxAI

Classification d'images medicales par Deep Learning

Detection de pneumonie sur radiographies thoraciques par CNN, Transfer Learning et explicabilite visuelle

Status Best AUC Best Recall Python License

Built with:

PyTorch Streamlit scikit-learn UV HuggingFace

Models: DenseNet121 ResNet18 EfficientNet CNN

Interpretability: Grad-CAM Grad-CAM++ IG


Tester l'application en ligne | Modeles sur HuggingFace

Streamlit App

🎯 Objectif

Developper un pipeline complet de Deep Learning capable de distinguer des radiographies thoraciques normales de celles presentant une pneumonie, avec des performances robustes (validees par K-fold) et une interpretation visuelle des decisions (Grad-CAM, Grad-CAM++, Integrated Gradients).

βš•οΈ Ce projet s'inscrit dans le cadre d'un outil d'aide a la decision medicale β€” il ne vise en aucun cas a remplacer le diagnostic d'un medecin.

πŸ“Š Dataset

Chest X-Ray Images (Pneumonia) β€” Kaggle

Source : Guangzhou Women and Children's Medical Center. Labels valides par 2 medecins experts + 1 verificateur.

Set NORMAL PNEUMONIA Total Ratio P/N
Train 1,341 3,875 5,216 2.89
Val (original) 8 8 16 1.00
Test 234 390 624 1.67

⚠️ Problemes identifies :

  • Val set original inutilisable (16 images) β†’ re-split stratifie 85/15 du train set
  • Desequilibre 2.89:1 β†’ gere par WeightedRandomSampler + pos_weight
  • 170 patients partages entre train et test (risque de data leakage)
  • Population exclusivement pediatrique (un seul centre)

πŸ—οΈ Architectures

CNN Baseline (from scratch)

Conv(32) + BatchNorm + ReLU + MaxPool   (224 β†’ 112)
Conv(64) + BatchNorm + ReLU + MaxPool   (112 β†’ 56)
Conv(128) + BatchNorm + ReLU + MaxPool  (56  β†’ 28)
Flatten β†’ Dense(128) + Dropout(0.5) β†’ Dense(1)

Transfer Learning

Trois modeles pre-entraines sur ImageNet, avec fine-tuning des dernieres couches et classifieur enrichi Linear(256) + ReLU + Dropout + Linear(1) :

Modele Pre-entraine sur Fine-tuning Reference
ResNet18 ImageNet (1.4M images) layer4 He et al., 2016
DenseNet121 ImageNet (1.4M images) denseblock4 Huang et al., 2017 / CheXNet
EfficientNet-B0 ImageNet (1.4M images) derniers blocs Tan & Le, 2019

πŸ“ˆ Resultats

Comparaison des modeles (test set, seuil = 0.5)

Metrique CNN Baseline ResNet18 DenseNet121 EfficientNet
Accuracy 82.53% 85.74% 88.78% 87.98%
Recall 98.72% 99.49% 98.97% 97.69%
Specificite 55.56% 62.82% 71.79% 71.79%
F1-score 87.60% 89.71% 91.69% 91.04%
AUC-ROC 0.9457 0.9666 0.9710 0.9703
AUC-PR 0.9648 0.9751 0.9792 0.9829

πŸ† Meilleur modele global : DenseNet121 (AUC-ROC = 0.9710, seulement 4 pneumonies manquees sur 390).

Matrice de confusion β€” DenseNet121

Predit NORMAL Predit PNEUMONIA
Vrai NORMAL 168 (TN) 66 (FP)
Vrai PNEUMONIA 4 (FN) 386 (TP)

🎚️ Seuil optimal

Le seuil par defaut de 0.5 n'est pas optimal. Seuil optimal a 0.89 (F1 passe de 0.9169 β†’ 0.9328).

πŸ”„ Validation croisee K-fold (5 folds, CNN baseline)

Metrique Moyenne Ecart-type
Accuracy 97.60% Β± 0.54%
F1-score 98.38% Β± 0.37%
Recall 97.96% Β± 0.88%
AUC-ROC 0.9974 Β± 0.0009

Ecarts-types < 1% β†’ le modele est stable et les performances ne dependent pas du split.

πŸ” Interpretabilite

Trois methodes complementaires implementees from scratch :

Methode Principe Avantage
Grad-CAM Gradients moyens sur la derniere couche conv Vue globale des zones influentes
Grad-CAM++ Derivees d'ordre superieur Meilleure localisation, lesions multifocales
Integrated Gradients Interpolation baseline β†’ input (50 steps) Attributions au niveau pixel

L'analyse des erreurs par Grad-CAM revele que les faux negatifs sont lies a une attention trop localisee du modele, et les faux positifs a une activation sur des structures anatomiques ambigues.

⚠️ Les heatmaps ne sont pas des preuves cliniques. Elles analysent le comportement du modele, pas les lesions.

πŸ’» Application Streamlit β€” ThoraxAI

Interface de demonstration avec :

  • πŸ”¬ Selection parmi les 4 modeles
  • 🎚️ Seuil de decision ajustable
  • βš–οΈ Comparaison multi-modeles avec vote de consensus
  • πŸ”₯ Visualisation Grad-CAM (original / heatmap / superposition)
  • πŸ“‚ Exemples pre-charges du dataset
  • πŸ“‹ Historique des analyses
uv run streamlit run app.py

πŸ“ Structure du projet

ThoraxAI/
β”œβ”€β”€ πŸ“‚ app/                      # Application Streamlit (modulaire)
β”‚   β”œβ”€β”€ main.py
β”‚   β”œβ”€β”€ styles.py
β”‚   β”œβ”€β”€ components.py
β”‚   β”œβ”€β”€ inference.py
β”‚   └── data.py
β”œβ”€β”€ πŸ“‚ src/                      # Pipeline ML
β”‚   β”œβ”€β”€ config.py                # Constantes et configuration
β”‚   β”œβ”€β”€ dataset.py               # Transforms, DataLoaders, split stratifie
β”‚   β”œβ”€β”€ model.py                 # CNN baseline + ResNet18 + DenseNet121 + EfficientNet
β”‚   β”œβ”€β”€ train.py                 # EarlyStopping, boucle d'entrainement, K-fold
β”‚   └── eval/                    # Evaluation (modulaire)
β”‚       β”œβ”€β”€ metrics.py           # Metriques, comparaison, export JSON
β”‚       β”œβ”€β”€ plots.py             # Visualisations (confusion matrix, ROC, etc.)
β”‚       β”œβ”€β”€ gradcam.py           # Grad-CAM, Grad-CAM++, Integrated Gradients
β”‚       └── visualize.py         # Visualisations Grad-CAM
β”œβ”€β”€ πŸ“‚ notebooks/
β”‚   β”œβ”€β”€ 01_data_exploration.ipynb
β”‚   β”œβ”€β”€ 02_training.ipynb
β”‚   └── 03_evaluation.ipynb
β”œβ”€β”€ πŸ“‚ outputs/
β”‚   β”œβ”€β”€ checkpoints/             # Modeles sauvegardes (.pt)
β”‚   β”œβ”€β”€ figures/                 # Graphiques generes
β”‚   β”œβ”€β”€ results.json
β”‚   β”œβ”€β”€ training_summary.json
β”‚   └── eda_summary.json
β”œβ”€β”€ πŸ“‚ reports/                  # Rapport technique
β”œβ”€β”€ πŸ“‚ samples/                  # Images exemples pour la demo
β”œβ”€β”€ πŸ“‚ scripts/                  # Scripts utilitaires
β”œβ”€β”€ πŸ“„ app.py                    # Point d'entree Streamlit
β”œβ”€β”€ πŸ“„ pyproject.toml
└── πŸ“„ README.md

πŸš€ Installation

# Cloner le repo
git clone https://github.com/Exowz/ThoraxAI.git
cd ThoraxAI

# Installer les dependances avec UV
uv sync --extra demo

# Les modeles (.pt) et les images exemples sont telecharges
# automatiquement depuis HuggingFace Hub au premier lancement de l'app.
# Aucun telechargement manuel n'est necessaire.

# Telecharger le dataset Kaggle (uniquement pour re-entrainer)
uv sync --extra kaggle
uv run kaggle datasets download -d paultimothymooney/chest-xray-pneumonia
unzip chest-xray-pneumonia.zip -d data/

πŸ§ͺ Usage

# 1. Exploration des donnees
uv run jupyter notebook notebooks/01_data_exploration.ipynb

# 2. Entrainement (4 modeles + ablation study + K-fold)
uv run jupyter notebook notebooks/02_training.ipynb

# 3. Evaluation + interpretabilite
uv run jupyter notebook notebooks/03_evaluation.ipynb

# 4. Application Streamlit
uv run streamlit run app.py

πŸš€ Deploiement

L'application est deployee sur Streamlit Community Cloud et accessible a l'adresse : thoraxai-exowz.streamlit.app

Les checkpoints des modeles et les images exemples sont heberges sur Hugging Face Hub et telecharges automatiquement au premier lancement. Cela permet un deploiement leger sans inclure les fichiers .pt dans le repo Git.

πŸ”’ Reproductibilite

Composant Valeur
Python >= 3.10
PyTorch >= 2.0
Gestionnaire UV
Seed 42
Split validation 15% stratifie
Device CUDA / MPS / CPU

⚠️ Limites

  • Data leakage : 170 patients partages entre train et test
  • Source unique : population pediatrique, un seul centre (Guangzhou)
  • Specificite limitee : 66 faux positifs sur le meilleur modele
  • Pas de calibration des probabilites : les scores ne refletent pas les vraies probabilites

πŸ”­ Perspectives

  • Split par patient pour eliminer le data leakage
  • Validation sur des datasets multi-centres (CheXpert, MIMIC-CXR)
  • Ensemble de modeles (voting entre les 4 architectures)
  • Augmentations avancees (cutout, mixup)

πŸ“š References

  • Kaggle, Chest X-Ray Images (Pneumonia)
  • He et al., Deep Residual Learning for Image Recognition, CVPR 2016
  • Huang et al., Densely Connected Convolutional Networks, CVPR 2017
  • Tan & Le, EfficientNet: Rethinking Model Scaling, ICML 2019
  • Selvaraju et al., Grad-CAM: Visual Explanations from Deep Networks, ICCV 2017
  • Chattopadhay et al., Grad-CAM++, WACV 2018
  • Sundararajan et al., Axiomatic Attribution for Deep Networks, ICML 2017
  • Rajpurkar et al., CheXNet: Radiologist-Level Pneumonia Detection, arXiv 2017

Projet B3 Deep Learning β€” ECE Paris 2026

M.K.E. Kapoor & T.M. Rakotomalala β€” Pr. F. Derraz

Made with ❀️ and PyTorch

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages