knuckletouch/python/Step_33_CNN_PreprocessData....

963 lines
40 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from multiprocessing import Pool, cpu_count\n",
"\n",
"import copy\n",
"\n",
"import cv2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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>userID</th>\n",
" <th>Timestamp</th>\n",
" <th>Current_Task</th>\n",
" <th>Task_amount</th>\n",
" <th>TaskID</th>\n",
" <th>VersionID</th>\n",
" <th>RepetitionID</th>\n",
" <th>Actual_Data</th>\n",
" <th>Is_Pause</th>\n",
" <th>Image</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>56454</th>\n",
" <td>12</td>\n",
" <td>1553865148939</td>\n",
" <td>1</td>\n",
" <td>510</td>\n",
" <td>17</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56455</th>\n",
" <td>12</td>\n",
" <td>1553865148981</td>\n",
" <td>1</td>\n",
" <td>510</td>\n",
" <td>17</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56456</th>\n",
" <td>12</td>\n",
" <td>1553865149021</td>\n",
" <td>1</td>\n",
" <td>510</td>\n",
" <td>17</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56457</th>\n",
" <td>12</td>\n",
" <td>1553865149060</td>\n",
" <td>1</td>\n",
" <td>510</td>\n",
" <td>17</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56458</th>\n",
" <td>12</td>\n",
" <td>1553865149099</td>\n",
" <td>1</td>\n",
" <td>510</td>\n",
" <td>17</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userID Timestamp Current_Task Task_amount TaskID VersionID \\\n",
"56454 12 1553865148939 1 510 17 2 \n",
"56455 12 1553865148981 1 510 17 2 \n",
"56456 12 1553865149021 1 510 17 2 \n",
"56457 12 1553865149060 1 510 17 2 \n",
"56458 12 1553865149099 1 510 17 2 \n",
"\n",
" RepetitionID Actual_Data Is_Pause \\\n",
"56454 0 True False \n",
"56455 0 True False \n",
"56456 0 True False \n",
"56457 0 True False \n",
"56458 0 True False \n",
"\n",
" Image \n",
"56454 [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ... \n",
"56455 [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ... \n",
"56456 [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ... \n",
"56457 [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ... \n",
"56458 [0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, ... "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfAll = pd.read_pickle(\"DataStudyEvaluation/AllData.pkl\")\n",
"df = dfAll[(dfAll.Actual_Data == True) & (dfAll.Is_Pause == False)]\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([12, 5, 1, 10, 6, 3, 7, 8, 9, 11])"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.userID.unique()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 12.2 s, sys: 2.34 s, total: 14.6 s\n",
"Wall time: 14.2 s\n"
]
}
],
"source": [
"%%time\n",
"def is_max(df):\n",
" df_temp = df.copy(deep=True)\n",
" max_version = df_temp.RepetitionID.max()\n",
" df_temp[\"IsMax\"] = np.where(df_temp.RepetitionID == max_version, True, False)\n",
" df_temp[\"MaxRepetition\"] = [max_version] * len(df_temp)\n",
" return df_temp\n",
"\n",
"df_grp = df.groupby([df.userID, df.TaskID, df.VersionID])\n",
"pool = Pool(cpu_count() - 1)\n",
"result_lst = pool.map(is_max, [grp for name, grp in df_grp])\n",
"df = pd.concat(result_lst)\n",
"pool.close()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"df.Image = df.Image.apply(lambda x: x.reshape(27, 15))\n",
"df.Image = df.Image.apply(lambda x: x.clip(min=0, max=255))\n",
"df.Image = df.Image.apply(lambda x: x.astype(np.uint8))\n",
"df[\"ImageSum\"] = df.Image.apply(lambda x: np.sum(x))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"df.to_pickle(\"DataStudyEvaluation/dfFiltered.pkl\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"recorded actual: 608084, used data: 413500\n"
]
}
],
"source": [
"print(\"recorded actual: %s, used data: %s\" % (len(dfAll), len(df)))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_pickle(\"DataStudyEvaluation/dfFiltered.pkl\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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>userID</th>\n",
" <th>Timestamp</th>\n",
" <th>Current_Task</th>\n",
" <th>Task_amount</th>\n",
" <th>TaskID</th>\n",
" <th>VersionID</th>\n",
" <th>RepetitionID</th>\n",
" <th>Actual_Data</th>\n",
" <th>Is_Pause</th>\n",
" <th>Image</th>\n",
" <th>IsMax</th>\n",
" <th>MaxRepetition</th>\n",
" <th>ImageSum</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>178160</th>\n",
" <td>1</td>\n",
" <td>1553521741802</td>\n",
" <td>16</td>\n",
" <td>510</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]...</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>286</td>\n",
" </tr>\n",
" <tr>\n",
" <th>178161</th>\n",
" <td>1</td>\n",
" <td>1553521741842</td>\n",
" <td>16</td>\n",
" <td>510</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]...</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>319</td>\n",
" </tr>\n",
" <tr>\n",
" <th>178162</th>\n",
" <td>1</td>\n",
" <td>1553521741882</td>\n",
" <td>16</td>\n",
" <td>510</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]...</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>178163</th>\n",
" <td>1</td>\n",
" <td>1553521741922</td>\n",
" <td>16</td>\n",
" <td>510</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]...</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>288</td>\n",
" </tr>\n",
" <tr>\n",
" <th>178164</th>\n",
" <td>1</td>\n",
" <td>1553521741990</td>\n",
" <td>16</td>\n",
" <td>510</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>[[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]...</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>308</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" userID Timestamp Current_Task Task_amount TaskID VersionID \\\n",
"178160 1 1553521741802 16 510 0 2 \n",
"178161 1 1553521741842 16 510 0 2 \n",
"178162 1 1553521741882 16 510 0 2 \n",
"178163 1 1553521741922 16 510 0 2 \n",
"178164 1 1553521741990 16 510 0 2 \n",
"\n",
" RepetitionID Actual_Data Is_Pause \\\n",
"178160 0 True False \n",
"178161 0 True False \n",
"178162 0 True False \n",
"178163 0 True False \n",
"178164 0 True False \n",
"\n",
" Image IsMax \\\n",
"178160 [[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]... False \n",
"178161 [[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]... False \n",
"178162 [[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]... False \n",
"178163 [[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]... False \n",
"178164 [[0, 1, 1, 1, 0, 1, 0, 4, 1, 0, 2, 1, 1, 0, 1]... False \n",
"\n",
" MaxRepetition ImageSum \n",
"178160 1 286 \n",
"178161 1 319 \n",
"178162 1 72 \n",
"178163 1 288 \n",
"178164 1 308 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"#Label if knuckle or finger\n",
"def f(row):\n",
" if row['TaskID'] < 17:\n",
" #val = \"Knuckle\"\n",
" val = 0\n",
" elif row['TaskID'] >= 17:\n",
" #val = \"Finger\"\n",
" val = 1\n",
" return val\n",
"df['InputMethod'] = df.apply(f, axis=1)\n",
"\n",
"def f(row):\n",
" if row['TaskID'] < 17:\n",
" val = \"Knuckle\"\n",
" elif row['TaskID'] >= 17:\n",
" val = \"Finger\"\n",
" return val\n",
"df['Input'] = df.apply(f, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"#Svens new Blob detection\n",
"def detect_blobs(image, task):\n",
" #image = e.Image\n",
" large = np.ones((29,17), dtype=np.uint8)\n",
" large[1:28,1:16] = np.copy(image)\n",
" temp, thresh = cv2.threshold(cv2.bitwise_not(large), 200, 255, cv2.THRESH_BINARY)\n",
" contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
" contours = [a for a in contours if cv2.contourArea(a) > 8 and cv2.contourArea(a) < 255]\n",
" lstBlob = []\n",
" lstMin = []\n",
" lstMax = []\n",
" count = 0\n",
" contours.sort(key=lambda a: cv2.contourArea(a))\n",
" if len(contours) > 0:\n",
" # if two finger or knuckle\n",
" cont_count = 2 if task in [1, 6, 7, 18, 23, 24] and len(contours) > 1 else 1\n",
" for i in range(1, cont_count + 1):\n",
" max_contour = contours[-1 * i]\n",
" xmax, ymax = np.max(max_contour.reshape(len(max_contour),2), axis=0)\n",
" xmin, ymin = np.min(max_contour.reshape(len(max_contour),2), axis=0)\n",
" #croped_im = np.zeros((27,15))\n",
" blob = large[max(ymin - 1, 0):min(ymax + 1, large.shape[0]),max(xmin - 1, 0):min(xmax + 1, large.shape[1])]\n",
" #croped_im[0:blob.shape[0],0:blob.shape[1]] = blob\n",
" #return (1, [croped_im])\n",
" lstBlob.append(blob)\n",
" lstMin.append(xmax-xmin)\n",
" lstMax.append(ymax-ymin)\n",
" count = count + 1\n",
" return (count, lstBlob, lstMin, lstMax)\n",
" else:\n",
" return (0, [np.zeros((29, 19))], 0, 0)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 5.65 s, sys: 4.52 s, total: 10.2 s\n",
"Wall time: 9.76 s\n"
]
}
],
"source": [
"%%time\n",
"pool = Pool(os.cpu_count()-1)\n",
"temp_blobs = pool.starmap(detect_blobs, zip(df.Image, df.TaskID))\n",
"pool.close()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"df[\"BlobCount\"] = [a[0] for a in temp_blobs]\n",
"df[\"BlobImages\"] = [a[1] for a in temp_blobs]\n",
"df[\"BlobW\"] = [a[2] for a in temp_blobs]\n",
"df[\"BlobH\"] = [a[3] for a in temp_blobs]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 334475\n",
"1 73449\n",
"2 5576\n",
"Name: BlobCount, dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.BlobCount.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"dfX = df[(df.BlobCount == 1)].copy(deep=True)\n",
"dfX.BlobImages = dfX.BlobImages.apply(lambda x : x[0])\n",
"dfX.BlobW = dfX.BlobW.apply(lambda x : x[0])\n",
"dfX.BlobH = dfX.BlobH.apply(lambda x : x[0])\n",
"\n",
"dfY = df[(df.BlobCount == 2)].copy(deep=True)\n",
"dfY.BlobImages = dfY.BlobImages.apply(lambda x : x[0])\n",
"dfY.BlobW = dfY.BlobW.apply(lambda x : x[0])\n",
"dfY.BlobH = dfY.BlobH.apply(lambda x : x[0])\n",
"\n",
"dfZ = df[(df.BlobCount == 2)].copy(deep=True)\n",
"dfZ.BlobImages = dfZ.BlobImages.apply(lambda x : x[1])\n",
"dfZ.BlobW = dfZ.BlobW.apply(lambda x : x[1])\n",
"dfZ.BlobH = dfZ.BlobH.apply(lambda x : x[1])\n",
"\n",
"df = dfX.append([dfY, dfZ])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sample Size not Argumented: 84601\n"
]
}
],
"source": [
"print(\"Sample Size not Argumented:\", len(df))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"df[\"BlobArea\"] = df[\"BlobW\"] * df[\"BlobH\"]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 84601.0\n",
"mean 16.5\n",
"std 5.9\n",
"min 12.0\n",
"25% 12.0\n",
"50% 16.0\n",
"75% 16.0\n",
"max 72.0\n",
"Name: BlobArea, dtype: float64"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.BlobArea.describe().round(1)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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>count</th>\n",
" <th>mean</th>\n",
" <th>std</th>\n",
" <th>min</th>\n",
" <th>25%</th>\n",
" <th>50%</th>\n",
" <th>75%</th>\n",
" <th>max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Input</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Finger</th>\n",
" <td>59879.0</td>\n",
" <td>17.3</td>\n",
" <td>5.8</td>\n",
" <td>12.0</td>\n",
" <td>12.0</td>\n",
" <td>16.0</td>\n",
" <td>20.0</td>\n",
" <td>56.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Knuckle</th>\n",
" <td>24722.0</td>\n",
" <td>14.8</td>\n",
" <td>5.7</td>\n",
" <td>12.0</td>\n",
" <td>12.0</td>\n",
" <td>12.0</td>\n",
" <td>16.0</td>\n",
" <td>72.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count mean std min 25% 50% 75% max\n",
"Input \n",
"Finger 59879.0 17.3 5.8 12.0 12.0 16.0 20.0 56.0\n",
"Knuckle 24722.0 14.8 5.7 12.0 12.0 12.0 16.0 72.0"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby(\"Input\").BlobArea.describe().round(1)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"df[\"BlobSum\"] = df.BlobImages.apply(lambda x: np.sum(x))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 84601.000000\n",
"mean 1238.209170\n",
"std 485.150602\n",
"min 467.000000\n",
"25% 930.000000\n",
"50% 1094.000000\n",
"75% 1383.000000\n",
"max 4275.000000\n",
"Name: BlobSum, dtype: float64"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.BlobSum.describe()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7ff3f0375b38>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.BlobSum.hist()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Small / Blobs where the pixels are only a \"little\" hit\n",
"dfX = df[df.BlobSum <= 255]\n",
"len(dfX)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sample Size argumented: 84601\n"
]
}
],
"source": [
"print(\"Sample Size argumented:\", len(df))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"def pasteToEmpty (blob):\n",
" croped_im = np.zeros((27,15))\n",
" croped_im[0:blob.shape[0],0:blob.shape[1]] = blob\n",
" return croped_im"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"df[\"Blobs\"] = df.BlobImages.apply(lambda x: pasteToEmpty(x))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"df.to_pickle(\"DataStudyEvaluation/df_statistics.pkl\")"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"df[[\"userID\", \"TaskID\", \"Blobs\", \"InputMethod\"]].to_pickle(\"DataStudyEvaluation/df_blobs_area.pkl\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# display blobs"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"userID 1\n",
"Timestamp 1553522289862\n",
"Current_Task 155\n",
"Task_amount 510\n",
"TaskID 0\n",
"VersionID 11\n",
"RepetitionID 0\n",
"Actual_Data True\n",
"Is_Pause False\n",
"Image [[1, 1, 1, 0, 0, 0, 0, 2, 1, 2, 2, 0, 3, 0, 0]...\n",
"IsMax True\n",
"MaxRepetition 0\n",
"ImageSum 933\n",
"InputMethod 0\n",
"Input Knuckle\n",
"BlobCount 1\n",
"BlobImages [[2, 2, 4, 5, 2], [1, 5, 11, 13, 5], [4, 9, 71...\n",
"BlobW 3\n",
"BlobH 4\n",
"BlobArea 12\n",
"BlobSum 710\n",
"Blobs [[2.0, 2.0, 4.0, 5.0, 2.0, 0.0, 0.0, 0.0, 0.0,...\n",
"Name: 191534, dtype: object\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.clf()\n",
"plt.figure(figsize=(6, 6))\n",
"ax = plt.gca()\n",
"data_point = 100\n",
"data = df.Blobs.iloc[data_point]\n",
"print(df.iloc[data_point])\n",
"plt.imshow(data, cmap='gray', vmin=0, vmax=255)\n",
"# Loop over data dimensions and create text annotations.\n",
"for i in range(0, data.shape[0]):\n",
" for j in range(0, data.shape[1]):\n",
" text = ax.text(j, i, int(data[i, j]),\n",
" ha=\"center\", va=\"center\", color=\"cyan\", fontsize=1)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}