Spaces:
Sleeping
Sleeping
File size: 44,603 Bytes
99a05f0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 |
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import pandas as pd \n",
"import ipdb\n",
"import os\n",
"import pickle as pkl\n",
"import os.path as osp\n",
"import numpy as np\n",
"from PIL import Image\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total images found: 9642\n",
"Images after KP filtering: 3895\n",
"['hake_train2015_HICO_train2015_00005476.jpg', 'hake_train2015_HICO_train2015_00008329.jpg', 'hake_train2015_HICO_train2015_00008027.jpg', 'hake_train2015_HICO_train2015_00013408.jpg', 'hake_train2015_HICO_train2015_00010656.jpg']\n"
]
}
],
"source": [
"# Load Agniv VITpose-base hico filtering\n",
"filter_path = './agniv_pose_filter/hico.npy'\n",
"pose_md = np.load(filter_path, allow_pickle=True)\n",
"pose_md = pose_md.item()\n",
"filter_img_names = {}\n",
"\n",
"print(f'Total images found: {len(pose_md)}')\n",
"\n",
"# Filter out images with < 10 visible keypoints \n",
"kp_thresh = 10\n",
"\n",
"for imgname, pose_num in pose_md.items():\n",
" if pose_num > kp_thresh:\n",
" filter_img_names[imgname] = pose_num\n",
" \n",
"print(f'Images after KP filtering: {len(filter_img_names)}')\n",
"\n",
"print(list(filter_img_names.keys())[:5])\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# # Load Agniv VITpose-base hot dict\n",
"# filter_path = \"./agniv_pose_filter/hot_dict.pkl\"\n",
"# with open(filter_path, 'rb') as f:\n",
"# pose_md_dict = pkl.load(f)\n",
" \n",
"# hico_dict = {}\n",
"\n",
"# for k, v in pose_md_dict.items():\n",
"# if 'hake' in k:\n",
"# hico_dict[k] = v\n",
" \n",
"# print(f'Total images found: {len(hico_dict)}')\n",
"\n",
"# # Filter out images with < 10 visible keypoints \n",
"# kp_thresh = 10\n",
"\n",
"# filter_img_names = {}\n",
"\n",
"# for imgname, kp_md in hico_dict.items():\n",
"# if kp_md == 0:\n",
"# continue\n",
"# if kp_md[\"num_persons\"] == 1 and kp_md[\"num_kpt\"][0.5][0] > kp_thresh:\n",
"# filter_img_names[imgname] = kp_md[\"num_kpt\"][0.5][0]\n",
" \n",
"# print(f'Images after KP filtering: {len(filter_img_names)}')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 0 1 2\n",
"0 1 airplane board\n",
"1 2 airplane direct\n",
"2 3 airplane exit\n",
"3 4 airplane fly\n",
"4 5 airplane inspect\n",
".. ... ... ...\n",
"595 596 zebra feed\n",
"596 597 zebra hold\n",
"597 598 zebra pet\n",
"598 599 zebra watch\n",
"599 600 zebra no_interaction\n",
"\n",
"[600 rows x 3 columns]\n"
]
}
],
"source": [
"\n",
"hico_annot = json.load(open('/ps/project/datasets/HICO/hico-image-level/hico-training-set-image-level.json', 'rb'))\n",
"hoi_mapping = pd.read_csv('/ps/project/datasets/HICO/hico-image-level/hico_hoi_list.txt', header=None, delim_whitespace=True)\n",
"print(hoi_mapping)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Final number of images 3154\n"
]
}
],
"source": [
"version = '1'\n",
"out_dir = f'./filtered_data/v_{version}'\n",
"os.makedirs(out_dir, exist_ok=True)\n",
"\n",
"objectwise_img_names = {}\n",
"imgwise_object_names = {}\n",
"img_dir = '/ps/project/datasets/HICO/hico_20150920/images/train2015'\n",
"\n",
"bad_object_names = ['bear', 'bird', 'cat', 'cow', \n",
" 'dog', 'elephant', 'giraffe', 'horse', \n",
" 'mouse', 'person', 'sheep', 'zebra' ]\n",
"bad_action_names = ['buy', 'chase', 'direct', 'greet', 'herd', 'hose',\n",
" 'hug', 'hunt', 'milk', 'no_interaction', 'pet', 'point', 'teach',\n",
" 'watch', 'wave']\n",
"\n",
"for i, (img_name, img_md) in enumerate(hico_annot.items()):\n",
" \n",
" # Apply keypoint number filtering on the images \n",
" full_img_name = 'hake_train2015_' + img_name\n",
" if full_img_name not in filter_img_names.keys():\n",
" continue\n",
" \n",
" # show the image\n",
" if i < 0:\n",
" img = Image.open(osp.join(img_dir,img_name))\n",
" display(img)\n",
" \n",
" obj_names = []\n",
" action_names = []\n",
" kp_num = filter_img_names[full_img_name]\n",
" \n",
" # travel through all hoi in the metadata, save obj_names and action_names for the hois\n",
" for hoi_id in img_md['hoi_id']:\n",
" img_md_row = hoi_mapping.loc[hoi_mapping[0] == hoi_id].iloc[0]\n",
"\n",
" obj_name = img_md_row[1]\n",
" if obj_name in bad_object_names:\n",
" continue\n",
" action_name = img_md_row[2]\n",
" if action_name in bad_action_names:\n",
" continue\n",
" \n",
" obj_names.append(obj_name)\n",
" action_names.append(action_name)\n",
" \n",
" if len(set(obj_names)) == 0 or len(action_names) == 0:\n",
" continue\n",
" \n",
" imgwise_object_names.setdefault(full_img_name,[]).extend(list(set(obj_names)))\n",
" \n",
"# # # Display images with multiple objects\n",
"# if len(set(obj_names)) > 1:\n",
"# print(img_name)\n",
"# print(obj_names)\n",
"# print(action_names)\n",
"# print(f'Number of Kps: {kp_num}')\n",
"# img = Image.open(osp.join(img_dir,img_name))\n",
"# display(img)\n",
" \n",
" for obj_name in set(obj_names):\n",
" objectwise_img_names.setdefault(obj_name,[]).append(full_img_name)\n",
" \n",
"print(f'Final number of images {len(imgwise_object_names)}')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saved at ./filtered_data/v_1/object_per_image_dict.json\n",
"saved at ./filtered_data/v_1/imgnames_per_object_dict.json\n"
]
}
],
"source": [
"# Save the imagewise_object dict\n",
"out_path = osp.join(out_dir, 'object_per_image_dict.json')\n",
"with open(out_path, 'w') as fp:\n",
" json.dump(imgwise_object_names, fp)\n",
" print(f'saved at {out_path}')\n",
" \n",
"# # save image_list \n",
"# out_path = osp.join(out_dir, 'hico_imglist_all_140223.txt')\n",
"# with open(out_path, 'w') as f:\n",
"# f.write('\\n'.join(imgwise_object_names.keys()))\n",
"# print(f'saved at {out_path}')\n",
"\n",
"\n",
"# Save the object_wise dict\n",
"out_path = osp.join(out_dir, 'imgnames_per_object_dict.json')\n",
"with open(out_path, 'w') as fp:\n",
" json.dump(objectwise_img_names, fp)\n",
" print(f'saved at {out_path}')\n",
"\n",
" \n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/stripathi/anaconda3/envs/cliff/lib/python3.10/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.5\n",
" warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"3189\n"
]
},
{
"data": {
"image/png": "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Khq+Y8cO9OzZEwMGDMCGDRtQUVEhlEVFRcHDwwOWlpbCsEmTJkEulyMuLk7t51RXV0Mul4teREREJE0d2rLTWENDA9544w0MHz4cAwYMEIY/++yzcHBwgI2NDa5fv47169fjzp07CAkJAQBkZ2eLgg4A4f/s7Gy1n7Vx40Z8+OGH7fRNiIiIqDPpNGFn5cqVuHnzJs6ePSsavmLFCuFvDw8PWFtbY9y4cUhKSkLv3r1b9VkbNmzA2rVrhf/lcjns7OxaV3EiIiLq1DrFaazXXnsNoaGhOHHiBHr16tXse4cOHQoASExMBABYWVkhJydH9B7l/03189HT04OhoaHoRURERNLUoWFHoVDgtddew/79+xEZGQknJ6dHjnP16lUAgLW1NQDA398fN27cQG5urvCeiIgIGBoaws3NrV3qTURERE+PDj2NtXLlSuzcuRMHDx6EgYGB0MfGyMgI+vr6SEpKws6dOzFlyhSYmZnh+vXrWLNmDQICAjBw4EAAwMSJE+Hm5oZFixbhk08+QXZ2Nt59912sXLkSenp6Hfn1iIiIqBPo0Jadb775BiUlJRg9ejSsra2F1+7duwEAurq6OHbsGCZOnAhXV1e8+eabCAoKwuHDh4VpaGtrIzQ0FNra2vD398dzzz2HxYsXi+7LQ0RERH9eHdqyo1Aomi23s7PDqVOnHjkdBwcHHDlypK2qRURERBLSKTooExEREbUXhh0iIiKSNIYdIiIikjSGHSIiIpI0hh0iIiKStE7zuIjOLm/LVrXDzV9e9oRrQkRERJpgyw4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUlal46ugBTkbvla7XCLl197wjUhIiKih7Flh4iIiCSNYYeIiIgkjWGHiIiIJI1hh4iIiCSNHZSfgJxv/qV2uOUrbz/hmhAREf35sGWHiIiIJI1hh4iIiCSNYYeIiIgkjWGH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iB6TxmHHysoKhYWFAB5cdRUdHQ0AuHfvHhQKRdvWjoiIiOgxaRx2xo4di0OHDgEAli5dijVr1mDChAmYN28eZs2a1eYVJCIiInocGl+N9d1336GhoQEAsHLlSpiZmeH8+fOYPn06XnrppTavIBEREdHj0DjsaGlpiR4COn/+fMyfP79NK0VERETUVlp1n52qqipcv34dubm5QiuP0vTp09ukYkRERERtQeOwExYWhsWLFyM/P1+lTCaTCU8+JyIiIuoMNO6gvGrVKsydOxdZWVloaGgQvRh0iIiIqLPROOzk5ORg7dq1sLS0bI/6EBEREbUpjcPOnDlzcPLkyXaoChEREVHb07jPztdff425c+fizJkz8PDwgI6Ojqj89ddfb7PKERERET0ujcPOrl27cPToUXTt2hUnT56ETCYTymQyGcMOERERdSoah5133nkHH374Id5++23R/XaIiIiIOiON00pNTQ3mzZvHoENERERPBY0Ty5IlS7B79+72qAsRERFRm9P4NFZ9fT0++eQThIeHY+DAgSodlD/77LM2qxwRERHR49I47Ny4cQPe3t4AgJs3b4rKGndWJiIiIuoMNA47J06caI96EBEREbUL9jImIiIiSWtxy87s2bNb9L6QkJBWV4aIiIiorbU47BgZGbVnPYiIiIjaRYvDzk8//dSe9SAiIiJqF+yzQ0RERJLGsENERESSxrBDREREksawQ0RERJLWorAzaNAgFBUVAQA++ugjVFRUtGuliIiIiNpKi8JOfHw8ysvLAQAffvghysrK2rVSRERERG2lRZeee3l5YenSpRgxYgQUCgU+/fRT9OjRQ+1733vvvTatIBEREdHjaFHY2bZtG95//32EhoZCJpPhjz/+QJcuqqPKZDKGHSIiIupUWhR2+vXrh99++w0AoKWlhePHj8PCwqJdK0ZERETUFjS+GquhoaHNgs7p06cxbdo02NjYQCaT4cCBA6Ly559/HjKZTPSaPHmy6D2FhYVYuHAhDA0NYWxsjGXLlrFPEREREQladel5UlISVq1ahfHjx2P8+PF4/fXXkZSUpPF0ysvL4enpiU2bNjX5nsmTJyMrK0t47dq1S1S+cOFCxMXFISIiAqGhoTh9+jRWrFihcV2IiIhImlr8bCyl8PBwTJ8+HV5eXhg+fDgA4Ny5c3B3d8fhw4cxYcKEFk8rMDAQ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q67GaitlZWVITEwU/r937x6uXr0KU1NT2Nvb44033sDHH3+MPn36CJee29jYCM/n6t+/PyZPnozly5djy5YtqK2txWuvvYb58+fzSiwiIiIC0MFhJyYmBmPGjBH+V/ajWbJkCbZt24a33noL5eXlWLFiBYqLizFixAiEhYUJ99gBgB07duC1117DuHHjoKWlhaCgIHz11VdP/LsQERFR59ShYWf06NFQKBRNlstkMnz00UfN3qzQ1NSUNxAkIiKiJvFBoERERCRpDDtEREQkaR16GoueXie/n6p2+Ojlvz/hmhARETWPLTtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaV06ugIkPeFbp6gdPmnZkSdcEyIiIoYd6gChPwaqHf7MC3884ZoQEdGfAU9jERERkaQx7BAREZGkMewQERGRpDHsEBERkaQx7BAREZGkMewQERGRpDHsEBERkaTxPjvUqYT8NFnt8NlLw55wTYiISCoYduip8tu2SWqHz38+/AnXhIiInhYMOyQZ27dNVDt8yfNHAQA//Kw+KL24mEGJiEjK2GeHiIiIJI1hh4iIiCSNYYeIiIgkjWGHiIiIJI1hh4iIiCSNYYeIiIgkjWGHiIiIJI332SECsPlX9ffgefU53oOHiOhpx5YdIiIikjSGHSIiIpI0hh0iIiKSNIYdIiIikjR2UCZqgc93qu/AvOZZdmAmIurs2LJDREREktapw84HH3wAmUwmerm6ugrlVVVVWLlyJczMzNCjRw8EBQUhJyenA2tMREREnU2nDjsA4O7ujqysLOF19uxZoWzNmjU4fPgw9u7di1OnTiEzMxOzZ8/uwNoSERFRZ9Pp++x06dIFVlZWKsNLSkqwdetW7Ny5E2PHjgUA/PTTT+jfvz+io6Ph5+f3pKtKREREnVCnb9m5e/cubGxs4OzsjIULFyItLQ0AEBsbi9raWowfP154r6urK+zt7REVFdXsNKurqyGXy0UvIiIikqZOHXaGDh2Kbdu2ISwsDN988w3u3buHkSNH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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# sort the dictionary \n",
"objectwise_img_names = dict(sorted(objectwise_img_names.items(), key=lambda x: len(x[1]), reverse=True))\n",
"\n",
"# Extract object names and image counts\n",
"obj_names = list(objectwise_img_names.keys())\n",
"img_counts = [len(objectwise_img_names[obj]) for obj in objectwise_img_names]\n",
"print(sum(img_counts))\n",
"\n",
"# Create bar plot\n",
"sns.barplot(x=obj_names, y=img_counts)\n",
"\n",
"# Add x-axis and y-axis labels\n",
"plt.xlabel('Object')\n",
"plt.ylabel('Number of Images')\n",
"\n",
"plt.xticks(rotation=45, ha='right', fontsize=3)\n",
"\n",
"# Save the plot as a high-resolution image file\n",
"out_path = osp.join(out_dir, 'image_per_object_category.png')\n",
"plt.savefig(out_path, dpi=300)\n",
"\n",
"# Show plot\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
|