{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":61446,"databundleVersionId":6962461,"sourceType":"competition"}],"dockerImageVersionId":30615,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch \nfrom torch import nn \nfrom torch.utils.data import Dataset , DataLoader \nimport cv2 \nimport os \nfrom torchvision import models\nimport tqdm","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.843231Z","iopub.execute_input":"2023-12-12T11:08:14.843662Z","iopub.status.idle":"2023-12-12T11:08:14.849289Z","shell.execute_reply.started":"2023-12-12T11:08:14.843628Z","shell.execute_reply":"2023-12-12T11:08:14.848122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.851593Z","iopub.execute_input":"2023-12-12T11:08:14.852366Z","iopub.status.idle":"2023-12-12T11:08:14.863879Z","shell.execute_reply.started":"2023-12-12T11:08:14.852298Z","shell.execute_reply":"2023-12-12T11:08:14.862344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Kidney(Dataset):\n    \n    def __init__(self , directory):\n        \n        self.dir = directory \n        \n        self.images = sorted(os.listdir(os.path.join(self.dir , 'images')))\n        self.masks = sorted(os.listdir(os.path.join(self.dir , 'labels')))\n        \n    def __len__(self):\n        \n        return len(self.images)\n    \n    def __getitem__(self , idx):\n        \n        img = os.path.join(self.dir, 'images', self.images[idx])\n        mask = os.path.join(self.dir, 'labels', self.masks[idx])\n        \n        img_ = cv2.imread(img)\n        mask_ = cv2.imread(mask , 0)\n        \n        img_ = cv2.cvtColor(img_ , cv2.COLOR_BGR2RGB)\n\n        \n        img_ = cv2.resize(img_ , (224 , 224))\n        mask_ = cv2.resize(mask_ , (224 , 224))\n        \n        img_ = img_/255 \n        mask_ = mask_/255 \n        \n        img_ = torch.from_numpy(img_).float()\n        mask_ = torch.from_numpy(mask_).float()\n        \n        img_ = img_.permute(2 , 0 , 1)\n        \n        mask_ = mask_.unsqueeze(0)\n        \n        \n        return img_ , mask_\n\n        \n    ","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.865381Z","iopub.execute_input":"2023-12-12T11:08:14.865906Z","iopub.status.idle":"2023-12-12T11:08:14.874618Z","shell.execute_reply.started":"2023-12-12T11:08:14.865873Z","shell.execute_reply":"2023-12-12T11:08:14.873660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = Kidney(\"/kaggle/input/blood-vessel-segmentation/train/kidney_1_dense\")\ndata_loader = DataLoader(dataset, batch_size=16, shuffle=True, num_workers=4)\nlen(dataset)","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.875945Z","iopub.execute_input":"2023-12-12T11:08:14.876274Z","iopub.status.idle":"2023-12-12T11:08:14.895277Z","shell.execute_reply.started":"2023-12-12T11:08:14.876245Z","shell.execute_reply":"2023-12-12T11:08:14.893863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TransformerEncoder(nn.Module):\n    \n    def __init__(self , input_channel , output_channel):\n        \n        super(TransformerEncoder, self).__init__()\n        self.transformer_layer = nn.TransformerEncoderLayer(input_channel, nhead=8)\n        self.transformer_encoder = nn.TransformerEncoder(self.transformer_layer, num_layers=4)\n        self.conv = nn.Conv2d(input_channel, output_channel, kernel_size=1)\n    \n    def forward(self , x):\n        \n        x = self.transformer_encoder(x)\n        \n        x = self.conv(x)\n        \n        return x ","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.897442Z","iopub.execute_input":"2023-12-12T11:08:14.898545Z","iopub.status.idle":"2023-12-12T11:08:14.905150Z","shell.execute_reply.started":"2023-12-12T11:08:14.898505Z","shell.execute_reply":"2023-12-12T11:08:14.904255Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class UnetTransformer(nn.Module):\n    \n    def __init__(self , input_  , output_):\n        \n        super(UnetTransformer , self).__init__()\n        \n        self.encoder = models.resnet101(pretrained=True)\n        \n        self.encoder = nn.Sequential(*list(self.encoder.children())[:-2])\n        \n        self.transformer_encoder = TransformerEncoder(512 , output_)\n        \n        self.decoder = nn.Sequential(\n            nn.Conv2d(512, 256, kernel_size=3, padding=1),\n            nn.ReLU(inplace=True),\n            nn.Conv2d(256, output_, kernel_size=1))    \n    def forward(self , x):\n        \n        x = self.encoder(x)\n        \n        x = self.transformer_encoder(x)\n        \n        x = self.decoder(x)\n        \n        return x\n","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.906568Z","iopub.execute_input":"2023-12-12T11:08:14.907508Z","iopub.status.idle":"2023-12-12T11:08:14.922941Z","shell.execute_reply.started":"2023-12-12T11:08:14.907461Z","shell.execute_reply":"2023-12-12T11:08:14.921417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input_ = 3  \noutput_= 1  ","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.925164Z","iopub.execute_input":"2023-12-12T11:08:14.925642Z","iopub.status.idle":"2023-12-12T11:08:14.934136Z","shell.execute_reply.started":"2023-12-12T11:08:14.925608Z","shell.execute_reply":"2023-12-12T11:08:14.932925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = UnetTransformer(input_ , output_)","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:14.935705Z","iopub.execute_input":"2023-12-12T11:08:14.936382Z","iopub.status.idle":"2023-12-12T11:08:15.927443Z","shell.execute_reply.started":"2023-12-12T11:08:14.936341Z","shell.execute_reply":"2023-12-12T11:08:15.926214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = model.to(device)","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:15.929068Z","iopub.execute_input":"2023-12-12T11:08:15.929471Z","iopub.status.idle":"2023-12-12T11:08:15.941228Z","shell.execute_reply.started":"2023-12-12T11:08:15.929436Z","shell.execute_reply":"2023-12-12T11:08:15.939278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = Kidney(\"/kaggle/input/blood-vessel-segmentation/train/kidney_1_dense\")\ntrain_loader = DataLoader(train_dataset , batch_size=8, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:15.944088Z","iopub.execute_input":"2023-12-12T11:08:15.944577Z","iopub.status.idle":"2023-12-12T11:08:15.953785Z","shell.execute_reply.started":"2023-12-12T11:08:15.944542Z","shell.execute_reply":"2023-12-12T11:08:15.952355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.BCELoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:08:15.955449Z","iopub.execute_input":"2023-12-12T11:08:15.956174Z","iopub.status.idle":"2023-12-12T11:08:15.964646Z","shell.execute_reply.started":"2023-12-12T11:08:15.956129Z","shell.execute_reply":"2023-12-12T11:08:15.963401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 1\nfor epoch in range(epochs):\n    \n    model.train()\n    total_loss = 0\n\n    for (img, mask) in train_loader:\n        \n        img = img.to(device)\n        mask = mask.to(device)\n        \n        if (len(img.shape)>3):\n            continue\n        out = model(img)\n        loss = criterion(out, mask)\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        total_loss += loss.item()\n\n        print(f\"Epoch: {epoch}/{epochs} | Loss: {total_loss}\")","metadata":{"execution":{"iopub.status.busy":"2023-12-12T11:09:11.175918Z","iopub.execute_input":"2023-12-12T11:09:11.176334Z","iopub.status.idle":"2023-12-12T11:09:41.892913Z","shell.execute_reply.started":"2023-12-12T11:09:11.176285Z","shell.execute_reply":"2023-12-12T11:09:41.891502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}