baal: num_samples should be a positive integer value, but got num_samples=0

First, I would like to know if this project works with segmentation problems, namely Unet - this one in particular.

Also, I tried to run a simple pipeline but I am getting this error when creating the dataset. However, if I run that piece of code it works:

from torch.utils.data.dataloader import default_collate
for data, target in DataLoader(train_dataset, batch_size, True, num_workers=4,
                                           collate_fn=None):
    print(data)

My Dataset constructor:

class Dataset(BaseDataset): “”"CamVid Dataset. Read images, apply augmentation and preprocessing transformations.

Args:
    images_dir (str): path to images folder
    masks_dir (str): path to segmentation masks folder
    class_values (list): values of classes to extract from segmentation mask
    augmentation (albumentations.Compose): data transfromation pipeline 
        (e.g. flip, scale, etc.)
    preprocessing (albumentations.Compose): data preprocessing 
        (e.g. noralization, shape manipulation, etc.)

"""
    def __init__(
            self, 
            ids,
            images_dir, 
            masks_dir, 
            classes=None, 
            augmentation=None, 
            preprocessing=None,
            show_original=False
    ):
        self.ids = ids#os.listdir(images_dir)
        self.images_fps = [os.path.join(images_dir, image_id) for image_id in self.ids]
        self.masks_fps = [os.path.join(masks_dir, image_id) for image_id in self.ids]
        
        # convert str names to class values on masks
        self.class_values = [i+1 for i,c in enumerate(classes)]
        
        self.augmentation = augmentation
        self.preprocessing = preprocessing
        self.show_original=show_original
    
    def __getitem__(self, i):
        try:
            # read data
            #print(self.images_fps[i])
            filename=self.images_fps[i]
            if not filename.endswith(".png"):
                # Virtual openslide patch in form filename_col_x_row_y
                slide_name=Path(filename).stem.split("_col_")[0]
                roi_x,roi_y=filename.split("col_")[1].split("_row_")
                roi_xy_large=int(int(roi_x)*patch_size),int(int(roi_y)*patch_size)
            
                slide= openslide.open_slide(slide_paths[slide_name])
                image=slide.read_region(roi_xy_large,0,(patch_size,patch_size))
                #print((roi_xy_large,0,(patch_size,patch_size)))
                #plt.imshow(img)
                #plt.show()

                image=image.convert('RGB')
                if self.show_original:
                    plt.imshow(image)
                    plt.show()
                image = np.asarray(image)
                mask=None
                
            else:
                image = cv2.imread(filename)
                

                image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                if self.show_original:
                    plt.imshow(image)
                    plt.show()

                #print(self.masks_fps[i])
                mask = cv2.imread(self.masks_fps[i], 0)

            

            # No mask, ex: false positives
            if mask is None:
                mask= PIL.Image.new('RGB', (256, 256), (0, 0, 0))
                mask=np.array(mask.convert("L"))
                
#             if image is None:
#                 image= PIL.Image.new('RGB', (256, 256), (0, 0, 0))
#                 image=np.array(image.convert("L"))


            #print('self.images_fps[i]',self.images_fps[i])
            #print('self.masks_fps[i]',self.masks_fps[i])

            #print('self.class_values:', self.class_values)
            #print('mask.max:', np.max(mask))
            #print('mask.min:', np.min(mask))
            #print('mask.unique:', np.unique(mask))

            # extract certain classes from mask (e.g. cars)
            masks = [(mask == v) for v in self.class_values]
            mask = np.stack(masks, axis=-1).astype('float')

            # apply augmentations
            if self.augmentation:
                sample = self.augmentation(image=image, mask=mask)
                image, mask = sample['image'], sample['mask']
#                 set_trace() if DEBUG else None
                
#                 mask[np.all(image == [0, 0, 0], axis=-1)]=0

            # apply preprocessing
            if self.preprocessing:
                sample = self.preprocessing(image=image, mask=mask)
                image, mask = sample['image'], sample['mask']
                
                

            return image, mask
            
        except Exception as error:
            print("error",error,self.images_fps[i],self.masks_fps[i])
            raise

    def __len__(self):
        return len(self.ids)

Regards

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 17 (8 by maintainers)

Most upvoted comments

You can show the uncertainty per image pretty easily (again if you require better utils for this, we can work on it)

(not tested, but should work)

wrapper = ModelWrapper(...)
dataset = YourDataset()
bald = BALD() # Here note that there is no "reduce" because we want the uncertainty per pixel

for out in wrapper.predict_on_dataset_generator(...):
    uncertainty = bald.get_uncertainties(out)
    # The shape is now [batch, width, height]
    for u in uncertainty:
        # Shape of u should be [width, height]
        plt.imshow(u)