{"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":"markdown","source":"## Base Notebooks\n https://www.kaggle.com/code/tanakar/2-5d-segmentaion-baseline-training\n \n https://www.kaggle.com/code/yoyobar/3d-resnet-baseline-inference","metadata":{"id":"4iikY8ombgYd"}},{"cell_type":"markdown","source":"# Imports & Installations","metadata":{"id":"MWzkSh-vbgYe"}},{"cell_type":"code","source":"# !pip install segmentation_models_pytorch --quiet","metadata":{"id":"JMNe53qSbgYf","outputId":"a26f54a0-8c25-484c-9900-8494b89ed2f0","execution":{"iopub.status.busy":"2023-06-04T12:16:28.161815Z","iopub.execute_input":"2023-06-04T12:16:28.162600Z","iopub.status.idle":"2023-06-04T12:16:28.167441Z","shell.execute_reply.started":"2023-06-04T12:16:28.162553Z","shell.execute_reply":"2023-06-04T12:16:28.166157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nimport math\nimport matplotlib.patches as patches\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport random\nimport scipy as sp\nimport shutil\nimport sys\nimport os\nimport gc\n\nfrom pathlib import Path\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nimport cv2\n\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam\nfrom torch.utils.data import DataLoader, Dataset, SubsetRandomSampler\n\nfrom tqdm.auto import tqdm\n\nfrom IPython.display import HTML, display\nfrom PIL import Image\n\n\nimport warnings\n\nwarnings.filterwarnings(\"ignore\", category=Image.DecompressionBombWarning)\n","metadata":{"id":"dc0VdGD3eyEP","execution":{"iopub.status.busy":"2023-06-04T12:16:36.452205Z","iopub.execute_input":"2023-06-04T12:16:36.452688Z","iopub.status.idle":"2023-06-04T12:16:40.628739Z","shell.execute_reply.started":"2023-06-04T12:16:36.452621Z","shell.execute_reply":"2023-06-04T12:16:40.627656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Install segmentation_models_pytorch**","metadata":{"id":"CEDkGoHlbgYg"}},{"cell_type":"code","source":"sys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\nsys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/segmentation-models-pytorch/segmentation_models.pytorch-master')\n","metadata":{"id":"BrrDx59pbgYg","execution":{"iopub.status.busy":"2023-06-04T12:16:40.630879Z","iopub.execute_input":"2023-06-04T12:16:40.631368Z","iopub.status.idle":"2023-06-04T12:16:40.637441Z","shell.execute_reply.started":"2023-06-04T12:16:40.631338Z","shell.execute_reply":"2023-06-04T12:16:40.636194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import segmentation_models_pytorch as smp\nfrom segmentation_models_pytorch import utils","metadata":{"id":"4sttIJjlbgYg","execution":{"iopub.status.busy":"2023-06-04T12:16:40.639186Z","iopub.execute_input":"2023-06-04T12:16:40.640018Z","iopub.status.idle":"2023-06-04T12:16:43.488969Z","shell.execute_reply.started":"2023-06-04T12:16:40.639936Z","shell.execute_reply":"2023-06-04T12:16:43.487738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Configuration","metadata":{"id":"ndbIBPZ1bgYg"}},{"cell_type":"code","source":"class CFG:\n    # ============== directories =============\n#     root_dir = '/content/drive/MyDrive/kaggle/'\n    root_dir = '/kaggle/input/vesuvius-challenge-ink-detection/'\n    # ============== model =============\n    backbone = 'efficientnet-b5'\n    in_chans = 6 \n    # ============== parameters =============\n    size = 224\n    tile_size = 224\n    stride = tile_size // 2\n    train_batch_size = 16 \n    valid_batch_size = 32\n    valid_id = 1\n    num_workers = 1\n    threshold = 0.4\n    # ============== augmentation =============\n    train_aug_list = [\n        A.Resize(size, size),\n        A.HorizontalFlip(p=0.5),\n        A.VerticalFlip(p=0.5),\n        A.RandomBrightnessContrast(p=0.75),\n        A.ShiftScaleRotate(p=0.75),\n        A.OneOf([\n                A.GaussNoise(var_limit=[10, 50]),\n                A.GaussianBlur(),\n                A.MotionBlur(),\n                ], p=0.4),\n        A.GridDistortion(num_steps=5, distort_limit=0.3, p=0.5),\n        A.CoarseDropout(max_holes=1, max_width=int(size * 0.3), max_height=int(size * 0.3), \n                        mask_fill_value=0, p=0.5),\n        A.Normalize(mean= [0] * in_chans, std= [1] * in_chans),\n        ToTensorV2(transpose_mask=True)\n    ]\n\n    valid_aug_list = [\n        A.Resize(size, size),\n        A.Normalize(mean= [0] * in_chans, std= [1] * in_chans),\n        ToTensorV2(transpose_mask=True)\n    ]\n\n    # ============== seed =============\n    seed = 42\n    # ============== train =============\n    train = False\n    # ==============  TTA =============\n    TTA = False\n    # ============== submission =============\n    submission = True","metadata":{"id":"ab_HusbuEx68","execution":{"iopub.status.busy":"2023-06-04T12:16:50.998995Z","iopub.execute_input":"2023-06-04T12:16:50.999386Z","iopub.status.idle":"2023-06-04T12:16:51.012452Z","shell.execute_reply.started":"2023-06-04T12:16:50.999352Z","shell.execute_reply":"2023-06-04T12:16:51.011411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Set Device**","metadata":{"id":"HAjMNVYgFmZ5"}},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","metadata":{"id":"sdxjxvpiFltm","execution":{"iopub.status.busy":"2023-06-04T12:16:54.104814Z","iopub.execute_input":"2023-06-04T12:16:54.105384Z","iopub.status.idle":"2023-06-04T12:16:54.188991Z","shell.execute_reply.started":"2023-06-04T12:16:54.105338Z","shell.execute_reply":"2023-06-04T12:16:54.186708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Helper Functions","metadata":{"id":"tOdhnCNlbgYh"}},{"cell_type":"code","source":"def plot_images(num_of_images, title_image_dict, cmap_list=None, figsize=(12, 24), font_size=15, same_title=False, axis='off'):\n    plt.rcParams.update({'font.size': font_size})\n    plt.figure(figsize=figsize)\n\n    if same_title:\n        title = np.full(num_of_images, str(list(title_image_dict.keys())[0]))\n        values = list(title_image_dict.values())[0]\n    else:\n        values = list(title_image_dict.values())\n        title = list(title_image_dict.keys())\n\n    rows = (num_of_images - 1) // 3 + 1  # Calculate the number of rows needed\n\n    for i in range(num_of_images):\n        plt.subplot(rows, 3, i + 1)  # Use 3 as the number of columns\n        plt.axis(axis)\n\n        if cmap_list is not None:\n            plt.imshow(values[i], cmap=cmap_list[i])\n        else:\n            plt.imshow(values[i])\n\n        plt.title(f'{title[i]}')\n\n    plt.tight_layout()  # Adjust the layout to prevent overlapping","metadata":{"id":"QZkx0yCuUfqa","execution":{"iopub.status.busy":"2023-06-04T12:16:55.120021Z","iopub.execute_input":"2023-06-04T12:16:55.120625Z","iopub.status.idle":"2023-06-04T12:16:55.131853Z","shell.execute_reply.started":"2023-06-04T12:16:55.120578Z","shell.execute_reply":"2023-06-04T12:16:55.130406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_metrics(train_logs, valid_logs):\n    epochs = range(0, len(train_logs['loss']))\n\n    # Plot loss\n    plt.figure(figsize=(16, 4))\n    plt.subplot(1, 3, 1)\n    plt.plot(epochs, train_logs['loss'], 'b-', label='Train Loss')\n    plt.plot(epochs, valid_logs['loss'], 'r-', label='Validation Loss')\n    plt.title('Train and Validation Loss')\n    plt.xlabel('Epochs')\n    plt.ylabel('Loss')\n    plt.legend()\n\n    # Plot F-score\n    plt.subplot(1, 3, 2)\n    plt.plot(epochs, train_logs['fscore'], 'b-', label='Train F-score')\n    plt.plot(epochs, valid_logs['fscore'], 'r-', label='Validation F-score')\n    plt.title('Train and Validation F-score')\n    plt.xlabel('Epochs')\n    plt.ylabel('F-score')\n    plt.legend()\n\n    # Plot IoU\n    plt.subplot(1, 3, 3)\n    plt.plot(epochs, train_logs['iou'], 'b-', label='Train IoU')\n    plt.plot(epochs, valid_logs['iou'], 'r-', label='Validation IoU')\n    plt.title('Train and Validation IoU')\n    plt.xlabel('Epochs')\n    plt.ylabel('IoU')\n    plt.legend()\n\n    # Adjust layout and display the plot\n    plt.tight_layout()\n    plt.show()\n","metadata":{"id":"yqTVjjfabgYh","execution":{"iopub.status.busy":"2023-06-04T12:16:55.313960Z","iopub.execute_input":"2023-06-04T12:16:55.314833Z","iopub.status.idle":"2023-06-04T12:16:55.326351Z","shell.execute_reply.started":"2023-06-04T12:16:55.314792Z","shell.execute_reply":"2023-06-04T12:16:55.325172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle(img):\n    pixels = img.flatten()\n    \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)","metadata":{"id":"s7shwOo1bgYi","execution":{"iopub.status.busy":"2023-06-04T12:16:55.479458Z","iopub.execute_input":"2023-06-04T12:16:55.479780Z","iopub.status.idle":"2023-06-04T12:16:55.486001Z","shell.execute_reply.started":"2023-06-04T12:16:55.479751Z","shell.execute_reply":"2023-06-04T12:16:55.484976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def set_seed(seed=None, cudnn_deterministic=True):\n    if seed is None:\n        seed = 42\n\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = cudnn_deterministic\n    torch.backends.cudnn.benchmark = False","metadata":{"id":"gd2Co2K-bgYi","execution":{"iopub.status.busy":"2023-06-04T12:16:55.791927Z","iopub.execute_input":"2023-06-04T12:16:55.792293Z","iopub.status.idle":"2023-06-04T12:16:55.801696Z","shell.execute_reply.started":"2023-06-04T12:16:55.792259Z","shell.execute_reply":"2023-06-04T12:16:55.800687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"set_seed(CFG.seed)","metadata":{"id":"TkY_PFNhF3YX","execution":{"iopub.status.busy":"2023-06-04T12:16:56.576092Z","iopub.execute_input":"2023-06-04T12:16:56.577070Z","iopub.status.idle":"2023-06-04T12:16:56.584884Z","shell.execute_reply.started":"2023-06-04T12:16:56.577029Z","shell.execute_reply":"2023-06-04T12:16:56.583629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Visualization","metadata":{"id":"xG9rH9G_UM1M"}},{"cell_type":"markdown","source":"**Train Image Layers Display**","metadata":{"id":"H70jJ92OVTAm"}},{"cell_type":"code","source":"mid = 65 // 2\nstart = mid - CFG.in_chans // 2\nend = mid + CFG.in_chans // 2\n\nfor i in tqdm(range(1, 4)):\n    images = []\n    for filename in tqdm(sorted(glob.glob(f\"{CFG.root_dir}train/{i}/surface_volume/*.tif\"))[start:end]):\n        image = np.array(Image.open(filename), dtype=np.float32)/65535.0\n        images.append(image)\n    fig, axes = plt.subplots(1, len(images), figsize=(15, 3))\n    for image, ax in zip(images, axes):\n        ax.imshow(np.array(Image.fromarray(image).resize((image.shape[1]//20, image.shape[0]//20)),\n                        dtype=np.float32), cmap='gray')  \n        ax.set_xticks([]); ax.set_yticks([])\n        \n    fig.tight_layout()\n    print(f\"Train file {i}: layers {start} - {end}\")\n    plt.show()\n\ndel images\ngc.collect()","metadata":{"id":"jiEQSe2CVaun","execution":{"iopub.status.busy":"2023-06-04T12:16:57.963471Z","iopub.execute_input":"2023-06-04T12:16:57.963974Z","iopub.status.idle":"2023-06-04T12:17:50.543699Z","shell.execute_reply.started":"2023-06-04T12:16:57.963936Z","shell.execute_reply":"2023-06-04T12:17:50.542668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Train Ink Labels Display**","metadata":{"id":"8HtoPA8ck3yI"}},{"cell_type":"code","source":"example_dict = {}\nshape_list = []\nfor i in tqdm(range(1, 4)):\n    example_image = Image.open(f\"{CFG.root_dir}train/{i}/ir.png\")\n    shape_list.append(f\"Image {i} shape = {example_image.size[::-1]}\\n\")\n    # Resize the image to a smaller size for display\n    example_image = example_image.resize((512, 512))  \n    example_dict[f\"Image #{i}\"] = example_image\n\nplot_images(3, example_dict, cmap_list=['gray']*3, figsize=(22,22), font_size= 18)\nfor details in shape_list:\n    print(details)","metadata":{"id":"bjWbQzwjk1h5","execution":{"iopub.status.busy":"2023-06-04T12:17:50.545674Z","iopub.execute_input":"2023-06-04T12:17:50.546682Z","iopub.status.idle":"2023-06-04T12:17:55.100383Z","shell.execute_reply.started":"2023-06-04T12:17:50.546613Z","shell.execute_reply":"2023-06-04T12:17:55.098717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Image & Mask","metadata":{"id":"lTz5MsbybgYj"}},{"cell_type":"code","source":"def read_image_mask(fragment_id, dir='train', test=False):\n    \n    \"\"\"\n    This function takes a fragment ID (1/2/3) as input and returns the middle 6 layers (29-34) \n    out of a total of 65 layers from the surface_volume file. It also pads both the surface_volume \n    file and the corresponding mask, and normalizes the mask values to range between 0 and 1.\n    \n    Args:\n        fragment_id (int): ID of the fragment (1/2/3).\n    \n    Returns:\n        surface_volume_layers (numpy array): The middle 6 layers (29-34) of the surface_volume file stacked, after padding.\n        normalized_mask (numpy array): The corresponding mask, padded and normalized between 0 and 1.\n    \"\"\"\n    \n    images = []\n\n    mid = 65 // 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(CFG.root_dir + f\"{dir}/{fragment_id}/surface_volume/{i:02}.tif\", 0)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    if test == True:\n        return images\n\n    mask = cv2.imread(CFG.root_dir + f\"train/{fragment_id}/inklabels.png\", 0)\n    mask = np.pad(mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n    mask = mask.astype('float32')\n    mask /= 255.0\n    \n    return images, mask","metadata":{"id":"pon_0vHobgYj","execution":{"iopub.status.busy":"2023-06-04T12:17:55.102037Z","iopub.execute_input":"2023-06-04T12:17:55.102705Z","iopub.status.idle":"2023-06-04T12:17:55.115802Z","shell.execute_reply.started":"2023-06-04T12:17:55.102667Z","shell.execute_reply":"2023-06-04T12:17:55.114698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_train_valid_dataset():\n    \n    \"\"\"\n    This function separates the fragments into 2 training data fragments and 1 validation data fragment.\n    Each fragment is divided into smaller images of shape (224, 224) with a stride of (112, 112).\n    The function applies the same division process to the fragments' masks and returns the train_images,\n    train_masks, valid_images and valid_masks. Additionally, it returns valid_xyxys, which represents the \n    (x, y) coordinates of the top-left and bottom-right vertices of each image in the validation set.\n    \n    Returns:\n        train_images (list): List of training images divided from the fragments.\n        train_masks (list): List of training masks divided from the fragments masks.\n        valid_images (list): List of validation images divided from the fragment.\n        valid_masks (list): List of validation masks divided from the fragment mask.\n        valid_xyxys (list): List of (x, y) coordinates representing the top-left and bottom-right vertices\n                            of each image in the validation set.\n    \"\"\"\n    train_images = []\n    train_masks = []\n\n    valid_images = []\n    valid_masks = []\n    valid_xyxys = []\n\n    for fragment_id in range(1, 4):\n\n        image, mask = read_image_mask(fragment_id)\n\n        x1_list = list(range(0, image.shape[1]-CFG.tile_size+1, CFG.stride))\n        y1_list = list(range(0, image.shape[0]-CFG.tile_size+1, CFG.stride))\n\n        for y1 in y1_list:\n            for x1 in x1_list:\n                y2 = y1 + CFG.tile_size\n                x2 = x1 + CFG.tile_size\n        \n                if fragment_id == CFG.valid_id:\n                    valid_images.append(image[y1:y2, x1:x2])\n                    valid_masks.append(mask[y1:y2, x1:x2, None])\n\n                    valid_xyxys.append([x1, y1, x2, y2])\n                else:\n                    train_images.append(image[y1:y2, x1:x2])\n                    train_masks.append(mask[y1:y2, x1:x2, None])\n                    \n    valid_xyxys = np.stack(valid_xyxys)\n    return train_images, train_masks, valid_images, valid_masks, valid_xyxys","metadata":{"id":"cWWIZbaLbgYj","execution":{"iopub.status.busy":"2023-06-04T12:17:55.118465Z","iopub.execute_input":"2023-06-04T12:17:55.119088Z","iopub.status.idle":"2023-06-04T12:17:55.133947Z","shell.execute_reply.started":"2023-06-04T12:17:55.119050Z","shell.execute_reply":"2023-06-04T12:17:55.132913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images, train_masks, valid_images, valid_masks, valid_xyxys = get_train_valid_dataset()","metadata":{"id":"9-tyhjegbgYj","execution":{"iopub.status.busy":"2023-06-04T12:17:55.135332Z","iopub.execute_input":"2023-06-04T12:17:55.135928Z","iopub.status.idle":"2023-06-04T12:18:08.514911Z","shell.execute_reply.started":"2023-06-04T12:17:55.135895Z","shell.execute_reply":"2023-06-04T12:18:08.513791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"Train set: {len(train_images)} images | {len(train_masks)} masks\")\nprint(f\"Validation set: {len(valid_images)} images | {len(valid_masks)} masks\")\nprint(f\"\\nFirst 5 validation images coordinates:\\n{valid_xyxys[:5]}\")","metadata":{"id":"U9fjQG0tbgYk","execution":{"iopub.status.busy":"2023-06-04T12:18:08.516580Z","iopub.execute_input":"2023-06-04T12:18:08.517566Z","iopub.status.idle":"2023-06-04T12:18:08.525166Z","shell.execute_reply.started":"2023-06-04T12:18:08.517519Z","shell.execute_reply":"2023-06-04T12:18:08.523861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Create image list to display in video**","metadata":{"id":"Z_FpGxsYXiPX"}},{"cell_type":"code","source":"def generate_patched_images(coordinates, fragment_id):\n    output_images = []  # List to store the patched images as NumPy arrays\n\n    sample_image = cv2.imread(CFG.root_dir + f\"train/{fragment_id}/inklabels.png\", 0)\n\n    random_numbers = random.sample(range(1, len(coordinates)), 19)\n    random_numbers.insert(0, 0)\n    random_numbers.sort()\n\n    for i in tqdm(range(len(random_numbers))):\n        x, y = coordinates[random_numbers[i]][:2]\n        rect = (x, y, CFG.size, CFG.size) \n        fig, ax = plt.subplots()\n        ax.imshow(sample_image, cmap='gray')\n        patch = patches.Rectangle((rect[0], rect[1]), rect[2], rect[3], linewidth=2, edgecolor='r', facecolor='none')\n        ax.add_patch(patch)\n        plt.axis('off')  # Remove axis\n        plt.tight_layout()\n        fig.canvas.draw()\n\n        # Convert plot to NumPy array\n        patched_image = np.array(fig.canvas.renderer.buffer_rgba())\n\n        plt.close(fig)  # Close the figure to free up memory\n        output_images.append((patched_image, random_numbers[i]))  # Append patched image to the output list\n\n    return output_images\n","metadata":{"id":"cx1GgCZcccEg","execution":{"iopub.status.busy":"2023-06-04T12:18:08.527013Z","iopub.execute_input":"2023-06-04T12:18:08.527580Z","iopub.status.idle":"2023-06-04T12:18:08.542113Z","shell.execute_reply.started":"2023-06-04T12:18:08.527542Z","shell.execute_reply":"2023-06-04T12:18:08.541088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Create Video**","metadata":{"id":"SvdSXhg0X3y2"}},{"cell_type":"code","source":"def display_training_process_video(output_images):\n    fig, ax = plt.subplots()\n    camera = Camera(fig)\n    \n    for i in tqdm(range(len(output_images))):\n        ax.axis('off')\n        ax.text(0.5, 1.08, f\"Valid Image #{output_images[i][1]}\", fontweight='bold', fontsize=18,\n                transform=ax.transAxes, horizontalalignment='center')\n        ax.imshow(output_images[i][0], cmap='gray')\n        camera.snap()\n        gc.collect()\n        \n    plt.close(fig)\n    \n    animation = camera.animate()\n    fix_video_adjust = \\\n    '<style> video {margin: 0px; padding: 0px; width:70%; height:auto;} </style>'\n    display(HTML(fix_video_adjust + animation.to_html5_video()))\n    \n    del camera\n    del animation\n    gc.collect()","metadata":{"id":"mWaNf5exYC5O","execution":{"iopub.status.busy":"2023-06-04T12:18:08.543796Z","iopub.execute_input":"2023-06-04T12:18:08.544290Z","iopub.status.idle":"2023-06-04T12:18:08.555584Z","shell.execute_reply.started":"2023-06-04T12:18:08.544248Z","shell.execute_reply":"2023-06-04T12:18:08.554487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install celluloid -q\n# from celluloid import Camera\n\n# display_training_process_video(generate_patched_images(valid_xyxys, fragment_id=CFG.valid_id))","metadata":{"id":"yqjGDu2aYnp4","execution":{"iopub.status.busy":"2023-06-04T12:18:08.557355Z","iopub.execute_input":"2023-06-04T12:18:08.557802Z","iopub.status.idle":"2023-06-04T12:18:49.247220Z","shell.execute_reply.started":"2023-06-04T12:18:08.557725Z","shell.execute_reply":"2023-06-04T12:18:49.246000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset","metadata":{"id":"sRADIZIYbgYk"}},{"cell_type":"code","source":"def get_transforms(data, cfg):\n    if data == 'train':\n        aug = A.Compose(cfg.train_aug_list)\n    elif data == 'valid':\n        aug = A.Compose(cfg.valid_aug_list)\n\n    return aug","metadata":{"id":"C3ZoFS4VbgYk","execution":{"iopub.status.busy":"2023-06-04T12:18:49.252622Z","iopub.execute_input":"2023-06-04T12:18:49.252943Z","iopub.status.idle":"2023-06-04T12:18:49.258914Z","shell.execute_reply.started":"2023-06-04T12:18:49.252913Z","shell.execute_reply":"2023-06-04T12:18:49.257836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class InkDetectionDataset(Dataset):\n    def __init__(self, images, labels=None, transform=None, mode='train'):\n        self.images = images\n        self.labels = labels\n        self.transform = transform\n        self.mode = mode\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n        \n        if self.mode == 'test':\n            label = np.zeros_like(image)\n        else:\n             label = self.labels[idx]\n\n        if self.transform:\n            data = self.transform(image=image, mask=label)\n            image = data['image']\n            label = data['mask']\n        \n        if self.mode == 'test':\n            return image\n        else:\n            return image, label","metadata":{"id":"tUPhuNv0bgYk","execution":{"iopub.status.busy":"2023-06-04T12:18:49.260495Z","iopub.execute_input":"2023-06-04T12:18:49.261177Z","iopub.status.idle":"2023-06-04T12:18:49.271740Z","shell.execute_reply.started":"2023-06-04T12:18:49.261136Z","shell.execute_reply":"2023-06-04T12:18:49.270696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = InkDetectionDataset(\n    train_images, labels=train_masks, transform=get_transforms(data='train', cfg=CFG))\nvalid_dataset = InkDetectionDataset(\n    valid_images, labels=valid_masks, transform=get_transforms(data='valid', cfg=CFG))\n\ntrain_loader = DataLoader(train_dataset,\n                          batch_size=CFG.train_batch_size,\n                          shuffle=True,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=True,\n                          )\nvalid_loader = DataLoader(valid_dataset,\n                          batch_size=CFG.valid_batch_size,\n                          shuffle=False,\n                          num_workers=CFG.num_workers, pin_memory=True, drop_last=False)","metadata":{"id":"gUrr6bC0bgYk","execution":{"iopub.status.busy":"2023-06-04T12:18:49.285987Z","iopub.execute_input":"2023-06-04T12:18:49.286382Z","iopub.status.idle":"2023-06-04T12:18:49.301420Z","shell.execute_reply.started":"2023-06-04T12:18:49.286340Z","shell.execute_reply":"2023-06-04T12:18:49.300375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Data Samples**","metadata":{"id":"ZveqcgPqG3A2"}},{"cell_type":"code","source":"NUM_SAMPLES = 100\n\n# Create a random subset of indices\nsampled_indices_train = np.random.choice(len(train_dataset), NUM_SAMPLES, replace=False)\nsampled_indices_valid = np.random.choice(len(valid_dataset), min(NUM_SAMPLES//10, len(valid_dataset)), replace=False)\n\n# Use the subset indices to create the SubsetRandomSampler\nsampler_train = SubsetRandomSampler(sampled_indices_train)\nsampler_valid = SubsetRandomSampler(sampled_indices_valid)\n\n# Create sub samples of the train and validation loaders\ntrain_loader_sample = DataLoader(dataset=train_dataset, batch_size=CFG.train_batch_size, sampler=sampler_train)\nvalid_loader_sample = DataLoader(dataset=valid_dataset, batch_size=CFG.train_batch_size, sampler=sampler_valid)","metadata":{"id":"EvVj9VgWbgYk","execution":{"iopub.status.busy":"2023-06-04T12:18:49.302919Z","iopub.execute_input":"2023-06-04T12:18:49.303299Z","iopub.status.idle":"2023-06-04T12:18:49.314773Z","shell.execute_reply.started":"2023-06-04T12:18:49.303258Z","shell.execute_reply":"2023-06-04T12:18:49.313723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{"id":"turAaQNMbgYl"}},{"cell_type":"code","source":"if os.path.exists('/kaggle/input/vesuvius-challenge-models/valid_1_epoch_8.pth'):\n    model = torch.load('/kaggle/input/vesuvius-challenge-models/valid_1_epoch_8.pth', map_location=device)\n    print(\"Model loaded successfully.\")\nelse:\n    model = smp.Unet(\n        encoder_name=CFG.backbone, \n        encoder_weights='imagenet', \n        classes=1,\n        in_channels=CFG.in_chans,\n        activation=None)\n    print(\"Saved model file not found.\")\n    \nloss = smp.utils.losses.BCEWithLogitsLoss()\n\n\nmetrics = [\n    smp.utils.metrics.Fscore(beta=0.5)\n]\n\n\noptimizer = torch.optim.Adam([ \n    dict(params=model.parameters(), lr=0.0001),\n])\n","metadata":{"id":"0OTHFiydbgYl","execution":{"iopub.status.busy":"2023-06-04T12:18:49.316530Z","iopub.execute_input":"2023-06-04T12:18:49.316947Z","iopub.status.idle":"2023-06-04T12:18:53.760168Z","shell.execute_reply.started":"2023-06-04T12:18:49.316909Z","shell.execute_reply":"2023-06-04T12:18:53.759075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train & Validate","metadata":{"id":"bvenxxQ6bgYl"}},{"cell_type":"code","source":"train_epoch = smp.utils.train.TrainEpoch(\n    model, \n    loss=loss, \n    metrics=metrics, \n    optimizer=optimizer,\n    device=device,\n    verbose=True,\n)\n\nval_epoch = smp.utils.train.ValidEpoch(\n    model,\n    loss=loss,\n    metrics=metrics,\n    device=device,\n    verbose=True,\n)","metadata":{"id":"4WUkiQJJbgYm","execution":{"iopub.status.busy":"2023-06-04T12:18:53.761702Z","iopub.execute_input":"2023-06-04T12:18:53.762366Z","iopub.status.idle":"2023-06-04T12:18:53.790341Z","shell.execute_reply.started":"2023-06-04T12:18:53.762323Z","shell.execute_reply":"2023-06-04T12:18:53.789409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if CFG.train:\n    min_loss = math.inf\n    metrics_values = {\n        'loss': {'train': [], 'valid': []},\n        'fscore': {'train': [], 'valid': []},\n        'iou': {'train': [], 'valid': []}\n    }\n    \n    for i in range(0,16):\n\n        print('\\nEpoch: {}'.format(i))\n        train_logs = train_epoch.run(train_loader)\n        valid_logs = val_epoch.run(valid_loader)\n        \n         # Store metric values for plotting\n        metrics_values['loss']['train'].append(train_logs['bce_with_logits_loss'])\n        metrics_values['loss']['valid'].append(valid_logs['bce_with_logits_loss'])\n        metrics_values['fscore']['train'].append(train_logs['fscore'])\n        metrics_values['fscore']['valid'].append(valid_logs['fscore'])\n        metrics_values['iou']['train'].append(train_logs['iou_score'])\n        metrics_values['iou']['valid'].append(valid_logs['iou_score'])\n        \n\n        if min_loss > valid_logs['bce_with_logits_loss']:\n            min_loss = valid_logs['bce_with_logits_loss']\n            best_model_name = f'stride{CFG.stride}_epoch_{i}'\n        \n        # Save all models\n        torch.save(model, f'./valid_{CFG.valid_id}_epoch_{i}.pth')\n        print('Model saved!')\n\n    # Print best model name\n    print(f'Best model: {best_model_name}')\n\n    # Plot metrics after all epochs\n    plot_metrics(\n        {'loss': metrics_values['loss']['train'], 'fscore': metrics_values['fscore']['train'], 'iou': metrics_values['iou']['train']},\n        {'loss': metrics_values['loss']['valid'], 'fscore': metrics_values['fscore']['valid'], 'iou': metrics_values['iou']['valid']}\n    )","metadata":{"id":"G7x6ScgzbgYm","execution":{"iopub.status.busy":"2023-06-04T12:18:53.791803Z","iopub.execute_input":"2023-06-04T12:18:53.792338Z","iopub.status.idle":"2023-06-04T12:18:53.805756Z","shell.execute_reply.started":"2023-06-04T12:18:53.792297Z","shell.execute_reply":"2023-06-04T12:18:53.804671Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{"id":"JXkVjslabgYm"}},{"cell_type":"code","source":"def TTA(x, model):\n    if CFG.TTA:\n        shape=x.shape\n        x=[x,*[torch.rot90(x,k=i,dims=(-2,-1)) for i in range(1,4)]]\n        x=torch.cat(x,dim=0)\n        x=model(x)\n        x=torch.sigmoid(x)\n        x=x.reshape(4,shape[0],*shape[2:])\n        x=[torch.rot90(x[i],k=-i,dims=(-2,-1)) for i in range(4)]\n        x=torch.stack(x,dim=0)\n        return x.mean(0)\n    else :\n        x=model(x)\n        x=torch.sigmoid(x)\n        return x","metadata":{"id":"G3TTUYVtly-r","execution":{"iopub.status.busy":"2023-06-04T12:18:53.807381Z","iopub.execute_input":"2023-06-04T12:18:53.808043Z","iopub.status.idle":"2023-06-04T12:18:53.821040Z","shell.execute_reply.started":"2023-06-04T12:18:53.808004Z","shell.execute_reply":"2023-06-04T12:18:53.820056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if CFG.submission:\n    dir = 'test'\n    fragment_ids = sorted(os.listdir(CFG.root_dir + dir))\nelse:\n    dir = 'train'\n    fragment_ids = [CFG.valid_id]\n    ","metadata":{"id":"lDYHaFnqbgYn","execution":{"iopub.status.busy":"2023-06-04T12:18:53.822537Z","iopub.execute_input":"2023-06-04T12:18:53.822945Z","iopub.status.idle":"2023-06-04T12:18:53.834245Z","shell.execute_reply.started":"2023-06-04T12:18:53.822904Z","shell.execute_reply":"2023-06-04T12:18:53.833093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_test_dataset(fragment_id):\n\n    \"\"\"\n    Creates a test dataset for ink detection.\n\n    Args:\n        fragment_id (int): The ID of the fragment.\n\n    Returns:\n        test_loader (DataLoader): A DataLoader object for the test dataset.\n        xyxys (numpy.ndarray): A NumPy array containing the coordinates of the image tiles in the test dataset.\n    \"\"\"\n\n    test_images = read_image_mask(fragment_id, dir=dir, test=True)\n\n    x1_list = list(range(0, test_images.shape[1]-CFG.tile_size+1,CFG.stride))\n    y1_list = list(range(0, test_images.shape[0]-CFG.tile_size+1, CFG.stride))\n\n\n\n    test_images_list = []\n    xyxys = []\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n\n            test_images_list.append(test_images[y1:y2, x1:x2])\n            xyxys.append((x1, y1, x2, y2))\n\n    xyxys = np.stack(xyxys)\n\n    test_dataset = InkDetectionDataset(test_images_list, transform=get_transforms(data='valid', cfg=CFG), mode='test')\n\n    test_loader = DataLoader(test_dataset,\n                        batch_size=CFG.valid_batch_size,\n                        shuffle=False,\n                        num_workers=CFG.num_workers, pin_memory=True, drop_last=False)\n\n    return test_loader, xyxys","metadata":{"id":"B0rblO91bgYn","execution":{"iopub.status.busy":"2023-06-04T12:18:53.835601Z","iopub.execute_input":"2023-06-04T12:18:53.836770Z","iopub.status.idle":"2023-06-04T12:18:53.849050Z","shell.execute_reply.started":"2023-06-04T12:18:53.836690Z","shell.execute_reply":"2023-06-04T12:18:53.847938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process_fragments(fragment_ids, CFG, device, model=None): \n    \"\"\"\n      Process fragments and generate results for each fragment.\n\n      Args:\n          fragment_ids (list): A list of fragment IDs to process.\n          model: The model used for prediction.\n          CFG: Configuration parameters.\n          device: The device used for computation (e.g., 'cuda' for GPU or 'cpu' for CPU).\n\n      Returns:\n          results (list): A list of tuples containing the fragment ID and corresponding inklabels in run-length encoding (RLE) format.\n      \"\"\"\n\n    results = []\n    for fragment_id in fragment_ids:\n\n        test_loader, xyxys = make_test_dataset(fragment_id)\n\n        binary_mask = cv2.imread(CFG.root_dir + f\"{dir}/{fragment_id}/mask.png\", 0)\n        binary_mask = (binary_mask / 255).astype(int)\n\n        original_height = binary_mask.shape[0]\n        original_width = binary_mask.shape[1]\n      \n\n        pad0 = (CFG.tile_size - binary_mask.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - binary_mask.shape[1] % CFG.tile_size)\n\n        binary_mask = np.pad(binary_mask, [(0, pad0), (0, pad1)], constant_values=0)\n\n        mask_pred = np.zeros(binary_mask.shape)\n        mask_count = np.zeros(binary_mask.shape)\n\n        for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n            images = images.cuda()\n            batch_size = images.size(0)\n            \n            with torch.no_grad():\n                \n                if CFG.submission:\n                    # Ensemble of 3 models\n                    model = torch.load(f'/kaggle/input/vesuvius-challenge-models/valid_{CFG.valid_id}_epoch_8.pth', map_location=device)\n                    y_preds = TTA(images,model).cpu().numpy()\n                    for index in [1, 2, 3]:\n                        if index == CFG.valid_id:\n                            continue\n                        else:\n                            model = torch.load(f'/kaggle/input/vesuvius-challenge-models/valid_{index}_epoch_8.pth', map_location=device)\n                        y_preds += TTA(images,model).cpu().numpy()\n                    y_preds /=3\n                \n                else:\n                    y_preds = TTA(images,model).cpu().numpy()\n        \n            start_idx = step*CFG.valid_batch_size\n            end_idx = start_idx + batch_size\n            for i, (x1, y1, x2, y2) in enumerate(xyxys[start_idx:end_idx]):\n                mask_pred[y1:y2, x1:x2] += y_preds[i].reshape(mask_pred[y1:y2, x1:x2].shape)\n                mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n\n        mask_pred /= mask_count\n\n        if fragment_id in [1, 2, 3]:\n            fig, axes = plt.subplots(1, 3, figsize=(15, 8))\n            ground_truth = cv2.imread(CFG.root_dir + f\"{dir}/{fragment_id}/inklabels.png\", 0)\n            axes[2].axis('off')\n            axes[2].imshow(ground_truth, cmap='gray')\n            \n\n        else:\n            fig, axes = plt.subplots(1, 2, figsize=(15, 8))\n        \n        axes[0].axis('off')\n        axes[0].imshow(mask_pred.copy(), cmap='gray')\n        \n        mask_pred = mask_pred[:original_height, :original_width]\n        binary_mask = binary_mask[:original_height, :original_width]\n\n        mask_pred = (mask_pred >= CFG.threshold).astype(int)\n        mask_pred *= binary_mask\n        axes[1].axis('off')\n        axes[1].imshow(mask_pred, cmap='gray')\n        plt.show()\n\n        inklabels_rle = rle(mask_pred)\n\n        results.append((fragment_id, inklabels_rle))\n\n\n        del mask_pred, mask_count\n        del test_loader\n\n        gc.collect()\n        torch.cuda.empty_cache()\n        \n    return results","metadata":{"id":"q19i4l880BOv","execution":{"iopub.status.busy":"2023-06-04T12:18:53.851730Z","iopub.execute_input":"2023-06-04T12:18:53.852585Z","iopub.status.idle":"2023-06-04T12:18:53.875804Z","shell.execute_reply.started":"2023-06-04T12:18:53.852546Z","shell.execute_reply":"2023-06-04T12:18:53.874804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = process_fragments(fragment_ids, CFG, device, model)","metadata":{"id":"pp2lJHpt2-Di","execution":{"iopub.status.busy":"2023-06-04T12:18:53.877358Z","iopub.execute_input":"2023-06-04T12:18:53.877836Z","iopub.status.idle":"2023-06-04T12:19:38.959759Z","shell.execute_reply.started":"2023-06-04T12:18:53.877797Z","shell.execute_reply":"2023-06-04T12:19:38.958560Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if CFG.submission:\n    sub = pd.DataFrame(results, columns=['Id', 'Predicted'])\n    sample_sub = pd.read_csv(CFG.root_dir + 'sample_submission.csv')\n    sample_sub = pd.merge(sample_sub[['Id']], sub, on='Id', how='left')\n    display(sample_sub)\n    sample_sub.to_csv(\"submission.csv\", index=False)","metadata":{"id":"HX9fMDTs3FZ3","execution":{"iopub.status.busy":"2023-06-04T12:19:38.961567Z","iopub.execute_input":"2023-06-04T12:19:38.962226Z","iopub.status.idle":"2023-06-04T12:19:38.969407Z","shell.execute_reply.started":"2023-06-04T12:19:38.962179Z","shell.execute_reply":"2023-06-04T12:19:38.968340Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![Screenshot 2023-06-04 at 14.57.00.png](attachment:ee3c98eb-f3c6-454d-b7f8-7bb90e4dc386.png)","metadata":{},"attachments":{"ee3c98eb-f3c6-454d-b7f8-7bb90e4dc386.png":{"image/png":"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gAQyNIEDEfdwQhT4MvRlZeNIIGMRgIj3SKfO8reaMS2pfvdy58oly75eLvgSv3TpUjKof1/JpXEMJEACJEACGYfAoRy7F7z3vpr3nhc9eZgL9poMjh7gDxKIQwArcmGW3AaYXk8WKPAlI8TjJEACJEACJEACJEACJEACJEACGZXAgYp7OB8KfBn1qrJdJJBBCcAv4rQZMwS+lPbs3qNmN4vKmeXKSf16dVJm5i6DnjqbRQIkQAJHLAGO3UfspWPDHQhQ4HOAxCQkQAIkQAIkQAIkQAIkQAIkQAIZjsDBiHs4GQp8Ge6SskEkQAIkQAIkQAIkQAIkQAKuBH5Ytcr4CT25SBHXLExHAiRAAiRAAiRAAiRAAiRAAiRAAoeVwMGKe2g8Bb7DeglZOQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQwNFCIBXiHlhR4DtaegzPkwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARI4LASoMB3WPGzchIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJwJ5AqcQ81cgWfO3emJAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHQBFIp7qFyCnyhLwEzkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkIAbgVSLe6iVAp8be6YiARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggVAE0kPcQwMo8IW6DExMAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAskJpJe4h5op8CXnzxQkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk4EwgPcU9NIICn/OlYEISIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSEwgvcU91E6BL/E14FESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEScCJwKMQ9NIQCn9PlYCISIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSEzgUAh8qIMCX+LrwKMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk4ESAAp8TJiYiARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggYxBIL0FPls+V/BljOvNVpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACRzhBKwAl16nYcunwJdehFkuCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZDAUUXACnDpcdLesinwpQdhlkkCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJHDUEfCKcKk8eX+5FPhSSZdlkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJHLUE/EJcqkD4y6XAlyqyLIcESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESOCoJuAX4lIBI6hMCnypIMsySIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEjnoCQWLcwUIJKpMC38FSZX4SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESUAJBYtzBgIlXHgW+g6HKvCRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTwD4F4gtyBAopXHgW+AyXKfCRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTgIRBPkPMkcf6ZqCwKfM4YmZAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAE4hNIJMrFzxV8JFFZFPiCmTGWBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEIRSCTKhSkoWTkU+MLQZFoSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESiEMgmTAXJ1ua6GTlUOBLg4wRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBCeQDJhzrXEZOVQ4HMlyXQkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIdAMlEuTrY00S7lUOBLg40RJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBCOgIsw51KiSzkU+FxIMg0JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJJCDgIswlyB495FIOBb4oLv4gARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggfAEXEQ5l1Jdy6HA50KTaUiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggDgFXYS5O9mi0azn/B7fK2T0x+9osAAAAAElFTkSuQmCC"}}}]}