Detection de pneumonie sur radiographies thoraciques par CNN, Transfer Learning et explicabilite visuelle
Built with:
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.
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 |
- 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)
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)
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 |
| 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).
| Predit NORMAL | Predit PNEUMONIA | |
|---|---|---|
| Vrai NORMAL | 168 (TN) | 66 (FP) |
| Vrai PNEUMONIA | 4 (FN) | 386 (TP) |
Le seuil par defaut de 0.5 n'est pas optimal. Seuil optimal a 0.89 (F1 passe de 0.9169 β 0.9328).
| 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.
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.
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.pyThoraxAI/
βββ π 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
# 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/# 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.pyL'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.
| Composant | Valeur |
|---|---|
| Python | >= 3.10 |
| PyTorch | >= 2.0 |
| Gestionnaire | UV |
| Seed | 42 |
| Split validation | 15% stratifie |
| Device | CUDA / MPS / CPU |
- 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
- 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)
- 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