{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Basic python import\nimport os\nimport sys\nimport yaml\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\nimport tifffile\n\n# Pytorch\nimport torch\nfrom torch.utils.data import DataLoader, Dataset\nimport torch.optim as optim\nimport torch.nn as nn\nimport torchvision.transforms as transforms\n\nsys.path.append('../input/')\nimport models","metadata":{"execution":{"iopub.status.busy":"2023-04-09T08:42:32.682921Z","iopub.execute_input":"2023-04-09T08:42:32.683346Z","iopub.status.idle":"2023-04-09T08:42:35.927184Z","shell.execute_reply.started":"2023-04-09T08:42:32.683317Z","shell.execute_reply":"2023-04-09T08:42:35.925991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fonctions and classes used","metadata":{}},{"cell_type":"code","source":"class CustomTestDataset(Dataset):\n    def __init__(self, root_dir, reshape_size):\n        self.root_dir = root_dir\n        self.image_files = os.listdir(os.path.join(root_dir, \"test_images\"))\n        self.meta_df = pd.read_csv(os.path.join(root_dir,'test.csv')).sort_values(by = 'id')\n        self.format_transform = transforms.Compose([\n            transforms.ToTensor(),\n            transforms.Resize((reshape_size, reshape_size))\n        ])\n\n    def __len__(self):\n        return len(self.image_files)\n\n    def __getitem__(self, idx):\n        image_path = os.path.join(self.root_dir, \"test_images\", self.image_files[idx])\n        image_id = self.image_files[idx][:-5]\n        image = tifffile.imread(image_path)\n        organ = self.meta_df[self.meta_df[\"id\"] == int(self.image_files[idx][:-5])][\"organ\"].values[0]\n        image_tensor = self.format_transform(image)\n\n        return (image_id, image_tensor, organ)\n\ndef get_test_dataset_and_dataloader(batch_size = 4,input_size = 1024, root_dir = os.path.join('..','data')):\n    \"\"\"\n    Load the training and test datasets into data loaders.\n    \"\"\"\n\n    test_dataset = CustomTestDataset(root_dir = root_dir, reshape_size = 1024)\n\n    if batch_size > 1:\n        test_dl = DataLoader(test_dataset, batch_size=batch_size, shuffle=True)\n        return test_dataset, test_dl\n\n    return test_dataset, None\n\ndef rle_encode(img):\n    \"\"\" TBD\n    \n    Args:\n        img (np.array): \n            - 1 indicating mask\n            - 0 indicating background\n    \n    Returns: \n        run length as string formated\n    \"\"\"\n    \n    img = img.T\n    pixels = img.flatten()\n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)\n\ndef make_submission2(model, device, test_df, test_dataset, threshold):\n    submission = {'id':[], 'rle':[]}\n    for idx, image, organ in test_dataset:\n        mask = model(torch.unsqueeze(image, dim=0).to(device)) # Depend on the test dataloader\n        img_row =  test_df[test_df['id']==int(idx)]\n        height, width = img_row['img_height'].item(), img_row['img_width'].item()\n        resized_mask = transforms.Resize((height, width))(mask).cpu().detach().numpy()\n        submission[\"id\"].append(idx)\n        binary_mask = (resized_mask> threshold).astype(np.uint8)[0][0]\n        submission['rle'].append(rle_encode(binary_mask))\n    # Create .csv\n    #test_df = pd.read_csv(\"HuBMAP-tissue-segmentation/data/\" + \"test.csv\")\n    sub = pd.DataFrame(submission)\n    sub.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-04-09T08:55:42.402213Z","iopub.execute_input":"2023-04-09T08:55:42.403117Z","iopub.status.idle":"2023-04-09T08:55:42.419400Z","shell.execute_reply.started":"2023-04-09T08:55:42.403065Z","shell.execute_reply":"2023-04-09T08:55:42.418051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Config","metadata":{}},{"cell_type":"markdown","source":"Ma proposition : \nAvoir un Notebook template associé à des paramètres par défaut. \nEnsuite pour chaque expérience on le duplique, et on change les valeurs des paramètres que l'on souhaite.","metadata":{}},{"cell_type":"code","source":"data_dir = \"/kaggle/input/hubmap-organ-segmentation\"\n\nDEBUG = False\n\nbatch_size = 1\n\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else 'cpu')","metadata":{"execution":{"iopub.status.busy":"2023-04-09T08:42:39.452410Z","iopub.execute_input":"2023-04-09T08:42:39.452982Z","iopub.status.idle":"2023-04-09T08:42:39.565175Z","shell.execute_reply.started":"2023-04-09T08:42:39.452934Z","shell.execute_reply":"2023-04-09T08:42:39.563200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Dataset and Dataloader","metadata":{}},{"cell_type":"code","source":"test_dataset, test_dataloader = get_test_dataset_and_dataloader(batch_size=batch_size ,input_size=1024,root_dir = data_dir)","metadata":{"execution":{"iopub.status.busy":"2023-04-09T08:42:41.651401Z","iopub.execute_input":"2023-04-09T08:42:41.651802Z","iopub.status.idle":"2023-04-09T08:42:41.678985Z","shell.execute_reply.started":"2023-04-09T08:42:41.651768Z","shell.execute_reply":"2023-04-09T08:42:41.678034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load model","metadata":{}},{"cell_type":"code","source":"model_name = '../input/models/save_09_04_2023_21_04_31.pt'\nMODEL = torch.load(model_name)","metadata":{"execution":{"iopub.status.busy":"2023-04-09T08:42:49.110374Z","iopub.execute_input":"2023-04-09T08:42:49.111056Z","iopub.status.idle":"2023-04-09T08:42:52.095705Z","shell.execute_reply.started":"2023-04-09T08:42:49.111019Z","shell.execute_reply":"2023-04-09T08:42:52.094665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"threshold_best = 0.410\n\ntest_df = pd.read_csv(os.path.join(data_dir, 'test.csv'))\n\nmake_submission2(MODEL, device, test_df, test_dataset, threshold_best)","metadata":{"execution":{"iopub.status.busy":"2023-04-09T08:54:43.310825Z","iopub.execute_input":"2023-04-09T08:54:43.311232Z","iopub.status.idle":"2023-04-09T08:54:43.635720Z","shell.execute_reply.started":"2023-04-09T08:54:43.311198Z","shell.execute_reply":"2023-04-09T08:54:43.634674Z"},"trusted":true},"execution_count":null,"outputs":[]}]}