{"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":"\n# <center>Input Data Quality Analysis</center>\n\n<center>\n    <figure>\n        <img src=\"data:image/png;base64,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\" alt =\"Sentiment Analysis\" style='width:10%;'>\n    </figure>\n</center>","metadata":{}},{"cell_type":"markdown","source":"This notebook contains a simple overview of what we have.\n\n# Table of contents\n<div style='border-width: 2px;\n              border-bottom-width:4px;\n              border-bottom-color:#00FF00;\n              border-bottom-style: solid;'></div>\n\n\n- [1 | IDs](#1)\n- [2 | Annotation Regions](#2)\n   > - [2.1 Region Areas per Image](#2.1)\n   > - [2.2 Areas of Regions](#2.2)\n- [3 | Visual Control](#3)\n- [4 | Conclusion](#4)\n\n\n<a id='1'></a>\n# 1 | IDs\n<div style='border-width: 2px;\n              border-bottom-width:4px;\n              border-bottom-color:#00FF00;\n              border-bottom-style: solid;'></div>\n<br/>\nIDs is the best mean to identify images and related data.","metadata":{}},{"cell_type":"code","source":"# Import necessary libraries\nimport os\nimport json\n\nimport cv2\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\n\npath_in_base = '/kaggle/input/hubmap-hacking-the-human-vasculature/'","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:03:10.531077Z","iopub.execute_input":"2023-06-09T09:03:10.531489Z","iopub.status.idle":"2023-06-09T09:03:10.766617Z","shell.execute_reply.started":"2023-06-09T09:03:10.531457Z","shell.execute_reply":"2023-06-09T09:03:10.765483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load annotation regions\nreg_df = pd.DataFrame({'iid':[], 'type':[], 'coord':[]})\n\nwith open(path_in_base + 'polygons.jsonl', 'r') as f:\n    for line in f:\n        antn = json.loads(line)\n        img_id = antn['id']\n        img_antn = antn['annotations']\n        for ant in img_antn:\n            tp = ant['type']\n            crd = ant['coordinates']\n            reg_df.loc[len(reg_df.index)] = np.array([img_id, tp, crd], dtype = object)\n\nreg_df.info()","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:03:10.769853Z","iopub.execute_input":"2023-06-09T09:03:10.770596Z","iopub.status.idle":"2023-06-09T09:03:41.863611Z","shell.execute_reply.started":"2023-06-09T09:03:10.770555Z","shell.execute_reply":"2023-06-09T09:03:41.861852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IDs of training set\ndef get_train_ids():\n    ids = set()\n    for dirname, _, filenames in os.walk(path_in_base + 'train'):\n        for filename in filenames:\n            ids.add(filename[:len(filename) - 4])\n    return ids\n\n# IDs of test set (actually there is only one image)\ndef get_test_ids():\n    ids = set()\n    for dirname, _, filenames in os.walk(path_in_base + 'test'):\n        for filename in filenames:\n            ids.add(filename[:len(filename) - 4])\n    return ids\n\n# IDs relating to the annotation regions\ndef get_polygons_ids():\n    ids = set(reg_df['iid'])\n    return ids\n\n# IDs relating to the metadata\ndef get_meta_ids():\n    ids = set()\n    df = pd.read_csv(path_in_base + 'tile_meta.csv')\n    ids.update(df['id'])\n    return ids\n\n# List of \"bad\" IDs discovered visually\n# The list is nominal and is presented only as an example\ndef get_bad_ids():\n    ids = set()\n    ids.add('0c0fd0a91f64')\n    ids.add('4aa434181421')\n    ids.add('8c66c89b3e78')\n    ids.add('30ad648e36a2')\n    ids.add('46d9ee4f8a44')\n    ids.add('596a08cbd66b')\n    ids.add('22429e2b9c48')\n    ids.add('c1da0ec94d0e')\n    ids.add('d6fd6d5bf8ee')\n    ids.add('eff3a8b0bf65')\n    return ids\n\n# Display an image\ndef draw_img(img_id):\n    img = Image.open(path_in_base + 'train/' + img_id + '.tif')\n    print(img_id)\n    display(img)","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:03:41.865314Z","iopub.execute_input":"2023-06-09T09:03:41.865925Z","iopub.status.idle":"2023-06-09T09:03:41.875344Z","shell.execute_reply.started":"2023-06-09T09:03:41.865889Z","shell.execute_reply":"2023-06-09T09:03:41.874646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IDs of training set\ntrain_ids = get_train_ids()\n\nprint(len(train_ids))\nprint(list(train_ids)[:10])","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:03:41.877652Z","iopub.execute_input":"2023-06-09T09:03:41.878288Z","iopub.status.idle":"2023-06-09T09:04:06.670657Z","shell.execute_reply.started":"2023-06-09T09:03:41.878254Z","shell.execute_reply":"2023-06-09T09:04:06.669872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IDs of test set\ntest_ids = get_test_ids()\n\nprint(len(test_ids))\nprint(list(test_ids)[:10])","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.672101Z","iopub.execute_input":"2023-06-09T09:04:06.672504Z","iopub.status.idle":"2023-06-09T09:04:06.681609Z","shell.execute_reply.started":"2023-06-09T09:04:06.672478Z","shell.execute_reply":"2023-06-09T09:04:06.679789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IDs relating to the annotation regions\npolygons_ids = get_polygons_ids()\n\nprint(len(polygons_ids))\nprint(list(polygons_ids)[:10])","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.682884Z","iopub.execute_input":"2023-06-09T09:04:06.683217Z","iopub.status.idle":"2023-06-09T09:04:06.699007Z","shell.execute_reply.started":"2023-06-09T09:04:06.683190Z","shell.execute_reply":"2023-06-09T09:04:06.697034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# IDs relating to the metadata\nmeta_ids = get_meta_ids()\n\nprint(len(meta_ids))\nprint(list(meta_ids)[:10])","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.700824Z","iopub.execute_input":"2023-06-09T09:04:06.701285Z","iopub.status.idle":"2023-06-09T09:04:06.733776Z","shell.execute_reply.started":"2023-06-09T09:04:06.701254Z","shell.execute_reply":"2023-06-09T09:04:06.732822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Ok, testing set does not intersect training set\nlen(test_ids.intersection(train_ids))","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.735089Z","iopub.execute_input":"2023-06-09T09:04:06.736427Z","iopub.status.idle":"2023-06-09T09:04:06.746370Z","shell.execute_reply.started":"2023-06-09T09:04:06.736367Z","shell.execute_reply":"2023-06-09T09:04:06.744976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# There is no a metadata for the given testing set.\nlen(test_ids.intersection(meta_ids))","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.747861Z","iopub.execute_input":"2023-06-09T09:04:06.749439Z","iopub.status.idle":"2023-06-09T09:04:06.759089Z","shell.execute_reply.started":"2023-06-09T09:04:06.749388Z","shell.execute_reply":"2023-06-09T09:04:06.758375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Ok. Test does not presented in polygons.\nlen(test_ids.intersection(polygons_ids))","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.762025Z","iopub.execute_input":"2023-06-09T09:04:06.763254Z","iopub.status.idle":"2023-06-09T09:04:06.774702Z","shell.execute_reply.started":"2023-06-09T09:04:06.763195Z","shell.execute_reply":"2023-06-09T09:04:06.773642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Only 1633 images presented in polygons\nlen(train_ids.intersection(polygons_ids))","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.775903Z","iopub.execute_input":"2023-06-09T09:04:06.777350Z","iopub.status.idle":"2023-06-09T09:04:06.792293Z","shell.execute_reply.started":"2023-06-09T09:04:06.777309Z","shell.execute_reply":"2023-06-09T09:04:06.790851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Four \"bad\" images are presented in polygons\nlen(get_bad_ids().intersection(polygons_ids))","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.793540Z","iopub.execute_input":"2023-06-09T09:04:06.793889Z","iopub.status.idle":"2023-06-09T09:04:06.808548Z","shell.execute_reply.started":"2023-06-09T09:04:06.793863Z","shell.execute_reply":"2023-06-09T09:04:06.807511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Lets see \"bad\" images\nbad_ids = get_bad_ids().intersection(polygons_ids)\n\nfor img_id in bad_ids:\n    draw_img(img_id)","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:06.810020Z","iopub.execute_input":"2023-06-09T09:04:06.810394Z","iopub.status.idle":"2023-06-09T09:04:07.131869Z","shell.execute_reply.started":"2023-06-09T09:04:06.810364Z","shell.execute_reply":"2023-06-09T09:04:07.130588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# There are regions for \"bad\" regions\n# They should be included into training (or validation) set\n\nfor img_id in bad_ids:\n    print(img_id, ':', end=' ')\n    print(reg_df[reg_df['iid'] == img_id]['coord'], '\\n')","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:07.134167Z","iopub.execute_input":"2023-06-09T09:04:07.134715Z","iopub.status.idle":"2023-06-09T09:04:07.246176Z","shell.execute_reply.started":"2023-06-09T09:04:07.134656Z","shell.execute_reply":"2023-06-09T09:04:07.244929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='2'></a>\n# 2 | Annotation Regions\n<div style='border-width: 2px;\n              border-bottom-width:4px;\n              border-bottom-color:#00FF00;\n              border-bottom-style: solid;'></div>\n<br/>\nAnnotation regions are essential in the development of the required AI model.","metadata":{}},{"cell_type":"code","source":"# NaN values (Ok)\nreg_df.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:07.248447Z","iopub.execute_input":"2023-06-09T09:04:07.248910Z","iopub.status.idle":"2023-06-09T09:04:07.275073Z","shell.execute_reply.started":"2023-06-09T09:04:07.248872Z","shell.execute_reply":"2023-06-09T09:04:07.272997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Types (Ok)\nreg_df['type'].unique()","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:07.276931Z","iopub.execute_input":"2023-06-09T09:04:07.277324Z","iopub.status.idle":"2023-06-09T09:04:07.299269Z","shell.execute_reply.started":"2023-06-09T09:04:07.277294Z","shell.execute_reply":"2023-06-09T09:04:07.297338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The dataset is very disbalanced by type\nvc = reg_df.type.value_counts()\nvc","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:07.302724Z","iopub.execute_input":"2023-06-09T09:04:07.303311Z","iopub.status.idle":"2023-06-09T09:04:07.322540Z","shell.execute_reply.started":"2023-06-09T09:04:07.303265Z","shell.execute_reply":"2023-06-09T09:04:07.320077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='2.1'></a>\n## 2.1 Region Areas per Image","metadata":{}},{"cell_type":"code","source":"# Return mask area (number of pixels in percent of 512 * 512) \ndef get_msk_area(img_id):\n    msk = np.zeros((512, 512), dtype = np.uint8)\n    mdf = reg_df[reg_df.iid == img_id]\n    for index, row in mdf.iterrows():\n        crd = np.array(row['coord'])\n        crd = crd.reshape(-1, 1, 2)\n        cv2.fillPoly(msk, [crd], 1)\n    ar_img = np.asarray(msk)\n    return ar_img.sum() * (100.0 / (512 * 512))\n\n# Calculate area for each region\n\nreg_areas_df = pd.DataFrame({'iid':[], 'area':[]})\n\nfor iid in polygons_ids:\n    ar = get_msk_area(iid)\n    reg_areas_df.loc[len(reg_areas_df.index)] = np.array([iid, ar])\n\nreg_areas_df['area'] = reg_areas_df['area'].astype(float)\n\nreg_areas_df","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:07.326253Z","iopub.execute_input":"2023-06-09T09:04:07.326756Z","iopub.status.idle":"2023-06-09T09:04:15.343990Z","shell.execute_reply.started":"2023-06-09T09:04:07.326717Z","shell.execute_reply":"2023-06-09T09:04:15.342311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# reg_areas_df.dtypes\nreg_areas_df['area'].describe()","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:15.345973Z","iopub.execute_input":"2023-06-09T09:04:15.347328Z","iopub.status.idle":"2023-06-09T09:04:15.364970Z","shell.execute_reply.started":"2023-06-09T09:04:15.347245Z","shell.execute_reply":"2023-06-09T09:04:15.363209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='2.2'></a>\n## 2.2 Areas of Regions","metadata":{}},{"cell_type":"code","source":"# Calculate area for each region\n\nreg_areas_reg_df = pd.DataFrame({'area':[]})\n\nfor index, row in reg_df.iterrows():\n    msk = np.zeros((512, 512), dtype = np.uint8)\n    crd = np.array(row['coord'])\n    crd = crd.reshape(-1, 1, 2)\n    # Draw the polygon on the mask\n    cv2.fillPoly(msk, [crd], 1)\n    ar_img = np.asarray(msk)\n    reg_areas_reg_df.loc[len(reg_areas_reg_df.index)] = np.array([ar_img.sum() * (100.0 / (512 * 512))])\n\nreg_areas_reg_df['area'] = reg_areas_reg_df['area'].astype(float)\n\nreg_areas_reg_df","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:15.367133Z","iopub.execute_input":"2023-06-09T09:04:15.367514Z","iopub.status.idle":"2023-06-09T09:04:37.165759Z","shell.execute_reply.started":"2023-06-09T09:04:15.367482Z","shell.execute_reply":"2023-06-09T09:04:37.164256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# reg_areas_df.dtypes\nreg_areas_reg_df['area'].describe()","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:37.166938Z","iopub.execute_input":"2023-06-09T09:04:37.167325Z","iopub.status.idle":"2023-06-09T09:04:37.181280Z","shell.execute_reply.started":"2023-06-09T09:04:37.167296Z","shell.execute_reply":"2023-06-09T09:04:37.179658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='3'></a>\n# 3 | Visual Control\n<div style='border-width: 2px;\n              border-bottom-width:4px;\n              border-bottom-color:#00FF00;\n              border-bottom-style: solid;'></div>\n<br/>\n\nVisual control of training TIFF images shows that picture of some of them differ from others.","metadata":{}},{"cell_type":"code","source":"# Display the divergent images\nbad_ids = get_bad_ids()\n\nfor img_id in bad_ids:\n    draw_img(img_id)","metadata":{"execution":{"iopub.status.busy":"2023-06-09T09:04:37.183669Z","iopub.execute_input":"2023-06-09T09:04:37.184427Z","iopub.status.idle":"2023-06-09T09:04:37.764651Z","shell.execute_reply.started":"2023-06-09T09:04:37.184388Z","shell.execute_reply":"2023-06-09T09:04:37.763056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id='4'></a>\n# 4 | Conclusion\n<div style='border-width: 2px;\n              border-bottom-width:4px;\n              border-bottom-color:#00FF00;\n              border-bottom-style: solid;'></div>\n\n\n1. Training list should be created according to the list of IDs from 'polygons.jsonl' file;\n2. Input data are imbalanced;\n3. Do the divergent images seem contributable to the model?","metadata":{}}]}