Retour aux projets
MedViz 1 mois 4 pers.

Prédiction médicale & Visualisation 3D

Application médicale complète combinant traitement de scanners CT 3D, Machine Learning quantile et visualisation WebGL pour prédire le déclin de la fibrose pulmonaire.

Python FastAPI XGBoost Next.js Three.js Docker DICOM
Aperçu du projet MedViz

Contexte & Problématique

La fibrose pulmonaire idiopathique (IPF) est une maladie chronique qui entraîne la formation progressive de tissu cicatriciel dans les poumons, diminuant irréversiblement la capacité respiratoire. Le paramètre clinique clé pour mesurer son évolution est la Capacité Vitale Forcée (FVC), exprimée en mL.

L’objectif de MedViz était de concevoir une application médicale complète capable de :

Le projet s’appuie sur le challenge OSIC (Open Source Imaging Consortium), dont les données comprennent des séries volumétriques DICOM et des mesures cliniques tabulaires (âge, sexe, tabagisme, historique FVC).

Type de Données Format Description
Scanners CT 3D DICOM (.dcm) Séries de coupes axiales volumétriques
Données Cliniques CSV (.csv) Métadonnées patients & historique FVC
Coupes axiales CT volumétriques (patient OSIC)
Coupes axiales CT volumétriques (patient OSIC)

Vue d’ensemble du Pipeline

01 DICOM Brut Scanner CT 3D
02 Normalisation HU Prétraitement DICOM
03 Segmentation K-Means + Morpho 3D
04 Radiomics 3D Biomarqueurs + Maillage GLB
05 Prédiction ML XGBoost Quantile
06 Score de Maladie Visualisation Web 3D

Traitement d’Images Médicales 3D

1. Normalisation Hounsfield (Prétraitement DICOM)

Les valeurs de gris brutes d’un scanner DICOM sont propres à chaque constructeur et sans signification physique directe. Elles doivent être converties en Unités Hounsfield (HU), une échelle absolue calibrée sur la densité des tissus biologiques :

Tissu Plage HU
Air externe ≈ −1000 HU
Parenchyme pulmonaire −900 à −400 HU
Tissus mous / eau ≈ 0 HU
Tissu fibrosé > −250 HU

Une fois en HU, un seuillage permet d’isoler les zones d’intérêt clinique et de normaliser les données entre patients.

Standardisation HU : (1) Coupe DICOM brute, (2) Seuillage Hounsfield
Standardisation HU : (1) Coupe DICOM brute, (2) Seuillage Hounsfield

2. Rééchantillonnage Isotrope 3D

Les épaisseurs de coupe CT varient selon les équipements. Pour garantir la cohérence des mesures géométriques et volumétriques entre patients, le volume 3D est rééchantillonné à 1 voxel = 1 mm³ (interpolation d’ordre 3 via scipy.ndimage.zoom).

3. Segmentation Automatique des Poumons

La segmentation isole le parenchyme pulmonaire des tissus environnants (os, muscles, air externe) selon 6 étapes numérotées :

  1. Coupe CT originale : Image axiale d’entrée brute.
  2. Frontière externe (FOV) : Masquage du champ de vision pour exclure les bordures du scanner.
  3. Air brut (K-Means) : Seuillage adaptatif $K=2$ séparant l’air des tissus.
  4. Poumons internes : Analyse des composantes connexes pour isoler les 2 cavités d’air principales.
  5. Masque final : Opérations morphologiques 3D (fermetures, dilatations) et nettoyage du bruit (< 5% du volume max).
  6. Poumons segmentés : Résultat final appliqué à l’image d’origine.
Étapes de la segmentation pulmonaire 3D
Étapes de la segmentation pulmonaire 3D

4. Reconstruction 3D Volumique des Poumons

Une fois la pile de coupes axiales 2D segmentée, l’ensemble des masques est empilé dans l’espace volumétrique pour reconstruire la structure globale du système respiratoire. L’algorithme des Marching Cubes (skimage.measure.marching_cubes) est appliqué sur ce volume pour extraire l’isosurface du parenchyme pulmonaire, générant ainsi une représentation 3D tridimensionnelle haute fidélité des deux poumons.

Reconstruction 3D du parenchyme pulmonaire à partir des coupes segmentées
Reconstruction 3D du parenchyme pulmonaire à partir des coupes segmentées

5. Extraction de Biomarqueurs Radiométriques

À partir du volume 3D reconstruit et du masque validé, trois biomarqueurs quantitatifs sont extraits par patient :

6. Génération du Maillage 3D & Export WebGL (GLB)

Le maillage 3D extrait est optimisé pour l’affichage interactif en deux étapes :

  1. Lissage & Simplification de surface : Normalisation des sommets et calcul des normales de surface.
  2. Export au format GLB / glTF 2.0 via trimesh pour un rendu WebGL temps réel directement dans le navigateur via Three.js.

Modèle de Prédiction : XGBoost Quantile

Plutôt qu’une simple prédiction ponctuelle, MedViz entraîne 5 modèles XGBoost distincts correspondant à des quantiles de la distribution de la FVC :

Quantile Interprétation médicale
q = 0.025 Borne inférieure IC 95% (pire cas)
q = 0.10 Borne inférieure IC 80%
q = 0.50 Médiane — prédiction centrale
q = 0.90 Borne supérieure IC 80%
q = 0.975 Borne supérieure IC 95% (meilleur cas)

Chaque modèle prend en entrée : semaine cible, âge, volume pulmonaire, moyenne HU, écart-type HU, ratio de fibrose, sexe, statut tabagique, FVC de référence, semaine de référence et delta temporel.

Indice de Confiance et Score de Sévérité

Un indice de confiance continu $C \in [0.01, 0.99]$ est dérivé de la largeur de l’intervalle IC 95% — plus le modèle est certain, plus cet indice est élevé.

Prédictions temporelles FVC et intervalles quantiles
Prédictions temporelles FVC et intervalles quantiles

Pour offrir une référence médicale normée, le Score de Sévérité est calculé à partir des équations GLI-2012 (Global Lung Function Initiative) en fonction de l’âge, taille et sexe du patient :

$$ \text{Score} = \frac{\text{FVC}_{\text{Baseline}}}{\text{FVC}_{\text{Optimale}}} $$
Score de sévérité GLI et statut de risque du patient
Score de sévérité GLI et statut de risque du patient

Résultats

Une étude comparative rigoureuse évalue l’apport direct des biomarqueurs radiométriques 3D (CT Scans) par rapport aux seules données cliniques tabulaires :

Modèle MAE avec Radiomics MAE sans Radiomics Gain MAE Gain Radiométrique
SVR (RBF) 119.4 mL 116.7 mL −2.7 mL ❌ Non utile
XGBoost 87.1 mL 94.7 mL +7.6 mL ✅ Utile
Random Forest 98.6 mL 109.4 mL +10.8 mL ✅ Utile

XGBoost avec radiomics atteint une MAE de 87.1 mL, soit le meilleur résultat, confirmant que les données d’imagerie 3D enrichissent significativement la capacité prédictive du modèle.

Score LLL avec et sans biomarqueurs radiomiques
Score LLL avec et sans biomarqueurs radiomiques
Erreurs MAE et RMSE par architecture vs baseline
Erreurs MAE et RMSE par architecture vs baseline

Architecture & Déploiement

MedViz adopte une architecture microservices découplée en 2 conteneurs Docker indépendants :

Architecture conteneurisée Backend & Frontend (Docker)
Architecture conteneurisée Backend & Frontend (Docker)

Qualité de Code & Intégration Continue (CI/CD)

Le projet atteint un taux de couverture de tests de 91% sur le backend Python, avec une pipeline CI/CD complète (GitLab CI) articulée en 3 phases automatiques : vérification du style (ruff, prettier), tests unitaires (pytest) et analyse statique des types (ty check, tsc).

Module Backend Couverture Pytest
database.py 100%
schemas.py 100%
logger.py 94%
services.py 94%
routes.py 89%
processing/pipeline.py 80%
TOTAL 91%
Pipeline d’intégration continue (GitLab CI)
Pipeline d’intégration continue (GitLab CI)

Interface Utilisateur & Application Web Complexe

Vue d’ensemble de l’interface utilisateur de MedViz
Vue d’ensemble de l’interface utilisateur de MedViz