Tomer Garber, Tom Tirer
Die Open University of Israel und die Bar-Ilan-Universität
Dieses Repository enthält die Codefreigabe für Image Restoration by Denoising Diffusion Models with Iteratively Precondition Guidance ( DDPG ).
Hauptidee: Identifizieren der Rückprojektionsführung (BP) (kürzlich unter den Namen „Pseudoinverse“ oder „Range/Nullraum“-Führung verwendet) als vorkonditionierte Version der Führung der kleinsten Quadrate (LS) und dementsprechend die Entwicklung einer Führungstechnik mit Iterationsabhängige Vorkonditionierung, die von BP zu LS wechselt und die Vorteile beider nutzt.
Der Code kann mit jedem Kernel sehr einfach an Superauflösung und Deblurring angepasst werden.
Eine Erweiterung auf andere lineare Messmodelle ist ebenfalls möglich.
Führen Sie Folgendes aus, um dieses Repository und den Code zu klonen:
git clone https://github.com/tirer-lab/DDPG.git
Es sind mehrere Abhängigkeiten erforderlich, und Sie können es über pip oder docker installieren. Der Code wurde auf Python 3.8 und PyTorch 1.9.0 geschrieben und getestet.
pip install torch torchvision lpips numpy tqdm pillow pyYaml pandas scipy
Installieren Sie entsprechend Ihrem Setup die entsprechenden Torch- und Torchvision-Versionen, zum Beispiel:
pip install torch==1.9.0+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
Das Repository enthält Dockerfile, um es auszuführen (nachdem Sie dieses Repo geklont und cd
darauf erstellt haben):
docker build .
Wenn Sie IDPG anstelle von DDPG ausführen möchten, können Sie die CMD
-Befehle in der Docker-Datei austauschen.
So laden Sie die im Artikel verwendeten Modelle herunter:
Den CelebA-HQ-Modellkontrollpunkt finden Sie hier. Laden Sie es herunter und platzieren Sie es in DDPG/exp/logs/celeba/
.
Den ImageNet-Modellprüfpunkt finden Sie hier. Laden Sie es herunter und platzieren Sie es in DDPG/exp/logs/imagenet/
.
Führen Sie die folgenden Befehle aus, um sofortige DDPG-Ergebnisse zu erhalten:
CelebA geräuschloser SRx4:
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
CelebA Gaußsche Unschärfe mit 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
Die Ergebnisse liegen in DDPG/exp/image_samples/
vor.
Die in der Arbeit verwendeten Datensätze sind CelebA-HQ und ImageNet. Beide finden Sie unter: [Google-Laufwerk] [Baidu-Laufwerk].
Nachdem Sie die Datensätze heruntergeladen haben, platzieren Sie jeden Datensatz im entsprechenden Verzeichnis:
DDPG/exp/datasets/celeba/
.DDPG/exp/datasets/imagenet/
.imagenet_val_1k.txt
ebenfalls über die obigen Links herunter und platzieren Sie sie in DDPG/exp
. Benennen Sie diese Datei in imagenet_val.txt
um, damit der Code sie verwenden kann. Für Motion Deblur haben wir das folgende Git-Repository zum Generieren der Kernel verwendet: https://github.com/LeviBorodenko/motionblur.
Klonen Sie dieses Repository und kopieren Sie die Datei „motionblur.py“ nach DDPG/functions
.
Wie in der Arbeit erwähnt, haben wir Bewegungsdeblur-Kernel mit intensity=0.5
verwendet.
Der allgemeine Python-Befehl zum Ausführen des Codes lautet:
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}
Wo:
config
: Der Name der YML, die zum Konfigurieren des verwendeten Modells verwendet werden soll.dataset_folder
: Der Name des Verzeichnisses, das den Bilddatensatz enthält.deg
: der zu verwendende Verschlechterungstyp. In der Arbeit verwendet: sr_bicubic
, deblur_gauss
, motion_deblur
sr_bicubic
ist außerdem das Flag --deg_scale 4
erforderlichsigma_y
: Geräuschpegel. In Papier verwendete Geräuschpegel: 0, 0.01, 0.05, 0.1
.image_folder
: Name des Verzeichnisses für Ausgabebilder.inject_noise
: Ob Rauschen injiziert werden soll (1) und DDPG ausgeführt werden soll oder nicht (0) und IDPG ausgeführt werden soll.gamma
: Der im Artikel verwendete Gamma-Hyperparameter.zeta
: Der im Artikel verwendete Zeta-Hyperparameter.eta_tilde
: Der im Artikel verwendete Eta-Hyperparameter.step_size_mode
: Welcher Schrittgrößenmodus verwendet werden soll. In der Arbeit wurde step_size_mode=0
(fest 1) für IDPG, geräuschloses DDPG und DDPG mit einem Geräuschpegel von 0.01
verwendet. Für die restlichen DDPG-Läufe wurde step_size_mode=1
(bestimmter Zerfall) verwendet.operator_implementation
– Ob SVD
oder FFT
verwendet werden soll. Der Standardwert ist FFT
.scale_ls
– Der in der Arbeit verwendete c
Hyperparameter, bei dem es sich um die Orientierungsskala der kleinsten Quadrate handelt. Der Standardwert ist 1
.save_observation
– Ob das beobachtete Bild gespeichert werden soll ( y
) oder nicht. Der Standardwert ist False
. Darüber hinaus können Sie die Stichprobenschritte konfigurieren (im Papier ist der Standardwert 100
). In jeder YML-Konfiguration im configs
( celeba_hq.yml
, imagenet_256.yml
und imagenet_256_cc.yml
) können Sie Folgendes ändern:
sampling :
T_sampling : <desired_sampling_steps>
Um die Ergebnisse der Arbeit zu reproduzieren, gibt es zwei Bewertungsskripte:
Beide Skripte enthalten alle im Dokument genannten Aufgaben mit der entsprechenden Konfiguration.
Weitere Ergebnisse finden Sie im Papier, darunter PSNR- und LPIPS-Ergebnisse im Vergleich zu Wettbewerbern.
Wenn Sie dieses Repository in Ihrer Forschung verwendet haben, zitieren Sie bitte den Artikel:
@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}
}
Diese Implementierung ist inspiriert von https://github.com/bahjat-kawar/ddrm und https://github.com/wyhuai/DDNM.