{"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":"# Requirements","metadata":{}},{"cell_type":"code","source":"!pip install mediapipe -q","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:15:43.348530Z","iopub.execute_input":"2023-02-28T07:15:43.349754Z","iopub.status.idle":"2023-02-28T07:16:01.912010Z","shell.execute_reply.started":"2023-02-28T07:15:43.349704Z","shell.execute_reply":"2023-02-28T07:16:01.910183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Imports","metadata":{}},{"cell_type":"code","source":"import sys\nsys.path.insert(1, \"/kaggle/input/drawing-utils-edited\")","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:14.548323Z","iopub.execute_input":"2023-02-28T07:16:14.548767Z","iopub.status.idle":"2023-02-28T07:16:14.554991Z","shell.execute_reply.started":"2023-02-28T07:16:14.548721Z","shell.execute_reply":"2023-02-28T07:16:14.553716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom wordcloud import WordCloud\nimport matplotlib.pyplot as plt\n\nimport mediapipe as mp\nimport cv2\nfrom drawing_utils_edited import draw_landmarks","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-28T07:16:15.125750Z","iopub.execute_input":"2023-02-28T07:16:15.126179Z","iopub.status.idle":"2023-02-28T07:16:15.433580Z","shell.execute_reply.started":"2023-02-28T07:16:15.126141Z","shell.execute_reply":"2023-02-28T07:16:15.432481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Utils","metadata":{}},{"cell_type":"code","source":"def visualize(**images):\n    \"\"\"PLot images in one row.\"\"\"\n    n = len(images)\n    plt.figure(figsize=(40, 5))\n    for i, (name, image) in enumerate(images.items()):\n        plt.subplot(1, n, i + 1)\n        plt.xticks([])\n        plt.yticks([])\n        plt.title(' '.join(name.split('_')).title())\n        plt.imshow(image)\n    plt.show()\n\ndef draw_face(background_image, face_df):\n    face_image = background_image.copy()\n    draw_landmarks(\n        face_image,\n        df,\n        mp_holistic.FACEMESH_CONTOURS,\n        landmark_drawing_spec=None,\n        connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_contours_style()\n    )\n    return face_image\n    \ndef draw_pose(background_image, pose_df):\n    pose_image = background_image.copy()\n    draw_landmarks(\n        pose_image,\n        df,\n        mp_holistic.POSE_CONNECTIONS,\n        #landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style()\n        )\n    return pose_image\n    \ndef draw_left_hand(background_image, left_hand):\n    left_hand_image = background_image.copy()\n    draw_landmarks(\n        left_hand_image,\n        df,\n        mp_holistic.HAND_CONNECTIONS,\n        mp_drawing_styles.get_default_hand_landmarks_style(),\n        mp_drawing_styles.get_default_hand_connections_style())\n    return left_hand_image\n\ndef draw_right_hand_image(background_image, right_hand_df):\n    right_hand_image = background_image.copy()\n    draw_landmarks(\n        right_hand_image,\n        df,\n        mp_holistic.HAND_CONNECTIONS,\n        mp_drawing_styles.get_default_hand_landmarks_style(),\n        mp_drawing_styles.get_default_hand_connections_style())\n    \n    return right_hand_image","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:16.592257Z","iopub.execute_input":"2023-02-28T07:16:16.592660Z","iopub.status.idle":"2023-02-28T07:16:16.604892Z","shell.execute_reply.started":"2023-02-28T07:16:16.592623Z","shell.execute_reply":"2023-02-28T07:16:16.603588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train CSV","metadata":{"_kg_hide-input":true}},{"cell_type":"code","source":"train= pd.read_csv(\"/kaggle/input/asl-signs/train.csv\")\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:17.387942Z","iopub.execute_input":"2023-02-28T07:16:17.388364Z","iopub.status.idle":"2023-02-28T07:16:17.636957Z","shell.execute_reply.started":"2023-02-28T07:16:17.388327Z","shell.execute_reply":"2023-02-28T07:16:17.635709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# number of classes\nlen(train[\"sign\"].unique())","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:18.008944Z","iopub.execute_input":"2023-02-28T07:16:18.009416Z","iopub.status.idle":"2023-02-28T07:16:18.033122Z","shell.execute_reply.started":"2023-02-28T07:16:18.009372Z","shell.execute_reply":"2023-02-28T07:16:18.031210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train[\"sign\"].value_counts())","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:18.730804Z","iopub.execute_input":"2023-02-28T07:16:18.731241Z","iopub.status.idle":"2023-02-28T07:16:18.747532Z","shell.execute_reply.started":"2023-02-28T07:16:18.731201Z","shell.execute_reply":"2023-02-28T07:16:18.745977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class distribution\nfor i in range(50, len(train[\"sign\"].value_counts())+1, 50):\n   \n    plt.subplot(5, 1, int(i/50))\n    plt.xticks([])\n    plt.yticks([])\n    \n    train[\"sign\"].value_counts()[i-50:i].plot(kind= \"barh\", figsize=(20,80))\n    ","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:19.104367Z","iopub.execute_input":"2023-02-28T07:16:19.105228Z","iopub.status.idle":"2023-02-28T07:16:23.554881Z","shell.execute_reply.started":"2023-02-28T07:16:19.105183Z","shell.execute_reply":"2023-02-28T07:16:23.553767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CLASSES_STR= \"\"\nfor sign in train[\"sign\"]:\n    CLASSES_STR+= sign+\" \"\n\nwordcloud = WordCloud(width = 800, height = 800,\n                background_color ='white',\n                min_font_size = 10).generate(CLASSES_STR)\n\n# plot the WordCloud image                      \nplt.figure(figsize = (8, 8), facecolor = None)\nplt.imshow(wordcloud)\nplt.axis(\"off\")\nplt.tight_layout(pad = 0)\n \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:25.761760Z","iopub.execute_input":"2023-02-28T07:16:25.762886Z","iopub.status.idle":"2023-02-28T07:16:27.980948Z","shell.execute_reply.started":"2023-02-28T07:16:25.762827Z","shell.execute_reply":"2023-02-28T07:16:27.980079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize keypoints","metadata":{}},{"cell_type":"code","source":"# Build Keypoints using MP Holistic\nmp_holistic = mp.solutions.holistic # Holistic model\nmp_drawing = mp.solutions.drawing_utils # Drawing utilities\nmp_drawing_styles = mp.solutions.drawing_styles\n\n# dummy background image\nimage = np.zeros([400,400,3],dtype=np.uint8)\nimage.fill(255) # or img[:] = 255  ","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:30.451739Z","iopub.execute_input":"2023-02-28T07:16:30.453020Z","iopub.status.idle":"2023-02-28T07:16:30.459850Z","shell.execute_reply.started":"2023-02-28T07:16:30.452964Z","shell.execute_reply":"2023-02-28T07:16:30.457915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Change path to any parquet file here:","metadata":{}},{"cell_type":"code","source":"# a sample parquet to visualize\npath = \"/kaggle/input/asl-signs/train_landmark_files/18796/1001373962.parquet\"\nsample_parquet= pd.read_parquet(path)","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:31.381944Z","iopub.execute_input":"2023-02-28T07:16:31.382383Z","iopub.status.idle":"2023-02-28T07:16:31.502235Z","shell.execute_reply.started":"2023-02-28T07:16:31.382344Z","shell.execute_reply":"2023-02-28T07:16:31.501151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"grouped_by_frame_number= sample_parquet.groupby([\"frame\"])\nfor frame_num, df in grouped_by_frame_number:\n    \n    grouped_by_type= df.groupby([\"type\"])\n    \n    for type_, df in grouped_by_type:\n        if type_ == \"face\":\n            face_image= draw_face(image, df)\n        \n        if type_ == \"pose\":\n            pose_image= draw_pose(image, df)\n            \n        if type_ == \"left_hand\":\n            left_hand_image= draw_left_hand(image, df)\n            \n        if type_ == \"right_hand\":\n            right_hand_image= draw_right_hand_image(image, df)\n            \n    print(frame_num)\n    visualize( \n        face=face_image,\n        pose=pose_image,\n        left_hande=left_hand_image,\n        right_hand=right_hand_image,\n        )\n    ","metadata":{"execution":{"iopub.status.busy":"2023-02-28T07:16:32.333924Z","iopub.execute_input":"2023-02-28T07:16:32.334738Z","iopub.status.idle":"2023-02-28T07:16:35.646331Z","shell.execute_reply.started":"2023-02-28T07:16:32.334684Z","shell.execute_reply":"2023-02-28T07:16:35.645098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}