Tomer Garber, Tom Tirer
La Universidad Abierta de Israel y la Universidad Bar-Ilan
Este repositorio contiene la versión del código para la restauración de imágenes mediante modelos de difusión de eliminación de ruido con guía iterativamente preacondicionada ( DDPG ).
Idea principal: identificar la guía de retroproyección (BP) (utilizada recientemente bajo los nombres de guía "pseudoinversa" o "rango/espacio nulo") como una versión precondicionada de la guía de mínimos cuadrados (LS) y, en consecuencia, diseñar una técnica de guía con precondicionamiento dependiente de iteración que atraviesa de BP a LS, disfrutando de los beneficios de ambos.
El código se puede adaptar muy fácilmente a superresolución y eliminación de desenfoque con cualquier kernel.
También es posible la ampliación a otros modelos de medición lineal.
Para clonar este repositorio y el código, ejecute:
git clone https://github.com/tirer-lab/DDPG.git
Se requieren varias dependencias y puede instalarlas mediante pip o docker . El código fue escrito y probado en Python 3.8 y PyTorch 1.9.0.
pip install torch torchvision lpips numpy tqdm pillow pyYaml pandas scipy
Instale las versiones de antorcha y torchvision relevantes según su configuración, por ejemplo:
pip install torch==1.9.0+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
El repositorio contiene Dockerfile, para usarlo ejecute (después de clonar este repositorio y cd
):
docker build .
Si desea ejecutar IDPG en lugar de DDPG , puede intercambiar los comandos CMD
en el archivo Docker.
Para descargar los modelos utilizados en el artículo:
El punto de control del modelo CelebA-HQ se puede encontrar aquí. Descárgalo y colócalo en DDPG/exp/logs/celeba/
.
El punto de control del modelo ImageNet se puede encontrar aquí. Descárgalo y colócalo en DDPG/exp/logs/imagenet/
.
Ejecute los siguientes comandos para obtener resultados DDPG inmediatos:
CelebA SRx4 silencioso:
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 Desenfoque gaussiano con 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
Los resultados estarán en DDPG/exp/image_samples/
.
Los conjuntos de datos utilizados en el artículo son CelebA-HQ e ImageNet. Ambos se pueden encontrar en: [Google drive] [Baidu drive].
Después de descargar los conjuntos de datos, coloque cada conjunto de datos en el directorio correspondiente:
DDPG/exp/datasets/celeba/
.DDPG/exp/datasets/imagenet/
.imagenet_val_1k.txt
de los enlaces anteriores y colóquelo en DDPG/exp
. Cambie el nombre de este archivo a imagenet_val.txt
para que el código lo utilice. Para motion deblur utilizamos el siguiente repositorio de git para generar los núcleos: https://github.com/LeviBorodenko/motionblur.
Clona ese repositorio y copia el archivo motionblur.py en DDPG/functions
.
Como se menciona en el artículo, utilizamos núcleos de desenfoque de movimiento con intensity=0.5
.
El comando general de Python para ejecutar el código es:
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}
Dónde:
config
: el nombre del yml que se utilizará para configurar el modelo utilizado.dataset_folder
: el nombre del directorio que contiene el conjunto de datos de imágenes.deg
: el tipo de degradación a utilizar. Usado en papel: sr_bicubic
, deblur_gauss
, motion_deblur
sr_bicubic
, también se requiere la bandera --deg_scale 4
sigma_y
: Nivel de ruido. Niveles de ruido utilizados en el papel: 0, 0.01, 0.05, 0.1
.image_folder
: nombre del directorio para las imágenes de salida.inject_noise
: si se inyecta ruido (1) y ejecuta DDPG o no (0) y ejecuta IDPG .gamma
: el hiperparámetro gamma utilizado en el artículo.zeta
: el hiperparámetro Zeta utilizado en el artículo.eta_tilde
: el hiperparámetro Eta utilizado en el artículo.step_size_mode
: qué modo de tamaño de paso usar. En el artículo, se utilizó step_size_mode=0
(fijo 1) para IDPG, DDPG silencioso y DDPG con nivel de ruido 0.01
. step_size_mode=1
(cierta decadencia) se usó para el resto de las ejecuciones de DDPG.operator_implementation
: si se debe utilizar SVD
o FFT
. El valor predeterminado es FFT
.scale_ls
: el hiperparámetro c
utilizado en el artículo, que es la escala de orientación de mínimos cuadrados. El valor predeterminado es 1
.save_observation
: si se guarda o no la imagen observada ( y
). El valor predeterminado es False
. Además, puede configurar los pasos de muestreo (el valor predeterminado es 100
en el documento). En cada configuración de yml en el directorio configs
( celeba_hq.yml
, imagenet_256.yml
e imagenet_256_cc.yml
) puede cambiar:
sampling :
T_sampling :
Para reproducir los resultados del trabajo, existen 2 guiones de evaluación:
Ambos scripts contienen todas las tareas mencionadas en el documento con la configuración relevante.
Se pueden encontrar resultados adicionales en el documento, incluidos los resultados de PSNR y LPIPS en comparación con la competencia.
Si utilizó este repositorio en su investigación, cite el artículo:
@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}
}
Esta implementación está inspirada en https://github.com/bahjat-kawar/ddrm y https://github.com/wyhuai/DDNM.