Tomer Garber, Tom Tirer
A Universidade Aberta de Israel e a Universidade Bar-Ilan
Este repositório contém o lançamento do código para Restauração de Imagem por Denoising Diffusion Models with Iterativamente Precondicionado Guidance ( DDPG ).
Idéia principal: identificar a orientação de retroprojeção (BP) (usada recentemente sob os nomes de orientação "pseudoinverso" ou "intervalo/espaço nulo") como uma versão pré-condicionada da orientação de mínimos quadrados (LS) e, consequentemente, desenvolver uma técnica de orientação com pré-condicionamento dependente de iteração que atravessa de BP a LS, aproveitando os benefícios de ambos.
O código pode ser facilmente adaptado para super-resolução e desfocagem com qualquer kernel.
A extensão para outros modelos de medição linear também é possível.
Para clonar este repositório e o código, execute:
git clone https://github.com/tirer-lab/DDPG.git
Existem várias dependências necessárias e você pode instalá-las via pip ou docker . O código foi escrito e testado em Python 3.8 e PyTorch 1.9.0.
pip install torch torchvision lpips numpy tqdm pillow pyYaml pandas scipy
Instale as versões relevantes da tocha e do torchvision de acordo com sua configuração, por exemplo:
pip install torch==1.9.0+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
O repositório contém Dockerfile, para usá-lo execute (após clonar este repositório e cd
nele):
docker build .
Se desejar executar IDPG em vez de DDPG , você pode trocar os comandos CMD
no arquivo Docker.
Para baixar os modelos usados no artigo:
O ponto de verificação do modelo CelebA-HQ pode ser encontrado aqui. Baixe-o e coloque-o em DDPG/exp/logs/celeba/
.
O ponto de verificação do modelo ImageNet pode ser encontrado aqui. Baixe-o e coloque-o em DDPG/exp/logs/imagenet/
.
Execute os seguintes comandos para obter resultados imediatos do DDPG:
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 desfoque gaussiano com 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
Os resultados estarão em DDPG/exp/image_samples/
.
Os conjuntos de dados usados no artigo são CelebA-HQ e ImageNet. Ambos podem ser encontrados em: [Google drive] [Baidu drive].
Depois de baixar os conjuntos de dados, coloque cada conjunto de dados no diretório relevante:
DDPG/exp/datasets/celeba/
.DDPG/exp/datasets/imagenet/
.imagenet_val_1k.txt
dos links acima e coloque-o em DDPG/exp
. Renomeie este arquivo para imagenet_val.txt
para que o código possa usá-lo. Para motion deblur usamos o seguinte repositório git para gerar os kernels: https://github.com/LeviBorodenko/motionblur.
Clone esse repositório e copie o arquivo motionblur.py em DDPG/functions
.
Conforme mencionado no artigo, usamos kernels de desfoque de movimento com intensity=0.5
.
O comando python geral para executar o código é:
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}
Onde:
config
: O nome do yml a ser usado para configurar o modelo usado.dataset_folder
: o nome do diretório que contém o conjunto de dados da imagem.deg
: o tipo de degradação a ser usado. Usado em papel: sr_bicubic
, deblur_gauss
, motion_deblur
sr_bicubic
, o sinalizador --deg_scale 4
também é necessáriosigma_y
: Nível de ruído. Níveis de ruído usados em papel: 0, 0.01, 0.05, 0.1
.image_folder
: Nome do diretório para imagens de saída.inject_noise
: Injetar ruído (1) e executar DDPG ou não (0) e executar IDPG .gamma
: O hiperparâmetro Gamma usado no artigo.zeta
: O hiperparâmetro Zeta usado no artigo.eta_tilde
: O hiperparâmetro Eta usado no artigo.step_size_mode
: Qual modo de tamanho de passo usar. No artigo, step_size_mode=0
(fixo 1) foi usado para IDPG, DDPG sem ruído e DDPG com nível de ruído 0.01
. step_size_mode=1
(certa decadência) foi usado para o restante das execuções do DDPG.operator_implementation
- Se deve usar SVD
ou FFT
. O padrão é FFT
.scale_ls
- O hiperparâmetro c
usado no artigo, que é a escala de orientação de mínimos quadrados. O padrão é 1
.save_observation
- Salvar a imagem observada ( y
) ou não. O padrão é False
. Além disso, você pode configurar as etapas de amostragem (o padrão é 100
no papel). Em cada configuração yml no diretório configs
( celeba_hq.yml
, imagenet_256.yml
e imagenet_256_cc.yml
) você pode alterar:
sampling :
T_sampling : <desired_sampling_steps>
Para reproduzir os resultados do artigo, existem 2 roteiros de avaliação:
Ambos os scripts contêm todas as tarefas mencionadas no artigo com a configuração relevante.
Resultados adicionais podem ser encontrados no artigo, incluindo resultados de PSNR e LPIPS em comparação com concorrentes.
Se você usou este repositório em sua pesquisa, cite o artigo:
@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 implementação é inspirada em https://github.com/bahjat-kawar/ddrm e https://github.com/wyhuai/DDNM.