Skip to content

Instantly share code, notes, and snippets.

@jcheong0428
Last active March 1, 2022 01:37
Show Gist options
  • Save jcheong0428/60b748c9cdb39c3c8db0145682577f7f to your computer and use it in GitHub Desktop.
Save jcheong0428/60b748c9cdb39c3c8db0145682577f7f to your computer and use it in GitHub Desktop.
22W_PSYC53.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "22W_PSYC53.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyPBtPIecYUIARuFLdZf9r2K",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/jcheong0428/60b748c9cdb39c3c8db0145682577f7f/22w_psyc53.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# 1.1 Install OpenFace\n",
"Note that installation can take ~40 minutes. \n",
"\n",
"If you plan on using OpenPose, change your runtime to GPU. \n",
"Click \"Runtime\"->\"Change runtime type\" from the top menu and click \"GPU\". "
],
"metadata": {
"id": "JWIME_JHDchK"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "yfpPuxEwqXCk"
},
"outputs": [],
"source": [
"import os\n",
"from os.path import exists, join, basename, splitext\n",
"\n",
"git_repo_url = 'https://github.com/TadasBaltrusaitis/OpenFace.git'\n",
"project_name = splitext(basename(git_repo_url))[0]\n",
"# clone openface\n",
"!git clone -q --depth 1 $git_repo_url\n",
"\n",
"# install python dependencies\n",
"!pip install -q youtube-dl\n",
"\n",
"# Finally, actually install OpenFace\n",
"!cd OpenFace && bash ./download_models.sh && sudo bash ./install.sh"
]
},
{
"cell_type": "markdown",
"source": [
"## 1.2 Upload your video\n",
"Drop your video into the File section shown on the left. Check what your file name is, and change the \"output.mp4\" and \"output.avi\" to your video's file name.\n",
"\n",
"For example, if your video name is group1.mp4, change \"output.mp4\" to \"group1.mp3\", and \"output.avi\" to \"group1.avi\".\n"
],
"metadata": {
"id": "hGug5hg3d0dI"
}
},
{
"cell_type": "code",
"source": [
"# change output.mp4 to your group's video\n",
"!./OpenFace/build/bin/FaceLandmarkVidMulti -f output.mp4 -out_dir processed\n",
"# convert the result into MP4\n",
"!ffmpeg -y -loglevel info -i processed/output.avi output.mp4"
],
"metadata": {
"id": "9kY9-FtaDb47"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def show_local_mp4_video(file_name, width=640, height=480):\n",
" import io\n",
" import base64\n",
" from IPython.display import HTML\n",
" video_encoded = base64.b64encode(io.open(file_name, 'rb').read())\n",
" return HTML(data='''<video width=\"{0}\" height=\"{1}\" alt=\"test\" controls>\n",
" <source src=\"data:video/mp4;base64,{2}\" type=\"video/mp4\" />\n",
" </video>'''.format(width, height, video_encoded.decode('ascii')))\n",
"\n",
"show_local_mp4_video('output.mp4', width=960, height=720)"
],
"metadata": {
"id": "FQMrovkROHw2"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"To avoid installing and processing this step, download the processed results in the \"processed\" folder from the \"Files\" tab on the left. The file will be named \"yourvideoname.csv\". Click Download from the three dots when you hover over the file. "
],
"metadata": {
"id": "N6R5fSUVILHJ"
}
},
{
"cell_type": "markdown",
"source": [
"# 2.1 Install OpenPose\n",
"\n",
"Before installing OpenPose change your runtime to GPU. \n",
"Click \"Runtime\"->\"Change runtime type\" from the top menu and click \"GPU\". \n",
"~20 minutes"
],
"metadata": {
"id": "wL0xnah4iDqZ"
}
},
{
"cell_type": "code",
"source": [
"import os\n",
"from os.path import exists, join, basename, splitext\n",
"\n",
"git_repo_url = 'https://github.com/CMU-Perceptual-Computing-Lab/openpose.git'\n",
"project_name = splitext(basename(git_repo_url))[0]\n",
"if not exists(project_name):\n",
" # see: https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/949\n",
" # install new CMake becaue of CUDA10\n",
" !wget -q https://cmake.org/files/v3.13/cmake-3.13.0-Linux-x86_64.tar.gz\n",
" !tar xfz cmake-3.13.0-Linux-x86_64.tar.gz --strip-components=1 -C /usr/local\n",
" # clone openpose\n",
" !git clone -q --depth 1 $git_repo_url\n",
" !sed -i 's/execute_process(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\\/3rdparty\\/caffe)/execute_process(COMMAND git checkout f019d0dfe86f49d1140961f8c7dec22130c83154 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\\/3rdparty\\/caffe)/g' openpose/CMakeLists.txt\n",
" # install system dependencies\n",
" !apt-get -qq install -y libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev opencl-headers ocl-icd-opencl-dev libviennacl-dev\n",
" # install python dependencies\n",
" !pip install -q youtube-dl\n",
" # build openpose\n",
" !cd openpose && rm -rf build || true && mkdir build && cd build && cmake .. && make -j`nproc`\n",
" \n",
"from IPython.display import YouTubeVideo"
],
"metadata": {
"id": "MmxUVLglgHm4",
"outputId": "e7cbbff9-b639-4702-b02d-6ffa52c5b814",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"^C\n",
"\n",
"gzip: stdin: unexpected end of file\n",
"tar: Unexpected EOF in archive\n",
"tar: Unexpected EOF in archive\n",
"tar: Error is not recoverable: exiting now\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"# 2.2 Upload your group's video & Extract poses from video. \n",
"Change \"video.mp4\" to your video name. "
],
"metadata": {
"id": "TVLO6nfRiWDv"
}
},
{
"cell_type": "code",
"source": [
"# Use openpose to extract poses\n",
"!cd openpose && ./build/examples/openpose/openpose.bin --video ../video.mp4 --write_json ./output/ --display 0 --write_video ../openpose.avi\n",
"# convert the result into MP4\n",
"!ffmpeg -y -loglevel info -i openpose.avi openpose.mp4"
],
"metadata": {
"id": "pvrSe9IVgHkk"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def show_local_mp4_video(file_name, width=640, height=480):\n",
" import io\n",
" import base64\n",
" from IPython.display import HTML\n",
" video_encoded = base64.b64encode(io.open(file_name, 'rb').read())\n",
" return HTML(data='''<video width=\"{0}\" height=\"{1}\" alt=\"test\" controls>\n",
" <source src=\"data:video/mp4;base64,{2}\" type=\"video/mp4\" />\n",
" </video>'''.format(width, height, video_encoded.decode('ascii')))\n",
"\n",
"# visualize results\n",
"show_local_mp4_video('openpose.mp4', width=960, height=720)"
],
"metadata": {
"id": "EqWcLtA-egaj"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"OpenPose outputs are saved in the \"outuput\" folder. Download the entire folder by running the following code to save the results into a zip file. You can then click the zip file \"openpose_results.zip\" to download it. "
],
"metadata": {
"id": "dgu7zFAnJHX3"
}
},
{
"cell_type": "code",
"source": [
"!zip -r /content/openpose_results.zip /content/openpose/output\n"
],
"metadata": {
"id": "wHXfEVciJKpY"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"\n",
"\n",
"# 2.3 Analyze OpenPose data\n"
],
"metadata": {
"id": "IukgXavSeh9U"
}
},
{
"cell_type": "markdown",
"source": [
"If you are re-logging in, start from here by uploading the results zip file. You don't need to install OpenPose again. The code below will extract the zip file to the /openpose/output director. "
],
"metadata": {
"id": "4kSYoVqSuQO_"
}
},
{
"cell_type": "code",
"source": [
"!mkdir -p /content/openpose\n",
"!unzip -j openpose_results.zip -d /content/openpose/output"
],
"metadata": {
"id": "FFwym5diuPVI"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"After you have the data extracted, run the following code."
],
"metadata": {
"id": "KHXrpIq-uP9O"
}
},
{
"cell_type": "code",
"source": [
"import json, os, glob\n",
"import pandas as pd, numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"pose_2d_keys = {0: \"Nose\", 1: \"Neck\", 2: \"RShoulder\",\n",
"3: \"RElbow\", 4: \"RWrist\", 5: \"LShoulder\", 6: \"LElbow\",\n",
"7: \"LWrist\", 8: \"MidHip\", 9: \"RHip\",\n",
"10: \"RKnee\", 11: \"RAnkle\", 12: \"LHip\", 13: \"LKnee\", 14: \"LAnkle\", 15: \"REye\",\n",
"16: \"LEye\", 17: \"REar\", 18: \"LEar\", 19: \"LBigToe\", 20: \"LSmallToe\",\n",
"21: \"LHeel\", 22: \"RBigToe\", 23: \"RSmallToe\", 24: \"RHeel\", 25: \"Background\"}\n",
"pose2d_cols = np.ravel([[f'x_{pose_2d_keys[i]}',\n",
" f'y_{pose_2d_keys[i]}',\n",
" f'c_{pose_2d_keys[i]}'] for i in range(25)])\n",
"\n",
"def load_keypoints(fname, frame_no):\n",
" '''Load OpenPose keypoints output\n",
" Args:\n",
" fname: filename of OpenPose output keypoints\n",
" frame_no: frame number to be appended to file\n",
" Returns:\n",
" Pandas dataframe that includes filename, inferred frameno, value, key, keyID.\n",
" Example Use:\n",
" import glob, os\n",
" import pandas as pd\n",
" from tqdm import tqdm\n",
" fnames = np.sort(glob.glob('output/json/*_keypoints.json'))\n",
" new_df_fname = 'output/Sherlock.csv'\n",
" if not os.path.exists(new_df_fname):\n",
" for fname in tqdm(fnames[:5000]):\n",
" frame_no = os.path.split(fname)[1].split('_')[1]\n",
" load_keypoints(fname, frame_no = frame_no).to_csv(new_df_fname, index=False, header=False, mode='a')\n",
" else:\n",
" col_names = ['fname', 'frame', 'key','keyID', 'personID','value']\n",
" df = pd.read_csv(new_df_fname, header=None, names=col_names)\n",
" '''\n",
" with open(fname) as json_file:\n",
" data = json.load(json_file)\n",
" # check if no_people different from number of unique people ids\n",
" no_people = len(data['people'])\n",
" people_ids = [data['people'][i_people]['person_id'][0] for i_people in range(no_people)]\n",
" if no_people != len(np.unique(people_ids)):\n",
" people_ids = list(range(no_people))\n",
" df = pd.DataFrame()\n",
" for i_people in range(no_people):\n",
" for key in data['people'][i_people].keys():\n",
" value = data['people'][i_people][key]\n",
" # if key=='pose_keypoints_2d':\n",
" # # use appropriate name\n",
" # keyID = [pose2d_cols[i] for i in range(len(value))]\n",
" # else:\n",
" keyID = [f\"{key}_{str(i).zfill(3)}\" for i in range(len(value))]\n",
" df = pd.concat([df, pd.DataFrame({'fname': fname, 'frame': frame_no,\n",
" 'key': key, 'keyID': keyID,\n",
" 'personID': people_ids[i_people],\n",
" 'value': value\n",
" })])\n",
" return df.reset_index(drop=True)\n",
"\n",
"import glob, os\n",
"import pandas as pd\n",
"from tqdm import tqdm\n",
"fnames = np.sort(glob.glob('/content/openpose/output/*_keypoints.json'))\n",
"new_df_fname = 'pose_output.csv'\n",
"if not os.path.exists(new_df_fname):\n",
" for fname in tqdm(fnames):\n",
" frame_no = os.path.split(fname)[1].split('_')[1]\n",
" df = load_keypoints(fname, frame_no = frame_no).to_csv(new_df_fname, index=False, header=False, mode='a')\n",
"else:\n",
" col_names = ['fname', 'frame', 'key','keyID', 'personID','value']\n",
" df = pd.read_csv(new_df_fname, header=None, names=col_names)"
],
"metadata": {
"id": "BVI2NCtVgHhn"
},
"execution_count": 1,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"See OpenPose doc for link between columnID and body point: https://cmu-perceptual-computing-lab.github.io/openpose/web/html/doc/md_doc_02_output.html\n",
"\n",
"The code below plots the movement of the sternum for each individual in the video. Note that you'll need to tweek the face_id to match th enumber of people in the video. "
],
"metadata": {
"id": "g1Hq1l7-esG1"
}
},
{
"cell_type": "code",
"source": [
"# Check if data loaded. \n",
"df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 270
},
"id": "UxRUpVG0GH7s",
"outputId": "a9461aa0-127a-403e-ec5f-98452efd59ae"
},
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"\n",
" <div id=\"df-1a610303-3701-40bd-b2b7-57bd8b39872f\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>fname</th>\n",
" <th>frame</th>\n",
" <th>key</th>\n",
" <th>keyID</th>\n",
" <th>personID</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>/content/openpose/output/ExpVideo_000000000000...</td>\n",
" <td>0</td>\n",
" <td>person_id</td>\n",
" <td>person_id_000</td>\n",
" <td>0</td>\n",
" <td>-1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>/content/openpose/output/ExpVideo_000000000000...</td>\n",
" <td>0</td>\n",
" <td>pose_keypoints_2d</td>\n",
" <td>pose_keypoints_2d_000</td>\n",
" <td>0</td>\n",
" <td>562.671000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>/content/openpose/output/ExpVideo_000000000000...</td>\n",
" <td>0</td>\n",
" <td>pose_keypoints_2d</td>\n",
" <td>pose_keypoints_2d_001</td>\n",
" <td>0</td>\n",
" <td>453.773000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>/content/openpose/output/ExpVideo_000000000000...</td>\n",
" <td>0</td>\n",
" <td>pose_keypoints_2d</td>\n",
" <td>pose_keypoints_2d_002</td>\n",
" <td>0</td>\n",
" <td>0.842676</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>/content/openpose/output/ExpVideo_000000000000...</td>\n",
" <td>0</td>\n",
" <td>pose_keypoints_2d</td>\n",
" <td>pose_keypoints_2d_003</td>\n",
" <td>0</td>\n",
" <td>527.467000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-1a610303-3701-40bd-b2b7-57bd8b39872f')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-1a610303-3701-40bd-b2b7-57bd8b39872f button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-1a610303-3701-40bd-b2b7-57bd8b39872f');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
],
"text/plain": [
" fname ... value\n",
"0 /content/openpose/output/ExpVideo_000000000000... ... -1.000000\n",
"1 /content/openpose/output/ExpVideo_000000000000... ... 562.671000\n",
"2 /content/openpose/output/ExpVideo_000000000000... ... 453.773000\n",
"3 /content/openpose/output/ExpVideo_000000000000... ... 0.842676\n",
"4 /content/openpose/output/ExpVideo_000000000000... ... 527.467000\n",
"\n",
"[5 rows x 6 columns]"
]
},
"metadata": {},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"source": [
"# Scatterplot of neck\n",
"threshold = .85\n",
"filter_window = 60\n",
"\n",
"for personID in [0,1,2]:\n",
" persondf = df.query(\"key=='pose_keypoints_2d' and personID==@personID\") \n",
" cs_index = persondf.query(\"keyID=='pose_keypoints_2d_002' and value>@threshold\").index\n",
"\n",
" xs = persondf.loc[cs_index-2]['value'].rolling(filter_window).median(center=True).values\n",
" ys = persondf.loc[cs_index-1]['value'].rolling(filter_window).median(center=True).values\n",
" \n",
" plt.scatter(xs, ys, s=1, label=personID)\n",
"plt.legend()\n",
"plt.axis('equal')\n",
"plt.xlim([0, 1920])\n",
"plt.ylim([1080,0])\n",
"plt.show()"
],
"metadata": {
"id": "z8OKndioed5D",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 269
},
"outputId": "a6255d4d-6758-4cad-84fb-9f095852cd4b"
},
"execution_count": 3,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"# 3.1 Video Event Segmentation Tool \n",
"\n",
"\n",
"* [Click this link to use the tool](https://jinhyuncheong.com/vest/vest.html)\n",
"* [How to use the tool](https://towardsdatascience.com/how-to-use-vest-a-free-online-tool-for-segmenting-video-clips-a6ec50e29971?sk=2065cb12567832eef625bbba810543b6)\n",
"* How to analyze the output (shown below)\n",
"\n",
"\n"
],
"metadata": {
"id": "UDvkdm_WgH-9"
}
},
{
"cell_type": "markdown",
"source": [
"1. After you are done annotating, download your results with the \"Download results\" button. You will get a \"segmentation_results.json\" file in your download folder. \n",
"2. Drag & drop this file into the Files menu on your right. This will upload the file to Colab. \n",
"3. Run the following code below to get the outputs in a table format and plot the speech times. "
],
"metadata": {
"id": "cLocy-50goQz"
}
},
{
"cell_type": "code",
"source": [
"import pandas as pd\n",
"\n",
"def parse_vest_json(f):\n",
" \"\"\"Parse json output from VEST\n",
"\n",
" Args:\n",
" f: path to VEST json output\n",
" \n",
" Returns:\n",
" segmentations dataframe\n",
" points dataframe\n",
" \"\"\"\n",
" seg_df, pts_df = pd.DataFrame(), pd.DataFrame()\n",
"\n",
" df = pd.read_json(f, lines=True)\n",
" seg_cols = [col for col in df.columns if 'segment' in col]\n",
" _seg_df = df[seg_cols].dropna().T\n",
" for rowix, row in _seg_df.iterrows():\n",
" seg_df = pd.concat([seg_df, pd.DataFrame(row.values[0],index=[row.name])])\n",
"\n",
" pts_cols = [col for col in df.columns if 'point' in col]\n",
" _pts_df = df[pts_cols].dropna().T\n",
" for rowix, row in _pts_df.iterrows():\n",
" pts_df = pd.concat([pts_df, pd.DataFrame(row.values[0], index=[row.name])])\n",
" return seg_df, pts_df\n",
"\n",
"\n",
"path_to_file = \"/content/segmentation_results.json\"\n",
"seg_df, pts_df = parse_vest_json(f=path_to_file)\n",
"display(seg_df.head(), pts_df.head()) # Show the first few lines. "
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 221
},
"id": "MxJDRii8qgDa",
"outputId": "404deed0-8a7b-494d-aead-3e747090efce"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <div id=\"df-c40c6506-e1ca-4a83-8773-2c5775a3f219\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>startTime</th>\n",
" <th>endTime</th>\n",
" <th>id</th>\n",
" <th>labelText</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>peaks.segment.0</th>\n",
" <td>1.866666</td>\n",
" <td>50.858667</td>\n",
" <td>peaks.segment.0</td>\n",
" <td>Speaker 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peaks.segment.2</th>\n",
" <td>52.773333</td>\n",
" <td>103.168000</td>\n",
" <td>peaks.segment.2</td>\n",
" <td>Speaker 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peaks.segment.3</th>\n",
" <td>103.594667</td>\n",
" <td>138.069333</td>\n",
" <td>peaks.segment.3</td>\n",
" <td>Speaker 3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peaks.segment.4</th>\n",
" <td>142.812303</td>\n",
" <td>144.469333</td>\n",
" <td>peaks.segment.4</td>\n",
" <td>Speaker 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peaks.segment.5</th>\n",
" <td>144.725333</td>\n",
" <td>147.114667</td>\n",
" <td>peaks.segment.5</td>\n",
" <td>Speaker 2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-c40c6506-e1ca-4a83-8773-2c5775a3f219')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-c40c6506-e1ca-4a83-8773-2c5775a3f219 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-c40c6506-e1ca-4a83-8773-2c5775a3f219');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
],
"text/plain": [
" startTime endTime id labelText\n",
"peaks.segment.0 1.866666 50.858667 peaks.segment.0 Speaker 1\n",
"peaks.segment.2 52.773333 103.168000 peaks.segment.2 Speaker 2\n",
"peaks.segment.3 103.594667 138.069333 peaks.segment.3 Speaker 3\n",
"peaks.segment.4 142.812303 144.469333 peaks.segment.4 Speaker 1\n",
"peaks.segment.5 144.725333 147.114667 peaks.segment.5 Speaker 2"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <div id=\"df-2327bbf1-6119-4991-873d-935adc21580e\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2327bbf1-6119-4991-873d-935adc21580e')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-2327bbf1-6119-4991-873d-935adc21580e button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-2327bbf1-6119-4991-873d-935adc21580e');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
],
"text/plain": [
"Empty DataFrame\n",
"Columns: []\n",
"Index: []"
]
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"# 3.2 Plot how each person was speaking."
],
"metadata": {
"id": "wf4G-7QKhHlu"
}
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"yvaldict = {'Speaker 1': {'ymin':0, 'ymax':.333, 'color': 'b'}, \n",
" 'Speaker 2':{'ymin': .333, 'ymax':.666, 'color': 'r'} , \n",
" 'Speaker 3': {'ymin': .666, 'ymax':.999, 'color': 'k'}}\n",
"# plot segmentation results.\n",
"f,ax = plt.subplots(figsize=(15,2))\n",
"for speaker in yvaldict.keys():\n",
" for rowix, row in seg_df.query('labelText==@speaker').iterrows():\n",
" ax.fill_betweenx([yvaldict[row.labelText]['ymin'], yvaldict[row.labelText]['ymax']],\n",
" row.startTime, row.endTime, color=yvaldict[row.labelText]['color']\n",
" )\n",
"\n",
"# plot points results\n",
"_ = [ax.axvline(row.startTime, linestyle='--') for rowix, row in pts_df.iterrows()]\n",
"\n",
"# add speech portion info \n",
"seg_df['duration'] = seg_df['endTime']-seg_df['startTime']\n",
"speechportion = seg_df.groupby('labelText').sum()/seg_df.groupby('labelText').sum().sum()\n",
"speechportion = speechportion['duration']\n",
"\n",
"ax.set(xlabel='Time (sec)', title=f\"Group XX\\n\\\n",
"Speech time distributions: S1 {speechportion['Speaker 1']:.2f}, \\\n",
"S2 {speechportion['Speaker 2']:.2f}, S3 {speechportion['Speaker 3']:.2f}\", ylabel=\"Speaker\")\n",
"ax.set(yticks=[.15, .5, .85], yticklabels=[\"S1\", \"S2\", \"s3\"])\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 202
},
"id": "4j46qFW_AP29",
"outputId": "2cdc0c0c-01ad-4585-e006-1ceacca94f3c"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x144 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"# 3.3 Print out how long each person spoke. "
],
"metadata": {
"id": "UyLSPDAyhm7m"
}
},
{
"cell_type": "code",
"source": [
"seg_df = seg_df.assign(duration = seg_df['endTime']-seg_df['startTime'])\n",
"seg_df.groupby('labelText').sum()[['duration']]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 175
},
"id": "k8qpd4R7AUI6",
"outputId": "17c3af49-5692-4559-bd87-b256073a9969"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"\n",
" <div id=\"df-78e4fb37-0d7f-4a97-a494-50527963e54b\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>duration</th>\n",
" </tr>\n",
" <tr>\n",
" <th>labelText</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Speaker 1</th>\n",
" <td>79.995635</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Speaker 2</th>\n",
" <td>156.776076</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Speaker 3</th>\n",
" <td>78.014459</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-78e4fb37-0d7f-4a97-a494-50527963e54b')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-78e4fb37-0d7f-4a97-a494-50527963e54b button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-78e4fb37-0d7f-4a97-a494-50527963e54b');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
],
"text/plain": [
" duration\n",
"labelText \n",
"Speaker 1 79.995635\n",
"Speaker 2 156.776076\n",
"Speaker 3 78.014459"
]
},
"metadata": {},
"execution_count": 30
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment