前言
在训练transUnet网络时,我想使用我自己的1.8w张copymove数据集。但是图像的原图是tif格式,groundtruth是png格式。所以在加载数据集时产出了许多坑!!!
开始跳坑
1、读取图片时的坑
def readImage(self):
#print("读取图片")
self.pic_root = self.data_root + "/Image/"
self.gt_root = self.data_root + "/Mask_bi/"
#这里由于原图与groundtruth的后缀不一样 所以得分开
filename_i = os.listdir(self.pic_root)
filename_g = os.listdir(self.gt_root)
for i in range(len(filename_i)):
self.image_name.append(self.pic_root + filename_i[i])
#print(filename[i])
self.gt_name.append(self.gt_root + filename_g[i])
#print(filename[i])
之前我读取图像时候没有保存filename_g ,下面都使用的是filename_i 。这就会导致读入image_name与gt_name中的名字是一样的。比如说对于一张图片,image是000.tiff。img_gt中也是000.tiff,但实际我的img_gt中是000_mask.png。这样后面打开图像时就找不到啦。所以得有两个列表分别保存。
2、使用pillow打开TIFF文件报tempfile.tif: Cannot read TIFF header错误的解决方案如题,使用pillow的 Image.open(tiff file path)报错tempfile.tif: Cannot read TIFF header.的错误。
原因是 libtiff的版本问题。 将版本降到4.0.10即可解决。(conda install libtiff=4.0.10 or pip install libtiff=4.0.10)
3、报一个错
ValueError: image has wrong mode
经过查找。在我的transform中,使用了数据增广
self.im_tfs_val = tfs.Compose([
torchvision.transforms.RandomHorizontalFlip(),
#tfs.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5),
tfs.ToTensor(),
tfs.Normalize(self.mean, self.std),
])
就是注释掉的代码,这个可以在PNG,JPG和8位TIF上用,但是我的TIF图像是24位的,所以就爆了这个错。我不使用这个进行数据增广就好了。
如果想用,那俺就不知道怎么改了,我直接弃之!!(理直气壮)