Tomer Garber, Tom Tirer
L'Université ouverte d'Israël et l'Université Bar-Ilan
Ce référentiel contient la version de code pour la restauration d'images par débruitage de modèles de diffusion avec guidage itératif préconditionné ( DDPG ).
Idée principale : identifier le guidage par rétroprojection (BP) (utilisé récemment sous les noms de guidage « pseudoinverse » ou « range/null-space ») comme une version préconditionnée du guidage par moindres carrés (LS), et en conséquence, concevoir une technique de guidage avec préconditionnement dépendant de l'itération qui traverse de BP à LS, bénéficiant des avantages des deux.
Le code peut être très facilement adapté à la super-résolution et à la suppression du flou avec n'importe quel noyau.
Une extension à d’autres modèles de mesure linéaire est également possible.
Pour cloner ce dépôt et le code, exécutez :
git clone https://github.com/tirer-lab/DDPG.git
Plusieurs dépendances sont requises et vous pouvez l'installer via pip ou docker . Le code a été écrit et testé sur Python 3.8 et PyTorch 1.9.0.
pip install torch torchvision lpips numpy tqdm pillow pyYaml pandas scipy
Installez les versions de torch et torchvision appropriées en fonction de votre configuration, par exemple :
pip install torch==1.9.0+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
Le référentiel contient Dockerfile, afin de l'utiliser, exécutez-le (après avoir cloné ce dépôt et y avoir cd
) :
docker build .
Si vous souhaitez exécuter IDPG au lieu de DDPG , vous pouvez échanger les commandes CMD
dans le fichier Docker.
Pour télécharger les modèles utilisés dans l'article :
Le point de contrôle du modèle CelebA-HQ peut être trouvé ici. Téléchargez-le et placez-le dans DDPG/exp/logs/celeba/
.
Le point de contrôle du modèle ImageNet peut être trouvé ici. Téléchargez-le et placez-le dans DDPG/exp/logs/imagenet/
.
Exécutez les commandes suivantes pour obtenir des résultats DDPG immédiats :
CelebA SRx4 silencieux :
python main.py --config celeba_hq.yml --path_y celeba_hq --deg sr_bicubic --sigma_y 0
-i DDPG_celeba_sr_bicubic_sigma_y_0 --inject_noise 1 --zeta 0.7 --step_size_mode 0
--deg_scale 4 --operator_imp SVD
Déflou gaussien CelebA avec sigma_y=0,05 :
python main.py --config celeba_hq.yml --path_y celeba_hq --deg deblur_gauss --sigma_y 0.05
-i DDPG_celeba_deblur_gauss_sigma_y_0.05 --inject_noise 1 --gamma 8 --zeta 0.5 --eta_tilde 0.7
--step_size_mode 1 --operator_imp FFT
Les résultats seront dans DDPG/exp/image_samples/
.
Les ensembles de données utilisés dans l'article sont CelebA-HQ et ImageNet. Les deux peuvent être trouvés dans : [Google Drive] [Baidu Drive].
Après avoir téléchargé les ensembles de données, placez chaque ensemble de données dans le répertoire approprié :
DDPG/exp/datasets/celeba/
.DDPG/exp/datasets/imagenet/
.imagenet_val_1k.txt
à partir des liens ci-dessus et placez-le dans DDPG/exp
. Renommez ce fichier en imagenet_val.txt
pour que le code l'utilise. Pour la suppression du flou de mouvement, nous avons utilisé le référentiel git suivant pour générer les noyaux : https://github.com/LeviBorodenko/motionblur.
Clonez ce référentiel et copiez le fichier motionblur.py dans DDPG/functions
.
Comme mentionné dans l'article, nous avons utilisé des noyaux de suppression de flou de mouvement avec intensity=0.5
.
La commande python générale pour exécuter le code est :
python main.py --config {config}.yml --path_y {dataset_folder} --deg {deg} --sigma_y {sigma_y}
-i {image_folder} --inject_noise {inject_noise} --gamma {gamma} --zeta {zeta} --eta_tilde {eta_tilde}
--step_size_mode {step_size_mode} --operator_imp {operator_implementation} --save_y {save_observation}
--scale_ls {scale_for_gLS}
Où:
config
: Le nom du yml à utiliser pour configurer le modèle utilisé.dataset_folder
: Le nom du répertoire contenant l’ensemble de données d’image.deg
: le type de dégradation à utiliser. Utilisé dans le papier : sr_bicubic
, deblur_gauss
, motion_deblur
sr_bicubic
, l'indicateur --deg_scale 4
est également requissigma_y
: Niveau de bruit. Niveaux de bruit utilisés dans le papier : 0, 0.01, 0.05, 0.1
.image_folder
: Nom du répertoire pour les images de sortie.inject_noise
: s'il faut injecter du bruit (1) et exécuter DDPG ou non (0) et exécuter IDPG .gamma
: L'hyperparamètre Gamma utilisé dans l'article.zeta
: L'hyperparamètre Zeta utilisé dans l'article.eta_tilde
: L'hyperparamètre Eta utilisé dans l'article.step_size_mode
: quel mode de taille de pas utiliser. Dans l'article, step_size_mode=0
(fixed 1) a été utilisé pour IDPG, DDPG silencieux et DDPG avec un niveau de bruit 0.01
. step_size_mode=1
(certaine décroissance) a été utilisé pour le reste des exécutions DDPG.operator_implementation
- S'il faut utiliser SVD
ou FFT
. La valeur par défaut est FFT
.scale_ls
- L'hyperparamètre c
utilisé dans l'article, qui est l'échelle de guidage des moindres carrés. La valeur par défaut est 1
.save_observation
- S'il faut enregistrer l'image observée ( y
) ou non. La valeur par défaut est False
. De plus, vous pouvez configurer les étapes d'échantillonnage (la valeur par défaut est 100
dans le document). Dans chaque configuration yml sous le répertoire configs
( celeba_hq.yml
, imagenet_256.yml
et imagenet_256_cc.yml
), vous pouvez modifier :
sampling :
T_sampling :
Afin de reproduire les résultats de l'article, il existe 2 scripts d'évaluation :
Les deux scripts contiennent toutes les tâches mentionnées dans le document avec la configuration appropriée.
Des résultats supplémentaires peuvent être trouvés dans l'article, notamment les résultats PSNR et LPIPS par rapport aux concurrents.
Si vous avez utilisé ce référentiel dans votre recherche, veuillez citer l'article :
@inproceedings{garber2023image,
title={Image Restoration by Denoising Diffusion Models with Iteratively Preconditioned Guidance},
author={Garber, Tomer and Tirer, Tom},
booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition},
year={2024}
}
Cette implémentation s'inspire de https://github.com/bahjat-kawar/ddrm et https://github.com/wyhuai/DDNM.