nachifur / RDDM

CVPR 2024: Residual Denoising Diffusion Models
https://arxiv.org/abs/2308.13712
361 stars 33 forks source link

图像恢复任务的训练 #2

Closed MrWan001 closed 1 month ago

MrWan001 commented 1 year ago

您好,想使用成对数据集进行图像恢复任务的训练,请问应该怎样设置数据集路径,训练指令需要修改吗(非常感谢)

nachifur commented 1 year ago
  1. 修改train.py image

train.py中,其他任务类似于42行(阴影去除,有mask输入)和49行(低光照增强,无mask输入)。

train.py中,35行-37行 阴影去除: condition = True input_condition = True input_condition_mask = True

低光照: condition = True input_condition = False input_condition_mask = False

  1. 修改src/residual_denoising_diffusion_pytorch.py

a. [self.alphas_cumsum[t]*self.num_timesteps, self.betas_cumsum[t]*self.num_timesteps]] -> [t,t] (in L852 and L1292). b. modify the corresponding experimental settings (see Table 4 in the Appendix), e.g., Loss, Optimizer

MrWan001 commented 1 year ago

好的,非常感谢!

MrWan001 commented 1 year ago

作者您好,我在尝试复现低光照增强的实验,在修改附录中表4的参数时遇到以下问题: 牛蛙3 1、βT²在哪里设置,好像没有找到。 2、LOSS为残差损失+噪声损失在哪里设置,我看到一些if num_unet = 2 else语句,是设置了参数num_unet = 2,就自动对应是残差+噪声的损失类型了吗 3、论文中表述的是,对于图像恢复任务,使用残差+噪声损失,但附录表4中,低光照任务显示只使用残差损失,这是因为对于低光照任务,只预测残差,实验效果比两个都预测更好吗。 4、采样方法设置λres=1,λϵ=1,如何设置,没有找到对应的地方,是确定了num_unet = 2这个参数,loss和sampling method在源代码中就是对应设置好的吗 4、优化器的设置,恢复任务使用的是Adma,我参照residual_denoising_diffusion_pytorch.py中1467-1476行进行了修改,您看是这样改的吗, 牛蛙2

期待您的回复!非常感谢

nachifur commented 1 year ago

rddm是根据以下仓库进行修改的:https://github.com/lucidrains/denoising-diffusion-pytorch

对于图像恢复任务,暂时需要可以根据目前已公开的代码,和上述原始代码自行修改。

  1. $\beta_T^2$对应sum_scale
  2. loss修改对应的p_losses(),和表4对应上即可
  3. 采样方法的修改,对应test_res_or_noise
  4. 目前的代码对应:SM-Res-N-2Net (见最新的arxiv). If computational resources are sufficient, two separate networks (num_unet = 2) can be trained for noise and residual predictions, and the optimal sampling method can be determined during testing.
  5. Adam优化器:self.opt = Adam(diffusion_model.parameters(), lr=train_lr, betas=adam_betas)

非常抱歉目前仅提供用于探索partially path-independent generation process的代码。为了更好的代码可读性,后续我们将逐步更新、重构代码,请关注该仓库。

MrWan001 commented 12 months ago

感谢之前的回复!已经跑通了图像修复的代码,并阅读了V2版本的论文,附录部分很丰富,关于残差和噪声解耦的研究感觉很有意义。 还有个问题是测试代码中的低光照部分,我看代码计算的是ycbcr空间y通道的指标,低光照任务目前普遍都是测这个指标而不是rgb的吗。

nil0330 commented 11 months ago

感谢之前的回复!已经跑通了图像修复的代码,并阅读了V2版本的论文,附录部分很丰富,关于残差和噪声解耦的研究感觉很有意义。 还有个问题是测试代码中的低光照部分,我看代码计算的是ycbcr空间y通道的指标,低光照任务目前普遍都是测这个指标而不是rgb的吗。

你好我也在复现这篇代码,但是数据集配置中 xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_free_train.flist这个应该具体替换成什么能否举个例子,感谢和期待您的回答

nachifur commented 11 months ago

@nil0330 .flist是文件路径列表

nil0330 commented 11 months ago

感谢之前的回复!已经跑通了图像修复的代码,并阅读了V2版本的论文,附录部分很丰富,关于残差和噪声解耦的研究感觉很有意义。 还有个问题是测试代码中的低光照部分,我看代码计算的是ycbcr空间y通道的指标,低光照任务目前普遍都是测这个指标而不是rgb的吗。

你好我在复现时发现model_out的内容如下 image 请问您运行时也是同样的吗

nachifur commented 11 months ago

@nil0330 单unet是这样的(返回:一个为0,一个是噪声或残差图像)。

shenyue0530 commented 10 months ago

作者,您好,请问去雨的话针对35-37行应该怎么修改呢,还有就是xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_free_train.flist目录下是成对的图片么,因为降雨的数据集里的图片是成对的,所以这个目录下的数据集是“有雨和无雨”的图像对么

nachifur commented 10 months ago

@shenyue0530

condition = True # 生成(无条件输入)=False, 恢复(有条件输入)=True input_condition = False # 额外的输入条件=Ture, 例如阴影去除任务重的mask input_condition_mask = False # 如果额外的输入条件如果是mask时,为True

folder = ["xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_free_train.flist", # 训练集的gt, 图片文件列表 "xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_train.flist", # 训练集的输入, 图片文件列表 "xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_free_test.flist", # 测试集的gt, 图片文件列表 "xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_test.flist"] # 测试集的输入, 图片文件列表

nil0330 commented 10 months ago

作者你好,代码已经成功运起来我有一个疑问,代码产生的结果result/sample中会出现四个图片,他们分别代表的是什么? image 如图:分别代表的是输入,gt,输出和残差嘛

nachifur commented 10 months ago

@nil0330 你可以修改和debug一下对应的代码,应该很容易修改输出的图像。

JunningSu commented 10 months ago

作者您好,我的研究领域不在CV上,但是看完您的工作十分感兴趣,但在复现时源码中并没有给出数据集,方便的话可以把数据集加在源码中吗?或者分享一个网盘链接,谢谢!

nachifur commented 10 months ago

@JunningSu 本文使用的都是已经开源的数据集(我们并没有数据集的分发权利),用搜索引擎或在Github一查就有了。

GeroRoman commented 8 months ago

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.请问能解释一下这个assertion吗
nachifur commented 8 months ago

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.请问能解释一下这个assertion吗

这个错误没有遇到过,可以bing/google搜搜,排查一下

GeroRoman commented 8 months ago

Snipaste_2024-03-07_21-23-40 您好,作者! 我把代码跑通了但是这里显示test生成的图片是这样的,请问我是哪里没有设置正确吗?能不能给我一点提示,我是否需要修改代码中的某些部分?我是修改了folder的路径并在folder文件夹里和上图中的results里面的sample里面分别加入了celeba数据集的图片,但是我感觉这里面训练的时候并没有用到这些图片

KasuganoLove commented 7 months ago

train.py中,其他任务类似于42行(阴影去除,有mask输入)和49行(低光照增强,无mask输入)。

你好,请问ISTD数据集的GT mask在推理的时候会作为condition一起输入到网络中吗?

KasuganoLove commented 7 months ago

train.py中,其他任务类似于42行(阴影去除,有mask输入)和49行(低光照增强,无mask输入)。

你好,请问ISTD数据集的GT mask在推理的时候会作为condition一起输入到网络中吗?

根据以下代码,我的理解是作为condition输入的,请问您在测试是是直接用测试集GT的mask作为condition吗?还是有其他的网络生成一个mask。

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/datasets/base.py#L114-L147

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/src/residual_denoising_diffusion_pytorch.py#L1252-L1280

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/src/residual_denoising_diffusion_pytorch.py#L843-L850

根据以下代码,我的理解是作为condition输入的,请问您在测试是是直接用测试集GT的mask作为condition吗?还是有其他的网络生成一个mask。

根据我对以下代码的理解,测试是是直接用测试集GT的mask作为condition:

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/src/residual_denoising_diffusion_pytorch.py#L1441-L1455

nachifur commented 7 months ago

Snipaste_2024-03-07_21-23-40 您好,作者! 我把代码跑通了但是这里显示test生成的图片是这样的,请问我是哪里没有设置正确吗?能不能给我一点提示,我是否需要修改代码中的某些部分?我是修改了folder的路径并在folder文件夹里和上图中的results里面的sample里面分别加入了celeba数据集的图片,但是我感觉这里面训练的时候并没有用到这些图片

如果是:图像生成对于celeba(默认的代码会自己下载数据集,可能需要梯子),可以看一下./datasets/get_dataset.py,[29-31行取消注释,注释33行]。(https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/datasets/get_dataset.py#L29)

debug一下,设置断点,看看能不能正常加载数据。

注意:除了partially path-independent generation process实验(目前release的代码是针对这个实验的)使用[self.alphas_cumsum[t]*self.num_timesteps, self.betas_cumsum[t]*self.num_timesteps]],其他所有任务默认使用[t,t]

nachifur commented 7 months ago

train.py中,其他任务类似于42行(阴影去除,有mask输入)和49行(低光照增强,无mask输入)。

你好,请问ISTD数据集的GT mask在推理的时候会作为condition一起输入到网络中吗?

concat一起送到网络。

nachifur commented 7 months ago

train.py中,其他任务类似于42行(阴影去除,有mask输入)和49行(低光照增强,无mask输入)。

你好,请问ISTD数据集的GT mask在推理的时候会作为condition一起输入到网络中吗?

根据以下代码,我的理解是作为condition输入的,请问您在测试是是直接用测试集GT的mask作为condition吗?还是有其他的网络生成一个mask。

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/datasets/base.py#L114-L147

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/src/residual_denoising_diffusion_pytorch.py#L1252-L1280

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/src/residual_denoising_diffusion_pytorch.py#L843-L850

根据以下代码,我的理解是作为condition输入的,请问您在测试是是直接用测试集GT的mask作为condition吗?还是有其他的网络生成一个mask。

根据我对以下代码的理解,测试是是直接用测试集GT的mask作为condition:

https://github.com/nachifur/RDDM/blob/46ffd50f858a59fc3b43e538d501d991af3c1472/src/residual_denoising_diffusion_pytorch.py#L1441-L1455

类似于之前的方法(两阶段阴影去除范式:先检测再去除),阴影去除任务直接使用mask的gt。也可以尝试评估采用其他的阴影检测网络得到的mask。具体可参见ICCV2019: Shadow removal via shadow image decomposition,以及appendix。

TuTusong commented 7 months ago

作者您好,在复现过程中想替换成自己的数据集进行尝试,也将路径存成了文件列表,但是读取时还是出现了这个错误,想问下.flist中是存在什么结构吗? image

nachifur commented 7 months ago

作者您好,在复现过程中想替换成自己的数据集进行尝试,也将路径存成了文件列表,但是读取时还是出现了这个错误,想问下.flist中是存在什么结构吗? image

没有特殊格式,每一行是图片的绝对路径。可以先一行一行debug看看哪里的问题。

TuTusong commented 7 months ago

作者您好,在复现过程中想替换成自己的数据集进行尝试,也将路径存成了文件列表,但是读取时还是出现了这个错误,想问下.flist中是存在什么结构吗? image

没有特殊格式,每一行是图片的绝对路径。可以先一行一行debug看看哪里的问题。

感谢您的回答,已经可以运行了

nachifur commented 7 months ago

作者您好,在复现过程中想替换成自己的数据集进行尝试,也将路径存成了文件列表,但是读取时还是出现了这个错误,想问下.flist中是存在什么结构吗? image

没有特殊格式,每一行是图片的绝对路径。可以先一行一行debug看看哪里的问题。

感谢您的回答,已经可以运行了

好的。

如果方便,您可以贴出来如何解决的这个问题,以及注意事项,方便大家修改和运行。

非常抱歉目前不完善的代码给大家带来不便。代码正在整理,随时更新完善。

JunningSu commented 7 months ago

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.请问能解释一下这个assertion吗

您好,我也遇到了这个问题,请问这个问题是怎么解决的,谢谢!

nachifur commented 7 months ago

@JunningSu 可以先一行一行debug看看哪里的问题。

KasuganoLove commented 7 months ago

你好,请问在low-level vision中验证集和测试集是一个东西吗(表示疑惑)?

KasuganoLove commented 7 months ago

你好,请问在low-level vision中验证集和测试集是一个东西吗(表示疑惑)?

我注意到LOL数据集通常是这么做的:https://github.com/wyf0912/LLFlow/issues/51

想问下您ISTD 和 RainDrop数据集也是这么处理的吗?

nachifur commented 7 months ago

See https://github.com/nachifur/RDDM/issues/14

你好,请问在low-level vision中验证集和测试集是一个东西吗(表示疑惑)?

我注意到LOL数据集通常是这么做的:wyf0912/LLFlow#51

想问下您ISTD 和 RainDrop数据集也是这么处理的吗?

Arrosw commented 7 months ago

作者好,请问最后生成出的修复图片,会保持原有图片中未被遮挡/破坏的区域吗?(即是不是只留下了mask的区域?没破坏的区域直接从原图中抠出来加上去的?) 谢谢

nachifur commented 7 months ago

image

对于image inpainting,Fig.19 (g-i) 没有mask作为条件输入,也没有Input作为条件输入,只有输入(b) Input+Noise,网络直接输出结果。本文的inpainting实验仅做可行性研究,没有采用I = (1-mask)*I_in+mask*I_{out_by_net}的方式。如果做定量比较,可能需要类似的处理。

作者好,请问最后生成出的修复图片,会保持原有图片中未被遮挡/破坏的区域吗?(即是不是只留下了mask的区域?没破坏的区域直接从原图中抠出来加上去的?) 谢谢

JunningSu commented 7 months ago

作者您好,请问我在用代码debugISTD数据集时采样生成的图像如下 微信图片_20240328153223 请问最后一行生成的图片不是gt即去除阴影后的图片吗?我在ddim_sample中调了use_type="use_x_start"

yuanshuai-alt commented 7 months ago

作者您好,我在复现图像修复任务,按照Readme和附录的要求设置了相关参数,并且设置了输入GT图和Input图,训练10万步后,Unet[0]损失在0.003左右,Unet[1]损失在0.02左右,采样结果不太理想,Input+Noise图像跟论文中的也不太一样。请问可能是哪里出现问题了呢?可以给一个image inpainting的代码吗?感谢感谢 sample-1501

nil0330 commented 7 months ago

你好作者我注意到在采样过程中你的输入是在原图像上加上了随机的噪声,但是最后的输出仿佛把这部分的噪声也学习到了,能否请教这个这个加噪操作的目的是什么? image

nachifur commented 7 months ago

作者您好,我在复现图像修复任务,按照Readme和附录的要求设置了相关参数,并且设置了输入GT图和Input图,训练10万步后,Unet[0]损失在0.003左右,Unet[1]损失在0.02左右,采样结果不太理想,Input+Noise图像跟论文中的也不太一样。请问可能是哪里出现问题了呢?可以给一个image inpainting的代码吗?感谢感谢 sample-1501

抱歉,最近有点忙,inpainting的代码正在整理中。

nachifur commented 7 months ago

你好作者我注意到在采样过程中你的输入是在原图像上加上了随机的噪声,但是最后的输出仿佛把这部分的噪声也学习到了,能否请教这个这个加噪操作的目的是什么?

最开始的去噪扩散模型(DDPM)就是加噪和去噪的过程。对于图像生成,噪声可以提供多样性;对于图像恢复,一定程度的噪声也有利于性能的提升(见Appendix-B.5. Ablation Studies-Noise Perturbation Intensity.)。

lwtgithublwt commented 6 months ago

感谢之前的回复!已经跑通了图像修复的代码,并阅读了V2版本的论文,附录部分很丰富,关于残差和噪声解耦的研究感觉很有意义。 还有个问题是测试代码中的低光照部分,我看代码计算的是ycbcr空间y通道的指标,低光照任务目前普遍都是测这个指标而不是rgb的吗。

你好我也在复现这篇代码,但是数据集配置中 xxx/dataset/ISTD_Dataset_arg/data_val/ISTD_shadow_free_train.flist这个应该具体替换成什么能否举个例子,感谢和期待您的回答

@nil0330 您好,在复现过程中,遇到无法识别flist文件,请问flist内具体是什么样的,不知道您是如何解决?

lwtgithublwt commented 6 months ago

作者您好,在复现过程中想替换成自己的数据集进行尝试,也将路径存成了文件列表,但是读取时还是出现了这个错误,想问下.flist中是存在什么结构吗? image

没有特殊格式,每一行是图片的绝对路径。可以先一行一行debug看看哪里的问题。

感谢您的回答,已经可以运行了 @TuTusong 您好,我也遇到了这个问题,不知道您是如何解决的?

2zhujia commented 6 months ago

您好我是一个小白,请问有单独的real_img去噪模块吗,我可以直接用我的数据集跑去噪任务吗,谢谢

miraclerepuduce commented 6 months ago

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思RuntimeError: 已尝试在当前进程完成其引导阶段之前启动新进程。

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.请问能解释一下这个assertion吗

您好,我也遇到了这个问题,请问这个问题是怎么解决的,谢谢!

这个问题你现在是怎么解决的,我也遇到了,难受

nachifur commented 6 months ago

您好我是一个小白,请问有单独的real_img去噪模块吗,我可以直接用我的数据集跑去噪任务吗,谢谢

没太明白real_img去噪模块是什么意思?

miraclerepuduce commented 6 months ago
  1. 修改train.py image

train.py中,其他任务类似于42行(阴影去除,有mask输入)和49行(低光照增强,无mask输入)。

train.py中,35行-37行 阴影去除: condition = True input_condition = True input_condition_mask = True

低光照: condition = True input_condition = False input_condition_mask = False

  1. 修改src/residual_denoising_diffusion_pytorch.py

a. [self.alphas_cumsum[t]*self.num_timesteps, self.betas_cumsum[t]*self.num_timesteps]] -> [t,t] (in L852 and L1292). b. modify the corresponding experimental settings (see Table 4 in the Appendix), e.g., Loss, Optimizer

作者你好,你们的工作看起来非常新颖!但是你的回复中的2.a部分具体是怎么更改的,我好像卡住了,可以具体示范一下吗,谢谢!

lwtgithublwt commented 6 months ago

lkl AttributeError: 'int' object has no attribute 'size'作者您好,这个该如何解决,感觉应该是数据的相关问题。

miraclerepuduce commented 6 months ago

lkl AttributeError: 'int' object has no attribute 'size'作者您好,这个该如何解决,感觉应该是数据的相关问题。

me too ,我查看了数据格式,有一个是元组中多了一个int元素,而计算loss的另一个元组中没有这个int

laboratory616 commented 6 months ago

lkl AttributeError: 'int' object has no attribute 'size'作者您好,这个该如何解决,感觉应该是数据的相关问题。

me too ,我查看了数据格式,有一个是元组中多了一个int元素,而计算loss的另一个元组中没有这个int

如果只预测res,需要在train.py中修改参数num_unet = 1,objective = 'pred_res'

RongjinGuo commented 6 months ago

lkl AttributeError: 'int' object has no attribute 'size'作者您好,这个该如何解决,感觉应该是数据的相关问题。

me too ,我查看了数据格式,有一个是元组中多了一个int元素,而计算loss的另一个元组中没有这个int

如果只预测res,需要在train.py中修改参数num_unet = 1,objective = 'pred_res'

那如果是同时预测res和noise应该怎么办呀

Ying-debug commented 6 months ago

为什么我训练的损失函数一直振荡不收敛?