Advance sorry for being noob in Pytorch.
I am trying to do image segmentation with custom data set. ( /home/images/ and /home/masks/)
Home
train_val
Images
- Images1 . Jpg
- …………
Masks
- Images1 . bmp
- ……………….
I am getting the number of images and masks pairs. But the visualization is not working properly. I am pretty sure something is incorrect with my dataloader set.
I uploaded the full code here.
def robotfishhumanreefwrecks(mask):
human=torch.zeros((imw,imh))
fish=torch.zeros((imw,imh))
robot=torch.zeros((imw,imh))
reef=torch.zeros((imw,imh))
wrecks=torch.zeros((imw,imh))
for i in range(imw):
for j in range(imh):
if (mask[i,j,0]==0 and mask[i,j,1]==0 and mask[i,j,2]==1):
Human[i, j] = 1
elif (mask[i,j,0]==1 and mask[i,j,1]==1 and mask[i,j,2]==0):
fish[i, j] = 1
elif (mask[i,j,0]==1 and mask[i,j,1]==0 and mask[i,j,2]==0):
robot[i, j] = 1
elif (mask[i,j,0]==1 and mask[i,j,1]==0 and mask[i,j,2]==1):
reef[i, j] = 1
elif (mask[i,j,0]==0 and mask[i,j,1]==1 and mask[i,j,2]==1):
wreck[i, j] = 1
else:
pass
return torch.stack((robot,fish,human,reef,wreck),-1)
def getSaliency(mask):
imgw,imgh=mask.shape[0],mask.shape[1]
sal=torch.zeros((imgw,imgh))
for i in range(imgw):
for j in range(imgh):
if (mask[i,j,0]==0 and mask[i,j,1]==0 and mask[i,j,2]==1):
sal[i,j]=1
elif (mask[i,j,0]==1 and mask[i,j,1]==0 and mask[i,j,2]==0):
sal[i, j] = 1
elif (mask[i,j,0]==1 and mask[i,j,1]==1 and mask[i,j,2]==0):
sal[i, j] = 1
elif (mask[i,j,0]==0 and mask[i,j,1]==1 and mask[i,j,2]==1):
sal[i, j] = 0.8
else: pass
return sal.unsqueeze(1)
def processData(image,mask,sal=False):
# scaling image data and masks
image = image / 255
mask = mask /255
mask[mask > 0.5] = 1
mask[mask <= 0.5] = 0
m = []
for i in range(mask.shape[0]):
if sal:
m.append(getSaliency(mask[i]))
else:
m.append(robotfishhumanreefwrecks(mask[i]))
m=torch.tensor(m)
return (img,m)
class SUIMData(Dataset):
def __init__(self,folder_path,transform=None):
# self.images_filenames=images_filenames
self.images_directory=sorted(glob.glob(os.path.join(folder_path,'images','*.jpg')))
self.masks_directory=sorted(glob.glob(os.path.join(folder_path,'masks','*.bmp')))
self.transform=transform
def __len__(self):
return len(self.images_directory)
def __getitem__(self,index):
image = Image.open(self.img_files[index])
mask = Image.open(self.mask_files[index])
image=processData(image)
mask=processData(mask)
if self.transform is not None:
transformed = self.transform(image=image, mask=mask)
image = transformed["image"]
mask = transformed["mask"]
return image, mask
def load_training(batch_size,image_folder,mask_folder, sal=False):
scale=Rescale(256)
transform = transforms.Compose(
# [transforms.RandomHorizontalFlip(),
[Rescale(256),
transforms.ToTensor()])
image_data=torchvision.datasets.ImageFolder(root=image_folder,transform=transform)
mask_data=torchvision.datasets.ImageFolder(root=mask_folder,transform=transform)
image_generator=DataLoader(image_data,batch_size=batch_size,shuffle=True,num_workers=4)
mask_generator=DataLoader(mask_data,batch_size=batch_size,shuffle=True,num_workers=4)
for (img,mask) in zip(image_generator,mask_generator):
img,mask_indiv=processData(img,mask,sal)
yield img,mask_indiv
def getPaths(data_dir):
# read image files from directory
exts = ['*.png','*.PNG','*.jpg','*.JPG', '*.JPEG', '*.bmp']
image_paths = []
for pattern in exts:
for d, s, fList in os.walk(data_dir):
for filename in fList:
if (fnmatch.fnmatch(filename, pattern)):
fname_ = os.path.join(d,filename)
image_paths.append(fname_)
return image_paths
data=SUIMData(folder_path='home/train_val')
len(data)
import albumentations as A
from albumentations.pytorch import ToTensorV2
train_transform = A.Compose(
[
A.Resize(256, 256),
A.ShiftScaleRotate(shift_limit=0.2, scale_limit=0.2, rotate_limit=30, p=0.5),
A.RGBShift(r_shift_limit=25, g_shift_limit=25, b_shift_limit=25, p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
ToTensorV2(),
]
)
def visualize_augmentations(dataset, idx=0, samples=5):
dataset = copy.deepcopy(dataset)
dataset.transform = A.Compose([t for t in dataset.transform if not isinstance(t, (A.Normalize, ToTensorV2))])
figure, ax = plt.subplots(nrows=samples, ncols=2, figsize=(10, 24))
for i in range(samples):
image, mask = dataset[idx]
ax[i, 0].imshow(image)
ax[i, 1].imshow(mask, interpolation="nearest")
ax[i, 0].set_title("Augmented image")
ax[i, 1].set_title("Augmented mask")
ax[i, 0].set_axis_off()
ax[i, 1].set_axis_off()
plt.tight_layout()
plt.show()
random.seed(42)
train_dataset = SUIMData(folder_path='home/train_val',transform=train_transform)
visualize_augmentations(train_dataset, idx=55)
This visualize augmentation is giving me NotImplementedError. Advance thanks