RDDM icon indicating copy to clipboard operation
RDDM copied to clipboard

图像恢复任务的训练

Open MrWan001 opened this issue 1 year ago • 67 comments

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

MrWan001 avatar Oct 19 '23 06:10 MrWan001

  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

nachifur avatar Oct 19 '23 07:10 nachifur

好的,非常感谢!

MrWan001 avatar Oct 19 '23 13:10 MrWan001

作者您好,我在尝试复现低光照增强的实验,在修改附录中表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

期待您的回复!非常感谢

MrWan001 avatar Oct 22 '23 07:10 MrWan001

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的代码。为了更好的代码可读性,后续我们将逐步更新、重构代码,请关注该仓库。

nachifur avatar Oct 23 '23 11:10 nachifur

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

MrWan001 avatar Nov 05 '23 07:11 MrWan001

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

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

nil0330 avatar Nov 27 '23 02:11 nil0330

@nil0330 .flist是文件路径列表

nachifur avatar Nov 28 '23 03:11 nachifur

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

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

nil0330 avatar Dec 03 '23 06:12 nil0330

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

nachifur avatar Dec 06 '23 11:12 nachifur

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

shenyue0530 avatar Dec 11 '23 09:12 shenyue0530

@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"] # 测试集的输入, 图片文件列表

nachifur avatar Dec 11 '23 09:12 nachifur

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

nil0330 avatar Dec 11 '23 11:12 nil0330

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

nachifur avatar Dec 12 '23 07:12 nachifur

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

JunningSu avatar Dec 13 '23 05:12 JunningSu

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

nachifur avatar Dec 13 '23 10:12 nachifur

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思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吗

GeroRoman avatar Mar 05 '24 03:03 GeroRoman

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思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搜搜,排查一下

nachifur avatar Mar 05 '24 14:03 nachifur

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

GeroRoman avatar Mar 07 '24 13:03 GeroRoman

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

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

KasuganoLove avatar Mar 12 '24 03:03 KasuganoLove

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

KasuganoLove avatar Mar 12 '24 03:03 KasuganoLove

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 avatar Mar 12 '24 11:03 nachifur

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

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

concat一起送到网络。

nachifur avatar Mar 12 '24 11:03 nachifur

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。

nachifur avatar Mar 12 '24 11:03 nachifur

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

TuTusong avatar Mar 13 '24 14:03 TuTusong

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

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

nachifur avatar Mar 13 '24 15:03 nachifur

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

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

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

TuTusong avatar Mar 14 '24 06:03 TuTusong

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

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

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

好的。

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

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

nachifur avatar Mar 14 '24 07:03 nachifur

您好,我是深度学习的初学者,我今天 在运行程序的时候出现这个报错,我不太清楚这个报错是什么意思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吗

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

JunningSu avatar Mar 24 '24 03:03 JunningSu

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

nachifur avatar Mar 24 '24 06:03 nachifur

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

KasuganoLove avatar Mar 25 '24 02:03 KasuganoLove