lin-tianyu / Stable-Diffusion-Seg

[MICCAI 2024] Codebase for "Stable Diffusion Segmentation for Biomedical Images with Single-step Reverse Process"
https://lin-tianyu.github.io/Stable-Diffusion-Seg/
Other
58 stars 7 forks source link

BTCV #12

Open DDBB-YL opened 1 month ago

DDBB-YL commented 1 month ago

1d23f9f5218411e9444b6c395009e86c 作者您好我在使用BTCV数据集输入python ./data/synapse/ni12format.py命令时出现了这个问题 请问您该怎么解决呢?感谢您的回复。

lin-tianyu commented 1 month ago

如果你看了BTCV数据集的dataloader代码(./ldm/data/synapse.py)就会发现,预处理后的BTCV数据集存放在./data/synapse/train/./data/synapse/test/./data/synapse/test_vol/路径中。

而现在的./data/synapse/路径下是没有train/test/test_vol/文件夹的。因此你可以先提前创建这些文件夹然后再运行代码试试看。

当然也可以在代码中动态检查这些文件夹是否存在,若不存在则自动创建。欢迎提交PR~

DDBB-YL commented 1 month ago

感谢作者您的帮助 已经解决该数据集的问题。请问您STS-3D这个数据集我该下载图片里的哪个呢? 99f07815380789d01b18b360e6a14ac7

lin-tianyu commented 1 month ago

我是在这里下载的STS-3D数据集:https://tianchi.aliyun.com/competition/entrance/532087/information

DDBB-YL commented 1 month ago

感谢作者您的帮助 问题已经解决 非常感谢!

DDBB-YL commented 1 month ago

作者再次麻烦您一下,第一张图的BTCV数据集之前跑起来过断了再次跑的时候发现出现dice计算的问题 请问是我选择的yaml文件不对吗?第二张图的sts数据集在处理的时候出现这样的问题该怎么解决呢?感谢作者您的帮助! 92a3557ccb51c41f32fa8812fa2b7bcb d93f78f3e335759477c4f549927745c4

lin-tianyu commented 1 month ago
  1. BTCV的这个问题挺奇怪的,似乎是没有正确读取到数据。你可以提供更多的细节给我,比如运行的训练命令、使用的yaml文件等;
  2. STS的这个问题的报错是Missing key num_classes,我认为这是sts3d-ldm-kl-8-concat-mode.yaml中的model - params下缺失了num_classes: 2参数导致的。你可以试试加入这个参数。如果修改后可以正确运行的话欢迎提交PR,这样我就可以把你加到collaborator~
DDBB-YL commented 1 month ago

1.训练命令:nohup python -u main.py --base configs/latent-diffusion/synapse-cls14-ldm-kl-8.yaml -t --gpus 1, --name btcv > nohup/btcv.log 2>&1 & 2. 1ab2a6d4a90a7de107eed13949b26bc4 作者我加上您说的参数了还是出现了图片里的问题。感谢您的回复!

lin-tianyu commented 1 month ago
  1. 我们不支持14类,SDSeg是一个二类分割方法,请使用synapse-cls2-ldm-kl-8.yaml。我们会在后续的更新中澄清这一点。
  2. 请提供完整的报错和运行相关信息。这里的NameError: name 'trainer' is not defined涵盖的范围非常的广泛,只要任何一种错误导致trainer没有正常定义就会出错,所以无法分析问题。(而且你仔细看的话,这次的报错和上次不一样,在full_key处)
DDBB-YL commented 1 month ago

1f76e5d025c296ac8d91e986559f9c6 d30c1e90a3d407edc4fa071f8b66f54 df1213520d0466a6b02e6c19c01e2ee

作者您好 已经根据您说的方式进行修改 是因为我数据的存放位置不对导致的错误吗?

lin-tianyu commented 1 month ago

我看了一下STS3D的dataloader代码,ldm/data/sts3d.py里定义了一个DATA_PATH变量作为STS3D数据集的输入路径。请问你修改了这个变量吗?

顺便,你可以试试把原来的num_classes: 2去掉,仅仅修改这里的DATA_PATH变量,看看能不能运行。

如果num_classes: 2 + DATA_PATH 或者仅修改DATA_PATH两种方式都还是不行,就请你在ldm/data/sts3d.py的dataloader里面将实际读取到的路径打印到命令行输出看看,这对debug也有所帮助,谢谢~

DDBB-YL commented 1 month ago

QQ_1726761371842 QQ_1726761491219 QQ_1726761748348 作者您好 我尝试了很多次修改 每一次都是在epoh9终止,请问您这是什么原因呢?感谢您的回复。

lin-tianyu commented 1 month ago

抱歉,是我没有在README中解释清楚。

问题解释

基于你的log,你这里出现的问题在于没有正确的读取到测试集数据: image 红框内的值应该是12,表示12个测试volumes。

而之所以会在epoch9的时候报错,是因为configs/latent-diffusion/synapse-cls2-ldm-kl-8.yaml中定义了log_dice_frequency: 5000,意味着每5000个training steps就会中断训练执行一次测试过程,而测试集又没有读取到,所以报错。这里可以看到错误出现在training steps为5000的时候: image 没有读取到测试集数据自然就导致了你这里第三章图中的division by zero的错误。

解决方案

数据集中应该还有一个test_vol文件夹,存放了12个测试集数据的volumes及其对应的label文件: image 这一步我应该是手动做的,所以没有反映在nii2format.py中。

一些细节

应该注意,synapse-cls2-ldm-kl-8.yaml中提到了一个SynapseValidation用于validation,和一个SynapseValidationVolume用于testing(二者都定义在ldm/data/synapse.py中),这二者的异同在于:

  1. SynapseValidationSynapseValidationVolume所使用的其实是完全相同的12个volumes里的数据,但前者是2D slices而后者是3D volumes;
  2. 在训练过程中的validation process使用SynapseValidation来计算相关的loss,而不计算分割指标(dice);训练过程中的testing process使用SynapseValidationVolume来计算分割指标,使得我们可以了解模型目前的分割效果如何。
  3. validation process的频率通过synapse-cls2-ldm-kl-8.yaml中的check_val_every_n_epoch来定义,对于BTCV数据集默认为10;testing process的频率通过log_dice_frequency来定义,对于BTCV数据集默认为5000 steps。
DDBB-YL commented 1 month ago

QQ_1726914467249 QQ_1726914486733 作者您好!根据您的建议进行修改后出现了如图所示得报错,该如何修改呢?感谢您的回复!

lin-tianyu commented 1 month ago

请你先尝试自己debug之后,告诉我debug过程中发现的现象,再整理成现象+问题(+思考)的格式来问问题。而不是“如图所示”就要让我分析出问题在哪,没有人有这个能力,也极少有报错这么简单。私以为直接甩张图就要作者将解决方案喂到嘴边的行为是不礼貌的,请理解。

提高所问问题的质量将很大程度上提升我们的沟通效率。谢谢!

For example,

  1. Attribute Error: 'list' object has no attribute 'shape'意味着seg_label_dict[k]是一个list;
  2. 往前找到第405行,可以知道seg_label_dict是来自模型的log_dice函数的返回值;
  3. README中提到了模型定义在ldm/models/ddpm.py中,根据这个文件以及推理代码scripts/slice2seg.py都可以看出log_dice函数的定义和模型在一起,因此找到ldm/models/ddpm.py中的log_dice
  4. 可以看到模型的第二个返回值seg_label_dict来自变量seg_label_pair
  5. ctrl+fcmd+f一下就可以找到seg_label_pair的定义,来自于1668-1684行;
  6. 这个代码段中又有很多存储为list格式的数据、数据预处理步骤,等等。

依次阅读并检查上述部分的代码将非常有助于发现问题。(上述步骤里其中有一步解释了为什么调用.shape的时候seg_label_dict[k]会是list类型,请自己找到答案)

解决问题后,希望能提交PR来帮助SDSeg代码库的更新,如果不熟悉PR的流程,也可以简单总结解决这些bug所进行的代码修改。感谢。

lin-tianyu commented 1 month ago

你好,

README中说明了STS3D的预处理代码为“./data/sts3d/sts3d_preprocess.py”。(btw,STS-3D数据集本来就是只有两个类别:背景+牙齿)

或者你也可以看看这个issue里我和DDBB-YL的讨论,他似乎已经解决了这个问题。

Tianyu

From: CatCatCat @.> Date: Tuesday, September 24, 2024 at 06:11 To: lin-tianyu/Stable-Diffusion-Seg @.> Cc: Tianyu Lin @.>, Comment @.> Subject: Re: [lin-tianyu/Stable-Diffusion-Seg] BTCV (Issue #12)

  1. BTCV的这个问题挺奇怪的,似乎是没有正确读取到数据。你可以提供更多的细节给我,比如运行的训练命令、使用的yaml文件等;
  2. STS的这个问题的报错是Missing key num_classes,我认为这是sts3d-ldm-kl-8-concat-mode.yaml中的model - params下缺失了num_classes: 2参数导致的。你可以试试加入这个参数。如果修改后可以正确运行的话欢迎提交PR,这样我就可以把你加到collaborator~

请问作者:num_classes为2的话,STS3D数据集我是不是需要先手动把所有标签值都设为1呢,还是代码里面有处理呢,我也是运行会出现这个问题。

― Reply to this email directly, view it on GitHubhttps://github.com/lin-tianyu/Stable-Diffusion-Seg/issues/12#issuecomment-2370848075, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ARUIAENDAQQHZTDITKTVYLLZYE3DPAVCNFSM6AAAAABN6R553CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGNZQHA2DQMBXGU. You are receiving this because you commented.Message ID: @.***>

lin-tianyu commented 1 month ago

我看了一下STS3D的dataloader代码,ldm/data/sts3d.py里定义了一个DATA_PATH变量作为STS3D数据集的输入路径。请问你修改了这个变量吗?

顺便,你可以试试把原来的num_classes: 2去掉,仅仅修改这里的DATA_PATH变量,看看能不能运行。

如果num_classes: 2 + DATA_PATH 或者仅修改DATA_PATH两种方式都还是不行,就请你在ldm/data/sts3d.py的dataloader里面将实际读取到的路径打印到命令行输出看看,这对debug也有所帮助,谢谢~

@DDBB-YL @CatCatCat 我已经将STS3D数据集的相关设置文件(yaml, sts3d.py)进行了更新,有需要的话可以看看最新的代码。

此外,请务必将yaml文件中的increase_log_steps设置为False,即increase_log_steps: False。这会减少不必要的log过程,前期训练速度会大幅增加,谢谢。