2012的测试集是不公开的。
实验代码来源https://github.com/Golbstein/Keras-segmentation-deeplab-v3.1
这个代码需要改的。一个新的代码从来都不是下来就能用的,至少你的数据存储地址就不一样。
这个代码主要是要修改utils.py里面的数据生成器:
self.image_path_list = sorted(glob.glob(os.path.join(folder, 'JPEGImages', 'train', '*')))
self.label_path_list = sorted(glob.glob(os.path.join(folder, 'SegmentationClassAug', '*')))
这两句直接获取JPEGImage里面的train文件夹,众所周知,VOC官方是提供的txt来做data split,显然这里作者自己把训练数据放到一个文件夹里面了。所以如果是按照官方的先读取txt获得:
train_text = open(os.path.join(folder, 'ImageSets', 'Segmentation')+'/train.txt').read()
train = train_text.split('\n')
self.image_path_list = sorted([os.path.join(folder, 'JPEGImages')+ '/'+ name + '.jpg' for name in train ])[1:]
self.label_path_list = sorted([os.path.join(folder, 'SegmentationClass')+'/'+name +'.png' for name in train ])[1:]
同样的不要忘记修改test。
以及这个作者的validation数据是随机从image_path_list里面分出来的:
np.random.seed(seed)
n_images_to_select = round(len(self.image_path_list) * validation_split)
x = np.random.permutation(len(self.image_path_list))[:n_images_to_select]
所以前面的train应该使用trainval
train_text = open(os.path.join(folder, 'ImageSets', 'Segmentation')+'/trainval.txt').read()
train = train_text.split('\n')
self.image_path_list = sorted([os.path.join(folder, 'JPEGImages')+ '/'+ name + '.jpg' for name in train ])[1:]
self.label_path_list = sorted([os.path.join(folder, 'SegmentationClass')+'/'+name +'.png' for name in train ])[1:]
另外,需要使用Image读取,使用opencv读取的话,需要将标注图片提前转换到1-21的label范围,要不然读出来是0-220的,会报错。