{"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":"Published on March 22, 2023. By Marília Prata, mpwolke","metadata":{}},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-03-22T21:06:13.961860Z","iopub.execute_input":"2023-03-22T21:06:13.962328Z","iopub.status.idle":"2023-03-22T21:06:41.467810Z","shell.execute_reply.started":"2023-03-22T21:06:13.962288Z","shell.execute_reply":"2023-03-22T21:06:41.466795Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Benetech - Making Graphs Accessible\n\n\"Benetech, the leading software for social good nonprofit, today announced two significant AI initiatives to reduce barriers to STEM (science, technology, engineering, and math) education and employment for people with disabilities and learning and thinking differences.\"\n\n\"The programs, supported by General Motors (GM) and Schmidt Futures, a philanthropic initiative of Eric and Wendy Schmidt, are focused on leveraging AI to make complex visuals, graphs, and equations in science and math educational materials accessible to people with dyslexia, vision loss, and other reading barriers.\"\n\n\"This technology will be used to enhance the accessibility of STEM education materials for students with reading barriers and empower other education stakeholders, including teachers, publishers, researchers, and students themselves, to improve the accessibility of their own materials.\"\n\nhttps://benetech.org/news/press/benetech-inclusive-ai-initiatives-break-down-stem-barriers-to-stem/\n\n\n\"The goal of this competition is to extract data represented by four types of charts commonly found in STEM textbooks. You will develop an automatic solution trained on a graph dataset.\"\n\nhttps://www.kaggle.com/competitions/benetech-making-graphs-accessible","metadata":{}},{"cell_type":"markdown","source":"![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS0EA99oaAe4OW0qBfIDgM94CuY12Hi-d8wyfNdKtRwNlgv_dYk6ZPSBJVTFeuffRX6cEU&usqp=CAU)https://benetech.org/blog/ai-unlock-stem-content-students-disabilities/","metadata":{}},{"cell_type":"markdown","source":"#Competition Citation\n\n@misc{benetech-making-graphs-accessible,\n\n    author = {Benji Andrews, benjiaa, HCL-Rantig, Hema Natarajan, Maggie, Ryan Holbrook},\n    \n    title = {Benetech - Making Graphs Accessible},\n    \n    publisher = {Kaggle},\n    \n    year = {2023},\n    \n    url = {https://kaggle.com/competitions/benetech-making-graphs-accessible}","metadata":{}},{"cell_type":"code","source":"%config Completer.use_jedi = False","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:08:37.843796Z","iopub.execute_input":"2023-03-22T21:08:37.844782Z","iopub.status.idle":"2023-03-22T21:08:37.854248Z","shell.execute_reply.started":"2023-03-22T21:08:37.844717Z","shell.execute_reply":"2023-03-22T21:08:37.852720Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -Uqqq pycocotools","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:08:53.143478Z","iopub.execute_input":"2023-03-22T21:08:53.143924Z","iopub.status.idle":"2023-03-22T21:09:31.429704Z","shell.execute_reply.started":"2023-03-22T21:08:53.143884Z","shell.execute_reply":"2023-03-22T21:09:31.427844Z"},"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Loading SeshuRajuP data","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/benetech-making-graphs-accessible-csv/train.csv')\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:27:09.809284Z","iopub.execute_input":"2023-03-22T21:27:09.809786Z","iopub.status.idle":"2023-03-22T21:27:13.267854Z","shell.execute_reply.started":"2023-03-22T21:27:09.809728Z","shell.execute_reply":"2023-03-22T21:27:13.266250Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Based on: https://www.kaggle.com/eigrad/convert-rle-to-bounding-box-x0-y0-x1-y1\ndef rle2mask(rle, img_w, img_h):\n    \n    ## transforming the string into an array of shape (2, N)\n    array = np.fromiter(rle.split(), dtype = np.uint)\n    array = array.reshape((-1,2)).T\n    array[0] = array[0] - 1\n    \n    ## decompressing the rle encoding (ie, turning [3, 1, 10, 2] into [3, 4, 10, 11, 12])\n    # for faster mask construction\n    starts, lenghts = array\n    mask_decompressed = np.concatenate([np.arange(s, s + l, dtype = np.uint) for s, l in zip(starts, lenghts)])\n\n    ## Building the binary mask\n    msk_img = np.zeros(img_w * img_h, dtype = np.uint8)\n    msk_img[mask_decompressed] = 1\n    msk_img = msk_img.reshape((img_h, img_w))\n    msk_img = np.asfortranarray(msk_img) ## This is important so pycocotools can handle this object\n    \n    return msk_img","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:10:31.048417Z","iopub.execute_input":"2023-03-22T21:10:31.048990Z","iopub.status.idle":"2023-03-22T21:10:31.057821Z","shell.execute_reply.started":"2023-03-22T21:10:31.048944Z","shell.execute_reply":"2023-03-22T21:10:31.056405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#I wasn't able to work with the annotations cause I got \"ValueError: invalid literal for int() with base 10: 'cc68f19b708c'\"","metadata":{}},{"cell_type":"code","source":"#Code by Jensen https://www.kaggle.com/code/a03102030/simple-cnn-for-top-10000-data\n#https://www.kaggle.com/code/mpwolke/iwildcam-2022-cnn\n\nimg=[]\nfilename=df.name[:10000]#original is id\nlabel=df.source[:10000]\nfor file in filename:\n    image=cv2.imread(\"../input/benetech-making-graphs-accessible/train/images/\"+file+'.jpg')\n    res=cv2.resize(image,(32,32))\n    img.append(res)\nimg=np.array(img)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-03-22T21:30:23.221697Z","iopub.execute_input":"2023-03-22T21:30:23.222283Z","iopub.status.idle":"2023-03-22T21:31:44.236262Z","shell.execute_reply.started":"2023-03-22T21:30:23.222222Z","shell.execute_reply":"2023-03-22T21:31:44.234261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Code by Jensen https://www.kaggle.com/code/a03102030/simple-cnn-for-top-10000-data\n#https://www.kaggle.com/code/mpwolke/iwildcam-2022-cnn\n\nplt.figure(figsize=(15,15))\nfor i in range(9):\n    plt.subplot(3,3,i+1)\n    plt.imshow(img[i])","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:31:53.149219Z","iopub.execute_input":"2023-03-22T21:31:53.149660Z","iopub.status.idle":"2023-03-22T21:31:54.525280Z","shell.execute_reply.started":"2023-03-22T21:31:53.149621Z","shell.execute_reply":"2023-03-22T21:31:54.523512Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Thank God and SeshuRajuP dataset I didn't got an error above","metadata":{}},{"cell_type":"code","source":"df_grp = df.groupby([\"name\",\"image\"])[[\"annotation\",\"height\",\"width\"]].sum().reset_index()\ndf_grp.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:43:31.255542Z","iopub.execute_input":"2023-03-22T21:43:31.256688Z","iopub.status.idle":"2023-03-22T21:43:31.469466Z","shell.execute_reply.started":"2023-03-22T21:43:31.256629Z","shell.execute_reply":"2023-03-22T21:43:31.468041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#I tried to reduce(group by) the columns to avoid error. Though I failed to make a model.","metadata":{}},{"cell_type":"code","source":"#Code by Jensen https://www.kaggle.com/code/a03102030/simple-cnn-for-top-10000-data\n#https://www.kaggle.com/code/mpwolke/iwildcam-2022-cnn\n\nimg1=[]\nfilename=df_grp.name[:10000]#original is id\nlabel=df_grp.image[:10000]\nfor file in filename:\n    image=cv2.imread(\"../input/benetech-making-graphs-accessible/train/images/\"+file+'.jpg')\n    res=cv2.resize(image,(32,32))\n    img1.append(res)\nimg1=np.array(img1)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:46:12.290244Z","iopub.execute_input":"2023-03-22T21:46:12.290804Z","iopub.status.idle":"2023-03-22T21:47:34.033410Z","shell.execute_reply.started":"2023-03-22T21:46:12.290739Z","shell.execute_reply":"2023-03-22T21:47:34.032192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Code by Jensen https://www.kaggle.com/code/a03102030/simple-cnn-for-top-10000-data\n#https://www.kaggle.com/code/mpwolke/iwildcam-2022-cnn\n\nplt.figure(figsize=(15,15))\nfor i in range(9):\n    plt.subplot(3,3,i+1)\n    plt.imshow(img1[i])","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:47:41.931855Z","iopub.execute_input":"2023-03-22T21:47:41.932298Z","iopub.status.idle":"2023-03-22T21:47:43.270426Z","shell.execute_reply.started":"2023-03-22T21:47:41.932262Z","shell.execute_reply":"2023-03-22T21:47:43.268795Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from pathlib import Path\nimport os.path\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport seaborn as sns\n\n#Ignore warnings\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:59:05.083818Z","iopub.execute_input":"2023-03-22T20:59:05.084258Z","iopub.status.idle":"2023-03-22T20:59:16.688383Z","shell.execute_reply.started":"2023-03-22T20:59:05.084219Z","shell.execute_reply":"2023-03-22T20:59:16.686900Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torchvision\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom PIL import Image, ImageDraw\n#import xml.etree.ElementTree as ET  #We don't have xml\n\nimages_dir = '/kaggle/input/benetech-making-graphs-accessible/train/images/'\nannotations_dir = '/kaggle/input/benetech-making-graphs-accessible/train/annotations/'","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:59:21.730996Z","iopub.execute_input":"2023-03-22T20:59:21.732255Z","iopub.status.idle":"2023-03-22T20:59:24.588954Z","shell.execute_reply.started":"2023-03-22T20:59:21.732179Z","shell.execute_reply":"2023-03-22T20:59:24.587730Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Sample Image","metadata":{}},{"cell_type":"code","source":"sample_image = Image.open('/kaggle/input/benetech-making-graphs-accessible/train/images/002bcf154c3d.jpg')\n\nsample_image","metadata":{"execution":{"iopub.status.busy":"2023-03-22T19:53:23.505999Z","iopub.execute_input":"2023-03-22T19:53:23.506625Z","iopub.status.idle":"2023-03-22T19:53:23.559839Z","shell.execute_reply.started":"2023-03-22T19:53:23.506585Z","shell.execute_reply":"2023-03-22T19:53:23.558513Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import requests\nfrom bs4 import BeautifulSoup\nimport lxml\nimport urllib\nimport sys\nfrom PIL import Image\nimport cv2\nimport csv\nimport multiprocessing\nimport matplotlib.pyplot as plt\nimport math\nimport time\nimport datetime\nimport glob","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-03-22T20:59:33.437313Z","iopub.execute_input":"2023-03-22T20:59:33.437736Z","iopub.status.idle":"2023-03-22T20:59:33.866797Z","shell.execute_reply.started":"2023-03-22T20:59:33.437698Z","shell.execute_reply":"2023-03-22T20:59:33.865127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#That below wasn't helpful cause we have many json files","metadata":{}},{"cell_type":"code","source":"#Code by Ventakumar R https://www.kaggle.com/venkatkumar001/hfp-2-eda-tensorflow/notebook\n\nimport json, codecs\n\nwith codecs.open(\"../input/benetech-making-graphs-accessible/train/annotations/002bcf154c3d.json\", 'r',\n                 encoding='utf-8', errors='ignore') as f:\n    train_meta = json.load(f)\n    \n#with codecs.open(\"../input/.json\", 'r',\n #                encoding='utf-8', errors='ignore') as f:\n  #  test_meta = json.load(f)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:15:29.643170Z","iopub.execute_input":"2023-03-22T20:15:29.643975Z","iopub.status.idle":"2023-03-22T20:15:29.651558Z","shell.execute_reply.started":"2023-03-22T20:15:29.643933Z","shell.execute_reply":"2023-03-22T20:15:29.650099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2 as cv\n\nimg = cv.imread('../input/benetech-making-graphs-accessible/train/images/002b6b51c9f1.jpg')\nprint( img.shape )","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:17:46.426854Z","iopub.execute_input":"2023-03-22T20:17:46.427279Z","iopub.status.idle":"2023-03-22T20:17:46.462943Z","shell.execute_reply.started":"2023-03-22T20:17:46.427245Z","shell.execute_reply":"2023-03-22T20:17:46.461567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Below, I will try to see more chart's images.","metadata":{}},{"cell_type":"code","source":"DATA_PATH = \"../input/benetech-making-graphs-accessible/\"","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:54:35.272315Z","iopub.execute_input":"2023-03-22T20:54:35.273801Z","iopub.status.idle":"2023-03-22T20:54:35.281800Z","shell.execute_reply.started":"2023-03-22T20:54:35.273730Z","shell.execute_reply":"2023-03-22T20:54:35.278593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_paths = sorted(glob.glob(os.path.join(DATA_PATH, 'train/images/*.jpg')))","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:54:59.854333Z","iopub.execute_input":"2023-03-22T20:54:59.854865Z","iopub.status.idle":"2023-03-22T20:55:00.092011Z","shell.execute_reply.started":"2023-03-22T20:54:59.854824Z","shell.execute_reply":"2023-03-22T20:55:00.090977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"Number of images: {len(image_paths)}\")","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:55:04.795932Z","iopub.execute_input":"2023-03-22T20:55:04.797140Z","iopub.status.idle":"2023-03-22T20:55:04.805876Z","shell.execute_reply.started":"2023-03-22T20:55:04.797040Z","shell.execute_reply":"2023-03-22T20:55:04.804066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"paths = sorted(glob.glob(\"../input/benetech-making-graphs-accessible/train/images/*\"))","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:55:31.293956Z","iopub.execute_input":"2023-03-22T20:55:31.294352Z","iopub.status.idle":"2023-03-22T20:55:31.534068Z","shell.execute_reply.started":"2023-03-22T20:55:31.294318Z","shell.execute_reply":"2023-03-22T20:55:31.532390Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf \nimport numpy as np\nimport os\nimport matplotlib.pyplot as plt \ntf.__version__","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:00:44.943837Z","iopub.execute_input":"2023-03-22T21:00:44.944625Z","iopub.status.idle":"2023-03-22T21:00:44.956703Z","shell.execute_reply.started":"2023-03-22T21:00:44.944578Z","shell.execute_reply":"2023-03-22T21:00:44.954837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Name0=os.listdir('../input/benetech-making-graphs-accessible')\nName=sorted(Name0)\nn=len(Name)\nN=list(range(n))\nnormal_mapping=dict(zip(Name,N)) \nreverse_mapping=dict(zip(N,Name)) ","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:01:20.582325Z","iopub.execute_input":"2023-03-22T21:01:20.582801Z","iopub.status.idle":"2023-03-22T21:01:20.590463Z","shell.execute_reply.started":"2023-03-22T21:01:20.582736Z","shell.execute_reply":"2023-03-22T21:01:20.589035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Prepare ImageDataGenerator","metadata":{}},{"cell_type":"code","source":"#https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator\n\nimg_generator = tf.keras.preprocessing.image.ImageDataGenerator(\n                            #rotation_range=90,\n                            brightness_range=(0.5,1), \n                            #shear_range=0.2, \n                            #zoom_range=0.2,\n                            channel_shift_range=0.2,\n                            horizontal_flip=False,\n                            vertical_flip=False,\n                            rescale=1./255,\n                            validation_split=0.3)","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:01:38.460298Z","iopub.execute_input":"2023-03-22T21:01:38.461858Z","iopub.status.idle":"2023-03-22T21:01:38.470826Z","shell.execute_reply.started":"2023-03-22T21:01:38.461774Z","shell.execute_reply":"2023-03-22T21:01:38.469176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Stpete Ishii https://www.kaggle.com/code/stpeteishii/transfer-learning-for-manga-facial-expressions\n\nroot_dir = '../input/benetech-making-graphs-accessible'\n\nimg_generator_flow_train = img_generator.flow_from_directory(\n    directory=root_dir,\n    target_size=(224, 224),\n    batch_size=32,\n    shuffle=True,\n    subset=\"training\")\n\nimg_generator_flow_valid = img_generator.flow_from_directory(\n    directory=root_dir,\n    target_size=(224, 224),\n    batch_size=32,\n    shuffle=True,\n    subset=\"validation\")","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:02:47.092708Z","iopub.execute_input":"2023-03-22T21:02:47.093188Z","iopub.status.idle":"2023-03-22T21:03:40.134284Z","shell.execute_reply.started":"2023-03-22T21:02:47.093147Z","shell.execute_reply":"2023-03-22T21:03:40.132859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Since it has many images, I will spare your time hidding the outputs. Unhide if you want to check them","metadata":{}},{"cell_type":"code","source":"#Stpete Ishii https://www.kaggle.com/code/stpeteishii/transfer-learning-for-manga-facial-expressions\n\nimgs, labels = next(iter(img_generator_flow_train))\nfor img, label in zip(imgs, labels):\n    value=np.argmax(label)\n    plt.imshow(img)\n    plt.title(reverse_mapping[value])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T21:04:18.650626Z","iopub.execute_input":"2023-03-22T21:04:18.652202Z","iopub.status.idle":"2023-03-22T21:04:26.830199Z","shell.execute_reply.started":"2023-03-22T21:04:18.652120Z","shell.execute_reply":"2023-03-22T21:04:26.828861Z"},"_kg_hide-output":true,"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Ihelon https://www.kaggle.com/code/ihelon/lego-minifigure-faces-overview\n\nn_cols = 4\nn_rows = int(math.ceil(len(paths) / n_cols))\n\nfor r in range(n_rows):\n    plt.figure(figsize=(16, 5))\n    for c in range(n_cols):\n        plt.subplot(1, n_cols, c + 1)\n        current = r * n_cols + c\n        if current >= len(paths):\n            break\n        image = cv2.imread(paths[current])\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        plt.imshow(image)\n        plt.xticks([])\n        plt.yticks([])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-22T20:55:38.009499Z","iopub.execute_input":"2023-03-22T20:55:38.009918Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#Conclusion\n\nIt's another FrankensPythonish code of mine where I failed to join the Json annotations with the images.","metadata":{}},{"cell_type":"markdown","source":"#Acknowledgements:\n\nJensen https://www.kaggle.com/code/a03102030/simple-cnn-for-top-10000-data\n\nIhelon https://www.kaggle.com/code/ihelon/lego-minifigure-faces-overview\n\nStpete Ishii https://www.kaggle.com/code/stpeteishii/transfer-learning-for-manga-facial-expressions\n\nVentakumar R https://www.kaggle.com/venkatkumar001/hfp-2-eda-tensorflow/notebook","metadata":{}}]}