{"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":"!pip -q install tensorflow==2.3.0","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:55:27.147039Z","iopub.execute_input":"2022-03-19T13:55:27.147321Z","iopub.status.idle":"2022-03-19T13:56:36.637111Z","shell.execute_reply.started":"2022-03-19T13:55:27.147294Z","shell.execute_reply":"2022-03-19T13:56:36.636274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Basics / Data manipulation\nimport numpy as np\nimport pandas as pd\nfrom tqdm.notebook import tqdm\nimport zipfile\nimport os\n\n# Visualization\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport cv2\nimport skimage.io\nfrom IPython.display import display, HTML\n\n# ML\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split\n\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:56:36.638461Z","iopub.execute_input":"2022-03-19T13:56:36.638676Z","iopub.status.idle":"2022-03-19T13:56:42.321938Z","shell.execute_reply.started":"2022-03-19T13:56:36.638651Z","shell.execute_reply":"2022-03-19T13:56:42.321075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data\n10k+ of .tiff images\n*    **90%** for training \n*    **10%** for internal testing\n            *  75% Validation\n            *  25% Testing","metadata":{}},{"cell_type":"code","source":"# Folder paths\nTRAIN = '../input/prostate-cancer-grade-assessment/train_images'\nMASKS = '../input/prostate-cancer-grade-assessment/train_label_masks'\n\n# OUT_TRAIN = './train.zip'\n# OUT_VALIDATION = './validation.zip'\n# OUT_TEST = './test.zip'\n# OUT_MASKS_TRAIN = './masks_train.zip'\n# OUT_MASKS_VALIDATION = './masks_validation.zip'\n# OUT_MASKS_TEST = './masks_test.zip'\n\nBASE_FOLDER = \"/kaggle/input/prostate-cancer-grade-assessment/\"\n!ls {BASE_FOLDER}","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:56:42.323033Z","iopub.execute_input":"2022-03-19T13:56:42.323245Z","iopub.status.idle":"2022-03-19T13:56:42.61243Z","shell.execute_reply.started":"2022-03-19T13:56:42.323217Z","shell.execute_reply":"2022-03-19T13:56:42.611725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(BASE_FOLDER + \"train.csv\")\ntrain.columns.name = \"train.csv\"\ntest = pd.read_csv(BASE_FOLDER + \"test.csv\")\ntest.columns.name = \"test.csv\"\nsub = pd.read_csv(BASE_FOLDER + \"sample_submission.csv\")\nsub.columns.name = \"sample_submission.csv\"\n\nprint(f'Number of images: {len(train)}')\ndisplay(train.head())","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:56:42.613357Z","iopub.execute_input":"2022-03-19T13:56:42.613544Z","iopub.status.idle":"2022-03-19T13:56:44.757624Z","shell.execute_reply.started":"2022-03-19T13:56:42.61352Z","shell.execute_reply":"2022-03-19T13:56:44.755445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Checking for all the \"negative\" labels in the label of gleason_score\ndisplay(train[train['gleason_score'] == 'negative'])","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:56:44.760419Z","iopub.execute_input":"2022-03-19T13:56:44.760709Z","iopub.status.idle":"2022-03-19T13:56:44.787731Z","shell.execute_reply.started":"2022-03-19T13:56:44.760678Z","shell.execute_reply":"2022-03-19T13:56:44.786647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Deleting from the dataset a mislabeled row and converting the \"negative\" labels to \"0+0\" in order to have an standard\ntrain.drop([7273],inplace=True)\ntrain['gleason_score'] = train['gleason_score'].apply(lambda x: \"0+0\" if x == \"negative\" else x)\nprint(f'Number of images: {len(train)}')","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:56:44.789465Z","iopub.execute_input":"2022-03-19T13:56:44.789748Z","iopub.status.idle":"2022-03-19T13:56:44.807548Z","shell.execute_reply.started":"2022-03-19T13:56:44.789682Z","shell.execute_reply":"2022-03-19T13:56:44.806615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sus = pd.read_csv(\"../input/collection-of-600-suspicious-slides-data-loader/PANDA_Suspicious_Slides.csv\")\nsusIDs = sus['image_id']\nprint(f'Number of suspicious images: {len(susIDs)}')","metadata":{"execution":{"iopub.status.busy":"2022-03-19T13:57:24.774243Z","iopub.execute_input":"2022-03-19T13:57:24.774513Z","iopub.status.idle":"2022-03-19T13:57:24.796227Z","shell.execute_reply.started":"2022-03-19T13:57:24.774485Z","shell.execute_reply":"2022-03-19T13:57:24.795139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.reset_index()\nsusIDs.reset_index()\ntrain = train[~train.image_id.isin(susIDs)]\nprint(f'Number of reliable images: {len(train)}')","metadata":{"execution":{"iopub.status.busy":"2022-03-19T14:00:00.353871Z","iopub.execute_input":"2022-03-19T14:00:00.354179Z","iopub.status.idle":"2022-03-19T14:00:00.367525Z","shell.execute_reply.started":"2022-03-19T14:00:00.354148Z","shell.execute_reply":"2022-03-19T14:00:00.366661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = np.array(train) # Converting the DataFrame to an array to take the column\nlabels = data[:, 3] # Labels of interest (GLEASON SCORE)\n#labels","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.033837Z","iopub.status.idle":"2022-03-07T17:18:39.034199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = data[:, :3] # Features of interest (ID, PROVIDER, ISUP GRADE)\n#features","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.035461Z","iopub.status.idle":"2022-03-07T17:18:39.035815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = features\ny = labels","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.036911Z","iopub.status.idle":"2022-03-07T17:18:39.037259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.038306Z","iopub.status.idle":"2022-03-07T17:18:39.038665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_check, y_train, y_check = train_test_split(X, y, test_size=0.1, random_state = 42) ","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.039701Z","iopub.status.idle":"2022-03-07T17:18:39.040089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_validation, X_test, y_validation, y_test = train_test_split(X_check, y_check, test_size=0.25, random_state = 84)","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.041062Z","iopub.status.idle":"2022-03-07T17:18:39.041468Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train-Validation-Test","metadata":{}},{"cell_type":"code","source":"X_train = pd.DataFrame(X_train, columns=[\"image_id\", \"data_provider\", \"isup_grade\"])\nX_train[\"gleason_score\"] = y_train\n\nX_validation = pd.DataFrame(X_validation, columns=[\"image_id\", \"data_provider\", \"isup_grade\"])\nX_validation[\"gleason_score\"] = y_validation\n\nX_test = pd.DataFrame(X_test, columns=[\"image_id\", \"data_provider\", \"isup_grade\"])\nX_test[\"gleason_score\"] = y_test","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.042731Z","iopub.status.idle":"2022-03-07T17:18:39.043094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_eda = X_train.groupby(\"gleason_score\").count()[\"image_id\"].reset_index().sort_values(by=\"image_id\", ascending=False)\ntrain_eda.style.background_gradient(cmap=\"Greens\")\ntrain_eda.style.set_caption(\"Train\")","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.044581Z","iopub.status.idle":"2022-03-07T17:18:39.045098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_eda = X_validation.groupby(\"gleason_score\").count()[\"image_id\"].reset_index().sort_values(by=\"image_id\", ascending=False)\nvalidation_eda.style.background_gradient(cmap=\"Reds\")\ntrain_eda.style.set_caption(\"Validation\")","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.046373Z","iopub.status.idle":"2022-03-07T17:18:39.046886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_eda = X_test.groupby(\"gleason_score\").count()[\"image_id\"].reset_index().sort_values(by=\"image_id\", ascending=False)\ntest_eda.style.background_gradient(cmap=\"Blues\")\ntrain_eda.style.set_caption(\"Test\")","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.048118Z","iopub.status.idle":"2022-03-07T17:18:39.048636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.graph_objects as go\n\nfig = go.Figure(data=[\n    go.Bar(name=\"Test\", x=train_eda[\"gleason_score\"], y=train_eda[\"image_id\"]),\n    go.Bar(name=\"Validation\", x=validation_eda[\"gleason_score\"], y=validation_eda[\"image_id\"]),\n    go.Bar(name=\"Train\", x=test_eda[\"gleason_score\"], y=test_eda[\"image_id\"]),\n])\n\n# Change the bar mode\nfig.update_layout(barmode='group')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.049988Z","iopub.status.idle":"2022-03-07T17:18:39.050551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.express as px","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.051908Z","iopub.status.idle":"2022-03-07T17:18:39.052429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = train_eda\nfig = px.pie(df, values='image_id', names='gleason_score', title = 'Training Images')\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.053796Z","iopub.status.idle":"2022-03-07T17:18:39.054303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = validation_eda\nfig = px.pie(df, values='image_id', names='gleason_score', title = 'Validation Images')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.055718Z","iopub.status.idle":"2022-03-07T17:18:39.056211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = test_eda\nfig = px.pie(df, values='image_id', names='gleason_score', title = 'Testing Images')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.057428Z","iopub.status.idle":"2022-03-07T17:18:39.057805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = 'Training Images','Validation Images', 'Testing Images'\nsizes_features = [len(X_train), len(X_validation), len(X_test)]\n# sizes_labels = [len(y_train), len(y_validation)]\n\nfig, ax = plt.subplots(figsize=(30,7))\n\nax.pie(sizes_features, labels=labels, autopct='%1.1f%%',\n          shadow=True, startangle=60)\nax.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle\nax.set_title(f\"Distribution of the dataset\\n Total Images - {(len(X) / len(X) * 100)}%: {len(X)}\\n Training images - {(len(X_train) / len(X) * 100)}%: {len(X_train)}\\n Validation images - {(len(X_validation) / len(X) * 100)}%: {len(X_validation)}\\n Testing images - {(len(X_test) / len(X) * 100)}%: {len(X_test)} \\n \"\n                                                                          ,weight=\"bold\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.058859Z","iopub.status.idle":"2022-03-07T17:18:39.059222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(X_train.head())","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-03-07T17:18:39.060657Z","iopub.status.idle":"2022-03-07T17:18:39.061019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(X_validation.head())","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-03-07T17:18:39.064086Z","iopub.status.idle":"2022-03-07T17:18:39.064497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(X_test.head())","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-03-07T17:18:39.065979Z","iopub.status.idle":"2022-03-07T17:18:39.066391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Saving the datasets\nX_train = pd.DataFrame(X_train, columns=[\"image_id\", \"variant\", \"data_provider\", \"isup_grade\", \"gleason_score\"])\nX_validation = pd.DataFrame(X_validation, columns=[\"image_id\", \"variant\", \"data_provider\", \"isup_grade\", \"gleason_score\"])\nX_test = pd.DataFrame(X_test, columns=[\"image_id\", \"variant\", \"data_provider\", \"isup_grade\", \"gleason_score\"])\n\nX_train.to_csv(\"./training.csv\")\nX_validation.to_csv(\"./validation.csv\")\nX_test.to_csv(\"./testing.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.067601Z","iopub.status.idle":"2022-03-07T17:18:39.067967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SIZE_IMG = 112\nN = 16\ndef tile(img, mask):\n    result = []\n    shape = img.shape\n    pad0,pad1 = (SIZE_IMG - shape[0]%SIZE_IMG)%SIZE_IMG, (SIZE_IMG - shape[1]%SIZE_IMG)%SIZE_IMG\n    img = np.pad(img, [[pad0//2, pad0-pad0//2], [pad1//2, pad1 - pad1//2],[0,0]],\n                constant_values=255)\n    mask = np.pad(mask,[[pad0//2, pad0-pad0//2], [pad1//2,pad1-pad1//2], [0,0]],\n                constant_values=0)\n    img = img.reshape(img.shape[0]//SIZE_IMG, SIZE_IMG, img.shape[1]//SIZE_IMG,SIZE_IMG, 3)\n    img = img.transpose(0, 2, 1, 3, 4).reshape(-1, SIZE_IMG,SIZE_IMG,3)\n    mask = mask.reshape(mask.shape[0]//SIZE_IMG, SIZE_IMG,mask.shape[1]//SIZE_IMG, SIZE_IMG, 3)\n    mask = mask.transpose(0, 2, 1, 3, 4).reshape(-1, SIZE_IMG,SIZE_IMG, 3)\n    if len(img) < N:\n        mask = np.pad(mask, [[0, N-len(img)], [0, 0], [0, 0],[0, 0]], constant_values=0)\n        img = np.pad(img, [[0, N-len(img)],[0, 0],[0, 0], [0, 0]], constant_values=255)\n    idxs = np.argsort(img.reshape(img.shape[0], -1).sum(-1))[: N]\n    img = img[idxs]\n    mask = mask[idxs]\n    \n    for i in range(len(img)):\n        result.append({'img':img[i], 'mask':mask[i], 'idx':i})\n\n    return result","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-03-07T17:18:39.069002Z","iopub.status.idle":"2022-03-07T17:18:39.069398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def multiplyTiles(tiles):\n    variationA = []\n    variationB = []\n    variationC = []\n    variationD = []\n    variationE = []\n    variationF = []\n    variationG = []\n    variationH = []\n    for t in range(len(tiles)):\n        \n        # Original Tile (A)\n        tile_a_img = tiles[t]['img']\n        tile_a_mask = tiles[t]['mask']\n        tile_a_idx = tiles[t]['idx']\n        tile_a = {\"img\": tile_a_img, \"mask\": tile_a_mask, \"idx\": tile_a_idx}\n        \n        # Rotated Tiles (B, C, D)\n        tile_b_img = np.rot90(tile_a_img)\n        tile_b_mask = np.rot90(tile_a_mask)\n        tile_b_idx = tile_a_idx\n        tile_b = {\"img\": tile_b_img, \"mask\": tile_b_mask, \"idx\": tile_b_idx}\n        \n        tile_c_img = np.rot90(tile_b_img)\n        tile_c_mask = np.rot90(tile_b_mask)\n        tile_c_idx = tile_b_idx\n        tile_c = {\"img\": tile_c_img, \"mask\": tile_c_mask, \"idx\": tile_c_idx}\n        \n        tile_d_img = np.rot90(tile_c_img)\n        tile_d_mask = np.rot90(tile_c_mask)\n        tile_d_idx = tile_c_idx\n        tile_d = {\"img\": tile_d_img, \"mask\": tile_d_mask, \"idx\": tile_d_idx}\n        \n        # Mirrored Original Tile (A:E)\n        tile_e_img = np.fliplr(tile_a_img)\n        tile_e_mask = np.fliplr(tile_a_mask)\n        tile_e_idx = tile_a_idx\n        tile_e = {\"img\": tile_e_img, \"mask\": tile_e_mask, \"idx\": tile_e_idx}        \n        \n        # Mirrored Rotated Tiles (B:F, C:G, D:H)\n        tile_f_img = np.fliplr(tile_b_img)\n        tile_f_mask = np.fliplr(tile_b_mask)\n        tile_f_idx = tile_a_idx\n        tile_f = {\"img\": tile_f_img, \"mask\": tile_f_mask, \"idx\": tile_f_idx}\n        \n        tile_g_img = np.fliplr(tile_c_img)\n        tile_g_mask = np.fliplr(tile_c_mask)\n        tile_g_idx = tile_c_idx\n        tile_g = {\"img\": tile_g_img, \"mask\": tile_g_mask, \"idx\": tile_g_idx}\n        \n        tile_h_img = np.fliplr(tile_d_img)\n        tile_h_mask = np.fliplr(tile_d_mask)\n        tile_h_idx = tile_d_idx\n        tile_h = {\"img\": tile_h_img, \"mask\": tile_h_mask, \"idx\": tile_h_idx}        \n        \n        \n        variationA.append(tile_a)\n        variationB.append(tile_b)\n        variationC.append(tile_c)\n        variationD.append(tile_d)\n        variationE.append(tile_e)\n        variationF.append(tile_f)\n        variationG.append(tile_g)\n        variationH.append(tile_h)\n        \n        tile_bulk = [variationA, variationB, variationC, variationD, variationE, variationF, variationG, variationH]\n\n    return tile_bulk","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.070648Z","iopub.status.idle":"2022-03-07T17:18:39.07101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import openslide\nimg=openslide.OpenSlide('/kaggle/input/prostate-cancer-grade-assessment/train_images/0005f7aaab2800f6170c399693a96917.tiff')\ndisplay(img.get_thumbnail(size=(512,512)))\n","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-03-07T17:18:39.072026Z","iopub.status.idle":"2022-03-07T17:18:39.072406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Image Preview\n","metadata":{}},{"cell_type":"code","source":"train_dataset = pd.read_csv(\"./training.csv\", usecols=[\"image_id\", \"data_provider\", \"isup_grade\", \"gleason_score\"])\nvalidation_dataset = pd.read_csv(\"./validation.csv\", usecols=[\"image_id\", \"data_provider\", \"isup_grade\", \"gleason_score\"])\ntest_dataset = pd.read_csv(\"./testing.csv\", usecols=[\"image_id\", \"data_provider\", \"isup_grade\", \"gleason_score\"])\n\n# Mapping to the original dataset\n# ../input/prostate-cancer-grade-assessment/train_images/0005f7aaab2800f6170c399693a96917.tiff\n# ../input/prostate-cancer-grade-assessment/train_label_masks/0005f7aaab2800f6170c399693a96917_mask.tiff\nimg = skimage.io.MultiImage(os.path.join(TRAIN,\"0005f7aaab2800f6170c399693a96917\"+'.tiff'))[1]\nmask = skimage.io.MultiImage(os.path.join(MASKS,\"0005f7aaab2800f6170c399693a96917\"+'_mask.tiff'))[1]\ntiles = tile(img, mask)\n[tiles_A, tiles_B, tiles_C, tiles_D, tiles_E, tiles_F, tiles_G, tiles_H] = multiplyTiles(tiles)","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.073474Z","iopub.status.idle":"2022-03-07T17:18:39.073846Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#To Display The Variations\nf_A, ax_A = plt.subplots(4,4, figsize=(10, 10))\nf_B, ax_B = plt.subplots(4,4, figsize=(10, 10))\nf_C, ax_C = plt.subplots(4,4, figsize=(10, 10))\nf_D, ax_D = plt.subplots(4,4, figsize=(10, 10))\nf_E, ax_E = plt.subplots(4,4, figsize=(10, 10))\nf_F, ax_F = plt.subplots(4,4, figsize=(10, 10))\nf_G, ax_G = plt.subplots(4,4, figsize=(10, 10))\nf_H, ax_H = plt.subplots(4,4, figsize=(10, 10))\n\n#Display Variations\nfor t in range(len(tiles_A)):\n        ax_A[t//4, t%4].imshow(tiles_A[t][\"img\"]) # Displaying Image    \n        ax_A[t//4, t%4].axis('off')\nf_A.suptitle('Variation A')\n\nfor t in range(len(tiles_B)):\n        ax_B[t//4, t%4].imshow(tiles_B[t][\"img\"]) # Displaying Image    \n        ax_B[t//4, t%4].axis('off')  \nf_B.suptitle('Variation B')\n\nfor t in range(len(tiles_C)):\n        ax_C[t//4, t%4].imshow(tiles_C[t][\"img\"]) # Displaying Image    \n        ax_C[t//4, t%4].axis('off')  \nf_C.suptitle('Variation C') \n\nfor t in range(len(tiles_D)):\n        ax_D[t//4, t%4].imshow(tiles_D[t][\"img\"]) # Displaying Image    \n        ax_D[t//4, t%4].axis('off') \nf_D.suptitle('Variation D')\n\nfor t in range(len(tiles_E)):\n        ax_E[t//4, t%4].imshow(tiles_E[t][\"img\"]) # Displaying Image    \n        ax_E[t//4, t%4].axis('off')\nf_E.suptitle('Variation E')\n\nfor t in range(len(tiles_F)):\n        ax_F[t//4, t%4].imshow(tiles_F[t][\"img\"]) # Displaying Image    \n        ax_F[t//4, t%4].axis('off')  \nf_F.suptitle('Variation F')\n\nfor t in range(len(tiles_G)):\n        ax_G[t//4, t%4].imshow(tiles_G[t][\"img\"]) # Displaying Image    \n        ax_G[t//4, t%4].axis('off')  \nf_G.suptitle('Variation G')\n\nfor t in range(len(tiles_H)):\n        ax_H[t//4, t%4].imshow(tiles_H[t][\"img\"]) # Displaying Image    \n        ax_H[t//4, t%4].axis('off') \nf_H.suptitle('Variation H')","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-03-07T17:18:39.074847Z","iopub.status.idle":"2022-03-07T17:18:39.075228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Concatenate Images - 16:1\nThe function ```concat_tile()``` concatenates 16 tiles in one single image, which will be saved later on.","metadata":{}},{"cell_type":"code","source":"id_train = train_dataset[\"image_id\"][163]\nid_validation = validation_dataset[\"image_id\"][163]\nid_test = test_dataset[\"image_id\"][163]\n\n# Testing the function\ndef concat_tile(im_list_2d):\n    return cv2.vconcat([cv2.hconcat(im_list_h) for im_list_h in im_list_2d])\n\ndef mosaic(tiles):\n\n    im1 = tiles[0][\"img\"]\n    im2 = tiles[1][\"img\"]\n    im3 = tiles[2][\"img\"]\n    im4 = tiles[3][\"img\"]\n\n    im5 = tiles[4][\"img\"]\n    im6 = tiles[5][\"img\"]\n    im7 = tiles[6][\"img\"]\n    im8 = tiles[7][\"img\"]\n\n    im9 = tiles[8][\"img\"]\n    im10 = tiles[9][\"img\"]\n    im11 = tiles[10][\"img\"]\n    im12 = tiles[11][\"img\"]\n\n    im13 = tiles[12][\"img\"]\n    im14 = tiles[13][\"img\"]\n    im15 = tiles[14][\"img\"]\n    im16 = tiles[15][\"img\"]\n\n    im_tile = concat_tile([[im1, im2, im3, im4],\n                           [im5, im6, im7, im8],\n                           [im9, im10, im11, im12],\n                           [im13, im14, im15, im16]])\n    return im_tile\n\nimg = skimage.io.MultiImage(os.path.join(TRAIN, f\"{id_train}.tiff\"))[1]\nmask = skimage.io.MultiImage(os.path.join(MASKS, f\"{id_train}_mask.tiff\"))[1]\n\n\nmosaic_img = mosaic(tiles)\n\nplt.title(f\"ID: {id_train}\")\nplt.imshow(mosaic_img)","metadata":{"execution":{"iopub.status.busy":"2022-03-07T17:18:39.076408Z","iopub.status.idle":"2022-03-07T17:18:39.076755Z"},"trusted":true},"execution_count":null,"outputs":[]}]}