Closed 847001315 closed 1 year ago
我是用Linux系统来进行split_data.py,似乎会造成label和image不匹配的情况,问题出在image_files和label_files这两个列表并不能够完全相同顺序,实测会出现不同的顺序,我认为通过img的文件名去定位label似乎会更好一些。
import random
import os
import sys
import shutil
sep = '\\' if sys.platform[:3] == 'win' else '/'
def ensure_dir(path):
if not os.path.exists(path):
os.makedirs(path)
image_path = '/data/goals/project/UCMT/DATA/ISIC2018/' # 这里面得包含两个文件夹,一个是images,一个是masks,然后他就会生成对应的训练集和测试集
train_percent = 0.7 # 70%拿来训练,30%拿来测试
test_percent = 1-train_percent
image_files = [os.path.join(image_path, x, y)
for x in os.listdir(image_path) if x.endswith('images')
for y in os.listdir(os.path.join(image_path, x)) if y.endswith('.jpg')]
# label_files = [os.path.join(image_path, x, y)
# for x in os.listdir(image_path) if x.endswith('masks')
# for y in os.listdir(os.path.join(image_path, x)) if y.endswith('segmentation.png')]
print("图片个数:",len(image_files))
# assert len(image_files) == len(label_files)
length = len(image_files)
dataset_idx = range(length)
tv = int(length * train_percent) # 训练集的个数
tr = int(tv * train_percent) # 训练集的个数*0.7是啥意思?没用到
train_idx = random.sample(dataset_idx, tv)
for i in dataset_idx:
print(i)
image_file = image_files[i]
image_name = image_file.split("/")[-1].split('.')[0]
label_file = image_path+"masks"+"/"+image_name+"_segmentation.png"
if i in train_idx:
save_image_path = image_path + 'TrainDataset/' + 'images/'
save_label_path = image_path + 'TrainDataset/' + 'masks/'
ensure_dir(save_image_path)
ensure_dir(save_label_path)
shutil.copyfile(src=image_file, dst=save_image_path + image_name + '.jpg')
shutil.copyfile(src=label_file, dst=save_label_path + image_name + '.png')
else:
save_image_path = image_path + 'TestDataset/' + 'images/'
save_label_path = image_path + 'TestDataset/' + 'masks/'
ensure_dir(save_image_path)
ensure_dir(save_label_path)
shutil.copyfile(src=image_file, dst=save_image_path + image_name + '.jpg')
shutil.copyfile(src=label_file, dst=save_label_path + image_name + '.png')
以上是我更改的代码,如果有需要可以自取 顺便说一句,那个readme中的deeplabv3p的大小写和代码中默认的不对,应该改为DeepLabv3p。 还是非常钦佩作者写的代码,简洁明了,十分好跑通!!
在训练代码中, parser.add_argument('--labeled_percentage', type=int, default=0.05, help='the percentage of labeled data'),这里的type需要改成float,否则无法在命令行中输入,或者直接修改default也可。
感谢您对我们工作的关注! 对于您提出问题的回复如下: 1 MT和CPS为所提方法的基准模型; 2 Table 2中,MT、CPS和CCT为我们复现的结果。AdvSemiSeg和ColAdv引用自ColAdv。
同时,感谢您的建议!对于image和label不匹配的问题,读取list后加上sorted应可以解决。
感谢您对我们工作的关注! 对于您提出问题的回复如下: 1 MT和CPS为所提方法的基准模型; 2 Table 2中,MT、CPS和CCT为我们复现的结果。AdvSemiSeg和ColAdv引用自ColAdv。
同时,感谢您的建议!对于image和label不匹配的问题,读取list后加上sorted应可以解决。
好的,谢谢您的回复,目前正在精读你们的论文,如果有十分困惑又长期无法解决的问题,可能又要打扰你们了!
作者您好,您的论文中跑了三个数据集,分别是ISIC2018、Colonoscopy 和 3D LA数据集,ISIC2018与Colonoscopy的数据集形式接近,通过修改部分配置就能跑通,那3D的心脏数据集是否需要额外的代码或者配置呢?文中提到的滑动窗口方法,我在源码中似乎没找到
您好,3D部分的代码后续会和我们下一个工作一起开源。 3D和2D是类似的,您可以参考readme后面提到的repo。
好的,谢谢您的回复,我去相应的repo上去进行学习
论文中给出的实验设置为epoch=50,batchsize=16,而代码中的默认设置epoch=25,batchsize=8。此处batchsize=8,分别是有标签的8和无标签的8,所以一共16,那么epoch数量是为什么会×2,是因为有两个学生模型?还是因为有标签训练算一个epoch,无标签训练又算另外一个epoch?此处是我的困惑,我使用epoch=25成功复现出您论文对应的结果!
您好,对此问题,您参考原文实验设置的脚注就明白了。
您好,对此问题,您参考原文实验设置的脚注就明白了。
非常抱歉!! 是我没有仔细看论文! 谢谢您的及时回复~
作者您好,我复现了您的代码后,发现在ISIC2018上基本上完美复现,在Kvasir和ClinicDB上都出现了性能下降1-2个点的情况,我预计应该是因为split_data的时候,是进行随机划分的,这里导致了数据出现了差异,请问是否方便发送一下你们的Kvasir和ClinicDB划分后的数据集,我的邮箱是:847001315@qq.com,由于我已经重新划分2-3次了,目前还是没有很好的结果,所以才来求助您的! 万分感谢!!!
您好,这个数据集划分请参考https://github.com/DengPingFan/PraNet
您好,这个数据集划分请参考https://github.com/DengPingFan/PraNet
非常非常感谢,我还以为也是用split_data去实现的,我之前的数据集划分就是跟随PraNet的,真是令人欣喜。那请问,您是和Pra-net一样,将两个数据集的训练集合并去训练,还是单独分开训练?
合并训练,分开测试
合并训练,分开测试
好的,感谢您的回答,我目前使用合并训练,分开测试,在Kvasir上可以达到与论文几乎一致的水准,而在ClinicDB取得的效果远低于论文水准,几乎少了3个点多,而且会出现15%的比例结果优于30%训练集的结果的情况,请问是否有什么训练细节需要注意的嘛?
您可以尝试打乱并固定训练数据,比如打乱后保存为一个list,之后取15%或30%就按照该list取(即保证30%包含15%全部的数据),就不会出现15%优于30%的情况。 没有其他训练细节,导致结果存在差异的原因应该是随机选择有标签数据。
您可以尝试打乱并固定训练数据,比如打乱后保存为一个list,之后取15%或30%就按照该list取(即保证30%包含15%全部的数据),就不会出现15%优于30%的情况。 没有其他训练细节,导致结果存在差异的原因应该是随机选择有标签数据。
好的,谢谢您的回答!
作者您好,我想了解一下,文中所说的高置信度区域是否可以为模型预测的病灶位置,而低置信度区域为模型预测的背景区域?
您好,这是个不错的想法,但我们在UCMT中没有加此限制。
我看代码
uncertainty_map1 = torch.mean(torch.stack([pred1_u_feature, pred_u_feature]), dim=0) # 堆叠两个图,取平均,实际上还是概率图
uncertainty_map1 = -1.0 * torch.sum(uncertainty_map1 * torch.log(uncertainty_map1 + 1e-6), dim=1,
keepdim=True)
这段代码的本质含义是将模型对图片的预测概率值转变成模型对图片的置信度区间,这里是否隐含了,我们进行交换的patch部分,基本是模型预测出来的病灶部分? 我的理解是否出现了偏差?
其实不一定,mix操作并未区分前景和背景。