Python 为什么我在将漂亮的数据片段转换为png图像时会得到完全黑色的标签?
我对深度学习和图像分割任务非常陌生 我想通过对每个病例的中心50个切片,对3D漂亮数据(CT扫描)的2D unet进行训练。我将图像和标签保存为png,但标签是完全黑色的。我的目标是预测肿瘤区域(Y),给出CT扫描切片(X) 我做错了什么 我的代码:Python 为什么我在将漂亮的数据片段转换为png图像时会得到完全黑色的标签?,python,image-segmentation,unity3d-unet,Python,Image Segmentation,Unity3d Unet,我对深度学习和图像分割任务非常陌生 我想通过对每个病例的中心50个切片,对3D漂亮数据(CT扫描)的2D unet进行训练。我将图像和标签保存为png,但标签是完全黑色的。我的目标是预测肿瘤区域(Y),给出CT扫描切片(X) 我做错了什么 我的代码: labels = [] for i in range (0,100): seg = Path("/content/drive/My Drive/")/"case_{:05d}".format(i) / "segmentation.nii.gz
labels = []
for i in range (0,100):
seg = Path("/content/drive/My Drive/")/"case_{:05d}".format(i) / "segmentation.nii.gz"
seg = nib.load(seg)
seg = seg.get_data()
n_i, n_j, n_k = seg.shape
seg = seg[int(((n_i-1)/2)-25):int(((n_i-1)/2)+25),:,:]
for i in range(seg.shape[0]):
labels.append((seg[i,:,:]))
i+=1
labels = np.array(labels)
for i in range(labels.shape[0]):
label = (labels[i,:,:])
imsave('/content/drive/My Drive/labels/labels_slice_{:05d}.png'.format(i), label)
i += 1
我对图像做了同样的处理,得到以下.png文件:
但对于标签,我只得到一个完全黑色的图像
图像和标签的数据类型分别为float64和uint16
我在3D切片器和nipy中检查了您的nifti文件,该文件非常好。在这个分割文件中的608个切片中,只有181-397个切片具有正值,因此您应该得到其余的完全黑色图像 这个简短的片段使我能够在第300个片段中保存正面示例:
导入nibabel
将matplotlib.pyplot作为plt导入
seg=nibabel.load(“D:/Downloads/segmentation.nii.gz”)
data=seg.get_fdata()
图层=数据[300,:,:]
plt.imsave(“D:/Downloads/seg.png”,layer,cmap='gray')
让我知道你是否可以用上面的代码复制这个
另外,我知道这不是问题的一部分,但是你应该强烈地考虑使用NIFTI(或NRRD)格式,而不是将它们转换成PNG文件。 1) 当保存到PNG时,CT扫描会丢失很多信息。基本上,您正在重新缩放CT值,这些值通常在-2000到+2000到0-255像素范围内
2) 与分段遮罩类似,在nifti文件中,分段区域保存为“1”,背景保存为“0”。当您将其保存到PNG时,您会将其重新缩放到0-255,并且您必须再次将其转换回网络培训。我在3D切片器和nipy中检查了您的nifti文件,该文件非常好。在这个分割文件中的608个切片中,只有181-397个切片具有正值,因此您应该得到其余的完全黑色图像 这个简短的片段使我能够在第300个片段中保存正面示例:
导入nibabel
将matplotlib.pyplot作为plt导入
seg=nibabel.load(“D:/Downloads/segmentation.nii.gz”)
data=seg.get_fdata()
图层=数据[300,:,:]
plt.imsave(“D:/Downloads/seg.png”,layer,cmap='gray')
让我知道你是否可以用上面的代码复制这个
另外,我知道这不是问题的一部分,但是你应该强烈地考虑使用NIFTI(或NRRD)格式,而不是将它们转换成PNG文件。 1) 当保存到PNG时,CT扫描会丢失很多信息。基本上,您正在重新缩放CT值,这些值通常在-2000到+2000到0-255像素范围内
2) 与分段遮罩类似,在nifti文件中,分段区域保存为“1”,背景保存为“0”。当您将其保存到PNG时,您会将其重新缩放到0-255,并且您必须再次将其转换回网络培训。加载nifti文件后打印出
seg.max()
会得到什么?另外,.get_data()
似乎已被弃用,nipy现在使用.get_fdata()
。你能上传一个nifti示例文件来重现错误吗?@jwitos谢谢你的评论。打印seg.max()。还有一个例子,加载nifti文件后打印出seg.max()
会得到什么?另外,.get_data()
似乎已被弃用,nipy现在使用.get_fdata()
。你能上传一个nifti示例文件来重现错误吗?@jwitos谢谢你的评论。打印seg.max()。你有一个例子,谢谢。我能够复制结果。我理解你的意思,并用以下代码处理了掩码:masks=[]范围(0,25)内的I:b=[]msk=Path(“/content/drive/My drive”)/“case{:05d}.format(I)/“segmentation.nii.gz”b=nib.load(msk)b=b.get_fdata()print(“mask case{:05d}.format(I))b=resize(b,(b.shape[0],128128))b=b[,:,:]对于范围内的j(b.shape[0]):masks.append((b[j,:,:])masks=np.asarray(masks)
您认为这是一个好方法还是建议其他方法?您好,这取决于您最终要实现的目标。您在上一条评论中发布的代码有点混乱,因为它看起来像是b
和掩码
矩阵是相同的。此外,我还要再次检查调整矩阵大小后,矩阵的外观如何。根据您使用的库(skimage?numpy?),它可以更改原始矩阵的值。如果您想通过电子邮件继续此对话,请通过gmail.com上的jwitos与我联系。谢谢。我能够复制结果。我理解你的意思,并用以下代码处理了掩码:masks=[]范围(0,25)内的I:b=[]msk=Path(“/content/drive/My drive”)/“case{:05d}.format(I)/“segmentation.nii.gz”b=nib.load(msk)b=b.get_fdata()print(“mask case{:05d}.format(I))b=resize(b,(b.shape[0],128128))b=b[,:,:]对于范围内的j(b.shape[0]):masks.append((b[j,:,:])masks=np.asarray(masks)
您认为这是一个好方法还是建议其他方法?您好,这取决于您最终要实现的目标。您在上一条评论中发布的代码有点混乱,因为它看起来像是b
和掩码
矩阵是相同的。此外,我还要再次检查调整矩阵大小后,矩阵的外观如何。根据您使用的库(skimage?numpy?),它可以更改原始矩阵的值。如果您想通过电子邮件继续此对话,可以通过gmail.com上的jwitos与我联系。