{"cells":[{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"import torchvision\nimport torch\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nimport os\nimport math\n%matplotlib inline\n#pytorch utility imports\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader, TensorDataset\nfrom torchvision.utils import make_grid\nimport cv2 as cv\n#neural net imports\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.autograd import Variable","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"class Dataset(torch.utils.data.Dataset):\n    def __init__(self,img_fol,mask_fol):\n        self.img_fol=img_fol\n        self.mask_fol=mask_fol\n        self.fname=os.listdir(img_fol)\n#         self.name=os.listdir(img_fol)\n    def __getitem__(self,idx):\n        name=self.fname[idx]\n        img_name_path=os.path.join(self.img_fol,name)\n        mask_name_path=os.path.join(self.mask_fol,name)\n        img=cv.imread(img_name_path)\n        img = cv.resize(img , (80 , 80))\n        img = np.transpose(img , (2,0,1))\n        mask=cv.imread(mask_name_path , cv.IMREAD_UNCHANGED)\n        mask = np.where(mask<4,mask,0)\n        mask = cv.resize(mask , (80 , 80))\n#         mask = np.transpose(mask , (2,0,1))\n        return img, mask\n\n    def __len__(self):\n        return len(self.fname)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_fol = \"../input/cityscape/ds/images_prepped_train\"\nmask_fol = \"../input/cityscape/ds/annotations_prepped_train\"\nfor_loader=Dataset(img_fol, mask_fol)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from itertools import chain\nres = list(chain(*for_loader))\nres_im =res[0::2]\nres_lab = res[1::2]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"train_images = res_im[0:int(0.75*len(res_im))]\nval_images = res_im[int(0.75*len(res_im)):int(0.9*len(res_im))]\ntest_images = res_im[int(0.9*len(res_im)):]\ntrain_labels = res_lab[0:int(0.75*len(res_im))]\nval_labels = res_lab[int(0.75*len(res_im)):int(0.9*len(res_im))]\ntest_labels = res_lab[int(0.9*len(res_im)):]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"#train\ntrain_images_tensor = torch.FloatTensor(train_images)\ntrain_labels_tensor = torch.FloatTensor(train_labels)\ntrain_tensor = TensorDataset(train_images_tensor, train_labels_tensor)\n\n#val\nval_images_tensor = torch.FloatTensor(val_images)\nval_labels_tensor = torch.FloatTensor(val_labels)\nval_tensor = TensorDataset(val_images_tensor, val_labels_tensor)\n\n#test\ntest_images_tensor = torch.FloatTensor(test_images)\ntest_labels_tensor = torch.FloatTensor(test_labels)\ntest_tensor = TensorDataset(test_images_tensor, test_labels_tensor)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"train_loader = DataLoader(train_tensor, batch_size=64, num_workers=32, shuffle=True)\nval_loader = DataLoader(val_tensor, batch_size=64, num_workers=32, shuffle=True)\ntest_loader = DataLoader(test_tensor, batch_size=64, num_workers=32, shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"class Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()        \n        self.n1 = nn.Conv2d(3, 8, kernel_size=3, stride=1, padding=1)\n        self.n2 = nn.BatchNorm2d(8)\n        self.n3 = nn.ReLU(inplace=True)\n        self.n4 = nn.Conv2d(8, 16, kernel_size=5, stride=1, padding=2)\n        self.n5 = nn.BatchNorm2d(16)\n        self.n6 = nn.ReLU(inplace=True)\n        self.n7 = nn.Dropout(p=0.4)\n        self.n8 = nn.MaxPool2d(kernel_size=2, stride=2 , return_indices=True)\n        self.n9 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)\n        self.n10 = nn.BatchNorm2d(32)\n        self.n11 = nn.ReLU(inplace=True)\n        self.n12 = nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2)\n        self.n13 = nn.BatchNorm2d(64)\n        self.n14 = nn.ReLU(inplace=True)\n        self.n15 = nn.MaxPool2d(kernel_size=2, stride=2 , return_indices=True)\n        self.n16 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)\n        self.n17 = nn.BatchNorm2d(128)\n        self.n18 = nn.ReLU(inplace=True)\n        self.n19 = nn.Dropout(p=0.4)\n        self.n20 = nn.Conv2d(128, 256, kernel_size=5, stride=1, padding=2)\n        self.n21 = nn.BatchNorm2d(256)\n        self.n22 = nn.ReLU(inplace=True)\n        self.n23 = nn.MaxPool2d(kernel_size=2, stride=2 , return_indices=True)\n\n        self.n24 = nn.MaxUnpool2d(kernel_size=2, stride=2)\n        self.n25 = nn.ConvTranspose2d(256, 128, kernel_size=5, stride=1, padding=2)\n        self.n26 = nn.BatchNorm2d(128)\n        self.n27 = nn.ReLU(inplace=True)\n        self.n28 = nn.Dropout(p=0.4)\n        self.n29 = nn.ConvTranspose2d(128, 64, kernel_size=3, stride=1, padding=1)\n        self.n30 = nn.BatchNorm2d(64)\n        self.n31 = nn.ReLU(inplace=True)\n        self.n32 = nn.MaxUnpool2d(kernel_size=2, stride=2)\n        self.n33 = nn.ConvTranspose2d(64, 32, kernel_size=5, stride=1, padding=2)\n        self.n34 = nn.BatchNorm2d(32)\n        self.n35 = nn.ReLU(inplace=True)\n        self.n36 = nn.Dropout(p=0.4)\n        self.n37 = nn.ConvTranspose2d(32, 16, kernel_size=3, stride=1, padding=1)\n        self.n38 = nn.BatchNorm2d(16)\n        self.n39 = nn.ReLU(inplace=True)\n        self.n40 = nn.MaxUnpool2d(kernel_size=2, stride=2)\n        self.n41 = nn.ConvTranspose2d(16, 8, kernel_size=5, stride=1, padding=2)\n        self.n42 = nn.BatchNorm2d(8)\n        self.n43 = nn.ReLU(inplace=True)\n        self.n44 = nn.ConvTranspose2d(8, 4, kernel_size=3, stride=1, padding=1)\n        self.n45 = nn.BatchNorm2d(4)\n        self.n46 = nn.ReLU(inplace=True)\n        \n    def forward(self, x):\n        x = self.n1(x)\n        x = self.n2(x)\n        x = self.n3(x)\n        x = self.n4(x)\n        x = self.n5(x)\n        x = self.n6(x)\n        x = self.n7(x)\n        x , y1 = self.n8(x)\n        x = self.n9(x)\n        x = self.n10(x)\n        x = self.n11(x)\n        x = self.n12(x)\n        x = self.n13(x)\n        x = self.n14(x)\n        x ,y2 = self.n15(x)\n        x = self.n16(x)\n        x = self.n17(x)\n        x = self.n18(x)\n        x = self.n19(x)\n        x = self.n20(x)\n        x = self.n21(x)\n        x = self.n22(x)\n        x ,y3 = self.n23(x)\n\n        x = self.n24(x,y3)\n        x = self.n25(x)\n        x = self.n26(x)\n        x = self.n27(x)\n        x = self.n28(x)\n        x = self.n29(x)\n        x = self.n30(x)\n        x = self.n31(x)\n        x = self.n32(x,y2)\n        x = self.n33(x)\n        x = self.n34(x)\n        x = self.n35(x)\n        x = self.n36(x)\n        x = self.n37(x)\n        x = self.n38(x)\n        x = self.n39(x)\n        x = self.n40(x,y1)\n        x = self.n41(x)\n        x = self.n42(x)\n        x = self.n43(x)\n        x = self.n44(x)\n        x = self.n45(x)\n        x = self.n46(x)\n        x = F.softmax(x)\n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def cross_entropy2d(input, target, weight=None, size_average=True):\n    n, c, h, w = input.size()\n    nt, ht, wt = target.size()\n\n    # n, c, h, w -> n, h, c, w -> n, h, w, c\n\n    input = input.transpose(1, 2).transpose(2, 3).contiguous().view(-1, c) # -> shape: (X, c)\n    target = target.view(-1)\n    loss = F.cross_entropy(\n        input, target, weight=weight, size_average=size_average, ignore_index=250\n    )\n    return loss, input, target","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"net = Net()\n\noptimizer = optim.Adam(params=net.parameters(), lr=0.001)\ncriterion = nn.CrossEntropyLoss()\n# criterion = CrossEntropy()\nexp_lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"def train_model(num_epoch):\n    net.train()\n    exp_lr_scheduler.step()\n    train_loss = 0\n    train_acc = 0\n    val_loss = 0\n    val_acc = 0\n    for batch_idx, (data, target) in enumerate(train_loader):\n\n        data, target = data, target\n        optimizer.zero_grad()\n        output = net(data)\n        loss  , input , targ = cross_entropy2d(output , target.long())\n        lo= loss.item()\n        loss.backward()\n        optimizer.step()\n        \n        print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n            num_epoch, (batch_idx + 1) * len(data), len(train_loader.dataset),\n            100. * (batch_idx + 1) / len(train_loader), lo))\n            \ndef evaluate(data_loader):\n    net.eval()\n#     loss_func = DiceLoss()\n    loss = 0\n    correct = 0\n    for data, target in data_loader:\n        data, target = data, target\n        \n        output = net(data)\n        lossy  , iny , out=  cross_entropy2d(output, target.long())\n        loss+=lossy.item()\n\n    loss /= len(data_loader.dataset)\n        \n    print('\\nAverage Val Loss: {:.4f} '.format(loss ))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_epochs = 40\n\nfor n in range(num_epochs):\n    print(f\"{n+1}\")\n    train_model(n)\n    evaluate(val_loader)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"def make_predictions(data_loader):\n    net.eval()\n    data = next(iter(data_loader))\n    data1 = torch.tensor(data[0] , dtype = torch.float32)\n    print(data1.shape)\n    output = net(data1)\n    output = torch.max(output , dim =1)[1]\n    output = torch.reshape(output  , (output.shape[0] , 80 , 80))\n    return output ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"test_set_preds  = make_predictions(test_loader)\nprint(test_set_preds.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"der = next(iter(test_loader))\ncc = np.array(der[1][21].detach().numpy())\nplt.figure(figsize=(10,10))\nplt.subplot(3,2,1)\nplt.imshow((cc))\nplt.subplot(3,2,3)\ngg = np.array(test_set_preds[21,:,:].detach().numpy())/11.0\nplt.imshow(gg)\nplt.subplot(3,2,5)\ngg1 = np.array(test_set_preds[21,:,:].detach().numpy())\nplt.imshow(gg1)\nplt.subplot(3,2,2)\ncc1 = np.array(der[1][39].detach().numpy())\nplt.imshow((cc1))\nplt.subplot(3,2,4)\ngg2 = np.array(test_set_preds[39,:,:].detach().numpy())/11.0\nplt.imshow(gg2)\nplt.subplot(3,2,6)\ngg3 = np.array(test_set_preds[39,:,:].detach().numpy())\nplt.imshow(gg3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.unique(gg) , np.unique(cc) , np.unique(gg2) , np.unique(cc1)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}