{"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":"none","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader, Dataset\nimport torchvision.transforms as transforms\n\nclass conv_block(nn.Module):\n    def __init__(self, in_c, out_c):\n        super().__init__()\n\n        self.conv1 = nn.Conv2d(in_c, out_c, kernel_size=3, padding=1)\n        self.bn1 = nn.BatchNorm2d(out_c)\n\n        self.conv2 = nn.Conv2d(out_c, out_c, kernel_size=3, padding=1)\n        self.bn2 = nn.BatchNorm2d(out_c)\n\n        self.relu = nn.ReLU()\n\n    def forward(self, inputs):\n        x = self.conv1(inputs)\n        x = self.bn1(x)\n        x = self.relu(x)\n\n        x = self.conv2(x)\n        x = self.bn2(x)\n        x = self.relu(x)\n\n        return x\n\n\nclass encoder_block(nn.Module):\n    def __init__(self, in_c, out_c):\n        super().__init__()\n\n        self.conv = conv_block(in_c, out_c)\n        self.pool = nn.MaxPool2d((2, 2))\n\n    def forward(self, inputs):\n        x = self.conv(inputs)\n        p = self.pool(x)\n\n        return x, p\n\n\nclass decoder_block(nn.Module):\n    def __init__(self, in_c, out_c):\n        super().__init__()\n\n        self.up = nn.ConvTranspose2d(in_c, out_c, kernel_size=2, stride=2, padding=0)\n        self.conv = conv_block(out_c+out_c, out_c)\n\n    def forward(self, inputs, skip):\n        x = self.up(inputs)\n        x = torch.cat([x, skip], axis=1)\n        x = self.conv(x)\n\n        return x\n\n# Define the U-Net architecture\nclass UNet(nn.Module):\n    def __init__(self):\n        super(UNet, self).__init__()\n        # Define the encoder (downsampling) part\n        self.encoder = nn.Sequential(\n            nn.Conv2d(3, 64, kernel_size=3, padding=1),\n            nn.ReLU(inplace=True),\n            nn.Conv2d(64, 64, kernel_size=3, padding=1),\n            nn.ReLU(inplace=True),\n            nn.MaxPool2d(kernel_size=2, stride=2)\n        )\n        # Define the decoder (upsampling) part\n        self.decoder = nn.Sequential(\n            nn.Conv2d(64, 64, kernel_size=3, padding=1),\n            nn.ReLU(inplace=True),\n            nn.Conv2d(64, 64, kernel_size=3, padding=1),\n            nn.ReLU(inplace=True),\n            nn.ConvTranspose2d(64, 3, kernel_size=2, stride=2)\n        )\n\n    def forward(self, x):\n        # Encoder part\n        x = self.encoder(x)\n        # Decoder part\n        x = self.decoder(x)\n        return x\n    \n# Define the custom dataset class\nclass ISICDataset(Dataset):\n    def __init__(self, root_dir, transform=None):\n        self.root_dir = root_dir\n        self.transform = transform\n        self.images = []\n        for item in os.listdir(root_dir):\n            item_path = os.path.join(root_dir, item)\n            if os.path.isfile(item_path) and item.lower().endswith(('.jpg', '.jpeg', '.png')):\n                self.images.append(item_path)\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image_path = self.images[idx]\n        image = Image.open(image_path).convert('RGB')\n        if self.transform:\n            image = self.transform(image)\n        return image\n\n# Define the path to the Kaggle dataset\nkaggle_input_path = '/kaggle/input'\ndataset_name = 'siim-isic-melanoma-classification/jpeg/train'\ndata_dir = os.path.join(kaggle_input_path, dataset_name)\n\n# Create a data loader\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n])\ndataset = ISICDataset(data_dir, transform=transform)\ndataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)\n\n# Define the U-Net model\nunet_model = UNet()\n\n# Define the loss function and optimizer\ncriterion = nn.MSELoss()\noptimizer = optim.Adam(unet_model.parameters(), lr=0.001)\n\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n\n# Training loop\nnum_epochs = 10\nfor epoch in range(num_epochs):\n    running_loss = 0.0\n    for i, images in enumerate(dataloader):\n        images = images.to(device)\n        optimizer.zero_grad()\n        outputs = unet_model(images)\n        loss = criterion(outputs, images)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n        if i % 10 == 9:\n            print(f'Epoch [{epoch + 1}/{num_epochs}], Step [{i + 1}/{len(dataloader)}], Loss: {running_loss / 10:.4f}')\n            running_loss = 0.0\n\nprint('Finished Training')\n\n\n\n# # Iterate over the data loader\n# for images, labels in dataloader:\n#     # Do something with the data\n#     print(images.shape)\n#     print(labels.shape)\n","metadata":{"execution":{"iopub.status.busy":"2024-02-10T09:50:10.474575Z","iopub.execute_input":"2024-02-10T09:50:10.475034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport torch\nimport torchvision.transforms as transforms\nfrom PIL import Image\nfrom torch.utils.data import DataLoader, Dataset\n\nclass ISICDataset(Dataset):\n    def __init__(self, root_dir, transform=None):\n        self.root_dir = root_dir\n        self.transform = transform\n        self.images = []\n        self.masks = []\n        for item in os.listdir(root_dir):\n            item_path = os.path.join(root_dir, item)\n            if os.path.isfile(item_path):\n                if item.lower().endswith(('.jpg', '.jpeg', '.png')):\n                    self.images.append(item_path)\n                elif item.lower().endswith('.mask'):  # Assuming mask files have the \".mask\" extension\n                    self.masks.append(item_path)\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image_path = self.images[idx]\n        mask_path = self.masks[idx]\n \n        image = Image.open(image_path).convert('RGB')\n        mask = Image.open(mask_path).convert('L')  # Assuming masks are grayscale images\n\n        if self.transform:\n            image = self.transform(image)\n            mask = self.transform(mask)\n\n        return image, mask\n\n# Define the path to the Kaggle dataset\nkaggle_input_path = '/kaggle/input'\ndataset_name = 'siim-isic-melanoma-classification/jpeg/train'\ndata_dir = os.path.join(kaggle_input_path, dataset_name)\n\n# Create a data loader\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n])\ndataset = ISICDataset(data_dir, transform=transform)\ndataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)\n\n# Iterate over the data loader\nfor images, masks in dataloader:\n    # Do something with the data\n    print(images.shape)\n    print(masks.shape)\n","metadata":{},"execution_count":null,"outputs":[]}]}