您在使用 PyTorch 进行语义图像分割时遇到了这个问题?这是对我有用的解决方案。
简介目前,我正在做一个关于CT扫描中全身语义肿瘤分割的项目,但你知道,解决这类问题并不容易,所以在本文中,我将讨论一个著名的错误,你可能在使用PyTorch时遇到过。
因此,看看这个错误,程序没有指定错误的确切部分。对我来说,我一直打印图像和标签的形状和值,以查看确切的错误在哪里。
我将向您展示在我的项目中发现的错误,以及如何解决它们,希望它也将为您工作。
问题的所在对我来说,问题出在标签上,我很肯定你在这方面也有问题。让我来谈谈我发现的问题然后我们来解决它。
我的问题在于标签的值,程序检测多个类别(大于两类),而不是两个类(背景和前景)。所以在每个病人身上有不同数量的肿瘤可以检测到不同种类的肿瘤,而我们只需要分辨出前景和背景。
从上图你可以看到在这个切片中,我应该有相同的颜色,但不是那样,我有两个不同的颜色,这意味着程序看到3类(包括背景)。
如果你不经过预处理就把它画出来你可以看到所有的肿瘤都有相同的颜色(在视觉方面)但实际上,它们都有不同的标签值因此它们会被检测为不同的类别。如下图所示:
正如我告诉你们的,主要的问题是对于不同肿瘤标签值不同。
你还应该注意到标签值应该是0或1,因为如果你在做语义分割,你不需要其他值。
如果你想检查标签值,你可以使用一个叫做unique 的NumPy函数,这个函数会给你不同的值。
解决这个问题有很多方法,但是最简单的一个是标签转换成布尔值意味着标签将只有“真”或“假”(假的背景,值为0和其他为前景,为真)。
在开始训练和验证(如果有的话)之前,您只需添加这一行。label = label > 0
否则,如果你想处理0和1这取决于你有什么问题。如果你标签只有大于1的值,那么你可以用标签值除以它们的最大值。或者如果你有多类别的问题,那么在这里我建议你在训练部分外解决问题,这样你就不会减慢训练的进程。
代码实现样例import os from glob import glob import numpy as np import nibabel as nib input_nifti_file_path = r"E:datasetsvesselniftiFileslabels*" out_nifti_file_path = r"E:datasetsvesselniftiFileslabels2" list_labels = glob(input_nifti_file_path) for patient in list_labels: patient_name = os.path.basename(os.path.normpath(patient)) nifti_file = nib.load(patient) # fdata = nifti_file.get_fdata() # np_unique = np.unique(fdata) # print(np_unique) data = np.asarray(nifti_file.dataobj) np_unique = np.unique(data) print(np_unique) a = np.where(data >= 1) data[a] = 1 new_nifti = nib.Nifti1Image(data, nifti_file.affine) nib.save(new_nifti, os.path.join(out_nifti_file_path, patient_name))3. 其他说明
要特别注意,当使用函数
data = nifti_file.get_fdata()
的时候,会把nifti_file和data都cache在内存里,你后面改变data或nifti_file,前面定义的变量也会改变,而且容易造成out of memory,使用
data_array = np.asarray(nifti_file.dataobj)
更符合平时对变量的理解
参考目录https://blog.csdn.net/zhangjipinggom/article/details/116770250
https://pycad.co/runtimeerror-cuda-error-device-side-assert-triggered/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)