lseventeen / PHTrans

[MICCAI2022] PHTrans: Parallelly Aggregating Global and Local Representations for Medical Image Segmentation
Apache License 2.0
31 stars 5 forks source link

效果与论文中差距过大 #5

Closed Badinbed closed 1 year ago

Badinbed commented 1 year ago

您好,我按照md中的指示下载了两个数据集,训练了一下您的网络,效果与report结果差距很大 ABD 各类dice如下: 1:0.8002944413368666 2:0.7937590153254561 3:0.8504605809280753 4:0.6726143836534904 5:0.7817883539530274 6:0.9033643592822282 7:0.8903867461857408 8:0.9079427974217236 9:0.881327832960577 10:0.6665617814195197 11:0.7845430595518943 12:0.7680662054279375 13:0.6298614215606001 而且validation_raw/中的summary.json打不开,我甚至看不了其他指标,请问是上传的版本有问题吗

lseventeen commented 1 year ago

您好,这个库的确和最开始上传的版本有所不同,但仅仅是些代码优化,不影响使用,另一个分支是原始库bak

您展示的结果的确差距很大,请问训练是否使用了一样的数据划分?是否训练过nnUNet默认的网络,结果是否还是差很多?

Badinbed commented 1 year ago

您好,感谢回复。划分数据都用的PHTrans/phtrans/dataset_conversion中对应的py文件划分原始数据,然后用nnUNet的预处理,我有试过在ACDC数据上使用默认网络,效果如下 1:0.9072831809605251 2:0.8883261740391981 3:0.9270309548829361 前两项略高于论文中,第三项明显不如您论文的水平。而且使用默认网络时,validation_raw中的json文件是可以正常打开的,所以我说是不是版本有问题。 还有一个问题关于BTCV数据,我看其他人也提了,您训练时是否使用了12个测试数据,还是用测试数据做val得到best model,因为我看了nnformer的源码,他的处理和您有明显区别,他训练应该是可以保证没使用测试数据的,我不太能理解你到底是怎么处理的,希望能解惑一下。

lseventeen commented 1 year ago

您好,感谢回复。划分数据都用的PHTrans/phtrans/dataset_conversion中对应的py文件划分原始数据,然后用nnUNet的预处理,我有试过在ACDC数据上使用默认网络,效果如下 1:0.9072831809605251 2:0.8883261740391981 3:0.9270309548829361 前两项略高于论文中,第三项明显不如您论文的水平。而且使用默认网络时,validation_raw中的json文件是可以正常打开的,所以我说是不是版本有问题。 还有一个问题关于BTCV数据,我看其他人也提了,您训练时是否使用了12个测试数据,还是用测试数据做val得到best model,因为我看了nnformer的源码,他的处理和您有明显区别,他训练应该是可以保证没使用测试数据的,我不太能理解你到底是怎么处理的,希望能解惑一下。

您好,感谢您指出这个问题,后期使用这个库参加竞赛,重新更新了nnUNet的源码,但是忘了复制splits_final.pkl文件到预处理数据文件夹下的相关代码(刚刚已更新),即:

shutil.copy(join(nnUNet_raw_data, task_string, "splits_final.pkl"), cropped_out_dir) shutil.copy(join(cropped_out_dir, "splits_final.pkl"), preprocessing_output_dir_this_task)

数据集划分已经在数据处理的时候划分好了,并保存在了nnUNet_raw_data中BCV目录下, 经过复制后splits_final.pkl文件存在于预处理文件夹下,nnUNet训练前在数据划分时会首先检查是否有这个文件,

    if self.fold == "all":
        # if fold==all then we use all images for training and validation
        tr_keys = val_keys = list(self.dataset.keys())
    else:
        splits_file = join(self.dataset_directory, "splits_final.pkl")
        # if the split file does not exist we need to create it
        if not isfile(splits_file):
            self.print_to_log_file(
                "Creating new 5-fold cross-validation split...")
            splits = []
            all_keys_sorted = np.sort(list(self.dataset.keys()))
            kfold = KFold(n_splits=5, shuffle=True, random_state=12345)
            for i, (train_idx, test_idx) in enumerate(kfold.split(all_keys_sorted)):
                train_keys = np.array(all_keys_sorted)[train_idx]
                test_keys = np.array(all_keys_sorted)[test_idx]
                splits.append(OrderedDict())
                splits[-1]['train'] = train_keys
                splits[-1]['val'] = test_keys
            save_pickle(splits, splits_file)
        else:
            self.print_to_log_file(
                "Using splits from existing split file:", splits_file)
            splits = load_pickle(splits_file)
            self.print_to_log_file(
                "The split file contains %d splits." % len(splits))

        self.print_to_log_file("Desired fold for training: %d" % self.fold)

我们已经划分了,所以--fold 的参数是0-4 都执行这个18-12的测试和验证的数据集划分,这个划分策略和nnformer和TransUNet一样,只不过nnformer是在读数据那里划分的。我猜测因为BCV的数据量太小了,所以之前的工作只做了训练集和测试集的划分,同时测试集也被当成了验证集,事实上model_final_checkpoint.model和model_best.model的结果几乎一样,我们也是采用最后一个checkpoint用于验证。可见PHTrans/phtrans/inference/predict_simple.py

parser.add_argument('-chk',
                    help='checkpoint name,
                    required=False,
                    default='model_final_checkpoint')

审稿专家也提出了BCV的数据集的数据量比较小,没有说服力,但是大佬们都用这两个数据集,不比不行。目前我也在继续改进这个工作,在更大的数据集上进行实验。再次感谢您指出这个问题,有问题随时联系。

Susu0812 commented 8 months ago

您好,感谢回复。划分数据都用的PHTrans/phtrans/dataset_conversion中对应的py文件划分原始数据,然后用nnUNet的预处理,我有试过在ACDC数据上使用默认网络,效果如下 1:0.9072831809605251 2:0.8883261740391981 3:0.9270309548829361 前两项略高于论文中,第三项明显不如您论文的水平。而且使用默认网络时,validation_raw中的json文件是可以正常打开的,所以我说是不是版本有问题。 还有一个关于BTCV数据的问题,我看其他人也提了,您训练时是否使用了12个测试数据,还是用测试数据做val得到best model,因为我看了nnformer的源码,他的处理和您有明显区别,他训练应该是可以保证没使用测试数据的,我不太能理解你到底是怎么处理的,希望能解惑一下。

请问您最后两个数据集复现出的结果分别是多少?

wenzheng00 commented 4 months ago

您好,感谢回复。划分数据都用的PHTrans/phtrans/dataset_conversion中对应的py文件划分原始数据,然后用nnUNet的预处理,我有试过在ACDC数据上使用默认网络,效果如下 1:0.9072831809605251 2:0.8883261740391981 3:0.9270309548829361 前两项略高于论文中,第三项明显不如您论文的水平。而且使用默认网络时,validation_raw中的json文件是可以正常打开的,所以我说是不是版本有问题。 还有一个关于BTCV数据的问题,我看其他人也提了,您训练时是否使用了12个测试数据,还是用测试数据做val得到best model,因为我看了nnformer的源码,他的处理和您有明显区别,他训练应该是可以保证没使用测试数据的,我不太能理解你到底是怎么处理的,希望能解惑一下。

请问您最后两个数据集复现出的结果分别是多少?

您好,请问您是如何复现的,为什么我复现的有问题,跑不起来,可以给一份复现流程吗,谢谢