{"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":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":7055910,"sourceType":"datasetVersion","datasetId":4061332}],"dockerImageVersionId":30587,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nimport torchvision\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset\nfrom PIL import Image\nimport torch.nn.functional as F\nimport pandas as pd\nimport torch.nn as nn\nimport numpy as np\nimport random\nimport tempfile","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:08:28.341303Z","iopub.execute_input":"2023-11-27T08:08:28.342396Z","iopub.status.idle":"2023-11-27T08:08:28.348559Z","shell.execute_reply.started":"2023-11-27T08:08:28.34236Z","shell.execute_reply":"2023-11-27T08:08:28.347572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MyDataSet(Dataset):\n    def __init__(self, images_path: list, images_class: list, transform=None):\n        self.images_path = images_path\n        self.images_class = images_class\n        self.transform = transform\n    def __len__(self):\n        return len(self.images_path)\n    def __getitem__(self, item):\n        img = Image.open(self.images_path[item])\n        label = self.images_class[item]\n        if self.transform is not None:\n            img = self.transform(img)\n            label=torch.tensor(label)\n        return img, label","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:08:30.270826Z","iopub.execute_input":"2023-11-27T08:08:30.271916Z","iopub.status.idle":"2023-11-27T08:08:30.280396Z","shell.execute_reply.started":"2023-11-27T08:08:30.271873Z","shell.execute_reply":"2023-11-27T08:08:30.279187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_image(image_path):\n    # Load the image\n    img = Image.open(image_path)\n    img_array = np.array(img)\n    # Identify non-black pixels\n    #non_black_pixels = np.where(np.any(img_array != [0, 0, 0], axis=-1))\n    # Randomly select four non-black regions of size 256x256\n    regions = []\n    selected_coords = []\n    for _ in range(4):\n        while True:\n            start_x = random.randint(0, img_array.shape[1] - 256)\n            start_y = random.randint(0, img_array.shape[0] - 256)\n            if any(start_x in range(x[0], x[0]+256) and start_y in range(y[0], y[0]+256) for x, y in selected_coords):\n                continue\n            region = img_array[start_y:start_y+256, start_x:start_x+256]\n            if np.all(region != [0, 0, 0]):\n                regions.append(region)\n                selected_coords.append(((start_x, start_x + 256), (start_y, start_y + 256)))\n                break\n\n    # Convert these regions back to images and concatenate them\n    new_img = Image.fromarray(np.concatenate([np.concatenate(regions[:2], axis=1), np.concatenate(regions[2:], axis=1)], axis=0))\n    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=\".png\")\n    new_img.save(temp_file.name)\n    return temp_file.name","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:08:32.447319Z","iopub.execute_input":"2023-11-27T08:08:32.447849Z","iopub.status.idle":"2023-11-27T08:08:32.460259Z","shell.execute_reply.started":"2023-11-27T08:08:32.447808Z","shell.execute_reply":"2023-11-27T08:08:32.458947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_path = \"/kaggle/input/UBC-OCEAN/test_thumbnails/41_thumbnail.png\"\nimage=[create_image(image_path)]\nlabel = [0]\ndata_transform = transforms.Compose([transforms.ToTensor(),\n                                     transforms.Resize((256, 256), antialias=True),\n                                     transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])\nbatch_size = 1\ndata_set = MyDataSet(images_path=image,\n                     images_class=label,\n                     transform=data_transform)\ndata_loader = torch.utils.data.DataLoader(data_set,\n                                          batch_size=batch_size,\n                                          shuffle=True,\n                                          num_workers=1,\n                                          drop_last=False)","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:08:34.590856Z","iopub.execute_input":"2023-11-27T08:08:34.592127Z","iopub.status.idle":"2023-11-27T08:08:34.982641Z","shell.execute_reply.started":"2023-11-27T08:08:34.592073Z","shell.execute_reply":"2023-11-27T08:08:34.981387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nweights = torch.load(\"/kaggle/input/ovarian-cancer-resnet/model_4.pth\", map_location=device)\nweights = {k: v for k, v in weights.items()}\n\nmodel = torchvision.models.resnet34(pretrained=False)\nnum_ftrs = model.fc.in_features\nmodel.fc = nn.Linear(num_ftrs, 5)\nmodel_dict = model.state_dict()\nmodel_dict.update(weights)\nmodel.load_state_dict(model_dict)\nmodel.to(device)","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:08:36.621139Z","iopub.execute_input":"2023-11-27T08:08:36.621628Z","iopub.status.idle":"2023-11-27T08:08:37.247998Z","shell.execute_reply.started":"2023-11-27T08:08:36.621591Z","shell.execute_reply":"2023-11-27T08:08:37.246769Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"post_pred = transforms.Compose([lambda x: F.softmax(x, dim=0)])\n\nmodel.eval()\nwith torch.no_grad():\n    y_pred = torch.tensor([], dtype=torch.float32, device=device)\n    for test_data in data_loader:\n        test_images, test_labels = test_data[0].float().to(device), test_data[1].to(device)\n        y_pred = torch.cat([y_pred, model(test_images)], dim=0)\ny_pred_act = [post_pred(i) for i in y_pred]\ny_pred_act_np = [i.cpu().numpy() for i in y_pred_act]\nlabel_map = {\"HGSC\": 0,\"LGSC\": 1, \"EC\": 2, \"CC\": 3,\"MC\": 4}\nlabel_map_inverse = {v: k for k, v in label_map.items()}\nlabels_str = [label_map_inverse[label] for label in  y_pred.argmax(dim=1).cpu().numpy()]\n# file_name = os.path.basename(image_path)\n# image_ID = file_name.split('_')[0]\n\ntest_df = pd.read_csv('/kaggle/input/UBC-OCEAN/test.csv')\nimage_id = test_df['image_id']\nsubmission= pd.DataFrame(columns=[\"image_id\", \"label\"])\nsubmission[\"label\"] = labels_str\nsubmission[\"image_id\"]= image_id\nsubmission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:26:30.065941Z","iopub.execute_input":"2023-11-27T08:26:30.066514Z","iopub.status.idle":"2023-11-27T08:26:30.338705Z","shell.execute_reply.started":"2023-11-27T08:26:30.066473Z","shell.execute_reply":"2023-11-27T08:26:30.337145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:26:33.538725Z","iopub.execute_input":"2023-11-27T08:26:33.539749Z","iopub.status.idle":"2023-11-27T08:26:33.553622Z","shell.execute_reply.started":"2023-11-27T08:26:33.539703Z","shell.execute_reply":"2023-11-27T08:26:33.552444Z"},"trusted":true},"execution_count":null,"outputs":[]}]}