I have been trying to train a unet like model on a custom road segmentation dataset. You can look at an example here: sample_dataset
I am converting the mask to road lines using OpenCV edge detection.
The loss(both train and validation) during the training process became significantly low(1e-5). But the results during inference are not as expected(not even on the video from where I extracted the frames).
My dataLoader class looks like this
class load(Dataset):
def __init__(self,**kwargs):
self.width=kwargs["width"]
self.height=kwargs["height"]
self.samples=[]
self.path1="/home/satinder/Desktop/deepWay/DeepWay.v2/dataSet/Segmentation2/img/"
self.path2="/home/satinder/Desktop/deepWay/DeepWay.v2/dataSet/Segmentation2/mask/"
img_folder=os.listdir(self.path1)
for i in tqdm(img_folder):
num=i.split(".")[0]
self.samples.append((i,num+".png"))
self.color=transforms.ColorJitter(brightness = 1)
#self.translate=transforms.RandomAffine(translate=(0.1,0.1))
self.angle=transforms.RandomAffine(degrees=(60))
self.flip=transforms.RandomHorizontalFlip(p=0.5)
self.transforms_img=transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])
self.transforms_mask=transforms.Compose([transforms.Grayscale(num_output_channels=1),
transforms.ToTensor(),
transforms.Normalize((0.5,),(0.5,))])
def __len__(self):
return len(self.samples)
def __getitem__(self,idx):
i,j=self.samples[idx]
img=cv2.imread(self.path1+i,1)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#img=cv2.blur(img,(3,3))
mask=cv2.imread(self.path2+j,1)
mask=cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
mask=cv2.Canny(mask,100,150)
mask=cv2.dilate(mask,None,iterations=5)
img=cv2.resize(img,(self.height,self.width))
mask=cv2.resize(mask,(self.height,self.width))
#print(mask.shape)
seed=np.random.randint(2147483647)
img=Image.fromarray(img)
mask=Image.fromarray(mask)
random.seed(seed)
#img=self.color(img)
random.seed(seed)
#img=self.translate(img)
random.seed(seed)
#img=self.angle(img)
random.seed(seed)
#img=self.flip(img)
random.seed(seed)
img=self.transforms_img(img)
random.seed(seed)
#mask=self.translate(mask)
random.seed(seed)
#mask=self.angle(mask)
random.seed(seed)
#mask=self.flip(mask)
random.seed(seed)
mask=self.transforms_mask(mask)
#print(img)
return (img,mask)
def plot(self,img):
img=np.transpose(img.numpy(),(1,2,0))
img=img*0.5+0.5
img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
cv2.imshow("ds",img)
cv2.waitKey(0)
if(__name__=="__main__"):
obj=load(width=256,height=256)
res=obj.__getitem__(7)
obj.plot(res[0])
obj.plot(res[1])
#cv2.imshow("img",res[0].cpu().detach().numpy())
I am using BCEWithLogitsLoss as my loss function and Adam as the optimizer.