From 5c9e906eb569409209dcdf47b5e273e9125b38ad Mon Sep 17 00:00:00 2001 From: Tuan-Dat Tran Date: Sat, 17 Jul 2021 17:40:05 +0200 Subject: [PATCH] Finished Sliding Window (problem with labels) --- 1-first-project/Abgabe.ipynb | 57 +- 2-second-project/tdt/DataViz.ipynb | 2529 ++++++---------------------- 2 files changed, 564 insertions(+), 2022 deletions(-) diff --git a/1-first-project/Abgabe.ipynb b/1-first-project/Abgabe.ipynb index 159dc05..2fefb0c 100644 --- a/1-first-project/Abgabe.ipynb +++ b/1-first-project/Abgabe.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "be7fb1d9", + "id": "920f21b6", "metadata": {}, "outputs": [], "source": [ @@ -15,7 +15,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "6ed9eb14", + "id": "9494dff5", "metadata": {}, "outputs": [], "source": [ @@ -44,7 +44,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "3b4401d0", + "id": "ac87093f", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "9af8908e", + "id": "ff9eeb53", "metadata": {}, "outputs": [], "source": [ @@ -74,7 +74,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "00579598", + "id": "ec8ff24a", "metadata": {}, "outputs": [ { @@ -106,7 +106,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "dd2ba5c9", + "id": "18326042", "metadata": {}, "outputs": [], "source": [ @@ -162,7 +162,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "f383e21e", + "id": "8252cda5", "metadata": {}, "outputs": [], "source": [ @@ -178,7 +178,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "e40b33bf", + "id": "330b79aa", "metadata": {}, "outputs": [], "source": [ @@ -208,7 +208,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "56bce2a5", + "id": "7989f97f", "metadata": {}, "outputs": [], "source": [ @@ -227,7 +227,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "808f43c3", + "id": "06926b00", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +245,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "7dd050be", + "id": "56a8c615", "metadata": {}, "outputs": [], "source": [ @@ -275,7 +275,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "fc701b87", + "id": "0a347c17", "metadata": {}, "outputs": [], "source": [ @@ -317,7 +317,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "048718bd", + "id": "aadf64f9", "metadata": {}, "outputs": [], "source": [ @@ -339,7 +339,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "68335fef", + "id": "e7bfb918", "metadata": {}, "outputs": [], "source": [ @@ -359,7 +359,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "67ac50ef", + "id": "7ea5ec4d", "metadata": {}, "outputs": [], "source": [ @@ -402,13 +402,12 @@ { "cell_type": "code", "execution_count": 16, - "id": "1b5f3868", + "id": "b62d2f11", "metadata": {}, "outputs": [], "source": [ "checkpoint_file = './goat.weights'\n", "\n", - "\n", "def train(X_train, y_train, X_test, y_test):\n", " model = build_model()\n", " \n", @@ -439,7 +438,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "24d0b968", + "id": "8c03d2a3", "metadata": { "tags": [] }, @@ -452,7 +451,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "44b5e9f3", + "id": "5c9f56eb", "metadata": {}, "outputs": [], "source": [ @@ -477,7 +476,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "93d19897", + "id": "c86a5870", "metadata": { "tags": [] }, @@ -596,7 +595,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "c00b7ffe", + "id": "de7a2614", "metadata": {}, "outputs": [ { @@ -617,7 +616,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "1cd94b4c", + "id": "9f67f663", "metadata": {}, "outputs": [ { @@ -638,7 +637,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "dc5f4f81", + "id": "376ed54c", "metadata": { "tags": [] }, @@ -652,7 +651,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "37180b0e", + "id": "8bb6a389", "metadata": { "tags": [] }, @@ -686,7 +685,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "142787fc", + "id": "68b447f0", "metadata": { "tags": [] }, @@ -715,7 +714,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "8badef83", + "id": "20c0eb4e", "metadata": {}, "outputs": [ { @@ -741,7 +740,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "bd54349d", + "id": "b1095a11", "metadata": {}, "outputs": [ { @@ -1016,7 +1015,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "94c2a01e", + "id": "3228ce57", "metadata": {}, "outputs": [ { @@ -1291,7 +1290,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f17eeb73", + "id": "cf15d166", "metadata": {}, "outputs": [], "source": [] diff --git a/2-second-project/tdt/DataViz.ipynb b/2-second-project/tdt/DataViz.ipynb index ad694e8..a4574e6 100644 --- a/2-second-project/tdt/DataViz.ipynb +++ b/2-second-project/tdt/DataViz.ipynb @@ -1,9 +1,17 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "ae397d48", + "metadata": {}, + "source": [ + "# Constants" + ] + }, { "cell_type": "code", "execution_count": 1, - "id": "de9c6d92", + "id": "3827a09b", "metadata": {}, "outputs": [], "source": [ @@ -16,19 +24,24 @@ { "cell_type": "code", "execution_count": 2, - "id": "9a0834ed", + "id": "654f2682", "metadata": {}, "outputs": [], "source": [ "glob_path = '/opt/iui-datarelease3-sose2021/*.csv'\n", "\n", - "pickle_file = '../data.pickle'" + "pickle_file = '../data.pickle'\n", + "\n", + "cenario = 'SYY'\n", + "\n", + "win_sz = 50\n", + "stride_sz = 25 " ] }, { "cell_type": "code", "execution_count": 3, - "id": "68a72718", + "id": "6cc88c90", "metadata": {}, "outputs": [], "source": [ @@ -44,10 +57,18 @@ " axs[int(i/3)][i%3].plot(dd[i])" ] }, + { + "cell_type": "markdown", + "id": "3c47f127", + "metadata": {}, + "source": [ + "# Loading Data" + ] + }, { "cell_type": "code", "execution_count": 4, - "id": "0ef04cbe", + "id": "9dc8d47e", "metadata": { "tags": [] }, @@ -93,7 +114,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "26ab08b9", + "id": "1294685f", "metadata": {}, "outputs": [], "source": [ @@ -108,7 +129,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "06befbd4", + "id": "5e418dc4", "metadata": {}, "outputs": [], "source": [ @@ -123,7 +144,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "05bfe750", + "id": "7938c466", "metadata": {}, "outputs": [ { @@ -132,15 +153,15 @@ "text": [ "Loading data...\n", "../data.pickle found...\n", - "CPU times: user 597 ms, sys: 2.34 s, total: 2.94 s\n", - "Wall time: 2.94 s\n" + "768\n", + "CPU times: user 615 ms, sys: 2.24 s, total: 2.85 s\n", + "Wall time: 2.85 s\n" ] } ], "source": [ "%%time\n", "\n", - "\n", "def load_data() -> list:\n", " if os.path.isfile(pickle_file):\n", " print(f'{pickle_file} found...')\n", @@ -153,458 +174,17 @@ "\n", "print(\"Loading data...\")\n", "dic_data = load_data()\n", - "# plot_pd(data[0]['data'], False)" + "print(len(dic_data))" ] }, { "cell_type": "code", - "execution_count": 14, - "id": "f0a56d84", + "execution_count": 8, + "id": "e3f38b64", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SYY : 96\n", - "SYN : 96\n", - "SNY : 96\n", - "SNN : 96\n", - "JYY : 96\n", - "JYN : 96\n", - "JNY : 96\n", - "JNN : 96\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0FrameIDparticipantIDScenarioHeightNormalizationArmNormalizationRepetitionLeftHandTrackingAccuracyRightHandTrackingAccuracyCenterEyeAnchor_pos_X...right_Hand_RingTip_euler_Xright_Hand_RingTip_euler_Yright_Hand_RingTip_euler_Zright_Hand_PinkyTip_pos_Xright_Hand_PinkyTip_pos_Yright_Hand_PinkyTip_pos_Zright_Hand_PinkyTip_euler_Xright_Hand_PinkyTip_euler_Yright_Hand_PinkyTip_euler_ZSession
0001SortingBlocksSceneTrueTrue2LowHigh0.681254...302.771536.99136137.25130.7132570.8708611.073421316.052640.26445156.08362
1111SortingBlocksSceneTrueTrue2LowHigh0.681238...302.628037.42541141.27260.7144410.8649411.075697315.926740.45845156.82902
2221SortingBlocksSceneTrueTrue2LowHigh0.681438...302.414137.24395144.96830.7149230.8639871.076074315.568740.50327157.42562
3331SortingBlocksSceneTrueTrue2LowHigh0.681680...302.173136.79346148.41910.7153690.8631881.076337315.099140.50356157.89222
4441SortingBlocksSceneTrueTrue2LowHigh0.681469...301.940936.35692151.81960.7157760.8624771.076571314.648540.52340158.26992
..................................................................
1257125712571SortingBlocksSceneTrueTrue2LowLow0.153791...349.6221280.89230141.69550.2927640.6352260.777857348.3104289.75490125.44302
1258125812581SortingBlocksSceneTrueTrue2LowLow0.161396...346.6641283.53940168.42100.3526270.5984270.735074347.6538290.61270126.22812
1259125912591SortingBlocksSceneTrueTrue2LowLow0.169369...346.6641283.53940168.42100.3531790.5982510.735154347.6538290.61270126.22812
1260126012601SortingBlocksSceneTrueTrue2LowLow0.177724...346.6641283.53940168.42100.3531230.5981690.735184347.6538290.61270126.22812
1261126112611SortingBlocksSceneTrueTrue2LowLow0.186001...340.3340286.02930195.85160.4034200.5604230.685445344.4067296.86830140.06992
\n", - "

1262 rows × 346 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 FrameID participantID Scenario \\\n", - "0 0 0 1 SortingBlocksScene \n", - "1 1 1 1 SortingBlocksScene \n", - "2 2 2 1 SortingBlocksScene \n", - "3 3 3 1 SortingBlocksScene \n", - "4 4 4 1 SortingBlocksScene \n", - "... ... ... ... ... \n", - "1257 1257 1257 1 SortingBlocksScene \n", - "1258 1258 1258 1 SortingBlocksScene \n", - "1259 1259 1259 1 SortingBlocksScene \n", - "1260 1260 1260 1 SortingBlocksScene \n", - "1261 1261 1261 1 SortingBlocksScene \n", - "\n", - " HeightNormalization ArmNormalization Repetition \\\n", - "0 True True 2 \n", - "1 True True 2 \n", - "2 True True 2 \n", - "3 True True 2 \n", - "4 True True 2 \n", - "... ... ... ... \n", - "1257 True True 2 \n", - "1258 True True 2 \n", - "1259 True True 2 \n", - "1260 True True 2 \n", - "1261 True True 2 \n", - "\n", - " LeftHandTrackingAccuracy RightHandTrackingAccuracy \\\n", - "0 Low High \n", - "1 Low High \n", - "2 Low High \n", - "3 Low High \n", - "4 Low High \n", - "... ... ... \n", - "1257 Low Low \n", - "1258 Low Low \n", - "1259 Low Low \n", - "1260 Low Low \n", - "1261 Low Low \n", - "\n", - " CenterEyeAnchor_pos_X ... right_Hand_RingTip_euler_X \\\n", - "0 0.681254 ... 302.7715 \n", - "1 0.681238 ... 302.6280 \n", - "2 0.681438 ... 302.4141 \n", - "3 0.681680 ... 302.1731 \n", - "4 0.681469 ... 301.9409 \n", - "... ... ... ... \n", - "1257 0.153791 ... 349.6221 \n", - "1258 0.161396 ... 346.6641 \n", - "1259 0.169369 ... 346.6641 \n", - "1260 0.177724 ... 346.6641 \n", - "1261 0.186001 ... 340.3340 \n", - "\n", - " right_Hand_RingTip_euler_Y right_Hand_RingTip_euler_Z \\\n", - "0 36.99136 137.2513 \n", - "1 37.42541 141.2726 \n", - "2 37.24395 144.9683 \n", - "3 36.79346 148.4191 \n", - "4 36.35692 151.8196 \n", - "... ... ... \n", - "1257 280.89230 141.6955 \n", - "1258 283.53940 168.4210 \n", - "1259 283.53940 168.4210 \n", - "1260 283.53940 168.4210 \n", - "1261 286.02930 195.8516 \n", - "\n", - " right_Hand_PinkyTip_pos_X right_Hand_PinkyTip_pos_Y \\\n", - "0 0.713257 0.870861 \n", - "1 0.714441 0.864941 \n", - "2 0.714923 0.863987 \n", - "3 0.715369 0.863188 \n", - "4 0.715776 0.862477 \n", - "... ... ... \n", - "1257 0.292764 0.635226 \n", - "1258 0.352627 0.598427 \n", - "1259 0.353179 0.598251 \n", - "1260 0.353123 0.598169 \n", - "1261 0.403420 0.560423 \n", - "\n", - " right_Hand_PinkyTip_pos_Z right_Hand_PinkyTip_euler_X \\\n", - "0 1.073421 316.0526 \n", - "1 1.075697 315.9267 \n", - "2 1.076074 315.5687 \n", - "3 1.076337 315.0991 \n", - "4 1.076571 314.6485 \n", - "... ... ... \n", - "1257 0.777857 348.3104 \n", - "1258 0.735074 347.6538 \n", - "1259 0.735154 347.6538 \n", - "1260 0.735184 347.6538 \n", - "1261 0.685445 344.4067 \n", - "\n", - " right_Hand_PinkyTip_euler_Y right_Hand_PinkyTip_euler_Z Session \n", - "0 40.26445 156.0836 2 \n", - "1 40.45845 156.8290 2 \n", - "2 40.50327 157.4256 2 \n", - "3 40.50356 157.8922 2 \n", - "4 40.52340 158.2699 2 \n", - "... ... ... ... \n", - "1257 289.75490 125.4430 2 \n", - "1258 290.61270 126.2281 2 \n", - "1259 290.61270 126.2281 2 \n", - "1260 290.61270 126.2281 2 \n", - "1261 296.86830 140.0699 2 \n", - "\n", - "[1262 rows x 346 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Categorized Data\n", "cdata = dict() \n", @@ -643,1434 +223,548 @@ " else:\n", " cdata['JNN'].append(d)\n", "\n", - "for k,v in cdata.items():\n", - " print(k,': ',len(v))\n", - "test_entry = pickle.loads(pickle.dumps(cdata['SYY'][8]))\n", - "test_entry['data']" + "# for k,v in cdata.items():\n", + "# print(k,': ',len(v))\n", + "# test_entry = pickle.loads(pickle.dumps(cdata['SYY'][17]))\n", + "# test_entry['data']" + ] + }, + { + "cell_type": "markdown", + "id": "83953c92", + "metadata": {}, + "source": [ + "# Preprocessing" ] }, { "cell_type": "code", - "execution_count": 15, - "id": "7774192a", + "execution_count": 9, + "id": "583e8c34", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0LeftHandTrackingAccuracyRightHandTrackingAccuracyCenterEyeAnchor_pos_XCenterEyeAnchor_pos_YCenterEyeAnchor_pos_ZCenterEyeAnchor_euler_XCenterEyeAnchor_euler_YCenterEyeAnchor_euler_Zleft_OVRHandPrefab_pos_X...right_Hand_RingTip_pos_Zright_Hand_RingTip_euler_Xright_Hand_RingTip_euler_Yright_Hand_RingTip_euler_Zright_Hand_PinkyTip_pos_Xright_Hand_PinkyTip_pos_Yright_Hand_PinkyTip_pos_Zright_Hand_PinkyTip_euler_Xright_Hand_PinkyTip_euler_Yright_Hand_PinkyTip_euler_Z
00LowHigh0.6812541.6117740.7026837.490442348.7060344.8792000.679794...1.086929302.771536.99136137.25130.7132570.8708611.073421316.052640.26445156.0836
11LowHigh0.6812381.6119110.7023567.481093348.6785344.8827000.679784...1.092474302.628037.42541141.27260.7144410.8649411.075697315.926740.45845156.8290
22LowHigh0.6814381.6118610.7024407.484574348.6573344.8792000.680203...1.095202302.414137.24395144.96830.7149230.8639871.076074315.568740.50327157.4256
33LowHigh0.6816801.6117760.7023977.490453348.6290344.8807000.680205...1.097335302.173136.79346148.41910.7153690.8631881.076337315.099140.50356157.8922
44LowHigh0.6814691.6116850.7023367.495254348.6104344.8835000.680203...1.099373301.940936.35692151.81960.7157760.8624771.076571314.648540.52340158.2699
..................................................................
12571257LowLow0.1537911.2429050.59173648.695290335.02390.9404570.062155...0.792824349.6221280.89230141.69550.2927640.6352260.777857348.3104289.75490125.4430
12581258LowLow0.1613961.2543400.58755647.867380334.40860.5445230.119903...0.760241346.6641283.53940168.42100.3526270.5984270.735074347.6538290.61270126.2281
12591259LowLow0.1693691.2662050.58318646.953360333.81330.1305860.118583...0.760320346.6641283.53940168.42100.3531790.5982510.735154347.6538290.61270126.2281
12601260LowLow0.1777241.2783300.57799946.035750333.2926359.7097000.118528...0.760351346.6641283.53940168.42100.3531230.5981690.735184347.6538290.61270126.2281
12611261LowLow0.1860011.2902310.57363345.106170332.8138359.2862000.137214...0.724006340.3340286.02930195.85160.4034200.5604230.685445344.4067296.86830140.0699
\n", - "

1262 rows × 339 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 LeftHandTrackingAccuracy RightHandTrackingAccuracy \\\n", - "0 0 Low High \n", - "1 1 Low High \n", - "2 2 Low High \n", - "3 3 Low High \n", - "4 4 Low High \n", - "... ... ... ... \n", - "1257 1257 Low Low \n", - "1258 1258 Low Low \n", - "1259 1259 Low Low \n", - "1260 1260 Low Low \n", - "1261 1261 Low Low \n", - "\n", - " CenterEyeAnchor_pos_X CenterEyeAnchor_pos_Y CenterEyeAnchor_pos_Z \\\n", - "0 0.681254 1.611774 0.702683 \n", - "1 0.681238 1.611911 0.702356 \n", - "2 0.681438 1.611861 0.702440 \n", - "3 0.681680 1.611776 0.702397 \n", - "4 0.681469 1.611685 0.702336 \n", - "... ... ... ... \n", - "1257 0.153791 1.242905 0.591736 \n", - "1258 0.161396 1.254340 0.587556 \n", - "1259 0.169369 1.266205 0.583186 \n", - "1260 0.177724 1.278330 0.577999 \n", - "1261 0.186001 1.290231 0.573633 \n", - "\n", - " CenterEyeAnchor_euler_X CenterEyeAnchor_euler_Y \\\n", - "0 7.490442 348.7060 \n", - "1 7.481093 348.6785 \n", - "2 7.484574 348.6573 \n", - "3 7.490453 348.6290 \n", - "4 7.495254 348.6104 \n", - "... ... ... \n", - "1257 48.695290 335.0239 \n", - "1258 47.867380 334.4086 \n", - "1259 46.953360 333.8133 \n", - "1260 46.035750 333.2926 \n", - "1261 45.106170 332.8138 \n", - "\n", - " CenterEyeAnchor_euler_Z left_OVRHandPrefab_pos_X ... \\\n", - "0 344.879200 0.679794 ... \n", - "1 344.882700 0.679784 ... \n", - "2 344.879200 0.680203 ... \n", - "3 344.880700 0.680205 ... \n", - "4 344.883500 0.680203 ... \n", - "... ... ... ... \n", - "1257 0.940457 0.062155 ... \n", - "1258 0.544523 0.119903 ... \n", - "1259 0.130586 0.118583 ... \n", - "1260 359.709700 0.118528 ... \n", - "1261 359.286200 0.137214 ... \n", - "\n", - " right_Hand_RingTip_pos_Z right_Hand_RingTip_euler_X \\\n", - "0 1.086929 302.7715 \n", - "1 1.092474 302.6280 \n", - "2 1.095202 302.4141 \n", - "3 1.097335 302.1731 \n", - "4 1.099373 301.9409 \n", - "... ... ... \n", - "1257 0.792824 349.6221 \n", - "1258 0.760241 346.6641 \n", - "1259 0.760320 346.6641 \n", - "1260 0.760351 346.6641 \n", - "1261 0.724006 340.3340 \n", - "\n", - " right_Hand_RingTip_euler_Y right_Hand_RingTip_euler_Z \\\n", - "0 36.99136 137.2513 \n", - "1 37.42541 141.2726 \n", - "2 37.24395 144.9683 \n", - "3 36.79346 148.4191 \n", - "4 36.35692 151.8196 \n", - "... ... ... \n", - "1257 280.89230 141.6955 \n", - "1258 283.53940 168.4210 \n", - "1259 283.53940 168.4210 \n", - "1260 283.53940 168.4210 \n", - "1261 286.02930 195.8516 \n", - "\n", - " right_Hand_PinkyTip_pos_X right_Hand_PinkyTip_pos_Y \\\n", - "0 0.713257 0.870861 \n", - "1 0.714441 0.864941 \n", - "2 0.714923 0.863987 \n", - "3 0.715369 0.863188 \n", - "4 0.715776 0.862477 \n", - "... ... ... \n", - "1257 0.292764 0.635226 \n", - "1258 0.352627 0.598427 \n", - "1259 0.353179 0.598251 \n", - "1260 0.353123 0.598169 \n", - "1261 0.403420 0.560423 \n", - "\n", - " right_Hand_PinkyTip_pos_Z right_Hand_PinkyTip_euler_X \\\n", - "0 1.073421 316.0526 \n", - "1 1.075697 315.9267 \n", - "2 1.076074 315.5687 \n", - "3 1.076337 315.0991 \n", - "4 1.076571 314.6485 \n", - "... ... ... \n", - "1257 0.777857 348.3104 \n", - "1258 0.735074 347.6538 \n", - "1259 0.735154 347.6538 \n", - "1260 0.735184 347.6538 \n", - "1261 0.685445 344.4067 \n", - "\n", - " right_Hand_PinkyTip_euler_Y right_Hand_PinkyTip_euler_Z \n", - "0 40.26445 156.0836 \n", - "1 40.45845 156.8290 \n", - "2 40.50327 157.4256 \n", - "3 40.50356 157.8922 \n", - "4 40.52340 158.2699 \n", - "... ... ... \n", - "1257 289.75490 125.4430 \n", - "1258 290.61270 126.2281 \n", - "1259 290.61270 126.2281 \n", - "1260 290.61270 126.2281 \n", - "1261 296.86830 140.0699 \n", - "\n", - "[1262 rows x 339 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "def drop(entry) -> pd.DataFrame:\n", - " droptable = ['participantID', 'FrameID', 'Scenario', 'HeightNormalization', 'ArmNormalization', 'Repetition', 'Session']\n", + " droptable = ['participantID', 'FrameID', 'Scenario', 'HeightNormalization', 'ArmNormalization', 'Repetition', 'Session', 'Unnamed: 0']\n", " centry = pickle.loads(pickle.dumps(entry))\n", - " return centry['data'].drop(droptable, axis=1)\n", - "\n", - "test_entry2 = pickle.loads(pickle.dumps(test_entry))\n", - "test_entry2['data'] = drop(test_entry2)\n", - "test_entry2['data']" + " return centry['data'].drop(droptable, axis=1)" ] }, { "cell_type": "code", - "execution_count": 16, - "id": "4f3ff073", + "execution_count": 10, + "id": "b8a05286", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0LeftHandTrackingAccuracyRightHandTrackingAccuracyCenterEyeAnchor_pos_XCenterEyeAnchor_pos_YCenterEyeAnchor_pos_ZCenterEyeAnchor_euler_XCenterEyeAnchor_euler_YCenterEyeAnchor_euler_Zleft_OVRHandPrefab_pos_X...right_Hand_RingTip_pos_Zright_Hand_RingTip_euler_Xright_Hand_RingTip_euler_Yright_Hand_RingTip_euler_Zright_Hand_PinkyTip_pos_Xright_Hand_PinkyTip_pos_Yright_Hand_PinkyTip_pos_Zright_Hand_PinkyTip_euler_Xright_Hand_PinkyTip_euler_Yright_Hand_PinkyTip_euler_Z
000.01.00.6812541.6117740.7026837.490442348.7060344.8792000.679794...1.086929302.771536.99136137.25130.7132570.8708611.073421316.052640.26445156.0836
110.01.00.6812381.6119110.7023567.481093348.6785344.8827000.679784...1.092474302.628037.42541141.27260.7144410.8649411.075697315.926740.45845156.8290
220.01.00.6814381.6118610.7024407.484574348.6573344.8792000.680203...1.095202302.414137.24395144.96830.7149230.8639871.076074315.568740.50327157.4256
330.01.00.6816801.6117760.7023977.490453348.6290344.8807000.680205...1.097335302.173136.79346148.41910.7153690.8631881.076337315.099140.50356157.8922
440.01.00.6814691.6116850.7023367.495254348.6104344.8835000.680203...1.099373301.940936.35692151.81960.7157760.8624771.076571314.648540.52340158.2699
..................................................................
125712570.00.00.1537911.2429050.59173648.695290335.02390.9404570.062155...0.792824349.6221280.89230141.69550.2927640.6352260.777857348.3104289.75490125.4430
125812580.00.00.1613961.2543400.58755647.867380334.40860.5445230.119903...0.760241346.6641283.53940168.42100.3526270.5984270.735074347.6538290.61270126.2281
125912590.00.00.1693691.2662050.58318646.953360333.81330.1305860.118583...0.760320346.6641283.53940168.42100.3531790.5982510.735154347.6538290.61270126.2281
126012600.00.00.1777241.2783300.57799946.035750333.2926359.7097000.118528...0.760351346.6641283.53940168.42100.3531230.5981690.735184347.6538290.61270126.2281
126112610.00.00.1860011.2902310.57363345.106170332.8138359.2862000.137214...0.724006340.3340286.02930195.85160.4034200.5604230.685445344.4067296.86830140.0699
\n", - "

1262 rows × 339 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 LeftHandTrackingAccuracy RightHandTrackingAccuracy \\\n", - "0 0 0.0 1.0 \n", - "1 1 0.0 1.0 \n", - "2 2 0.0 1.0 \n", - "3 3 0.0 1.0 \n", - "4 4 0.0 1.0 \n", - "... ... ... ... \n", - "1257 1257 0.0 0.0 \n", - "1258 1258 0.0 0.0 \n", - "1259 1259 0.0 0.0 \n", - "1260 1260 0.0 0.0 \n", - "1261 1261 0.0 0.0 \n", - "\n", - " CenterEyeAnchor_pos_X CenterEyeAnchor_pos_Y CenterEyeAnchor_pos_Z \\\n", - "0 0.681254 1.611774 0.702683 \n", - "1 0.681238 1.611911 0.702356 \n", - "2 0.681438 1.611861 0.702440 \n", - "3 0.681680 1.611776 0.702397 \n", - "4 0.681469 1.611685 0.702336 \n", - "... ... ... ... \n", - "1257 0.153791 1.242905 0.591736 \n", - "1258 0.161396 1.254340 0.587556 \n", - "1259 0.169369 1.266205 0.583186 \n", - "1260 0.177724 1.278330 0.577999 \n", - "1261 0.186001 1.290231 0.573633 \n", - "\n", - " CenterEyeAnchor_euler_X CenterEyeAnchor_euler_Y \\\n", - "0 7.490442 348.7060 \n", - "1 7.481093 348.6785 \n", - "2 7.484574 348.6573 \n", - "3 7.490453 348.6290 \n", - "4 7.495254 348.6104 \n", - "... ... ... \n", - "1257 48.695290 335.0239 \n", - "1258 47.867380 334.4086 \n", - "1259 46.953360 333.8133 \n", - "1260 46.035750 333.2926 \n", - "1261 45.106170 332.8138 \n", - "\n", - " CenterEyeAnchor_euler_Z left_OVRHandPrefab_pos_X ... \\\n", - "0 344.879200 0.679794 ... \n", - "1 344.882700 0.679784 ... \n", - "2 344.879200 0.680203 ... \n", - "3 344.880700 0.680205 ... \n", - "4 344.883500 0.680203 ... \n", - "... ... ... ... \n", - "1257 0.940457 0.062155 ... \n", - "1258 0.544523 0.119903 ... \n", - "1259 0.130586 0.118583 ... \n", - "1260 359.709700 0.118528 ... \n", - "1261 359.286200 0.137214 ... \n", - "\n", - " right_Hand_RingTip_pos_Z right_Hand_RingTip_euler_X \\\n", - "0 1.086929 302.7715 \n", - "1 1.092474 302.6280 \n", - "2 1.095202 302.4141 \n", - "3 1.097335 302.1731 \n", - "4 1.099373 301.9409 \n", - "... ... ... \n", - "1257 0.792824 349.6221 \n", - "1258 0.760241 346.6641 \n", - "1259 0.760320 346.6641 \n", - "1260 0.760351 346.6641 \n", - "1261 0.724006 340.3340 \n", - "\n", - " right_Hand_RingTip_euler_Y right_Hand_RingTip_euler_Z \\\n", - "0 36.99136 137.2513 \n", - "1 37.42541 141.2726 \n", - "2 37.24395 144.9683 \n", - "3 36.79346 148.4191 \n", - "4 36.35692 151.8196 \n", - "... ... ... \n", - "1257 280.89230 141.6955 \n", - "1258 283.53940 168.4210 \n", - "1259 283.53940 168.4210 \n", - "1260 283.53940 168.4210 \n", - "1261 286.02930 195.8516 \n", - "\n", - " right_Hand_PinkyTip_pos_X right_Hand_PinkyTip_pos_Y \\\n", - "0 0.713257 0.870861 \n", - "1 0.714441 0.864941 \n", - "2 0.714923 0.863987 \n", - "3 0.715369 0.863188 \n", - "4 0.715776 0.862477 \n", - "... ... ... \n", - "1257 0.292764 0.635226 \n", - "1258 0.352627 0.598427 \n", - "1259 0.353179 0.598251 \n", - "1260 0.353123 0.598169 \n", - "1261 0.403420 0.560423 \n", - "\n", - " right_Hand_PinkyTip_pos_Z right_Hand_PinkyTip_euler_X \\\n", - "0 1.073421 316.0526 \n", - "1 1.075697 315.9267 \n", - "2 1.076074 315.5687 \n", - "3 1.076337 315.0991 \n", - "4 1.076571 314.6485 \n", - "... ... ... \n", - "1257 0.777857 348.3104 \n", - "1258 0.735074 347.6538 \n", - "1259 0.735154 347.6538 \n", - "1260 0.735184 347.6538 \n", - "1261 0.685445 344.4067 \n", - "\n", - " right_Hand_PinkyTip_euler_Y right_Hand_PinkyTip_euler_Z \n", - "0 40.26445 156.0836 \n", - "1 40.45845 156.8290 \n", - "2 40.50327 157.4256 \n", - "3 40.50356 157.8922 \n", - "4 40.52340 158.2699 \n", - "... ... ... \n", - "1257 289.75490 125.4430 \n", - "1258 290.61270 126.2281 \n", - "1259 290.61270 126.2281 \n", - "1260 290.61270 126.2281 \n", - "1261 296.86830 140.0699 \n", - "\n", - "[1262 rows x 339 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "def floatize(entry):\n", + "def floatize(entry) -> pd.DataFrame:\n", " centry = pickle.loads(pickle.dumps(entry))\n", " centry['data']['LeftHandTrackingAccuracy'] = (entry['data']['LeftHandTrackingAccuracy'] == 'High') * 1.0\n", " centry['data']['RightHandTrackingAccuracy'] = (entry['data']['RightHandTrackingAccuracy'] == 'High') * 1.0\n", - " return centry['data']\n", - "\n", - "test_entry3 = pickle.loads(pickle.dumps(test_entry2))\n", - "test_entry3['data'] = floatize(test_entry3)\n", - "test_entry3['data']" + " return centry['data']" ] }, { "cell_type": "code", - "execution_count": 17, - "id": "2249d728", + "execution_count": 11, + "id": "fbe90e8d", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0LeftHandTrackingAccuracyRightHandTrackingAccuracyCenterEyeAnchor_pos_XCenterEyeAnchor_pos_YCenterEyeAnchor_pos_ZCenterEyeAnchor_euler_XCenterEyeAnchor_euler_YCenterEyeAnchor_euler_Zleft_OVRHandPrefab_pos_X...right_Hand_RingTip_pos_Zright_Hand_RingTip_euler_Xright_Hand_RingTip_euler_Yright_Hand_RingTip_euler_Zright_Hand_PinkyTip_pos_Xright_Hand_PinkyTip_pos_Yright_Hand_PinkyTip_pos_Zright_Hand_PinkyTip_euler_Xright_Hand_PinkyTip_euler_Yright_Hand_PinkyTip_euler_Z
000.01.00.6812541.6117740.7026837.490442348.7060344.8792000.679794...1.086929302.771536.99136137.25130.7132570.8708611.073421316.052640.26445156.0836
110.01.00.6812381.6119110.7023567.481093348.6785344.8827000.679784...1.092474302.628037.42541141.27260.7144410.8649411.075697315.926740.45845156.8290
220.01.00.6814381.6118610.7024407.484574348.6573344.8792000.680203...1.095202302.414137.24395144.96830.7149230.8639871.076074315.568740.50327157.4256
330.01.00.6816801.6117760.7023977.490453348.6290344.8807000.680205...1.097335302.173136.79346148.41910.7153690.8631881.076337315.099140.50356157.8922
440.01.00.6814691.6116850.7023367.495254348.6104344.8835000.680203...1.099373301.940936.35692151.81960.7157760.8624771.076571314.648540.52340158.2699
..................................................................
125712570.00.00.1537911.2429050.59173648.695290335.02390.9404570.062155...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
125812580.00.00.1613961.2543400.58755647.867380334.40860.5445230.119903...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
125912590.00.00.1693691.2662050.58318646.953360333.81330.1305860.118583...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
126012600.00.00.1777241.2783300.57799946.035750333.2926359.7097000.118528...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
126112610.00.00.1860011.2902310.57363345.106170332.8138359.2862000.137214...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

1262 rows × 339 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 LeftHandTrackingAccuracy RightHandTrackingAccuracy \\\n", - "0 0 0.0 1.0 \n", - "1 1 0.0 1.0 \n", - "2 2 0.0 1.0 \n", - "3 3 0.0 1.0 \n", - "4 4 0.0 1.0 \n", - "... ... ... ... \n", - "1257 1257 0.0 0.0 \n", - "1258 1258 0.0 0.0 \n", - "1259 1259 0.0 0.0 \n", - "1260 1260 0.0 0.0 \n", - "1261 1261 0.0 0.0 \n", - "\n", - " CenterEyeAnchor_pos_X CenterEyeAnchor_pos_Y CenterEyeAnchor_pos_Z \\\n", - "0 0.681254 1.611774 0.702683 \n", - "1 0.681238 1.611911 0.702356 \n", - "2 0.681438 1.611861 0.702440 \n", - "3 0.681680 1.611776 0.702397 \n", - "4 0.681469 1.611685 0.702336 \n", - "... ... ... ... \n", - "1257 0.153791 1.242905 0.591736 \n", - "1258 0.161396 1.254340 0.587556 \n", - "1259 0.169369 1.266205 0.583186 \n", - "1260 0.177724 1.278330 0.577999 \n", - "1261 0.186001 1.290231 0.573633 \n", - "\n", - " CenterEyeAnchor_euler_X CenterEyeAnchor_euler_Y \\\n", - "0 7.490442 348.7060 \n", - "1 7.481093 348.6785 \n", - "2 7.484574 348.6573 \n", - "3 7.490453 348.6290 \n", - "4 7.495254 348.6104 \n", - "... ... ... \n", - "1257 48.695290 335.0239 \n", - "1258 47.867380 334.4086 \n", - "1259 46.953360 333.8133 \n", - "1260 46.035750 333.2926 \n", - "1261 45.106170 332.8138 \n", - "\n", - " CenterEyeAnchor_euler_Z left_OVRHandPrefab_pos_X ... \\\n", - "0 344.879200 0.679794 ... \n", - "1 344.882700 0.679784 ... \n", - "2 344.879200 0.680203 ... \n", - "3 344.880700 0.680205 ... \n", - "4 344.883500 0.680203 ... \n", - "... ... ... ... \n", - "1257 0.940457 0.062155 ... \n", - "1258 0.544523 0.119903 ... \n", - "1259 0.130586 0.118583 ... \n", - "1260 359.709700 0.118528 ... \n", - "1261 359.286200 0.137214 ... \n", - "\n", - " right_Hand_RingTip_pos_Z right_Hand_RingTip_euler_X \\\n", - "0 1.086929 302.7715 \n", - "1 1.092474 302.6280 \n", - "2 1.095202 302.4141 \n", - "3 1.097335 302.1731 \n", - "4 1.099373 301.9409 \n", - "... ... ... \n", - "1257 NaN NaN \n", - "1258 NaN NaN \n", - "1259 NaN NaN \n", - "1260 NaN NaN \n", - "1261 NaN NaN \n", - "\n", - " right_Hand_RingTip_euler_Y right_Hand_RingTip_euler_Z \\\n", - "0 36.99136 137.2513 \n", - "1 37.42541 141.2726 \n", - "2 37.24395 144.9683 \n", - "3 36.79346 148.4191 \n", - "4 36.35692 151.8196 \n", - "... ... ... \n", - "1257 NaN NaN \n", - "1258 NaN NaN \n", - "1259 NaN NaN \n", - "1260 NaN NaN \n", - "1261 NaN NaN \n", - "\n", - " right_Hand_PinkyTip_pos_X right_Hand_PinkyTip_pos_Y \\\n", - "0 0.713257 0.870861 \n", - "1 0.714441 0.864941 \n", - "2 0.714923 0.863987 \n", - "3 0.715369 0.863188 \n", - "4 0.715776 0.862477 \n", - "... ... ... \n", - "1257 NaN NaN \n", - "1258 NaN NaN \n", - "1259 NaN NaN \n", - "1260 NaN NaN \n", - "1261 NaN NaN \n", - "\n", - " right_Hand_PinkyTip_pos_Z right_Hand_PinkyTip_euler_X \\\n", - "0 1.073421 316.0526 \n", - "1 1.075697 315.9267 \n", - "2 1.076074 315.5687 \n", - "3 1.076337 315.0991 \n", - "4 1.076571 314.6485 \n", - "... ... ... \n", - "1257 NaN NaN \n", - "1258 NaN NaN \n", - "1259 NaN NaN \n", - "1260 NaN NaN \n", - "1261 NaN NaN \n", - "\n", - " right_Hand_PinkyTip_euler_Y right_Hand_PinkyTip_euler_Z \n", - "0 40.26445 156.0836 \n", - "1 40.45845 156.8290 \n", - "2 40.50327 157.4256 \n", - "3 40.50356 157.8922 \n", - "4 40.52340 158.2699 \n", - "... ... ... \n", - "1257 NaN NaN \n", - "1258 NaN NaN \n", - "1259 NaN NaN \n", - "1260 NaN NaN \n", - "1261 NaN NaN \n", - "\n", - "[1262 rows x 339 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAABJiklEQVR4nO3dd3xV5f3A8c9zb+7N3pvsyQ4rLJElIgguwIq2VrG1aqu1rbaOaqu2+qtYraO4rRY3iFYRZMsWkLBnIIRMskM22c/vj3MDAbJzV5Ln/XrllZtzzz3ne3KT733OM4WUEkVRFKX309k6AEVRFMU6VMJXFEXpI1TCVxRF6SNUwlcURekjVMJXFEXpIxxsHUBr/Pz8ZGRkpK3DUBRF6VH27NlTKKX0b+k5u034kZGRJCUl2ToMRVGUHkUIkd7ac6pKR1EUpY9QCV9RFKWPUAlfURSlj1AJX1EUpY9QCV9RFKWPUAlfURSlj1AJX1EUpY+w23743VXbUMv3md+TUZaBn7Mfw/2HE+0VbeuwFEVRbKZXJvyUsyn8ftPvSS+7MP5AIPjXlH9xdcTVNoxMURTFdnpdlU5tQy2/2fAbKusqeX3a6+z+2W5WzllJnHccL+95mUbZaOsQFUVRbKLXJfzCc4X4Ofvx3ITnmBQ6CScHJ8I9wrlryF1klGewM2cnAA2NDZTWlNo4WkVRFOsR9rrEYWJiouzqXDpN1ySEOL+ttqGW6cumM9h3MLHesSw5voSq+ipujLmRZ6981iwxK4qi2JoQYo+UMrGl53pdCR+0RN882QMY9Ubmxs1la/ZWPjj8AZNCJzEueBzfnPqGnIocG0WqKIpiPb2y0bY1vxr6Kxz1jgzwGcCUsClklGUw+3+zWZu+ljsH32nr8BRFUSyqV5bwW+NicOG+YfcxJWwKAOEe4QzwGcCq06uw16otRVEUczFLwhdCvC+EyBdCHG7leSGEeE0IkSKEOCiEGGmO85rDzXE3c6ToCLtyd9k6FEVRFIsyVwn/v8DMNp6/Fogzfd0DvGmm83bbnLg5uBvcWXFqha1DURSli87VNjD3je38a22yrUOxa2ZJ+FLKLUBxG7vcCHwoNTsBLyFEsDnO3V1GvZFJYZPYmr1VVesoSg/14Y409maU8Nr3KWw4lmfrcOyWterwQ4DMZj9nmbZdRAhxjxAiSQiRVFBQYKXQIMEvgeLqYlJLU612TkVRzKO6roF3t55mTJQPA4M9+MOS/Xy5J0sV4FpgV422Usp3pJSJUspEf/8W1+C1iJlRM3F2cObTY59a7ZyKopjHztQiCitq+PWUGN66fSSRfq48/MUBfjhVZOvQ7I61En42ENbs51DTNrvg4+TDhH4T2JK9RZUKFKWHScmvAGB4qBcRvq4svXc8LkY9Kw72zPE1e/L2sD9/v0WOba2Evxy4w9RbZxxQKqW0q3fjypArya3MJfmsavRRlJ7kZF4Ffm5GvF2NADgZ9EwbGMiqwzk0NPasAlxBVQEPfv8gf9v5N4vM+2WubpmfATuA/kKILCHEL4UQ9wkh7jPt8h2QCqQA7wK/Mcd5zWla+DQchAPfnf7O1qEoitIJJ/LLiQtwv2jblHh/SqrqOFVQYaOouubH3B8pqy3j8TGPoxPmL4+bZaStlPK2dp6XwP3mOJeleDl5cUXIFXyT8g33JdyHi8HF1iEpitIOKSUpeRXMGXlxH5BhYZ4AHMgsIT7QvaWX2qXk4mSMOiPDA4Zb5Ph21Whraz8d8FOKq4vZnbvb1qEoitIBeWU1lNfUExfgdtH2aD83vFwM7EjtWQ23x4qPEesdi0FnsMjx+17CzzkAW/4Ju9+DSxpoE4MScXZwZmv2VhsFpyhKZ5zIKwcg9pIqHZ1OMCnOn83JBTT2kHp8KSXJxckM8BlgsXP0zsnTSrPB0Q2cPC/evu9j+KZZzVJ9LYy/0JzgqHdkXPA4tmdvt1KgimJnaiqgPBf8Ym0dSYecNPXQiQ90u+y5qwYEsPzAGQ5mlzI8zMvKkXVeflU+Z2vOWjTh974SfvFpeHkQHFx68fbCFFj5R4iaDI+mQf/ZsO4v2vZmBvkOIqsii6q6KuvFrCi2lpUE216GF+Nh0SioamvgvP1IyS/Hx9WIr5vjZc9NivdHCNh4PN8GkXXe8eLjACrhd4p3JAQOhe+fhW8e0Er0ez+EZQvAwRHmvA3O3nD9K6BzgI0XL34S66WVbE6XnrZ66IpiE5WF8NFcWP801FVq216Igv9eB2nbbBpae07mVRAbcHnpHsDH1ciocG9WHDzTI8bXHC8+jkAQ7x1vsXP0voQvBMz/CLzC4MRqOLYClv9WK/nPew88TFP4uAXAlQ/Bkf/Bsl/AjjeACwlf9cdX+owNf9MS/d3fw+PZ4BakbS9Ihv/Ohvev1ap57IyUkhN55Zc12DZ325hwThVUsi+zxHqBdVHy2WTC3MNwNbha7By9sw7fJwruM5VMGuogey/49wdnr4v3u/IPkL4dDn+pfcVeTbhfLO5Gdw4WHGRu3Fyrh64oVlWeCwc+gzH3Qugobdu9m0FnAKML7P6PVvX57e/gts+1ApWdKCivoay6vs1ul2OjfQA4llPGyHBva4XWJZnlmUR6Rlr0HL2vhH8pvQHCx16e7AEcjPDz/2klG50Bdr+LTuhI8E9gT96eHnEbqCjd4h6kFY4mP3LxNldfMDjDFQ/ANc9qd8sHl9guzhY0Ndi2VcIP8XLG1ajnRG65tcLqsuyKbPq59rPoOXp/wm+PTq+VbIbeDEnvQ9YepoROIa0sjZMlJ20dnaJYXkt3v82NvQ9Cx8CqR6HolNXCas/J810yW0/4QgjiAt1JzrPvhF9WW0Z5bTkhbpdNImxWKuE3mfm8Vso/+DnTI6ajF3pWnV5l66gUxfZ0epj7DshGWPsXW0dzXkpBBR5ODvi7X95Dp7kBQe4k55bb9R37mYozAAS7WXaZEJXwmzh7QfQUOLEaXycfxgaPZfXp1Xb9R6IoVuMTBeMfgOSVcGa/raMB4FR+JTEBboh22hX6B7lztqqOgvIaK0XWeflVWtfRINcgi55HJfzm4mdASQbkH+PaqGvJqshSk6kpSpNx94GTl9bl2Q6kFlYQ7dd6dU6T/kFao+5xO67Hb0r4gS6BFj2PSvjN9Z8FDk6w8Tmuj76eBP8EHtv6GM/ufFaV9BXFyRMmPgwp6+DkOpuGUl5dR15ZDTEB7XdhHBDkAUCyHSf8gipthT9fZ1+Lnkcl/ObcA7U/6OMr0J9Yw0uTX2J6xHSWJC9h2cllto5OUWxv3K/B1R/223Z1uNQCbYBYjH/7JXwfVyMB7o4cyy2zdFhdln8uHx8nH4tNmtZEJfxLXfEg+A+Ez28jKCOJlya/xOig0Szat4jahlpbR6cotqU3wIDZcGIN1NiuxJxaqHXJ7EjCB61ax55L+HmVeQS4BFj8PCrhX8rgdGFCtSU/Q5Sd4ZdDfklxdTHr09fbNjZFsQeD52gjczN32SyEU/mV6HWCcJ+OrVsxIMidk/kV1DeYfxUpc8gszyTMPaz9HbtJJfyWJMyHkXdqj/d/wvh+4wl1C2VJsn0NPFEUm+g3Qvt+Zp/NQjhVUEGEjwtGh46lsP5BHtTWN5JWZH+TItY11pFVnkWkR6TFz6USfkscHOGG1yByIhz+Cp3QcUv/W9ibv5cTZ0/YOjpFsS0nT/CJsWn3zFMFFUR3sDoHINpfa9zNKK60VEhddqbiDPWynnCPcIufSyX8toSOhqKT0FDHjbE3IhCqWkdRQCvl2yjhNzRK0gqriPHv+CRjIV7OAGSXVFsqrC5LL0sHUCV8m/PvD431UJyKj5MPw/yH8X3G96qLpqL0Gw5lWVBRYPVTZ52torahscMNtgD+bo4Y9IIzJecsGFnXNCX8CI8Ii5+rV86WufVkAc+tPEZaUSWNjVDf2Eg/L2feuzPxfJ/cDvHvr33PPwr+/bku+jqe3fUsR4qOMMRvyIX9qkuhsQFcfKCxUZtR0I5mFVQUs2uqx8/ZD3HTrXrqUwWmHjod6IPfRKcTBHs6223Cdze64+XoZfFz9boSfkp+BQs+2E1tQyM/HxfBLydGcd/kGM7VNvCHJQeorW+ktKqO04WVbDtZ2PZ6lwGDQG+E7D0AzI6ejbODM0uTL1lN6/Vx8EI01NfA2xNh8fXaB4Ci9FZBCdp3GzTcnsrX6uE7Msq2uVBvZ9LtsNE2vSydSI/IdqeIMIdeV8KPDXBj4bwEZg4Jws3xwuUN6ufBA5/uY9BfV1PfLMnPHRHCv+YPb/lgDo4QPExb/g1wM7oxO3o2K06t4I+j/4iH0UNbF7dcm/iIH9+BvMPa46V3aH36w8da4jIVxbacPMA3zib1+KmFFfi4GvF2NXbqddH+rizfr61+ZY3k2lGLpi2itKbUKufqdSV8gJtHhV6U7AGuS+jHa7eNYP7oMJ6cPZBnbxrCgisi+WpfNsdy2hiBFzpaK8U01AFwS/wtVDdU8+2pb7Xn849c2Hftk+AXD+FXwPEV8P41sPs9c1+eotiHfiMga7fV72ZP5Vd2qsG2SbSfG2XV9RRV2tcASke9o1UGXUEvTfituWFYP56bM5S7J0Zz+7gIfjctDg8nB15Z30ZXy9BEqK+G3EMADPQdyFC/oSxNXqo13mbuvnj/MffA7Be1FYT8+sPmF6DW/rqCKUq3DbwOKvOtPq/OqYKOTZp2qaaumU3TMvRFfSrhX8rb1citY8LZcCyf7NYacyImAAJOrj2/aV7cPFJLUzlWfAxOrNL6JI/9NXhHwbDbIHAwzHoBZv0TKvLguJpxU+mF+s8Cgwuc2mC1U1bWaCX0cN+OjbBtrqlXT1Ojb1/UpxM+wB3jI2iUkiW7M1vewT0IoibCoQuTp00Ln4Ze6FmTuhLStmvTKl/7PPxuPzg2K3lEXqkNUkndZNFrUBSb0BsgZBRk7LTaKXNKtYJZqLdzp1/bz8sZo15HWpEq4fdZod4ujI3yZcXBM633r+8/WxuAVZwKgJeTF+P7jWdNynJkQ03r3dJ0eoi7Bo59q3rtKL1T+Dito4KVJlJrGjjVz6vzCV+vE4T6OJNeaH89daylzyd8gNkJwaQWVHK0tcbbpoTerK5ycsgksmtLyAiIh6gprR88ajLUlGoLqyhKbxM2Tlv60NSTzdKa+tF3JeGDNuL2TKn99cW3FpXwgVlDg3Ex6nl/W1rLO/jGaH3y934EUoKUTKytB2BD7HjQtfFr9I3VvhelmDdoRbEHYaMBAZk/WuV0mcVVOOgEge2sY9uafp7O5Jba3/QK1qISPtoCCdcn9GP14RyqTIn8MuN+DXmH4MU4+EcYIV8/yIB62NbYzq2sX5z2vfCkeYNWFHvg5AkBAyHLOgk/raiSUG9nHPRdS11Bnk4UVNRQZ6fTJFuaSvgmNyeGUlnbwHeHclveIWE+RE/V5taprYDQMYzvP4d9BfupqG2j1d/FV1sHtMiOE35B8vlxBorSaaGjTf3xLZ9E0wqriPTrfB/8JsGeTkgJ+Xa8oLklqYRvkhjhTT9PJ1Yfzml5BwdHuONreDQNnsyHX6zmqvi51DfWsyVrS+sHFkKr1rHXKp2MnfD6GK1hWVG6Iny8Np9UwTGLnkZKSVpRJZG+bST8cyWQsqHVD58gTycAu5xT57yMXZB72CKHVgnfRAjBDcND+P54Plln22nFdzCCEAz1G4q70Z1due2s/OMVDqVZ5gvWnEJHg3ck7Hrb1pEoPVXEeO17xg6LnqagvIaq2gai2irhr3oEPp4Ln8yDmsvvvCNMHxb2OKfOeev+Al//2iKHVgm/mZ+NDadRwhP/O8w/Vh1jT3pxm/vrdXrGBo1le/b2tqdM9gyF0mytwdfe6PTaqODMnTZdwUjpwbwiwD0Y0i2b8JtWq4pobdBVdRkc+RocnOHU97D5+ct2CfFyRq8TpNtrX/xTG7WlIwdcZ5HDq4TfTJiPC5Pj/dl8ooC3N6cy780dXPXiJm57Z2ert4ATQiaQV5VHWlla6wf2DIOGGqgstEzg3TXiZ2B0g51v2ToSpScSQqvWydhh0UJNWqGWpFst4e9drP2fLVipLVH6w79hzRMX/d8ZHXSEeDnb5VKHHFwKH92kPR6oEr5VvHbbCD78xRj2/mU6f5rRn/zyGnakFnH7e7soaKGhZ2TASAD25+9v/aCeIdr30lZG89qakycMuxWOfq3VxSpKZ4WPh7Js81ddNhuwmHm2Cp24sHrVRZb9Upu8MHoqhI6C2S/B4LmwYxFsXnjRrvGBbm1PmGgLDfWw8f+0x9e+oHUDtwCzJHwhxEwhRLIQIkUI8VgLzy8QQhQIIfabvu42x3ktwdPZwKR4f3xcjdw/NZYDT13DsvvGk1Nazfx3dpBZfHHJIMozCl8nX7Zmb239oK6mmfCqiiwYeTcN+6k2SdzBpe3vqyiXChysfS9MNt8xT66D/wuBV4fBwS/ILjlHkIcTDuXZF9fPVxTA4WXgFgg3vq5t0xvgJx9A7NVwfOVFdx7DQr04VVBBWbUd9Uw79AWcPQ23fgpj77XYAkrdTvhCCD3wOnAtMAi4TQjR0sfTEinlcNNXj5kzWK8TJEb68N+7RlNUUcstb++gouZCX30hBDOjZrIpcxMZZa2MpnXy1L7bc+k5ZCT0GwnbX7XPtgbFvvnGaN+LUrt3HCnh9FbY+hJ8cjMYXcDZG766m4VHr+a7ul/AK0PgjXEXqmrSt2vf53984W66yZB52p1Hs/apYWFeSAmHsiz//3gwq4Rb3t7BoL+u5sU1rXwYNtTDln9C4FBtQjoLMkcJfwyQIqVMlVLWAp8DN5rhuHZlbLQv/75tBDml1aw4cOai5xYMXoBRb+TNA2+2/OLzCb/EskF2hxCQeJdW7ZRnmS5hSi/mFqi1AxWf6t5xtr4Ei6+DDX/TVpub+w7ctRpmLuQLw3WkuSRoU5BX5MP6p7TXpG/XZu1sWnaxufiZ2nG++6OWWNFK+AD7M0u6F2s7lu7O5Oa3dpBeVElCqCeLNqawMTn/8h33faj93iY/YvGlUc2R8EOA5pXTWaZtl5onhDgohFgmhAhr6UBCiHuEEElCiKSCAusvjtyeiXF+xAa4sSTp4rr4INcgZkXNYn36esprWxh525Twz5VYPsjuiJ8JQgfHVtg6EqWnEUIbVZ5/tPOvlRL+92tYNBq+/ztET7kw3iX2ajA4UTf6Hp6quoU1Q/6pTTs+8g6t+vHMfm3G2rAxWjXOpVx84LpXtGVK938MgKeLgWg/V4sm/EXfn+SRLw8yJtKHVb+bxH/vGkNcgBvPLD9Cdd0lEymmbNCmYR94vcXiaWKtRttvgUgpZQKwDljc0k5SyneklIlSykR/f38rhdZxQgjmJ4axL6OEk3kXJ/abYm+iuqGaNWlrLn+hwUkrAdn79ApuAdpapU23yIrSGcHDIOdg56sEz+yFA59C4Qlt0aB5/9GqcZqVdtOLqqhrkMSa5rTnit+Cowe8M1lbdS7iytaPP/yn2t/1vk/ObxoW5sW+jJK2u1N3UXbJOV77PoVZQ4P4712j8XE14mTQ85frBuFWfJjl+7MvfsH8j+HWTyxeugfzJPxsoHmJPdS07TwpZZGUsqmLy3vAKDOc1yZuGhGCXidYtvfi3ghD/YYS6xXLVye/avmF/Ub2jH7u4eO0mQ/r7WsZOKUHCB6uVVuWpHfudcmrtDvLP6XCb3aAq99luzQVsOID3bUN3hFw5/ILO8Rd3frxhYCIKyDvyPkRuBNi/SisqLFIKf9fa7UV9J6YPeiiOX8mOZ1iheOT/MThkpH5QmgfcFZgjoS/G4gTQkQJIYzArcDy5jsIIYKb/XgDYNkx2Bbk7+7I1P4BfLU3m/pmEzAJIZgXN49DhYdILm6hcSZ4mFaCqbfzOTxiroL6c5DWRq8jRWlJ8DDte2cXNk9epU2z7OqrDQRswbGcMnQCYgOaLTAUOBim/RXmvtdy/X1zgUOgrlLrCQNMHxSIQS/47lArU6l0UU7pOb7en83Px0Vc3H1USvj+WXALRAyea9Zzdka3E76Ush54AFiDlsiXSimPCCH+JoS4wbTbg0KII0KIA8CDwILunteWbh4VSkF5DVtOXtzOcH3M9Rh0Br5O+fryF3mFA1LrMWDPIq8EoYf0H6x73uMrYeM/rHtOxbwCBoHOAXIOdPw1+ce0TgKDb2pzt32ZJQwI8sDZeMkHwsSHIeEn7Z8naIj2PfcgoHW/HhPlww+nzNtV+t0tp5FSsuCKSG1D+g+w6jFtAFjaVpj0J63nkY2YpQ5fSvmdlDJeShkjpXzOtO2vUsrlpsePSykHSymHSSmnSimPm+O8tnLVgAD83R15a/PFXdA8HT2ZGjaVL09+SWrpJd3TvCO0793ttmZpRlcITrDqsnWAdr5t/7L/OyCldQYn8B/YuYR/wtTm1cZUAo2Nkv2ZJQwP9+p6bP4DwcFJa+A1GRHmzfHccs7Vmmc1un0ZZ1m8I41bEsMI83GBumr44i7Y9SbsfB3iZkDiL81yrq5SI227wOig41cTo/jxdDEnLmm8fXTMozjqHXlsy2M0NF/WMHiYVk+ZtdvK0XZB+HitV4M16/FDR0NDLeQest45FfMLTtBK0R1tDE1ZDwGDL+8/38zpokrKq+sZHubV9bgMTlovtCP/06YCl5LhYV40mD5Muquqtp6Hlh4g0N2RP88eqG3c9xFU5MJtn8Nv98JPl7S9WJIVqITfRfNGhmJ00PHJzosbqAJcAnhszGMcKz7GxsyNF55wdNdueTPbmVnTHoQmavX4+UeseM7R2vee8IGotC4oASoLoLwDdePVZdr8O201uAJZZ7V5rKK7MQ8+oE0fUlUIzwXDM15ctWY6V+v3cuB493vPffZjJqcLK3l+XgIeTgatcfiH1yBsrPZB4xtjlV447VEJv4t83RyZNiCAlYdyL1s9Z2bkTMLcw3h9/+vUNDSropj8iLZylr2LmKDV4x/5n/XO6REMHiEq4fd0IdrcUh3qkXZ6s7agUNw1be6WV6YtSRjo4dS92OJnwpUPadM5D/spOoMj7xle5L7dM7QBXy2QUvLAp3tJeHoNq1pp4C2rruONjSlMiPVlUrypO3nGDm0d69F320Wib6ISfjfMGxlKYUUN3x+/ePScXqfnsTGPkVKSwqJ9iy48MehGiJ9h5Si7wD0IBszWpmq15jQLoYlWWwy7R7HCSlJm0zTpV0EH5tQ5uU7rSx82ts3d8k0J37+L69ieJwRc/RTc+S3MeRPuXs8u35sokF7I759rceK3tUfzWHEwh7Lqev74xQHWHLl8RbzX1p+kuKqWR2cO0DZICRuf01a7s/BUCZ2lEn43TO7vj7eLgc9+vHwOnUmhk7gl/hYWH1nM7tweWGq97hX41Ubrlk5CR2t9uMvM21WuR5NSm2pg08L297UHjm7g6n+++2OLik5p0xycXAvRk1seIdtMXlkNXi4GnAwtd9nsMidPqq75JzfVPANI+PHdi56ua2jkhdXHifZzZfOfphDp58p9H+/hxTXJ5ydeO5hVwvvbTzM/MYwE05QNJH+nDV6c+mft92FHVMLvBoNex90To9mUXHB+ru7mHk58mHCPcJ7Y9gRVdd2cfzt5Faz7q9bybw2uvqB3sM65msTPBAQk/afrx5Cyd63Pm5WkJQ8XH1tH0nHeUXA2reXnsvfAv0fC3321ev4OlIDzyqoJ6G7pvhVXxvpR6dKPA25Xwp7/Qu2F/+PPf8zgVEElj107gAhfV7789RXMHhrMoo0pXPOvLZwqqODxrw7h52ZqqK0shC8WwNI7wH+ANie/nVEJv5vmjNB6F6xsoX7PxeDC3yf8nZzKHN460I3FRapLYcUf4OR6radPb+UXp1Ul7f7PRfOgd1jGTnhzgjbzoD0qO6NVkzXUt79vk11vadUew26zXFzm5h0JxWktP9f8TuXKhyDh1nYPl19e0/36+1YY9DpmDg7ipdJp2ijhA58DWr38y+tPMjbKh+mDAgFwMuhZ9NOR/O83V1Bd38C0lzZz5EwZT98wGA9HB/jqHm3FrbgZcPtX7d652EIvzh7W0c/LmTGRPvxvX3aL83KMCBjBnNg5fHj0w8v75nfUln9CeS7c+G9tPd3ebMhcOFeslQQ7Q0pY/iCcOwt+8ZaJrTsyd8Pr47QVjb64s2NtI2VntEVpRvzc7qoG2uQTBWVZl3frzdoDJ9fA1Cfg7g1afXoHuinml1UT4G6ZhA8wOyGYrbWxlHoPhl1v09DQyFPfHKG4spYnZw9CXFKtOSLcm8V3jWHG4EDevNrItZtvgH8NhFMbYObzcNunbXYztSWV8M1gzsgQUvIrOJTd8vzavx3xWxplI2vT1nb+4GfTtQXGh/8MQnrsFEQdF3MV6Axw9JvOva6hVhtxOesFGHqzZWLrjMpCbQWjVY9C0vtaonfxgdG/guMr4PCX7R9j+2vaB8PYeywerll5R4JsvHyFt5T1gNAW+AhN7NChausbySuvoZ+X5RL++GhffFwdWWW4BgqTeeujj/nfvmwemh7P0FDPFl8zLMyLt382kmtTn0MUngQHR23a5tF2u7YToBK+WcwaGozRQce3l8yT38TfxZ8E/4SWZ9Jsz94Pta5rUx/vZpQ9hLM3xEzV2iw6w8FRG7ZuhSlmO+R/92l3ZkkfaNVxHiFw1ypt+TrfOFj/tLZSU2uykmD3uzD8Ni2B9iRN8V7acJt3SCv9O7WcRFuSVlRJQ6O8eA4dM3PQ65g1NIhnM4dSqPNnTOq/eXBaHA9Oi2v7hfs/1rqfzn0HfndAm7bZ2u1enaQSvhl4OhsYG+XDioM5VNW2XD97bdS1pJSkcKai5Q+FFtVWwr6PtXU6PUPNFG0PEDNNWxDC3qeTbk32XkhZB1c9CX86Cb9cD/ds0sYa6HQw713tDuCTmy+fSqKqWOst8t/rtN4u1zxrk0voFt9Y7XveJQP3cg9rk5h1wql8bSnDGH/LVmn9amI09Q4uvFVzDaN1J3hoWDttSLVVWntE6GgY2oG5fOyESvhm8rtpceSUVvPimhMtPj8qUKuO2ZPXibrpzQu1odmTHzFHiD3H4Ju0SbhS1nds/9pu9oAyty0vgpOXVn3j5Alhoy+eMKvfCK1UmLMfNr+gbWuo06p/XojSVmcKTYS711tt2lyzcguAoKHw43sXutjWlGsl/qChnTrUyfwKhIBo/26Osm1HhK8ra38/mfl3P6KtkLXtlbbbWTY8o02EOO2vdjWwqj0q4ZtJYqQPPx8XwfvbT/PB9sv7IMd5xeFudCcpr4MDi86mwQ//1hrswseZN1h75x4ED+7v2KjkxgZ4f4Y2G6E9yD0MySu12J08Wt9v0A1au8y2l2HPYvh4rtYjZ8TP4c4V2uCgnnxXd/2r2jQGG/6m/ZxnWgmrkyX8YzllRPi44GK0fFVJuK8LcVGRMO43cPBzWPVIy118G+q11bYGz4GoSd0+75mSc+xJP9vt43SEfVc49TBPXT+I3LJqnl15jAFBHoyP8T3/nF6nZ0roFBplB0dN7n4PEDClj9TdX8qrxVUwL7f7PW2yrgm/s2w8HVVbqc3tPvbe9ved+Q9twe5vHwS9I9z0prY6U28QMkrrcXV0OdS/otXfw4VpijvoeG45A4Pb+OC0hGlPae1mOxaBezCMWqDNtNl0l3Zqg9aTbMg8s5zuoaX7yS+vYcNDky/rEWRuqoRvRg56HS/dMoxIXxd+88kejueWXfT8/038P/4+4e/tH6i2UmusHXi93Xbvsgu1VVrDaOx0s/3zdVv4WPjlmo5VxTh5wq+3w8+/hvt39Z5k32TQHKgp09ZszT2sXa9nBz/I0WagTCuqZECQlRO+TgczntN6jG1+AV7qD5/eolXxSAmb/gGe4RA33Synu35YP1ILKjmaU9b+zt2kEr6ZeTgZePeORAx6HQve393iCNx2HfhcG2zVkVJiX2Z00eq557zVo+pRL+LkofVK8omydSTmFz0ZnH20Lqh5hyFwaKfep+O55UgJA4PdLRhkG6Y9pX1wN9Rqi5ckr4I9H2g9c6Y8pvUMM4NrBgUBsOVEoVmO1xaV8C0g2t+Nxb8YQ019A/d9vOfyVerb0thA7Y5/a2vgho+3XJC9hXdki2ugKnZAb9DuUpO/05Y97Gx1To621oTVq3Sa9BsODx+DvxaDawCsflRrK4qeYtaRz/7ujsQFuLEz1byrb7VEJXwLGRjswT/mDuV4bjmbktvob32J3ILDzHOXrBwwxf5LredKbB2BYu/iZ0JdFTTWdbqHzrGcMtwcHQj1dm5/Z0vS6bUG2pIMrQfPjW+YfSGTkeHeHG5l4KY5qYRvQVMHBGDU69iX0fEWeF+/QfgGj+CZzJWU15a3/wJbSV4FryRA2jZbR6LYs+gpFx53skfL8dwyBgS5W7whs0Om/RXmvK21uVigXa1/kDtFlbUUlFt2iU+V8C3I0UHP4BAPdp4u7vBrDHoDf0r8E+fqz7EidYUFo+ummgrwi9VmBTQDKSVnq63TNU2xIqML/HSpVir2Cu/wy6SUHM+xQQ+d1ji6aStmWair7ABTO8UxCzfcqoRvYVP7B3Ags4TSqo5P2TvYbzCDfQezNHlpixOy2YWEn8Av15mt/nzh7oXcseoO+76rUbomfgaM+FmnXpJ19hzlNfXnE2FvUFpTysIfF5JcfPniMENCPBECs6yv2xaV8C1sVITWPe9gdkmnXnfrgFtJKUnhq5NfdbzvfheU1pRy/4b7OVVyqvMv1plvQYrpEdNJL0vn46Mfm+2YSs/VVNK1mxK+GZwuPc3Hxz4mryrvsuc8nAzE+rtZfACWSvgW1jTb3oFOfnLPiprFUL+hPL3jae5dd6/Fqjvyq/I5VHCIm765iYc3PWzRD5e2jAocxeig0aw8vdJ+72oUqzmWU44Q0D+w95Tw08vSAYjwiGjx+QmxfuxILaKiphPrJXSSSvgW5uFkIMbftdO3aka9kQ+v/ZBHRz9KUm4SM76cwRPbnrh4UXQziPOOY8l1S/hJ/E9Ym76WHWd2mPX4nTE7ejbpZekcLTpqsxgU+3A8V5tSwdWx90wGcKZSmzgx2DW4xeevSwimtr6RdUcvXzfXXFTCt4LECB92p52lsbFzJVcHnQO3D7qdZTcsY1bULLIrsnHUm3+pt2C3YB4f8zj+zv68e+hdm5Wwp4VPw6AzsPL0SpucX7Efx3LKrD/C1sLyKvPwdfLFqG95EaOR4d5E+7ny7+9TqG+wzJ22SvhWMC7Gh9JzdRzP7VqDZIxXDE9f8TQfzPjAzJFdYNAbuCfhHvbk7WH7me0WO09bPB09mRgykdWnV9PQlSUOlV6hrqGRjOIqi86Bbwu5VbkEuQa1+rxOJ/jTjP6kFlTy3x/SLBKDSvhW0D9QK6lkFHdhmoVmLN0feV7cPELcQnht72s2q8ufFT2LgnMFHZ9VVOl1zpSco1Fqs1f2JnmVeQS6BLa5z4zBQcwYHMiGY/mdrhHoCJXwrSDQQ6uGyS2ttnEkbTPoDdw//H6OFR9jbXoXlmM0g8mhk3E1uLIyVVXr9FWZxecACPPuPQlfSklOZU6bJXzQSvkvzx/O4l+MQaczfwFPJXwr8HYx4mLUc7orE6lZ2ayoWcR4xvDm/jdtUq3i5ODEtPBprE9fb/YGaqVnyCjWFrTpTSX8ouoiKusqCfdof/CZi9EBo4NlUrNK+Fag0wmGhXqxN6PE1qG0S6/Tc9/w+0gtTe3aGrxmMDtqNuV15WzLUtM29EWZZ6sw6AVBHpZbuNzamrpkRnpE2jQOlfCtZES4F0dzyqipt//GyGsiriHWK5a3D75tkx47Y4LHMDNyJh6OvauXhtIxGUVVhHg5o7dAlYatNCX8jpTwLan3dHK1c3GBbjQ0SjKLq4gNsO/BJDqh46/j/4qzg7NNJq5y0Dnwz8n/tPp5FftwNKeM/kH2/T/SWcXV2nxafs62ncpblfCtJMpP62KWWmD/9fgAIwJGMMDHPBOjKUpHNa1y1ZumVACorKvEQTjgpLdtNZVK+FYS5ecKQGoPaLjtqD15e2wdgtLLpORXICUM6GUl/PLactyMbjaf6lklfCvxdDYQ7Olk8elPreWTY5+wYPUCNqRvsHUovZ6txkTYQrJpcGJ8L5pDB6CirgI3g+0HkqmEb0Vjo3xwMPNKObYy2Hcw8+LmMSVsiq1D6dWklCxYvYA39r9h61Cs4nB2KS5GPRG+rrYOxawKzxXi4+xj6zBUo601vXLrCFuHYDbDA4YzPGC4rcPo9Q4UHGBf/j5mR822dShWcSCrlCEhnr2qhw5AVnkWw/yH2ToM85TwhRAzhRDJQogUIcRjLTzvKIRYYnp+lxAi0hznVZRLbcrcRHZFtq3DMJuvU77G2cGZ62Out3UoFldb38jRnDKGmaYU7y3qGuvIrcwl1N0yq2V1RrcTvhBCD7wOXAsMAm4TQgy6ZLdfAmellLHAy8DC7p5XUZqra6xj8ZHF/G7j73ht72u2DscsztWfY03aGqZHTMfF0HtGnbbmRF45tfWNJIR62ToUs8qtyKVBNhDqZvuEb44qnTFAipQyFUAI8TlwI9B8UvMbgadNj5cBi4QQQqqVLpRu2pK1hRNnTxDqHsrS5KVM6DeBp8Y/ZeuwzOKz459RUVfBzfE32zoUq9hnWjNieJiXTeMwt/Ry+xh0BeZJ+CFAZrOfs4Cxre0jpawXQpQCvkBh852EEPcA9wCEh9v+l2MrjY3SIhMn9UbP7HiG/Kp85vefz4fXfoiPk4/Nu76ZQ3ltOYuPLGZs8FhGBPSetp+27Ms4i6+rkVBv5069rqquik+Pf8r4fuOpqK1gXfo6EvwTuC76OnTC9p0k2lvpyprsqtFWSvkO8A5AYmJinyz9V9c1cO2rW5k7IoQHrortFcnLkt6Z/g5+zn54Ovauet83D7xJcXUxfxj1B4uep7i6mD9v+zNzY+dyTeQ1Fj1XW+obGtl4PJ+Jcf6d+puXUvL0jqdZdXoVr+59FQCBYEnyEg7kH+DJcU/a/H8orTQNN4Mbvk6+No0DzNNomw2ENfs51LStxX2EEA6AJ1BkhnP3OuXV9UT7ufLSuhMsP3DG1uHYvRivmF6X7LdkbeGjox9xS/wtDPYdbNFzeRo9ySrP4j+H/2PTtYT3Z5ZwtqqOGYPbnj64uYbGBhbtX8Sq06u4feDtDPQZyO0Db2fnT3dyx6A7WHpiKV+c+MKCUXdMelk6ER4RNv/gAfMk/N1AnBAiSghhBG4Fll+yz3LgTtPjm4HvVf19y/zdHXnnjkQSI7x58uvDFJSrKYL7kqzyLJ764SlivWJ5dMyjFj+fXqfnrsF3cbToKDtzdlr8fK3ZmVqEEHBFTMdLwQt3L+Sdg+8wJXQKfxr9J5Zev5RHxzyKi8GFhxMfJjEwkdf3v05dQ50FI29fU8K3B91O+FLKeuABYA1wDFgqpTwihPibEOIG027/AXyFECnAQ8BlXTeVC/Q6wcKbE6iqbeBXHyZxPLd3jM5V2nby7EnuWHUHtQ21PD/x+VbXPjW362OuJ8A5gP8c+o9VzteSHalF9A90x9u1Y9ecUZbBF8lfMD1iOq9MfeWyunqd0PGLIb+guLqYVWmrLBFyh1TXV5NTmUOkZ6TNYmjOLC0aUsrvpJTxUsoYKeVzpm1/lVIuNz2ullL+REoZK6Uc09SjR2ldjL8bL88fTnpRJXd9sJuyatuWUhTL2p+/nwWrFwDw35n/pb9Pf6ud26g3smDIAnbl7mJr1larnbdJTX0De9LPMr4TpftF+xZh0Bv489g/o9fpW9znypArCXQJZEvWFnOF2mkZ5RlIpM3nwW9i+yZspVU3DOvH+wtGk19ewz9XJ9s6HMVCtmRt4Z519+Dl6MWH135InHec1WO4dcCt+Dn78XXK11Y/9570s1TXNXJFTMemDj5adJRVaVq9fVvTDQshGBU4ij15e2zWPmFPPXRAJXy7NyLcm5+NDeejnek8/tUhztXa/wIqfV19Y32H912Ttob7N9xPhEcEi69dbLPRmAadgSlhU9iWvY3KOuvO6LrtZCF6nehwCf+1va/h6ejJXUPuanffUYGjKDxXSGZ5Zrv7WoJK+EqnPTF7IHeOj+B4bhlOBvWW2bMDBQe48esbSS5u/46sobGBN/a/QZRnFItnLrb54hhzYudQVV9l9VL+rtPFDA3xxM2x/V7iJ8+eZPuZ7SwYvAB3Y/szao4KHAVAUl5St+PsirTSNPyd/XE12MdkcCp79ACODnqeuXEIy+67wi66dimtc3FwobqhmgWrF7Apc1ObVQnvHnqX1NJUHhj+gF1MnZDgn0CCfwKfHf/MalUgWWer2Jdxlknx/h3a/5Njn2DUGZkXN69D+0d7RhPsGsza9LXdCbPL7KmHDqiE36P0thkEe6M47zg+mfUJQa5B/Pb737Jg9YIWF4pZk7aG1/e/zqyoWTYd8HSpG2NuJL0s3WpVIF/vy6ZRwi2J7VdlZZZn8s2pb5gTNwdvJ+8OHV8Iwezo2ew4s4OyWuv3dssoz1AJX1F6syDXIJZet5Qnxj5BZnkmC1Yv4Jkdz5xfyGRr1lb+vPXPjAgYwd8m/M3G0V5sdNBoAH7M/dEq51t7NI/hYV6Eerd/h/Pvvf/GoDNwT8I9nTrHFf2uoFE2kpRr3WqdqroqiquL7WKWzCYq4SuKBRj0Bm4dcCsr567kjkF3sOzEMu5ddy8fHf2IP2z6A5Gekbw69VUc9Y62DvUikR6R+Dn7sTlzs8XPlVN6joNZpVwzOLDdfQ8XHmZV2iruGHQHAS4BnTrPMP9hOOmd2JWzq6uhdklOZQ4Awa7BVj1vW+xqLh1F6W2cHZz5Y+IfifaMZuHuhezM2UmCfwKvTHmlw9US1iSE4Jb+t/DG/jf4PuN7rgq/yqzHr65r4MU1WoP2noyzAFwzqO3pFKSUvJT0Ej5OPh3qmXMpo97IUP+hHC463PmAu+FMhTY1SohbiFXP2xaV8BXFwoQQzIvXloOsqqsi1D3U7hrfK2rqWfxDGvll1bg7TcZNv4SXd37C3mMhbDieT7SfK3NGhHBlnB9OBm2gU15ZNWuP5uHkoGP5gTPE+LsxIMid2QnBuDsZLjtHXUMjTy8/wue7L7QPzBkRQmxA22u9Hiw8SFJeEo+PebzLvV3C3cPZmLmxS6/tqqaFePq59bPqeduiEr6iWImvsy++zrafMbEljyw7wHeHcs//7BgYT7lXEof2HWVYiD87U4tYeSgHV6Oem0eFUlRZy5ojudQ1aL15DHrBztQi6hokX+7NYsk94y+a4ruypp757+zgcHYZ906O5teTY9hyspCrBrRfPbM5czN6oWd2dNeXeQxzD6O4upiK2grcjNZZTPxUySncDG74O3esB5I1qISvKH1cUlox3x3K5aHp8Tw4LY5tJws5Xqrn1SM7eP1uN2bHXEltfSM7UotYujuTT3/MwM3RgdvHRXBdQj+OnCll7shQjHodS5Iy+cvXh/lwRxq3jgnHoNeh1wm+2pvF4ewyXp4/jDkjtEbMG4Z1rOS7NXsrw/yHdWtW1DB3bULfzPJMBvoO7PJxOuNU6SmivaLt6m5OJXxF6ePe3ZqKl4uBX02MBuDKOD/GNkzj01R/PktezKzoqzE66Jgc78/keH/qGxrRCXG+BD8q4kJbxO1jw1l/NI+nvz3K098eZVSEN/+5M5EPd6QzNMSTm4Z3rj57f/5+jhcf57Ex3Ztv0RYJ/3Tpaa4MudIq5+oo1UtHUfqwwooa1h/L56djwnE2XpiEzKA3cP/w+zlQcIA16Wsueo2DXtfqimxCCP4xdyixAW4kRnhzILOE4X9bx8n8Cu4Y3/k54T89/inuRnfmxM7p/MU10zzhW0NNQw2F5wrtYh3b5lQJX1H6MD83R9b+YRKezpc3st4UexOfHv+UJ7c9Sbh7OIN8B3XomP28nFn/0GQAVh/O4b6P9+LlYuD6DlbhNCmtKWVD+gbmxs3t9khkN6MbPk4+Vkv4ORVal0x7arAFVcJXlD4vxt8NP7fLxwPodXrenv42HkYPnvrhKeoaOz9F98whwXz56/F8+8CV53v3dNTK1JXUNtYyN25up8/bklD3ULLKs8xyrPacqdS6ZNpTH3xQCV9RlDb4Ofvx57F/5njxcZanXLqQXceMivAhzKfzJfQ1aWuI9443W517mHuY1Ur4TX3wVQlfUZQeZVr4NGI8Y6w6i2ZFbQUHCg4wOXSy2Y4Z7h5OTmUOtQ21Zjtma9JK03DUOxLo0v4oYmtSCV9RlDYJIbgu5jr2F+wnoyzDKuf86uRXNMgGpoZNNdsxw9zDkEirVOuklqYS6RHZ6mpctqISvqIo7bo++np0Qsc3p76x+LnqG+tZfGQxY4LGMNR/qNmO2zRrZdOiJJZ0uvQ0UZ5RFj9PZ6mEryhKuwJdAxkdOJrVp1efn/XTUn7M+ZH8c/ncNuA2sx63KeFnlFv2LqW6vprsimyiPaMtep6uUAlfUZQOmRc/j4zyDNakrWl/525YdnIZ7kZ3JoZONOtxPR098XT0tHgJP70sXVu43DPSoufpCpXwFUXpkBmRM4j1iuWN/W90at3ezkg5m8K69HXM7z/fIlNHh7mFWbwOv+kOwp4WPmmiEr6iKB2iEzoeGP4AaWVprEtfZ5FzvLr3VVwNrtw56E6LHN/fxZ/C6kKLHLuJvS1c3pxK+IqidNjU8Km4G9wtsnrUNynfsClrE/ck3IOXk5fZjw/ajKVF54oscuwmaaVp+Dn72c3C5c2pqRUURekwndAxyHeQ2RcTefvA2yzav4hIj0huH3i7WY/dXJBLEMXVxVTVVVls4fjjxceJ9463yLG7S5XwFUXplCF+QzhRfIKquiqzHG9b9jZe3/86MyJn8NnszzDqjWY5bktivGIAOF122iLHr2uo41TJKQb4DLDI8btLJXxFUTolMSiRelnPgYID3T5WflU+j219jFjvWP4+4e8WX5wk2kvrKplakmqR46eWplIv6+nv3d8ix+8ulfAVRemUEQEj0As9SXndr8d/Keklquur+dfkf+Hs4GyG6NoW5h6Gg86BUyWnLHL848XHAVSVjqIovYOrwZVBvoO63XCbVZ7F6rTV3DbgNqv1WTfoDES4R5BaapkS/pasLfg5+52/k7A3KuEritJpiYGJHCo8xLn6c10+xhv738CgM1i0kbYl0V7RFkn4NQ01bMvextSwqeiEfaZW+4xKURS7NjF0InWNdby297UuvT6zPJNVp1fxk/ifEOhq3RklY7xiyCzPpKahxqzH3ZWzi6r6Kq4Kv8qsxzUnlfAVRem00UGjmd9/Ph8f+5gvT3zZ6dcv/HEhTg5O3DnYMgOs2hLtGU2jbDT7FAu7c3dj0BkYHTTarMc1J5XwFUXpksfHPM4w/2G8ceCNDpWWvzzxJY9vfZwfsn9gc9Zm7hpyF0GuQVaI9GJN68w2LVJiLnvz9zLEb4hFpoQwF5XwFUXpEr1Oz4MjHiS/Kp9lJ5a1uW9NQw3P7HiGFakruHf9vbgZ3Mw+G2ZHBbtpyw6aM+GX1pRypPAIiYGJZjumJaiRtgpSSpbszqSiph5PZwNjonyI8LW/YeGK/RkTPIbRQaN5KeklsiuyeXjUwy0u+rE9ezsSyYLBC/j21Lc8nPgw7kZ3G0QMvk6+eDt6c6ToiNmOuTV7Kw2ygSlhU8x2TEtQCV/hwx3pPLX84j/+2UODmRTvx/zR4S2+RkrJ2ao6fFwtNypS6Rmen/g8r+59lY+OfkR/7/7cGHvjZfvsytmFs4MzD454kIdGPYQQwgaRaoQQDPIbxImzJ8x2zM2Zm/Fx8mGI3xCzHdMSVJVOH3c4u5TnVh7jqgEBbH1kKmv/MIn7JsewKTmfT39sfcHnNzefYuYrWziUVWrFaBV7FOASwLMTnmWo31Be2P0C2RXZl+2TlJfEMP9hGPQGmyb7JrGesZwuPU1DY0O3j1XXWMf27O1MCp1kt90xm3QrOiGEjxBinRDipOm7dyv7NQgh9pu+lnfnnIp5Rfq58rNx4bz0k2GE+bgQH+jOY9cO4PAzM1hyz7hWX3fVgACCvZzxcjFYMVrFXgkheH7i80gpuW/dfZytPnv+udKaUk6ePWlX9dsxXjHUNNSQVdH9ufG/OvEV5XXlzIicYYbILKu7H0ePARuklHHABtPPLTknpRxu+rqhm+dUzMjN0YGnrh+M9yVVM0IInAytL8A8IMiDr39zBWE+lplxUOl5wj3CWTRtEdkV2SzcvfD89j15e5BIEoPsJ+HH+2hTHxwrOtat41TWVfLGgTdIDExkQr8J5gjNorqb8G8EFpseLwZu6ubxlB7EHm7NFfsyMnAkdw+9m5WpK7l33b2sS19HUl4SRp2RoX7mW5C8u+K94zHqjBwsPNit43yR/AXF1cX8ftTve8T/Q3cbbQOllDmmx7lAa0PmnIQQSUA98LyU8uuWdhJC3APcAxAe3nJjoaIo9u3uoXdTcK6AjRkbeWjTQ4A2FYMlpz3uLIPOQH+f/iQXJ3f5GGcqzvDmgTeZ0G8Cw/yHmTE6y2m3hC+EWC+EONzC10VN8VJKCchWDhMhpUwEfgq8IoSIaWknKeU7UspEKWWiv79/Z69FURQ7YNQbeWr8U6yat4qxQWNxN7jziyG/sHVYl4n0iOzyaNuGxgae/uFpJJK/jP+LmSOznHZL+FLKq1t7TgiRJ4QIllLmCCGCgfxWjpFt+p4qhNgEjAAsMz+poih2wdnBmbenv029rLfL0acDfQfybeq3ZJVnEeoe2qnXvpj0IjtydvDk2CcJcQuxUITm1906/OVA02QYdwLfXLqDEMJbCOFoeuwHTACOdvO8iqL0AHqd3i6TPcDk0MkAbM7a3KnXZZVn8Xny58yJncP8AfMtEZrFdDfhPw9MF0KcBK42/YwQIlEI8Z5pn4FAkhDiALARrQ5fJXxFUWwq3COcaM9oNmZu7PBrahtqeXTroxh1Rn4z/DcWjM4yutVoK6UsAqa1sD0JuNv0+AfAfprnFUVRTCaHTeajIx9RWlOKp6Nnu/sv/HEhBwsO8tLkl2wy8Vt32fewMEVRFAuaFTWLBtnAmwfebHffXTm7WHpiKXcNuYtrIq+xQnTmpxK+0uNpHcQUpfMG+Axgfv/5fHrsUw4WtN4nP6Msg79s/wvBrsHcP/x+K0ZoXirhKz1WbX0jv/jvbt7crDp8KV33u5G/I8AlgKd+eIq6hrrLnm+UjTyy5RGq6qt4ecrLdtsI3REq4Ss9ltFBR019Ax/vSKehUZXyla5xM7rx5LgnSSlJ4YMjH1z2/Nr0tRwpOsIjox9hsN9gG0RoPmp6ZKVH+/m4SO77eA8bjuVxzeCe14im2IcpYVOYETmDtw68hZ+zH4N9B1NUXUR2RTaL9i0i1iuW2VGzbR1mt6mEr/RoVw8MINjTiZWHclTCV7rlz2P/TEFVAU/98NRF22O9Ynlx8ostLuzS0wh7bfBKTEyUSUlJtg5D6QFOF1YS5u2Mg17VUCrd0ygb2Za9jaq6KnydffEwehDnHWf389w3J4TYY5rK5jKqhK/0eFF+ajlGxTx0Qsek0Em2DsNies7HlqIoitItKuEriqL0ESrhK71CXUMj7287zffH82wdiqLYLZXwlV7BQSf44IfTLP6ha/ObK0pfoBK+0isIIZg1NJjtKYWUVNXaOhxFsUsq4Su9xqwhwdQ3StYdVdU6itISlfCVXiMh1JNQb2f2Z5bYOhRFsUsq4St251xtA1e9uIkVB8906nVCCL594Eqem6OWX1CUlqiEr9idQ9mlpBZW4uTQ+aHs3q5GC0RkHrvTitmVWmTrMJQ+TCV8xe7syzgLwPBwL9sGYkZHz5Txk7d2MP+dnZ2+c1EUc1EJX7E7yXnlBHk44efWc+cdv9Qnu9IRAgLcHXl53Qm1aItiEyrhK3Ynt7SaEG9nW4dhNhU19Xy9L5t5I0N5dOYAThVUsuOUqtpRrE8lfMXu5JZWE+TpZOswzGbN4Vwqaxv46dhwZicE42zQs2xvlq3DUvoglfAVuyKlJKe0mmCP3pPwt6cU4utqZHioF04GPT8bG85Xe7NZcfAMh7NLOZhVYusQlT5CTY+s2JWyc/Wcq2voNSX82vpGNp0o4MpYP3Q6AcAjMwewN+MsD3y67/x+f5rRn/unxtoqTKWPUAlfsSs5ZecACPbsHXX4yw+cobiylrkjQ85vMzroeOvno/j3hhT6eTlzKLuEF9cmMznenyEhnjaMVuntVMJX7EpOaTUAQZ49v4eOlJJ3t6TSP9CdyfH+Fz0X4O7E328aAkDpuTp2pRbzyLKDfPWbK3Ay9Pyl9BT7pOrwFbuSez7h9/wS/qYTBSTnlfOrSdEIIVrdz9PZwMJ5CRzNKeMf3x2zYoRKX6MSvmJXckqrz/dX78nKqut4aW0yQR5O3DCsX7v7Xz0okJ+Pi+DjXRlkl5yzQoRKX6QSvmJXckvP4e/miKEHL0iekl/BnNe3czynnKeuH4TRoWPX8uspMegEvLXplIUjVPqqnvtfpfRKOaXVBPfgHjorDp7h6n9tpqiylo/vHsu1Q4M7/Np+Xs7ckhjG57szyCyusmCUSl+lEr5iV3r6oKvECB/+NKM/3z04kXHRvp1+/f1TY6lrkHyzP9sC0Sl9nUr4il3JLa3u0V0ygzyduH9qLP28unYN/bycGRbqycbkAjNHpigq4St2pLy6jvKa+h5dwjeHKf0D2JdxlrOVaqlGxbxUwlfsRl6Z1iWzJ9fhm8OU/v40SthyUpXyFfNSCV+xG+cHXfWieXS6IiHUCx9XI5tUtY5iZirhK3ajKeH35Dp8c9DrBJPj/dl8ooCGRjVvvmI+KuErdqNplG2AR88edGUOU/r7U1xZq2bSVMxKJXzFbuSUVuPralRzyQCT4vzRCVRvHcWsupXwhRA/EUIcEUI0CiES29hvphAiWQiRIoR4rDvnVHqv3NJzfb6HThNvVyPDwrzYckIlfMV8ulvCPwzMBba0toMQQg+8DlwLDAJuE0IM6uZ5lV6op4+yNbeJcf4czCqhpEp1z1TMo1sJX0p5TEqZ3M5uY4AUKWWqlLIW+By4sTvnVXqn3LKePcrW3KYNCKBRwvpj+bYOReklrFGHHwJkNvs5y7TtMkKIe4QQSUKIpIICdSvbl5yrbaCkqq7P99BpLiHUk2BPJ9YfzbN1KEov0W7CF0KsF0IcbuHL7KV0KeU7UspEKWWiv79/+y9Qeo3kvHIAov1cbRyJ/RBC6565/VQh9Q2Ntg5H6QXaXfFKSnl1N8+RDYQ1+znUtE1RztuXcRaAEeHeNo7EvkyK9+fz3ZnszywhMdLH1uEoPZw1qnR2A3FCiCghhBG4FVhuhfMqPciJvHKCPZ1UHf4lJsT4oROo3jqKWXRrTVshxBzg34A/sFIIsV9KOUMI0Q94T0o5S0pZL4R4AFgD6IH3pZRHuh250qv835yhlFTV2ToMu+PpYmD+6LAuz76pKM0JKe1z6HZiYqJMSkqydRiKoig9ihBij5SyxXFRaqStoihKH6ESvqIoSh+hEr6iKEofoRK+oihKH6ESvqIoSh+hEr6iKEofoRK+oihKH6ESvqIoSh9htwOvhBAFQHo3DuEHFJopHFvpDdcA6jrsjboO+2GJa4iQUrY4+6TdJvzuEkIktTbarKfoDdcA6jrsjboO+2Hta1BVOoqiKH2ESviKoih9RG9O+O/YOgAz6A3XAOo67I26Dvth1WvotXX4iqIoysV6cwlfURRFaUYlfEVRlD6i1yV8IcRMIUSyECJFCPGYreNpixAiTAixUQhxVAhxRAjxO9N2HyHEOiHESdN3b9N2IYR4zXRtB4UQI217BRcIIfRCiH1CiBWmn6OEELtMsS4xLW+JEMLR9HOK6flImwbejBDCSwixTAhxXAhxTAgxvoe+F38w/T0dFkJ8JoRw6gnvhxDifSFEvhDicLNtnf79CyHuNO1/Ughxp51cxz9Nf1cHhRD/E0J4NXvucdN1JAshZjTbbv5cJqXsNV9oSyieAqIBI3AAGGTruNqINxgYaXrsDpwABgEvAI+Ztj8GLDQ9ngWsAgQwDthl62todi0PAZ8CK0w/LwVuNT1+C/i16fFvgLdMj28Fltg69mbXsBi42/TYCHj1tPcCCAFOA87N3ocFPeH9ACYBI4HDzbZ16vcP+ACppu/epsfednAd1wAOpscLm13HIFOecgSiTPlLb6lcZvM/UDP/oscDa5r9/DjwuK3j6kT83wDTgWQg2LQtGEg2PX4buK3Z/uf3s3HcocAG4CpghemfsLDZH/j59wVtbePxpscOpv2EHVyDpylRiku297T3IgTINCU8B9P7MaOnvB9A5CWJslO/f+A24O1m2y/az1bXcclzc4BPTI8vylFN74elcllvq9Jp+mNvkmXaZvdMt9IjgF1AoJQyx/RULhBoemyv1/cK8AjQaPrZFyiRUtabfm4e5/lrMD1fatrf1qKAAuADU9XUe0IIV3rYeyGlzAZeBDKAHLTf7x563vvRpLO/f7t8Xy7xC7S7E7DydfS2hN8jCSHcgC+B30spy5o/J7WPd7vtOyuEuA7Il1LusXUs3eSAdhv+ppRyBFCJVoVwnr2/FwCmOu4b0T7A+gGuwEybBmUmPeH33x4hxBNAPfCJLc7f2xJ+NhDW7OdQ0za7JYQwoCX7T6SUX5k25wkhgk3PBwP5pu32eH0TgBuEEGnA52jVOq8CXkIIB9M+zeM8fw2m5z2BImsG3IosIEtKucv08zK0D4Ce9F4AXA2cllIWSCnrgK/Q3qOe9n406ezv317fF4QQC4DrgJ+ZPrzAytfR2xL+biDO1CPBiNYItdzGMbVKCCGA/wDHpJT/avbUcqCpd8GdaHX7TdvvMPVQGAeUNrvdtQkp5eNSylApZSTa7/t7KeXPgI3AzabdLr2Gpmu72bS/zUttUspcIFMI0d+0aRpwlB70XphkAOOEEC6mv6+m6+hR70cznf39rwGuEUJ4m+52rjFtsykhxEy0as8bpJRVzZ5aDtxq6i0VBcQBP2KpXGbtxgwrNJbMQuvtcgp4wtbxtBPrlWi3qAeB/aavWWh1qBuAk8B6wMe0vwBeN13bISDR1tdwyfVM4UIvnWjTH24K8AXgaNruZPo5xfR8tK3jbhb/cCDJ9H58jdbLo8e9F8AzwHHgMPARWg8Qu38/gM/Q2h3q0O64ftmV3z9aHXmK6esuO7mOFLQ6+ab/87ea7f+E6TqSgWubbTd7LlNTKyiKovQRva1KR1EURWmFSviKoih9hEr4iqIofYRK+IqiKH2ESviKoih9hEr4iqIofYRK+IqiKH3E/wP0Y4uQ+lFu5AAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import numpy as np\n", "right_Hand_ident='right_Hand'\n", "left_Hand_ident='left_hand'\n", "\n", - "def rem_low_acc(entry):\n", + "def rem_low_acc(entry) -> pd.DataFrame:\n", " centry = pickle.loads(pickle.dumps(entry))\n", " right_Hand_cols = [c for c in centry['data'] if right_Hand_ident in c]\n", " left_Hand_cols = [c for c in centry['data'] if left_Hand_ident in c]\n", " \n", " centry['data'].loc[centry['data']['RightHandTrackingAccuracy'] == 0.0, right_Hand_cols] = np.nan\n", " centry['data'].loc[centry['data']['LeftHandTrackingAccuracy'] == 0.0, left_Hand_cols] = np.nan\n", - " return centry['data']\n", + " return centry['data']" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "26059dd4", + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "\n", - "test_entry4 = pickle.loads(pickle.dumps(test_entry3))\n", - "test_entry4['data'] = rem_low_acc(test_entry4)\n", + "stride = 150\n", + "def pad(entry) -> pd.DataFrame:\n", + " centry = pickle.loads(pickle.dumps(entry))\n", + " cols = centry['data'].columns\n", + " pentry = pad_sequences(centry['data'].T.to_numpy(),\n", + " maxlen=(int(centry['data'].shape[0]/stride)+1)*stride,\n", + " dtype='float64',\n", + " padding='pre', \n", + " truncating='post',\n", + " value=np.nan\n", + " ) \n", + " pdentry = pd.DataFrame(pentry.T, columns=cols)\n", + " pdentry.loc[0] = [0 for _ in cols]\n", + " return pdentry" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "2f2181f0", + "metadata": {}, + "outputs": [], + "source": [ + "def interpol(entry) -> pd.DataFrame:\n", + " centry = pickle.loads(pickle.dumps(entry))\n", + " return centry['data'].interpolate(method='linear', axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "276ecf82", + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.preprocessing import timeseries_dataset_from_array\n", "\n", - "plt.plot(test_entry4['data']['right_Hand_RingTip_pos_X'])\n", - "plt.plot(test_entry4['data']['right_Hand_RingTip_pos_Y'])\n", - "plt.plot(test_entry4['data']['right_Hand_RingTip_pos_Z'])\n", + "def slicing(entry):\n", + " centry = pickle.loads(pickle.dumps(entry))\n", + " return timeseries_dataset_from_array(\n", + " data=centry['data'], \n", + " targets=[centry['user'] for _ in range(centry['data'].shape[0])], \n", + " sequence_length=win_sz,\n", + " sequence_stride=stride_sz, \n", + " batch_size=8, \n", + " seed=177013\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "dab70ad9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 96/96 [00:15<00:00, 6.14it/s]\n" + ] + } + ], + "source": [ + "classes = 16 # dynamic\n", "\n", - "test_entry4['data']" + "def preproc(data):\n", + " res_list = list()\n", + " \n", + " for e in tqdm(data):\n", + " res_list.append(preproc_entry(e))\n", + " \n", + " return res_list\n", + " \n", + "def preproc_entry(entry):\n", + " entry2 = pickle.loads(pickle.dumps(entry))\n", + " entry2['data'] = drop(entry2)\n", + " \n", + " entry3 = pickle.loads(pickle.dumps(entry2))\n", + " entry3['data'] = floatize(entry3)\n", + " \n", + " entry4 = pickle.loads(pickle.dumps(entry3))\n", + " entry4['data'] = rem_low_acc(entry4)\n", + " \n", + " entry5 = pickle.loads(pickle.dumps(entry4))\n", + " entry5['data'] = pad(entry5)\n", + " \n", + " entry6 = pickle.loads(pickle.dumps(entry5))\n", + " entry6['data'] = interpol(entry6)\n", + " \n", + " entry7 = pickle.loads(pickle.dumps(entry6))\n", + " entry7['data'] = slicing(entry7)\n", + " \n", + " return entry7\n", + "\n", + "pdata = preproc(cdata[cenario])" + ] + }, + { + "cell_type": "markdown", + "id": "ddba89b9", + "metadata": {}, + "source": [ + "# Building Model" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "61c34fed", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense, Flatten, BatchNormalization, Dropout, Conv2D, MaxPooling2D\n", + "\n", + "def build_model(train):\n", + " s = train[0].shape\n", + "\n", + " model = Sequential()\n", + " ncount = s[0]*s[1]\n", + " \n", + " model.add(Flatten(input_shape=s))\n", + " \n", + " model.add(BatchNormalization())\n", + " \n", + " model.add(Dropout(0.1))\n", + " \n", + " for i in range(1,6):\n", + " model.add(Dense(int(ncount/pow(3,i)), activation='relu'))\n", + " model.add(Dropout(0.1))\n", + " \n", + " model.add(Dense(classes, activation='softmax'))\n", + "\n", + " model.compile(\n", + " optimizer=tf.keras.optimizers.Adam(0.001),\n", + " loss=\"categorical_crossentropy\", \n", + " metrics=[\"acc\"],\n", + " )\n", + "\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "47058299", + "metadata": {}, + "outputs": [], + "source": [ + "checkpoint_file = './goat.weights'\n", + "\n", + "def train_model(X_train, y_train):\n", + " model = build_model(X_train)\n", + " \n", + " model.summary()\n", + "\n", + " history = model.fit(X_train, \n", + " y_train,\n", + " epochs=30,\n", + " batch_size=128,\n", + " shuffle=True,\n", + " verbose=0,\n", + " )\n", + " return model, history" ] }, { "cell_type": "code", "execution_count": 18, - "id": "b7e0ffcf", + "id": "6c99e0bc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "(48, 48)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" - }, + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder, LabelBinarizer\n", + "\n", + "train = np.array([x['data'] for x in pdata if x['session'] == 1])\n", + "test = np.array([x['data'] for x in pdata if x['session'] == 2])\n", + "\n", + "len(train), len(test)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "727b89e0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 8.86 s, sys: 3.63 s, total: 12.5 s\n", + "Wall time: 4.7 s\n" + ] + } + ], + "source": [ + "%%time\n", + "X_train = list()\n", + "y_train = list()\n", + "\n", + "train = list()\n", + "test = list()\n", + "\n", + "for x in pdata:\n", + " if x['session'] == 1:\n", + " train.append(\n", + " {\n", + " 'label': x['user'],\n", + " 'data': list()\n", + " })\n", + " for y in x['data'].unbatch().as_numpy_iterator():\n", + " X_train.append(y[0])\n", + " y_train.append(y[1])\n", + " \n", + " train[-1]['data'].append(y[0])\n", + " if x['session'] == 2:\n", + " test.append(\n", + " {\n", + " 'label': x['user'],\n", + " 'data': list()\n", + " })\n", + " for y in x['data'].unbatch().as_numpy_iterator():\n", + " test[-1]['data'].append(y[0])\n", + "\n", + "X_train = np.array(X_train)\n", + "y_train = np.array(y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "ba64dca4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5832, 50, 338)\n", + "(5832, 16)\n" + ] + } + ], + "source": [ + "lb = LabelBinarizer()\n", + "yy_train = lb.fit_transform(y_train)\n", + "\n", + "for e in test:\n", + " e['label'] = lb.transform([e['label']])\n", + " e['data'] = np.array(e['data'])\n", + " \n", + "for e in train:\n", + " e['label'] = lb.transform([e['label']])\n", + " e['data'] = np.array(e['data'])\n", + "\n", + "print(X_train.shape)\n", + "print(yy_train.shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "399176de", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 4: 53 (53, 50, 338)\n", + "14: 35 (35, 50, 338)\n", + "12: 65 (65, 50, 338)\n", + " 8: 149 (149, 50, 338)\n", + " 1: 53 (53, 50, 338)\n", + " 3: 107 (107, 50, 338)\n", + "11: 53 (53, 50, 338)\n", + " 3: 125 (125, 50, 338)\n", + " 1: 41 (41, 50, 338)\n", + "13: 71 (71, 50, 338)\n", + "15: 59 (59, 50, 338)\n", + " 3: 77 (77, 50, 338)\n", + "10: 119 (119, 50, 338)\n", + " 6: 47 (47, 50, 338)\n", + "14: 41 (41, 50, 338)\n", + " 5: 167 (167, 50, 338)\n", + " 8: 89 (89, 50, 338)\n", + "14: 41 (41, 50, 338)\n", + " 9: 71 (71, 50, 338)\n", + "10: 77 (77, 50, 338)\n", + " 8: 77 (77, 50, 338)\n", + "16: 77 (77, 50, 338)\n", + "16: 77 (77, 50, 338)\n", + " 2: 59 (59, 50, 338)\n", + " 9: 77 (77, 50, 338)\n", + "15: 77 (77, 50, 338)\n", + " 5: 101 (101, 50, 338)\n", + "16: 71 (71, 50, 338)\n", + "15: 71 (71, 50, 338)\n", + "12: 95 (95, 50, 338)\n", + " 6: 71 (71, 50, 338)\n", + " 2: 53 (53, 50, 338)\n", + "12: 845 (845, 50, 338)\n", + " 7: 65 (65, 50, 338)\n", + " 2: 65 (65, 50, 338)\n", + "13: 95 (95, 50, 338)\n", + " 5: 125 (125, 50, 338)\n", + "11: 65 (65, 50, 338)\n", + " 7: 59 (59, 50, 338)\n", + "10: 77 (77, 50, 338)\n", + " 6: 59 (59, 50, 338)\n", + " 7: 53 (53, 50, 338)\n", + " 1: 101 (101, 50, 338)\n", + "13: 71 (71, 50, 338)\n", + "11: 59 (59, 50, 338)\n", + " 4: 77 (77, 50, 338)\n", + " 9: 29 (29, 50, 338)\n", + " 4: 107 (107, 50, 338)\n" + ] + } + ], + "source": [ + "for e in test:\n", + " print(f\"{lb.inverse_transform(e['label'])[0]:2d}: {len(e['data']):3d} {e['data'].shape}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "75af2444", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "flatten (Flatten) (None, 16900) 0 \n", + "_________________________________________________________________\n", + "batch_normalization (BatchNo (None, 16900) 67600 \n", + "_________________________________________________________________\n", + "dropout (Dropout) (None, 16900) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 5633) 95203333 \n", + "_________________________________________________________________\n", + "dropout_1 (Dropout) (None, 5633) 0 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 1877) 10575018 \n", + "_________________________________________________________________\n", + "dropout_2 (Dropout) (None, 1877) 0 \n", + "_________________________________________________________________\n", + "dense_2 (Dense) (None, 625) 1173750 \n", + "_________________________________________________________________\n", + "dropout_3 (Dropout) (None, 625) 0 \n", + "_________________________________________________________________\n", + "dense_3 (Dense) (None, 208) 130208 \n", + "_________________________________________________________________\n", + "dropout_4 (Dropout) (None, 208) 0 \n", + "_________________________________________________________________\n", + "dense_4 (Dense) (None, 69) 14421 \n", + "_________________________________________________________________\n", + "dropout_5 (Dropout) (None, 69) 0 \n", + "_________________________________________________________________\n", + "dense_5 (Dense) (None, 16) 1120 \n", + "=================================================================\n", + "Total params: 107,165,450\n", + "Trainable params: 107,131,650\n", + "Non-trainable params: 33,800\n", + "_________________________________________________________________\n", + "CPU times: user 32.2 s, sys: 9.61 s, total: 41.8 s\n", + "Wall time: 18 s\n" + ] + } + ], + "source": [ + "%%time\n", + "model, history = train_model(np.array(X_train), np.array(yy_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1a63ecda", + "metadata": {}, + "outputs": [], + "source": [ + "def predict(model, entry):\n", + " p_dict = dict()\n", + " predictions = model.predict_classes(entry['data'])\n", + " \n", + " for p in predictions:\n", + " if p in p_dict:\n", + " p_dict[p] += 1\n", + " else:\n", + " p_dict[p] = 1\n", + " prediction = max(p_dict, key=p_dict.get)\n", + " return prediction\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "aae03bc6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/jupyterhub/lib/python3.8/site-packages/tensorflow/python/keras/engine/sequential.py:455: UserWarning: `model.predict_classes()` is deprecated and will be removed after 2021-01-01. Please use instead:* `np.argmax(model.predict(x), axis=-1)`, if your model does multi-class classification (e.g. if it uses a `softmax` last-layer activation).* `(model.predict(x) > 0.5).astype(\"int32\")`, if your model does binary classification (e.g. if it uses a `sigmoid` last-layer activation).\n", + " warnings.warn('`model.predict_classes()` is deprecated and '\n" + ] + } + ], + "source": [ + "ltest = [lb.inverse_transform(e['label'])[0] for e in test]\n", + "ptest = [predict(model, e) for e in test]\n", + "\n", + "# for e in test:\n", + "# print(f\"Label: {lb.inverse_transform(e['label'])[0]:2d}\")\n", + "# print(f\"Prediction: {predict(model, e):2d}\\n_______________\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "888494f1", + "metadata": {}, + "outputs": [], + "source": [ + "ltrain = [lb.inverse_transform(e['label'])[0] for e in train]\n", + "ptrain = [predict(model, e) for e in train]\n", + "# for e in train:\n", + "# print(f\"Label: {lb.inverse_transform(e['label'])[0]:2d}\")\n", + "# print(f\"Prediction: {predict(model, e):2d}\\n_______________\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "03dfed1a", + "metadata": {}, + "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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xdNaxZ49e9L2xX3sscc8rxH12p00yBUYERERkevqy2MHREREJAf5vTtJlRgREZEhyu+VmL7c7E5EREQk66glRkREZIjye0uMKjEiIiJDVF6evztkVIkRyWFeXva8YsUKT3JeeOEFT3Jk4A4dOuRJzsyZMz3JkeylSoyIiMgQ5ffuJH+3I4mIiMiAmVnahj5kPWxmPzKzH5vZmusst8DMnJmV3GidqsSIiIhIRplZgK7nKH4emAp8ycymXmO50cDvAIf7sl5VYkRERIYoD1tiPgP82DnX6JxrB14GvniN5X4f+Drwf/qy/arEiIiIDFHprMSYWbmZ1XYbyrtFFQJnu43/JDmt+7ZMByY456r6uv06sVdERERumnNuB7BjIO81szzgOeDJ/rwvZ1piDh48yNy5c3nwwQfZsWNAn+GQzPEySznZn5WunKlTp7JhwwY2btzIQw89dM1lpk+fTmVlJRUVFTz11FMATJkyhbVr16aG7du3c/fddw94O7SPsiMnEomwZs0aVq9ezb59+66af+DAAdatW0dFRQWbN2/m3LlzADQ2NlJRUZEa3n///ZvaDj9+dpmWl5eXtuEGzgETuo1/OjntstHArwDfNbPTwGeBN250cm9OtMTE43E2bdrErl27CIfDLFy4kLKyMu68807lZEmWcrI/K105Zsbjjz/O9u3bicVirFmzhkgkwvnz51PL3H777Tz88MNs27aNS5cuMXr0aABOnDjBli1bALjlllvYtGkTx48fH9TyZFOWH3MSiQQvvvgiq1atoqCggI0bN1JcXExh4S96EmbOnElZWRkAdXV17N69m5UrV1JYWMiGDRsIBAK0trZSUVHBPffcQyAQGNQyZUNOunh4ifURYLKZFdFVeXkc+PLlmc65fwbGdtuu7wIrnXO111tpTrTERCIRJk6cyIQJExg2bBjz5s2jurpaOVmUpZzsz0pXzh133EFzczMtLS3E43Fqa2uvak25//77eeedd7h06RIAH3300VXrmT59Og0NDXR0dAxqebIpy485jY2NhMNhQqEQ+fn5lJaWUldX12OZkSNHpl63tbWlfliHDx+eqrB0dHTc1A+uHz+7XOKc6wS+BrwF/BB4xTnXYGabzOwLA11vTlRiotEo48aNS42Hw2Gi0ahysihLOdmfla6cMWPGEIvFUuOxWIwxY8b0WCYUChEKhVi5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Ya/bbmYLgYedc8uS40uBUufc166x7BLga8B/cM61XS8zU91J/9PMPglwRQXmTuBHGcoUERGR7HQOmNBt/NPJaT2Y2Rzg94Av3KgCAxmqxDjnKp1zP7vG9B8DVZnIFBERkax1BJhsZkVmNgx4HHij+wJmVgx8g64KzId9WelgXGK9cRAyRURE5ApendjrnOukq4voLeCHwCvOuQYz22RmX0guthX4JPCqmR0zszd6WV1KRk7sNbNIb7MAXWsmIiIyxDjn3gTevGJaZbfXc/q7zoxdnQTMBa68XaIBNRnKFBERkX7w+7OTMlWJ2Qd80jl37MoZZvbdDGWKiIhIP6gScw3OuV7vBeOc+3ImMkVERGRoych9YtIkazdMcpdX9+zItft15KIcvQeJZD9Pm0bOnz+ftt/acePGed6sk6nuJBEREclyfu9OyqqnWIuIiIj0lVpiREREhii1xIiIiIgMAlViRERExJfUnSQiIjJEqTspSxw8eJC5c+fy4IMPsmPHDuVkYZbfcqZOncqGDRvYuHEjDz300DWXmT59OpWVlVRUVPDUU08BMGXKFNauXZsatm/fzt133z3g7QD/fXa5mBOJRFizZg2rV69m3759V80/cOAA69ato6Kigs2bN3PuXNcDehsbG6moqEgN77///k1thx8/u2zI8TLLyzLdLK+enZQxzrlsHfqss7PTzZ492505c8a1tbW5Rx55xJ08ebI/qxiSOV5m+SXn6aefdk8//bRbsWKF+/DDD926devcV7/6VXf27Fm3YcOG1Pynn37aVVRUuDNnzrhnn33WPf30027VqlU95j/99NPu2WefdT/72c/cM88802O6l2VSzsByampqUsN7773n7rvvPvf666+7gwcPutmzZ7tXX321xzLV1dWp188//7x77LHHXE1NjXv77bfdu+++62pqatybb77pZsyYkRqvqanxtExDNcfLrDTkePpb29zc7NI1eL3tzrncaImJRCJMnDiRCRMmMGzYMObNm0d1dbVysijLbzl33HEHzc3NtLS0EI/Hqa2tvao15f777+edd97h0qVLAHz00UdXrWf69Ok0NDTQ0dExsALhv88uF3MaGxsJh8OEQiHy8/MpLS2lrq6uxzIjR45MvW5ra0v9z3T48OEEAgEAOjo6bup/rH787LIhx8ssL8uUDn5vifGsEmNmoUytOxqN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\n", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -2080,180 +774,29 @@ } ], "source": [ - "def interpol(entry):\n", - " centry = pickle.loads(pickle.dumps(entry))\n", - " return centry['data'].interpolate()\n", + "from sklearn.metrics import confusion_matrix\n", + "import seaborn as sn\n", "\n", - "test_entry5 = pickle.loads(pickle.dumps(test_entry4))\n", - "test_entry5['data'] = interpol(test_entry5)\n", + "set_digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}\n", "\n", - "plt.plot(test_entry5['data']['right_Hand_RingTip_pos_X'])\n", - "plt.plot(test_entry5['data']['right_Hand_RingTip_pos_Y'])\n", - "plt.plot(test_entry5['data']['right_Hand_RingTip_pos_Z'])" + "train_cm = confusion_matrix(ltrain, ptrain, normalize='true')\n", + "test_cm = confusion_matrix(ltest, ptest, normalize='true')\n", + "\n", + "df_cm = pd.DataFrame(test_cm, index=set_digits, columns=set_digits)\n", + "plt.figure(figsize = (10,7))\n", + "sn_plot = sn.heatmap(df_cm, annot=True, cmap=\"Greys\")\n", + "plt.ylabel(\"True Label\")\n", + "plt.xlabel(\"Predicted Label\")\n", + "plt.show()" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "12125fe9", + "execution_count": null, + "id": "9ad253a7", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from tensorflow.keras.preprocessing import timeseries_dataset_from_array\n", - "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", - "\n", - "def slicing(entry):\n", - " stride = 150\n", - " entry['data'] = pad_sequences(entry['data'].to_numpy(),\n", - " maxlen=(int(entry['data'].shape[0]/stride)+1)*stride,\n", - " dtype='float64',\n", - " padding='pre', truncating='post'\n", - " )\n", - "\n", - " return timeseries_dataset_from_array(\n", - " data=entry['data'], \n", - " targets=[entry['user'] for _ in range(entry['data'].shape[0])], \n", - " sequence_length=300,\n", - " sequence_stride=150, \n", - " batch_size=1, \n", - " seed=177013\n", - " )\n", - "\n", - "test_entry6 = pickle.loads(pickle.dumps(test_entry5))\n", - "test_entry6['data'] = slicing(test_entry6)\n", - "test_entry6['data']" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "d6a9be7c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "7\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 316.0526 40.26445\n", - " 156.0836 ]\n", - " [ 0. 0. 0. ... 315.9267 40.45845\n", - " 156.829 ]\n", - " [ 0. 0. 0. ... 315.5687 40.50327\n", - " 157.4256 ]\n", - " ...\n", - " [ 0. 0. 0. ... 327.92606222 162.40435556\n", - " 268.09900667]\n", - " [ 0. 0. 0. ... 328.23225444 162.34076111\n", - " 267.87249333]\n", - " [ 0. 0. 0. ... 328.53844667 162.27716667\n", - " 267.64598 ]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 352.5714 179.1548 217.5497]\n", - " [ 0. 0. 0. ... 352.1808 177.5313 219.296 ]\n", - " [ 0. 0. 0. ... 350.6774 174.4262 226.6657]\n", - " ...\n", - " [ 0. 0. 0. ... 344.1929 153.8235 240.5687]\n", - " [ 0. 0. 0. ... 344.1672 153.5105 238.4677]\n", - " [ 0. 0. 0. ... 343.5467 153.3172 234.248 ]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 328.84463889 162.21357222\n", - " 267.41946667]\n", - " [ 0. 0. 0. ... 329.15083111 162.14997778\n", - " 267.19295333]\n", - " [ 0. 0. 0. ... 329.45702333 162.08638333\n", - " 266.96644 ]\n", - " ...\n", - " [ 0. 0. 0. ... 332.49044885 141.66310611\n", - " 290.62965115]\n", - " [ 0. 0. 0. ... 332.54811221 141.55510153\n", - " 291.25838779]\n", - " [ 0. 0. 0. ... 332.60577557 141.44709695\n", - " 291.88712443]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 343.0005 153.3162\n", - " 231.6987 ]\n", - " [ 0. 0. 0. ... 342.5247 153.2595\n", - " 229.2278 ]\n", - " [ 0. 0. 0. ... 341.5173 153.4126\n", - " 229.2072 ]\n", - " ...\n", - " [ 0. 0. 0. ... 79.14743952 127.82502188\n", - " 284.14814688]\n", - " [ 0. 0. 0. ... 82.5359335 127.607275\n", - " 283.617075 ]\n", - " [ 0. 0. 0. ... 85.92442748 127.38952812\n", - " 283.08600312]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 332.66343893 141.33909237\n", - " 292.51586107]\n", - " [ 0. 0. 0. ... 332.72110229 141.23108779\n", - " 293.14459771]\n", - " [ 0. 0. 0. ... 332.77876565 141.12308321\n", - " 293.77333435]\n", - " ...\n", - " [ 0. 0. 0. ... 345.114 96.71846\n", - " 272.46 ]\n", - " [ 0. 0. 0. ... 346.0049 97.19048\n", - " 274.314 ]\n", - " [ 0. 0. 0. ... 346.6387 97.76556\n", - " 275.7643 ]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 89.31292146 127.17178125\n", - " 282.55493125]\n", - " [ 0. 0. 0. ... 92.70141544 126.95403438\n", - " 282.02385937]\n", - " [ 0. 0. 0. ... 96.08990942 126.7362875\n", - " 281.4927875 ]\n", - " ...\n", - " [ 0. 0. 0. ... 315.7431 40.94952\n", - " 261.4432 ]\n", - " [ 0. 0. 0. ... 315.6548 39.27138\n", - " 264.3384 ]\n", - " [ 0. 0. 0. ... 315.6677 37.37699\n", - " 267.8434 ]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n", - "tf.Tensor(\n", - "[[[ 0. 0. 0. ... 347.3555 98.27622\n", - " 277.2787 ]\n", - " [ 0. 0. 0. ... 347.8575 99.32357\n", - " 277.5592 ]\n", - " [ 0. 0. 0. ... 348.1747 100.1475\n", - " 277.55 ]\n", - " ...\n", - " [ 0. 0. 0. ... 325.04633636 321.95206364\n", - " 115.3589 ]\n", - " [ 0. 0. 0. ... 324.85737273 319.39122727\n", - " 115.5281 ]\n", - " [ 0. 0. 0. ... 324.66840909 316.83039091\n", - " 115.6973 ]]], shape=(1, 300, 1350), dtype=float64)\n", - "tf.Tensor([1], shape=(1,), dtype=int32)\n" - ] - } - ], - "source": [ - "print(len(test_entry6['data']))\n", - "for d,l in test_entry6['data']:\n", - " print(d)\n", - " print(l)" - ] + "outputs": [], + "source": [] } ], "metadata": {