{"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":"gpu","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":10040,"sourceType":"datasetVersion","datasetId":6979}],"dockerImageVersionId":30627,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\npd.options.mode.chained_assignment = None","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-31T14:16:12.957962Z","iopub.execute_input":"2023-12-31T14:16:12.958607Z","iopub.status.idle":"2023-12-31T14:16:13.327802Z","shell.execute_reply.started":"2023-12-31T14:16:12.958578Z","shell.execute_reply":"2023-12-31T14:16:13.326963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(\"/kaggle/input/UBC-OCEAN/train.csv\")\n\ntrain_tma = train_df[train_df[\"is_tma\"] == True]\ntrain_no_tma = train_df[train_df[\"is_tma\"] == False]\ntrain_tma[\"file_path\"] = train_tma[\"image_id\"].apply(lambda x: \"/kaggle/input/UBC-OCEAN/train_images/\" + str(x) + \".png\")\ntrain_no_tma[\"file_path\"] = train_no_tma[\"image_id\"].apply(lambda x: \"/kaggle/input/UBC-OCEAN/train_thumbnails/\" + str(x) + \"_thumbnail.png\")\n\ntrain_df = pd.concat([train_tma, train_no_tma], axis=0)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:13.329721Z","iopub.execute_input":"2023-12-31T14:16:13.330247Z","iopub.status.idle":"2023-12-31T14:16:13.360655Z","shell.execute_reply.started":"2023-12-31T14:16:13.330212Z","shell.execute_reply":"2023-12-31T14:16:13.359937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv(\"/kaggle/input/UBC-OCEAN/test.csv\")\ntest_df[\"file_path\"] = test_df[\"image_id\"].apply(lambda x: \"/kaggle/input/UBC-OCEAN/test_thumbnails/\" + str(x) + \"_thumbnail.png\")","metadata":{"execution":{"iopub.status.busy":"2023-12-31T15:04:35.710202Z","iopub.execute_input":"2023-12-31T15:04:35.710576Z","iopub.status.idle":"2023-12-31T15:04:35.72203Z","shell.execute_reply.started":"2023-12-31T15:04:35.710547Z","shell.execute_reply":"2023-12-31T15:04:35.721223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nimg = Image.open(train_no_tma.iloc[0][\"file_path\"])\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:13.361713Z","iopub.execute_input":"2023-12-31T14:16:13.362007Z","iopub.status.idle":"2023-12-31T14:16:15.473896Z","shell.execute_reply.started":"2023-12-31T14:16:13.361982Z","shell.execute_reply":"2023-12-31T14:16:15.472966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_to_id = {'HGSC': 2, 'MC': 4, 'LGSC': 3, 'EC': 1, 'CC': 0}\nid_to_label = {}\nfor key, value in label_to_id.items():\n    id_to_label[value] = key","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:15.476652Z","iopub.execute_input":"2023-12-31T14:16:15.477013Z","iopub.status.idle":"2023-12-31T14:16:15.482687Z","shell.execute_reply.started":"2023-12-31T14:16:15.476977Z","shell.execute_reply":"2023-12-31T14:16:15.481685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader, Dataset\n\nimport torchvision\nfrom torchvision import models, transforms\n\ndef get_device():\n    if torch.cuda.is_available():\n        return \"cuda\"\n    else:\n        return \"cpu\"\n    \ndevice = get_device()\nprint(f\"Using {device}\")","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:15.483878Z","iopub.execute_input":"2023-12-31T14:16:15.484196Z","iopub.status.idle":"2023-12-31T14:16:18.585858Z","shell.execute_reply.started":"2023-12-31T14:16:15.484166Z","shell.execute_reply":"2023-12-31T14:16:18.584943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_transforms = {\n    'train': transforms.Compose([\n        transforms.RandomResizedCrop(224),\n        transforms.RandomHorizontalFlip(),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n    ]),\n    'val': transforms.Compose([\n        transforms.Resize(256),\n        transforms.CenterCrop(224),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n    ]),\n}","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:18.58695Z","iopub.execute_input":"2023-12-31T14:16:18.587365Z","iopub.status.idle":"2023-12-31T14:16:18.593501Z","shell.execute_reply.started":"2023-12-31T14:16:18.58734Z","shell.execute_reply":"2023-12-31T14:16:18.592621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class UBC_Dataset(Dataset):\n    def __init__(self, df, data_transform=None):\n        self.df = df\n        self.data_transform = data_transform\n    \n    def __getitem__(self, idx):\n        item = self.df.iloc[idx]\n        \n        img = Image.open(item[\"file_path\"])\n        if self.data_transform:\n            img = self.data_transform(img)\n        \n        label = label_to_id[item[\"label\"]]\n        \n        return img, label\n    \n    def __len__(self):\n        return len(self.df)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:18.594816Z","iopub.execute_input":"2023-12-31T14:16:18.595569Z","iopub.status.idle":"2023-12-31T14:16:18.605139Z","shell.execute_reply.started":"2023-12-31T14:16:18.595537Z","shell.execute_reply":"2023-12-31T14:16:18.604342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_ft = models.resnet50()\nmodel_ft.load_state_dict(torch.load(\"/kaggle/input/resnet50/resnet50.pth\"))\nnum_ftrs = model_ft.fc.in_features\nmodel_ft.fc = nn.Linear(num_ftrs, len(label_to_id))\nmodel_ft = model_ft.to(device)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:16:18.606211Z","iopub.execute_input":"2023-12-31T14:16:18.606493Z","iopub.status.idle":"2023-12-31T14:16:22.760455Z","shell.execute_reply.started":"2023-12-31T14:16:18.606471Z","shell.execute_reply":"2023-12-31T14:16:22.759649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_model(model, dataloader, criterion, optimizer, device, num_epochs=50):\n    model.train()\n    \n    for epoch in range(num_epochs):\n        print('-' * 10)\n        print(f'Epoch {epoch}/{num_epochs - 1}')\n\n        running_loss = 0.0\n        running_corrects = 0\n\n        for imgs, labels in dataloader:\n            imgs = imgs.to(device)\n            labels = labels.to(device)\n\n            optimizer.zero_grad()\n\n            outputs = model(imgs)\n            _, preds = torch.max(outputs, dim=1)\n            loss = criterion(outputs, labels)\n\n            loss.backward()\n            optimizer.step()\n\n            running_loss += loss.item() * imgs.size(0)\n            running_corrects += torch.sum(preds == labels.data)\n\n        epoch_loss = running_loss / len(dataloader.dataset)\n        epoch_acc = running_corrects.double() / len(dataloader.dataset)\n\n        print(f'Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:21:30.410915Z","iopub.execute_input":"2023-12-31T14:21:30.411259Z","iopub.status.idle":"2023-12-31T14:21:30.419607Z","shell.execute_reply.started":"2023-12-31T14:21:30.411232Z","shell.execute_reply":"2023-12-31T14:21:30.418693Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dt = UBC_Dataset(train_df, data_transforms[\"train\"])\ntrain_dataloader = DataLoader(train_dt, batch_size=2, shuffle=True)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)\n\ntrain_model(model_ft, train_dataloader, criterion, optimizer, device, num_epochs=100)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T14:21:37.057204Z","iopub.execute_input":"2023-12-31T14:21:37.057568Z","iopub.status.idle":"2023-12-31T15:03:52.23512Z","shell.execute_reply.started":"2023-12-31T14:21:37.057542Z","shell.execute_reply":"2023-12-31T15:03:52.233367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(model, file_path, device):\n    img = Image.open(file_path)\n    img = data_transforms['train'](img)\n    img = torch.unsqueeze(img, dim=0)\n    img = img.to(device)\n    \n    outputs = model(img)\n    \n    _, label_id = torch.max(outputs, dim=1)\n    \n    return id_to_label[label_id.item()]","metadata":{"execution":{"iopub.status.busy":"2023-12-31T15:14:11.640844Z","iopub.execute_input":"2023-12-31T15:14:11.641199Z","iopub.status.idle":"2023-12-31T15:14:11.646605Z","shell.execute_reply.started":"2023-12-31T15:14:11.64117Z","shell.execute_reply":"2023-12-31T15:14:11.645667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import csv\n\nsubmission_csv = \"/kaggle/working/submission.csv\"\n\nwith open(submission_csv, mode=\"w\") as f:\n    writer = csv.writer(f)\n    writer.writerow(['image_id', 'label'])\n    \n    for index, row in test_df.iterrows():\n        image_id = row[\"image_id\"]\n        file_path = row[\"file_path\"]\n        label = predict(model_ft, file_path, device)\n        \n        writer.writerow([image_id, label])","metadata":{"execution":{"iopub.status.busy":"2023-12-31T15:14:12.869179Z","iopub.execute_input":"2023-12-31T15:14:12.869535Z","iopub.status.idle":"2023-12-31T15:14:13.038634Z","shell.execute_reply.started":"2023-12-31T15:14:12.869507Z","shell.execute_reply":"2023-12-31T15:14:13.037698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}