After lesson 3 of the fast.ai course I wanted to train an image segmentation model on the Airbus Ship Detection dataset from Kaggle.
I tried using the
SegmentationLabelList to import the data but it only allows to provide the labels (segments) as file names of the corresponding mask images. The problem is that the ship detection dataset provides the masks using Run-length Encoding.
My first intuition was to implement my custom
SegmentationLabelList class where I replace the
open(self, fn) function by replacing the
open_mask function by the
open_mask_rle function. The former opens the mask from a file name and the latter creates the makes from the run-length encoded mask. The full code of my custom class is:
class EncodedSegmentationLabelList(SegmentationLabelList): "`ItemList` for encoded segmentation masks." _processor=SegmentationProcessor def open(self, fn): return open_mask_rle(fn, shape=(768, 768))
Note that 768 is used because this is the image size of the dataset.
However, when I try to create an item list as
src = (EncodedSegmentationLabelList.from_df(path=path, df=df_segment, folder='train', cols='ImageId') .split_by_rand_pct(0.05) .label_from_df(cols='EncodedPixels', classes=codes))
I get the following error message:
Edit: the error code does not seem to be produced by the masks itself but by the
classes member of the
SegmentationLabelList class. My
codes variable is
codes = array(['no ship', 'ship']) which is length 2.
Does anyone have an idea how to proceed?