I am trying to train a segmentation algorithm with FastAi. I have training and validation data in separate folders, so was planning on using GrandparentSplitter() but for some reason the validation set is empty.
My files are organized as below:
Path ---> train ---> images
---> masks
---> valid ---> images
---> masks
codes = np.array(['background', 'alpha', 'beta', 'jamma'])
def label_func(x): return path/'train/masks'/f'{x.stem}_mask.png'
db = DataBlock(blocks=(ImageBlock(), MaskBlock(codes)),
splitter=GrandparentSplitter(train_name='train', valid_name='valid'),
get_items=get_image_files,
get_y=label_func)
dls = db.dataloaders(path/'train/images', bs=1)
dls.show_batch()
mask directory contains 3 times the items of images
mask file name example img-1-0001_s_0_alpha_mask.png
image file name example img-1-0001_s_0_i_0_ax.png
each image could have all 3 categories
Update
I wrote this get_mask function to be passed to get_y
def get_mask(x):
"""
:param x: filename of scan from FastAi
:return: path of corresponding mask
"""
x_mask = ''
x = str(x)
if 'train' in x:
p_id = x.split('/')[-1].split('_idx_')[0]
main_dir = x.split('/images/')[0]
for fn in os.listdir(os.path.join(main_dir, 'masks')):
if p_id in fn:
x_mask = os.path.join(os.path.join(main_dir, 'masks'), fn)
print(x_mask)
return Path(x_mask)
running
dls.train_ds[0] returns the following:
/mnt/Datasets/pngs_datasets/train/masks/img-01-0001_slice_11_alpha_masks.png
/mnt/Datasets/pngs_datasets/train/masks/img-01-0001_slice_11_beta_masks.png
/mnt/Datasets/pngs_datasets/train/masks/img-01-0001_slice_11_jamma_masks.png
Out[1]: (PILImage mode=RGB size=256x256, PILMask mode=L size=256x256)
but if i run
dls.show_batch(max_n=4, vmin=1, vmax=30, figsize=(14,10))
i get an error
<ipython-input-4-93800379df65> in get_mask(x)
10 p_id = x.split('/')[-1].split('_idx_')[0]
11 main_dir = x.split('/images/')[0]
---> 12 for fn in os.listdir(os.path.join(main_dir, 'masks')):
13
14 if p_id in fn:
NotADirectoryError: [Errno 20] Not a directory: '/mnt/Datasets/pngs_datasets/train/masks/img-0109_slice_14_alpha_masks.png/masks'