Ce projet implémente une solution de Débruitage basée sur le Deep Learning pour des images transmises via SoftCast, un schéma de codage conjoint source-canal linéaire. L'innovation principale réside dans l'utilisation d'un DnCNN (Denoising Convolutional Neural Network) pour estimer et supprimer le bruit non-linéaire introduit par la transmission SoftCast sur un canal AWGN.
Le décodage SoftCast traditionnel souffre d'un bruit de canal directement corrélé à la puissance du signal. Ce projet vise à améliorer la qualité de reconstruction uniquement par le post-traitement du signal bruité reçu à l'aide d'un réseau de neurones spécialisé.
PLP25INT57-Denoisn-AI/
│
├── dataset/ # Dossier généré automatiquement contenant les datasets HDF5
│ ├── train/ # Dossier avec les images brutes du dataset
│ ├── valid/
│ ├── test/
│ ├── train_blind_p64.h5 # Dataset d'entraînement (SNR variable)
│ ├── valid_0db_p64.h5 # Dataset de validation (0dB)
│ ├── valid_10db_p64.h5 # Dataset de validation (10dB)
│ └── valid_20db_p64.h5 # Dataset de validation (20dB)
│
├── dataset_original/ # Dossier source des images brutes (non inclus dans git)
│
├── logs/ # Logs d'entraînement
│ ├── txt/ # Fichiers logs texte (historique des pertes, psnr, etc.)
│ ├── images/ # Courbes d'entraînement générées (Loss, PSNR, SSIM)
│ └── benchmark/ # Résultats générés par le script de test (images, csv, plots)
│
├── model/ # Sauvegarde des modèles (checkpoints)
│ ├── dncnn_softcast_best_psnr.pth # Meilleur modèle en PSNR (Moyenne sur validations)
│ ├── dncnn_softcast_best_ssim.pth # Meilleur modèle en SSIM (Moyenne sur validations)
│ └── dncnn_softcast_last.pth # Dernier état du modèle
│
├── utils/ # Fonctions utilitaires diverses
│
├── config.py # Fichier de configuration central (Hyperparamètres, chemins, options)
├── dataset_hdf5.py # Gestion du Dataset : Génération HDF5, Data Augmentation, Blind Noise
├── softcast_image.py # SoftCast (Encodage, Canal AWGN, Décodage)
├── train.py # Script principal d'entraînement (DDP, Scheduler, Multi-SNR Validation)
├── test.py # Script de test et benchmarking (Génération de rapports et visualisations)
└── requirements.txt # Liste des dépendances Python
Si Python n'est pas encore installé sur votre ordinateur, veuillez vous référer au tutoriel Python.
https://www.python.org/downloads/
-
Cloner le dépôt GitHub
git clone https://github.com/gllrdmaxime/PLP25INT57-Denoisn_AI.git cd PLP25INT57-Denoisn-AI -
Créer un environnement virtuel
python -m venv venv # Sur Linux/Mac source venv/bin/activate # Sur Windows venv\Scripts\activate
-
Installer les dépendances
pip install -r requirements.txt
Le processus d'entraînement génère automatiquement les datasets HDF5 manquants (Training + Validation Multi-SNR). Il utilise une stratégie de "Blind Learning", s'entraînant sur des niveaux de SNR aléatoires entre 0dB et 20dB pour bien généraliser.
python train.py
./run_training.sh #Entraînement avec plusieurs cartes graphiques sur Linux- Checkpoints : Les modèles avec le meilleur PSNR/SSIM moyen (sur 0, 10, 20dB) sont sauvegardés automatiquement dans
model/. - Logs : Les courbes d'entraînement et métriques sont enregistrées dans
logs/.
Pour évaluer le modèle sur le dataset de benchmark, utilisez test.py. Vous pouvez spécifier quel checkpoint utiliser.
python test.py --model ssim
python test.py --model psnr
python test.py --model lastLe script produit :
- Sortie Console : Gains détaillés PSNR/SSIM par image et par niveau CSNR.
- Visualisations : Images Avant/Après et sauvegarde du bruit dans
benchmark/logs. - Graphiques : Courbes de gain en fonction de l'Information Spatiale (SI).
- Vérifier les données dans le fichier
.h5
Lance la vérification sur le fichier dataset/train_blind_p64.h5 généré par dataset_hdf5.py
python utils/check_h5.py- Lire les données dans le fichier
.pth
Regarder les poids du réseau entraîné et leurs distribution statistique
python utils/display_pth_model.py model/dncnn_softcast_best_psnr.pth- Calculer la distribution de SI dans les images d'un dossier
Calcule la distribution SI et enregistre le graphique dans logs/images/si_histogram.png
python utils/dataset_si_histogram.py dataset/- Extraire un dataset cible avec une distribution SI homogène
Calcule la distribution SI et enregistre le graphique dans logs/images/si_histogram.png
python utils/extract_si_dataset.py "dataset_original/" "dataset/" --count 10000 --bins 100 --split 0.88 0.02 0.1 # Train Valid Test- Benchmark sur images couleur
Module d'analyse sur YUV, 4 scénarios: S1: Évaluation de référence isolant la dégradation du canal en appliquant SoftCast uniquement sur Y S2: Simulation de transmission colorimétrique réaliste via SoftCast, incluant un sous-échantillonnage spatial 4:2:0 pour compresser les plans u et v. S3: S1 + restauration de Y. S4: S2 + restauration de Y, U et V.
python utils/color_softcast_test.py- Convertir un
.pthen.onnx
Ce script permet de convertir notre .pth en un fichier .onnx pour l'importer sur une STM32
python utils/convert_to_onnx.py --model "model/dncnn_softcast_best_ssim.pth" --output "model/dncnn_softcast_best_ssim.onnx"Une application graphique est disponible pour tester le modèle sur vos propres images et visualiser les résultats :
python demo/demo_app.py- Fonctionnalités : Chargement d'images, simulation SoftCast + Canal (0-20dB), comparaison visuelle.
- Modèle : Utilise par défaut
model/dncnn_softcast_best_ssim.pth.
- Source : LSDIR Lien de téléchargement : https://huggingface.co/ofsoundof/LSDIR/tree/main
- Pré-traitement :
- On sélectionne 10 000 images dans le dataset original pour avoir une distribution homogène des SI dans ces images et on fait la séparation (88% train 2% valid 10% test)
- Les images passent par notre implémentation SoftCast.
- Labels : La différence entre l'Image SoftCast Bruitée et l'Image SoftCast Propre (pas l'image brute originale), forçant le réseau à apprendre uniquement les artefacts de compression (bruit de canal).
Tous les hyperparamètres sont centralisés dans config.py :
VALID_SNRS: Liste des niveaux de SNR pour la validation (ex: [0, 10, 20]).TRAIN_SNR_MIN/TRAIN_SNR_MAX: Plage pour l'entraînement "Blind".NUM_LAYERS: Profondeur du DnCNN.BLOCK_SIZE: Taille de bloc SoftCast (défaut : 32).