{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":34547,"databundleVersionId":3897958,"sourceType":"competition"}],"dockerImageVersionId":30747,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nimport os\nimport torch\nimport torch.nn as nn\nfrom torch.autograd import Variable\nfrom torch.utils.data import DataLoader\nimport torch.optim as optim\nimport torch.nn.functional as F\nimport torchvision.transforms as transforms\nimport cv2\nfrom tqdm import tqdm\nfrom torch.utils.data import Dataset\nimport matplotlib.pyplot as plt\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        if filename.endswith('.csv'):\n            print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/hubmap-organ-segmentation/train.csv')\ntest = pd.read_csv('/kaggle/input/hubmap-organ-segmentation/test.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_image = cv2.imread('/kaggle/input/hubmap-organ-segmentation/train_images/10703.tiff')\nplt.imshow(cv2.cvtColor(sample_image, cv2.COLOR_BGR2RGB))\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class FDataset(Dataset):\n    def __init__(self, dataframe, transform=None, target_size=(512, 512)):\n        self.dataframe = dataframe\n        self.transform = transform\n        self.target_size = target_size\n\n    def __len__(self):\n        return len(self.dataframe)\n\n    def __getitem__(self, idx):\n        img_id = self.dataframe.iloc[idx][\"id\"]\n        img_path = f'/kaggle/input/hubmap-organ-segmentation/train_images/{img_id}.tiff'\n    \n        if not os.path.isfile(img_path):\n            return None  # or raise an exception to skip this data point.\n\n        img = cv2.imread(img_path)\n        if img is None:\n            return None\n\n        rle = self.dataframe.iloc[idx][\"rle\"]\n        height = self.dataframe.iloc[idx][\"img_height\"]\n        width = self.dataframe.iloc[idx][\"img_width\"]\n        mask = rle_to_mask(rle, height, width)\n\n        img = cv2.resize(img, self.target_size)\n        mask = cv2.resize(mask, self.target_size, interpolation=cv2.INTER_NEAREST)\n\n        if self.transform:\n            img = self.transform(img)\n            mask = torch.tensor(mask, dtype=torch.float32).unsqueeze(0)  # (1, H, W)\n            \n        if img is None or mask is None:\n            return None\n        return img, mask\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def collate_fn(batch):\n    # Filter out None values from the batch\n    batch = list(filter(lambda x: x is not None, batch))\n    if len(batch) == 0:\n        return None  # Handle cases where an entire batch is invalid\n    return torch.utils.data.default_collate(batch)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_to_mask(rle, height, width):\n    mask = np.zeros(height * width, dtype=np.uint8)\n    rle = list(map(int, rle.split()))\n    for i in range(0, len(rle), 2):\n        start = rle[i] - 1\n        length = rle[i + 1]\n        mask[start:start + length] = 1\n    return mask.reshape((height, width)).T","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.Resize((512, 512)),\n    transforms.ToTensor(),\n])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = FDataset(dataframe=train, transform=transform, target_size=(512, 512))\ntest_dataset = FDataset(dataframe=test, transform=transform, target_size=(512,512))\ntrain_loader = DataLoader(train_dataset, batch_size=8, shuffle=True, num_workers=2)\ntest_loader = DataLoader(test_dataset, batch_size=8, shuffle=False, num_workers=2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNNModel(nn.Module):\n    def __init__(self):\n        super(CNNModel, self).__init__()\n        self.cnn1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)\n        self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)\n        self.cnn2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)\n        self.cnn3 = nn.Conv2d(128, 256, kernel_size=3, padding=1)\n        self.cnn4 = nn.Conv2d(256, 128, kernel_size=3, padding=1)\n        self.cnn5 = nn.Conv2d(128, 3, kernel_size=1)\n        \n        self._to_linear = None\n        self.convs = nn.Sequential(\n            self.cnn1,\n            nn.ReLU(),\n            self.pool,\n            self.cnn2,\n            nn.ReLU(),\n            self.pool,\n            self.cnn3,\n            nn.ReLU(),\n            self.pool,\n            self.cnn4,\n            nn.ReLU(),\n            self.pool,\n            self.cnn5, \n        )\n        self._get_output_size((3, 512, 512))\n\n        self.fc1 = nn.Linear(self._to_linear, 512)\n        self.fc2 = nn.Linear(512, 3)\n\n    def _get_output_size(self, input_shape):\n        \"\"\" Calculate the size of the flattened output from the convolutional layers. \"\"\"\n        with torch.no_grad():\n            x = torch.randn(1, *input_shape)\n            x = self.convs(x)\n            self._to_linear = int(torch.prod(torch.tensor(x.shape[1:])))\n    \n    def forward(self, x):\n        x = self.convs(x) \n        x = F.interpolate(x, size=(512, 512), mode='bilinear', align_corners=False)\n        x = F.softmax(x, dim=1)\n        return x","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CNNModel()\n\n\nbatch_size = 8\nn_iters = 2500\nnum_epochs = n_iters // (len(train_loader.dataset) // batch_size)\nnum_epochs = int(num_epochs)\ncriterion = nn.CrossEntropyLoss()\nlearning_rate = 0.001\noptimizer = optim.SGD(model.parameters(), lr=learning_rate)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count = 0\nloss_list = []\niteration_list = []\naccuracy_list = []\n\nfor epoch in range(num_epochs):\n    model.train()\n\n    for images, masks in train_loader:\n\n        outputs = model(images)\n\n        masks = masks.squeeze(1)\n        masks = masks.long()\n        \n        loss = criterion(outputs, masks)\n\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        count += 1\n        \n        if count % 50 == 0:       \n            correct = 0\n            total = 0\n            model.eval()\n            with torch.no_grad():\n                for images, masks in test_loader:\n                    outputs = model(images)\n\n                    _, predicted = torch.max(outputs.data, 1)\n\n                    total += masks.numel()\n                    correct += (predicted == masks).sum().item()\n            \n            accuracy = 100 * correct / float(total)\n            \n            loss_list.append(loss.item())\n            iteration_list.append(count)\n            accuracy_list.append(accuracy)\n            \n            if count % 500 == 0:\n                print('Iteration: {}  Loss: {:.4f}  Accuracy: {:.2f} %'.format(count, loss.item(), accuracy))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(iteration_list,loss_list)\nplt.xlabel(\"Number of iteration\")\nplt.ylabel(\"Loss\")\nplt.title(\"CNN: Loss vs Number of iteration\")\nplt.show()\n\nplt.plot(iteration_list,accuracy_list,color = \"blue\")\nplt.xlabel(\"Number of iteration\")\nplt.ylabel(\"Accuracy\")\nplt.title(\"CNN: Accuracy vs Number of iteration\")\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mask_to_rle(mask):\n    pixels = mask.flatten()\n    rle = []\n    prev = 0\n    for i, pixel in enumerate(pixels):\n        if pixel != prev:\n            rle.append(i + 1)\n            prev = pixel\n    rle_str = \" \".join(map(str, rle))\n    return rle_str\n\nsubmission = []\nfor img_id, predicted_mask in test_predictions:\n    rle = mask_to_rle(predicted_mask)\n    submission.append({'id': img_id, 'rle': rle})","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.DataFrame(submission)\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}