ac5113 commited on
Commit
9a959e6
1 Parent(s): 73849f0

initial app test

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. configs/cfg_test.yml +0 -28
  2. configs/cfg_train.yml +0 -29
  3. hot_analysis/.ipynb_checkpoints/hico_analysis-checkpoint.ipynb +0 -307
  4. hot_analysis/.ipynb_checkpoints/vcoco_analysis-checkpoint.ipynb +0 -276
  5. hot_analysis/agniv_pose_filter/hico.npy +0 -3
  6. hot_analysis/agniv_pose_filter/hot.npy +0 -3
  7. hot_analysis/agniv_pose_filter/hot_dict.pkl +0 -3
  8. hot_analysis/agniv_pose_filter/pq_wnp.npy +0 -3
  9. hot_analysis/agniv_pose_filter/vcoco.npy +0 -3
  10. hot_analysis/count_objects_per_img.py +0 -35
  11. hot_analysis/create_combined_objectwise_plots.ipynb +0 -291
  12. hot_analysis/create_part_probability_mesh.py +0 -86
  13. hot_analysis/damon_qc_stats/compute_accuracy_iou_damon.py +0 -59
  14. hot_analysis/damon_qc_stats/compute_fleiss_kappa_damon.py +0 -111
  15. hot_analysis/damon_qc_stats/qa_accuracy_gt_contact_combined.npz +0 -3
  16. hot_analysis/damon_qc_stats/quality_assurance_accuracy.csv +0 -0
  17. hot_analysis/damon_qc_stats/quality_assurance_fleiss.csv +0 -0
  18. hot_analysis/damon_qc_stats/successful_qualifications_fleiss.csv +0 -0
  19. hot_analysis/filtered_data/v_1/hico/hico_imglist_all_140223.txt +0 -0
  20. hot_analysis/filtered_data/v_1/hico/image_per_object_category.png +0 -0
  21. hot_analysis/filtered_data/v_1/hico/imgnames_per_object_dict.json +0 -0
  22. hot_analysis/filtered_data/v_1/hico/imgnames_per_object_dict.txt +0 -0
  23. hot_analysis/filtered_data/v_1/hico/object_per_image_dict.json +0 -0
  24. hot_analysis/filtered_data/v_1/hico/object_per_image_dict.txt +0 -0
  25. hot_analysis/filtered_data/v_1/hico_imglist_all_140223.txt +0 -0
  26. hot_analysis/filtered_data/v_1/image_per_object_category.png +0 -0
  27. hot_analysis/filtered_data/v_1/imgnames_per_object_dict.json +0 -0
  28. hot_analysis/filtered_data/v_1/imgnames_per_object_dict.txt +0 -0
  29. hot_analysis/filtered_data/v_1/object_per_image_dict.json +0 -0
  30. hot_analysis/filtered_data/v_1/object_per_image_dict.txt +0 -0
  31. hot_analysis/filtered_data/v_1/vcoco/image_per_object_category.png +0 -0
  32. hot_analysis/filtered_data/v_1/vcoco/imgnames_per_object_dict.json +0 -0
  33. hot_analysis/filtered_data/v_1/vcoco/object_per_image_dict.json +0 -0
  34. hot_analysis/filtered_data/v_1/vcoco/vcoco_imglist_all_170223.txt +0 -2368
  35. hot_analysis/hico_analysis.ipynb +0 -342
  36. hot_analysis/image_per_object_category.png +0 -0
  37. hot_analysis/jc_graphs/documents-export-2023-03-07/image_per_object_category.csv +0 -70
  38. hot_analysis/jc_graphs/documents-export-2023-03-07/object_nest_piechart_data.csv +0 -77
  39. hot_analysis/jc_graphs/documents-export-2023-03-07/partwise_contact_graph.csv +0 -18
  40. hot_analysis/jc_graphs/plot_image_per_object.py +0 -147
  41. hot_analysis/jc_graphs/plot_partwise_contacts.py +0 -42
  42. hot_analysis/object_nest_piechart.py +0 -136
  43. hot_analysis/partwise_contact_graph.py +0 -98
  44. hot_analysis/vcoco_analysis.ipynb +0 -276
  45. scripts/datascripts/add_imgname_column_to_deco_csv.py +0 -23
  46. scripts/datascripts/combine_cropped_npz.py +0 -63
  47. scripts/datascripts/combine_mturk_csvs.py +0 -33
  48. scripts/datascripts/combine_npzs.py +0 -41
  49. scripts/datascripts/convert_rich_npz_to_cropped.py +0 -75
  50. scripts/datascripts/get_part_seg_mask.py +0 -199
configs/cfg_test.yml DELETED
@@ -1,28 +0,0 @@
1
- EXP_NAME: 'damon_hrnet_testing'
2
- PROJECT_NAME: 'DECO_DAMON_Testing'
3
- OUTPUT_DIR: 'deco_results'
4
- CONDOR_DIR: ''
5
- DATASET:
6
- BATCH_SIZE: 16
7
- NUM_WORKERS: 4
8
- NORMALIZE_IMAGES: [True]
9
- OPTIMIZER:
10
- TYPE: 'adam'
11
- LR: [5e-5]
12
- NUM_UPDATE_LR: 3
13
- TRAINING:
14
- ENCODER: 'hrnet'
15
- CONTEXT: [True]
16
- NUM_EPOCHS: 1
17
- NUM_EARLY_STOP: 10
18
- SUMMARY_STEPS: 5
19
- CHECKPOINT_EPOCHS: 5
20
- DATASETS: ['damon']
21
- DATASET_MIX_PDF: ['1.']
22
- DATASET_ROOT_PATH: ''
23
- BEST_MODEL_PATH: './checkpoints/Release_Checkpoint/deco_best.pth'
24
- PAL_LOSS_WEIGHTS: 0.0
25
- VALIDATION:
26
- SUMMARY_STEPS: 1000
27
- DATASETS: ['damon']
28
- MAIN_DATASET: 'damon'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
configs/cfg_train.yml DELETED
@@ -1,29 +0,0 @@
1
- EXP_NAME: 'demo_train'
2
- PROJECT_NAME: 'DECO_demo_training'
3
- OUTPUT_DIR: 'deco_results'
4
- CONDOR_DIR: ''
5
- DATASET:
6
- BATCH_SIZE: 4
7
- NUM_WORKERS: 8
8
- NORMALIZE_IMAGES: [True]
9
- OPTIMIZER:
10
- TYPE: 'adam'
11
- LR: [1e-5]
12
- NUM_UPDATE_LR: 3
13
- TRAINING:
14
- ENCODER: 'hrnet'
15
- CONTEXT: [True]
16
- NUM_EPOCHS: 100
17
- NUM_EARLY_STOP: 10
18
- SUMMARY_STEPS: 5
19
- CHECKPOINT_EPOCHS: 5
20
- DATASETS: ['damon', 'rich', 'prox']
21
- DATASET_MIX_PDF: ['0.4', '0.3', '0.3'] # should sum to 1.0 unless you want to weight by dataset size
22
- DATASET_ROOT_PATH: ''
23
- BEST_MODEL_PATH: './checkpoints/Other_Checkpoints/demo_train.pth'
24
- LOSS_WEIGHTS: 1.
25
- PAL_LOSS_WEIGHTS: 0.01
26
- VALIDATION:
27
- SUMMARY_STEPS: 5
28
- DATASETS: ['damon', 'rich', 'prox']
29
- MAIN_DATASET: 'damon'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/.ipynb_checkpoints/hico_analysis-checkpoint.ipynb DELETED
@@ -1,307 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 5,
6
- "metadata": {},
7
- "outputs": [],
8
- "source": [
9
- "import json\n",
10
- "import pandas as pd \n",
11
- "import ipdb\n",
12
- "import os\n",
13
- "import pickle as pkl\n",
14
- "import os.path as osp\n",
15
- "import numpy as np\n",
16
- "from PIL import Image\n"
17
- ]
18
- },
19
- {
20
- "cell_type": "code",
21
- "execution_count": 6,
22
- "metadata": {},
23
- "outputs": [
24
- {
25
- "name": "stdout",
26
- "output_type": "stream",
27
- "text": [
28
- "Total images found: 9642\n",
29
- "Images after KP filtering: 3895\n",
30
- "['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"
31
- ]
32
- }
33
- ],
34
- "source": [
35
- "# Load Agniv VITpose-base hico filtering\n",
36
- "filter_path = './agniv_pose_filter/hico.npy'\n",
37
- "pose_md = np.load(filter_path, allow_pickle=True)\n",
38
- "pose_md = pose_md.item()\n",
39
- "filter_img_names = {}\n",
40
- "\n",
41
- "print(f'Total images found: {len(pose_md)}')\n",
42
- "\n",
43
- "# Filter out images with < 10 visible keypoints \n",
44
- "kp_thresh = 10\n",
45
- "\n",
46
- "for imgname, pose_num in pose_md.items():\n",
47
- " if pose_num > kp_thresh:\n",
48
- " filter_img_names[imgname] = pose_num\n",
49
- " \n",
50
- "print(f'Images after KP filtering: {len(filter_img_names)}')\n",
51
- "\n",
52
- "print(list(filter_img_names.keys())[:5])\n"
53
- ]
54
- },
55
- {
56
- "cell_type": "code",
57
- "execution_count": 7,
58
- "metadata": {},
59
- "outputs": [],
60
- "source": [
61
- "# # Load Agniv VITpose-base hot dict\n",
62
- "# filter_path = \"./agniv_pose_filter/hot_dict.pkl\"\n",
63
- "# with open(filter_path, 'rb') as f:\n",
64
- "# pose_md_dict = pkl.load(f)\n",
65
- " \n",
66
- "# hico_dict = {}\n",
67
- "\n",
68
- "# for k, v in pose_md_dict.items():\n",
69
- "# if 'hake' in k:\n",
70
- "# hico_dict[k] = v\n",
71
- " \n",
72
- "# print(f'Total images found: {len(hico_dict)}')\n",
73
- "\n",
74
- "# # Filter out images with < 10 visible keypoints \n",
75
- "# kp_thresh = 10\n",
76
- "\n",
77
- "# filter_img_names = {}\n",
78
- "\n",
79
- "# for imgname, kp_md in hico_dict.items():\n",
80
- "# if kp_md == 0:\n",
81
- "# continue\n",
82
- "# if kp_md[\"num_persons\"] == 1 and kp_md[\"num_kpt\"][0.5][0] > kp_thresh:\n",
83
- "# filter_img_names[imgname] = kp_md[\"num_kpt\"][0.5][0]\n",
84
- " \n",
85
- "# print(f'Images after KP filtering: {len(filter_img_names)}')"
86
- ]
87
- },
88
- {
89
- "cell_type": "code",
90
- "execution_count": 8,
91
- "metadata": {},
92
- "outputs": [
93
- {
94
- "name": "stdout",
95
- "output_type": "stream",
96
- "text": [
97
- " 0 1 2\n",
98
- "0 1 airplane board\n",
99
- "1 2 airplane direct\n",
100
- "2 3 airplane exit\n",
101
- "3 4 airplane fly\n",
102
- "4 5 airplane inspect\n",
103
- ".. ... ... ...\n",
104
- "595 596 zebra feed\n",
105
- "596 597 zebra hold\n",
106
- "597 598 zebra pet\n",
107
- "598 599 zebra watch\n",
108
- "599 600 zebra no_interaction\n",
109
- "\n",
110
- "[600 rows x 3 columns]\n"
111
- ]
112
- }
113
- ],
114
- "source": [
115
- "\n",
116
- "hico_annot = json.load(open('/ps/project/datasets/HICO/hico-image-level/hico-training-set-image-level.json', 'rb'))\n",
117
- "hoi_mapping = pd.read_csv('/ps/project/datasets/HICO/hico-image-level/hico_hoi_list.txt', header=None, delim_whitespace=True)\n",
118
- "print(hoi_mapping)"
119
- ]
120
- },
121
- {
122
- "cell_type": "code",
123
- "execution_count": 9,
124
- "metadata": {
125
- "scrolled": true
126
- },
127
- "outputs": [
128
- {
129
- "name": "stdout",
130
- "output_type": "stream",
131
- "text": [
132
- "Final number of images 3154\n"
133
- ]
134
- }
135
- ],
136
- "source": [
137
- "version = '1'\n",
138
- "out_dir = f'./filtered_data/v_{version}'\n",
139
- "os.makedirs(out_dir, exist_ok=True)\n",
140
- "\n",
141
- "objectwise_img_names = {}\n",
142
- "imgwise_object_names = {}\n",
143
- "img_dir = '/ps/project/datasets/HICO/hico_20150920/images/train2015'\n",
144
- "\n",
145
- "bad_object_names = ['bear', 'bird', 'cat', 'cow', \n",
146
- " 'dog', 'elephant', 'giraffe', 'horse', \n",
147
- " 'mouse', 'person', 'sheep', 'zebra' ]\n",
148
- "bad_action_names = ['buy', 'chase', 'direct', 'greet', 'herd', 'hose',\n",
149
- " 'hug', 'hunt', 'milk', 'no_interaction', 'pet', 'point', 'teach',\n",
150
- " 'watch', 'wave']\n",
151
- "\n",
152
- "for i, (img_name, img_md) in enumerate(hico_annot.items()):\n",
153
- " \n",
154
- " # Apply keypoint number filtering on the images \n",
155
- " full_img_name = 'hake_train2015_' + img_name\n",
156
- " if full_img_name not in filter_img_names.keys():\n",
157
- " continue\n",
158
- " \n",
159
- " # show the image\n",
160
- " if i < 0:\n",
161
- " img = Image.open(osp.join(img_dir,img_name))\n",
162
- " display(img)\n",
163
- " \n",
164
- " obj_names = []\n",
165
- " action_names = []\n",
166
- " kp_num = filter_img_names[full_img_name]\n",
167
- " \n",
168
- " # travel through all hoi in the metadata, save obj_names and action_names for the hois\n",
169
- " for hoi_id in img_md['hoi_id']:\n",
170
- " img_md_row = hoi_mapping.loc[hoi_mapping[0] == hoi_id].iloc[0]\n",
171
- "\n",
172
- " obj_name = img_md_row[1]\n",
173
- " if obj_name in bad_object_names:\n",
174
- " continue\n",
175
- " action_name = img_md_row[2]\n",
176
- " if action_name in bad_action_names:\n",
177
- " continue\n",
178
- " \n",
179
- " obj_names.append(obj_name)\n",
180
- " action_names.append(action_name)\n",
181
- " \n",
182
- " if len(set(obj_names)) == 0 or len(action_names) == 0:\n",
183
- " continue\n",
184
- " \n",
185
- " imgwise_object_names.setdefault(full_img_name,[]).extend(list(set(obj_names)))\n",
186
- " \n",
187
- "# # # Display images with multiple objects\n",
188
- "# if len(set(obj_names)) > 1:\n",
189
- "# print(img_name)\n",
190
- "# print(obj_names)\n",
191
- "# print(action_names)\n",
192
- "# print(f'Number of Kps: {kp_num}')\n",
193
- "# img = Image.open(osp.join(img_dir,img_name))\n",
194
- "# display(img)\n",
195
- " \n",
196
- " for obj_name in set(obj_names):\n",
197
- " objectwise_img_names.setdefault(obj_name,[]).append(full_img_name)\n",
198
- " \n",
199
- "print(f'Final number of images {len(imgwise_object_names)}')"
200
- ]
201
- },
202
- {
203
- "cell_type": "code",
204
- "execution_count": null,
205
- "metadata": {
206
- "scrolled": true
207
- },
208
- "outputs": [],
209
- "source": [
210
- "# Save the imagewise_object dict\n",
211
- "out_path = osp.join(out_dir, 'object_per_image_dict.json')\n",
212
- "with open(out_path, 'w') as fp:\n",
213
- " json.dump(imgwise_object_names, fp)\n",
214
- " print(f'saved at {out_path}')\n",
215
- " \n",
216
- "# # save image_list \n",
217
- "# out_path = osp.join(out_dir, 'hico_imglist_all_140223.txt')\n",
218
- "# with open(out_path, 'w') as f:\n",
219
- "# f.write('\\n'.join(imgwise_object_names.keys()))\n",
220
- "# print(f'saved at {out_path}')\n",
221
- "\n",
222
- "\n",
223
- "# Save the object_wise dict\n",
224
- "out_path = osp.join(out_dir, 'imgnames_per_object_dict.json')\n",
225
- "with open(out_path, 'w') as fp:\n",
226
- " json.dump(objectwise_img_names, fp)\n",
227
- " print(f'saved at {out_path}')\n",
228
- "\n",
229
- " \n",
230
- "\n",
231
- " "
232
- ]
233
- },
234
- {
235
- "cell_type": "code",
236
- "execution_count": null,
237
- "metadata": {},
238
- "outputs": [],
239
- "source": [
240
- "import matplotlib.pyplot as plt\n",
241
- "import seaborn as sns\n",
242
- "\n",
243
- "# sort the dictionary \n",
244
- "objectwise_img_names = dict(sorted(objectwise_img_names.items(), key=lambda x: len(x[1]), reverse=True))\n",
245
- "\n",
246
- "# Extract object names and image counts\n",
247
- "obj_names = list(objectwise_img_names.keys())\n",
248
- "img_counts = [len(objectwise_img_names[obj]) for obj in objectwise_img_names]\n",
249
- "print(sum(img_counts))\n",
250
- "\n",
251
- "# Create bar plot\n",
252
- "sns.barplot(x=obj_names, y=img_counts)\n",
253
- "\n",
254
- "# Add x-axis and y-axis labels\n",
255
- "plt.xlabel('Object')\n",
256
- "plt.ylabel('Number of Images')\n",
257
- "\n",
258
- "plt.xticks(rotation=45, ha='right', fontsize=3)\n",
259
- "\n",
260
- "# Save the plot as a high-resolution image file\n",
261
- "out_path = osp.join(out_dir, 'image_per_object_category.png')\n",
262
- "plt.savefig(out_path, dpi=300)\n",
263
- "\n",
264
- "# Show plot\n",
265
- "plt.show()"
266
- ]
267
- },
268
- {
269
- "cell_type": "code",
270
- "execution_count": null,
271
- "metadata": {},
272
- "outputs": [],
273
- "source": [
274
- "\n",
275
- " "
276
- ]
277
- },
278
- {
279
- "cell_type": "code",
280
- "execution_count": null,
281
- "metadata": {},
282
- "outputs": [],
283
- "source": []
284
- }
285
- ],
286
- "metadata": {
287
- "kernelspec": {
288
- "display_name": "Python 3",
289
- "language": "python",
290
- "name": "python3"
291
- },
292
- "language_info": {
293
- "codemirror_mode": {
294
- "name": "ipython",
295
- "version": 3
296
- },
297
- "file_extension": ".py",
298
- "mimetype": "text/x-python",
299
- "name": "python",
300
- "nbconvert_exporter": "python",
301
- "pygments_lexer": "ipython3",
302
- "version": "3.8.5"
303
- }
304
- },
305
- "nbformat": 4,
306
- "nbformat_minor": 4
307
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/.ipynb_checkpoints/vcoco_analysis-checkpoint.ipynb DELETED
@@ -1,276 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 30,
6
- "metadata": {},
7
- "outputs": [],
8
- "source": [
9
- "import json\n",
10
- "import pandas as pd \n",
11
- "import ipdb\n",
12
- "import os\n",
13
- "import pickle as pkl\n",
14
- "import os.path as osp\n",
15
- "import numpy as np\n",
16
- "from PIL import Image"
17
- ]
18
- },
19
- {
20
- "cell_type": "code",
21
- "execution_count": 31,
22
- "metadata": {},
23
- "outputs": [
24
- {
25
- "name": "stdout",
26
- "output_type": "stream",
27
- "text": [
28
- "Total images found: 5459\n",
29
- "Images after KP filtering: 2386\n",
30
- "['vcoco_000000051899.jpg', 'vcoco_000000093127.jpg', 'vcoco_000000455665.jpg', 'vcoco_000000248389.jpg', 'vcoco_000000403947.jpg']\n"
31
- ]
32
- }
33
- ],
34
- "source": [
35
- "# Load Agniv VITpose-base hot dict\n",
36
- "filter_path = \"./agniv_pose_filter/hot_dict.pkl\"\n",
37
- "with open(filter_path, 'rb') as f:\n",
38
- " pose_md_dict = pkl.load(f)\n",
39
- " \n",
40
- "vcoco_dict = {}\n",
41
- "\n",
42
- "for k, v in pose_md_dict.items():\n",
43
- " if 'vcoco' in k:\n",
44
- " vcoco_dict[k] = v\n",
45
- " \n",
46
- "print(f'Total images found: {len(vcoco_dict)}')\n",
47
- "\n",
48
- "# Filter out images with < 10 visible keypoints \n",
49
- "kp_thresh = 10\n",
50
- "\n",
51
- "filter_img_names = {}\n",
52
- "\n",
53
- "for imgname, kp_md in vcoco_dict.items():\n",
54
- " if kp_md == 0:\n",
55
- " continue\n",
56
- " if kp_md[\"num_persons\"] == 1 and kp_md[\"num_kpt\"][0.5][0] > kp_thresh:\n",
57
- " filter_img_names[imgname] = kp_md[\"num_kpt\"][0.5][0]\n",
58
- " \n",
59
- "print(f'Images after KP filtering: {len(filter_img_names)}')\n",
60
- "\n",
61
- "print(list(filter_img_names.keys())[:5])"
62
- ]
63
- },
64
- {
65
- "cell_type": "code",
66
- "execution_count": 35,
67
- "metadata": {},
68
- "outputs": [
69
- {
70
- "name": "stdout",
71
- "output_type": "stream",
72
- "text": [
73
- "loading annotations into memory...\n",
74
- "Done (t=1.30s)\n",
75
- "creating index...\n",
76
- "index created!\n",
77
- "Final number of images 2368\n"
78
- ]
79
- }
80
- ],
81
- "source": [
82
- "from pycocotools.coco import COCO\n",
83
- "version = '1'\n",
84
- "out_dir = f'./filtered_data/v_{version}/vcoco'\n",
85
- "os.makedirs(out_dir, exist_ok=True)\n",
86
- "\n",
87
- "coco_dir = '/is/cluster/work/stripathi/pycharm_remote/v-coco/data'\n",
88
- "coco = COCO(os.path.join(coco_dir, 'instances_vcoco_all_2014.json'))\n",
89
- "\n",
90
- "imgwise_object_names = {}\n",
91
- "img_dir = '/ps/project/datasets/HOT/Contact_Data/images/training/'\n",
92
- "\n",
93
- "bad_object_names = ['bird', 'cat', 'dog', 'horse', 'sheep', 'cow', \n",
94
- " 'elephant', 'bear', 'zebra', 'giraffe']\n",
95
- "\n",
96
- "# # Get all coco objects\n",
97
- "# count = 0\n",
98
- "# for id in range(91):\n",
99
- "# try: \n",
100
- "# print(coco.loadCats(id))\n",
101
- "# count += 1\n",
102
- "# except:\n",
103
- "# print(f'ID:{id} does not exist')\n",
104
- "# continue\n",
105
- "# print(count)\n",
106
- "\n",
107
- "objectwise_img_names = {}\n",
108
- "for img_name in filter_img_names.keys():\n",
109
- " img_id = int(os.path.splitext(img_name.split('_')[-1])[0])\n",
110
- " ann_ids = coco.getAnnIds([img_id])\n",
111
- " anns = coco.loadAnns(ann_ids)\n",
112
- " object_list = []\n",
113
- " for ann in anns:\n",
114
- " object_cat = coco.loadCats(ann[\"category_id\"])\n",
115
- " if len(object_cat) > 1:\n",
116
- " ipdb.set_trace()\n",
117
- " object_name = object_cat[0]['name']\n",
118
- " if object_name in bad_object_names:\n",
119
- " continue\n",
120
- " if object_name != 'person':\n",
121
- " object_list.append(object_name)\n",
122
- " if len(object_list) != 0:\n",
123
- " imgwise_object_names[img_name] = list(set(object_list))\n",
124
- " \n",
125
- " for obj_name in set(object_list):\n",
126
- " objectwise_img_names.setdefault(obj_name,[]).append(img_name)\n",
127
- " \n",
128
- "# # Visualize images \n",
129
- "# print(img_name)\n",
130
- "# print(list(set(object_list)))\n",
131
- "# img = Image.open(osp.join(img_dir,img_name))\n",
132
- "# display(img)\n",
133
- " \n",
134
- " \n",
135
- "print(f'Final number of images {len(imgwise_object_names)}')\n",
136
- " \n"
137
- ]
138
- },
139
- {
140
- "cell_type": "code",
141
- "execution_count": 36,
142
- "metadata": {
143
- "scrolled": true
144
- },
145
- "outputs": [
146
- {
147
- "name": "stdout",
148
- "output_type": "stream",
149
- "text": [
150
- "saved at ./filtered_data/v_1/vcoco/object_per_image_dict.json\n",
151
- "saved at ./filtered_data/v_1/vcoco/vcoco_imglist_all_170223.txt\n",
152
- "saved at ./filtered_data/v_1/vcoco/imgnames_per_object_dict.json\n"
153
- ]
154
- }
155
- ],
156
- "source": [
157
- "# Save the imagewise_object dict\n",
158
- "out_path = osp.join(out_dir, 'object_per_image_dict.json')\n",
159
- "with open(out_path, 'w') as fp:\n",
160
- " json.dump(imgwise_object_names, fp)\n",
161
- " print(f'saved at {out_path}')\n",
162
- " \n",
163
- "# save image_list \n",
164
- "out_path = osp.join(out_dir, 'vcoco_imglist_all_170223.txt')\n",
165
- "with open(out_path, 'w') as f:\n",
166
- " f.write('\\n'.join(imgwise_object_names.keys()))\n",
167
- " print(f'saved at {out_path}')\n",
168
- "\n",
169
- "\n",
170
- "# Save the object_wise dict\n",
171
- "out_path = osp.join(out_dir, 'imgnames_per_object_dict.json')\n",
172
- "with open(out_path, 'w') as fp:\n",
173
- " json.dump(objectwise_img_names, fp)\n",
174
- " print(f'saved at {out_path}')\n",
175
- "\n",
176
- " \n",
177
- "\n",
178
- " "
179
- ]
180
- },
181
- {
182
- "cell_type": "code",
183
- "execution_count": 37,
184
- "metadata": {
185
- "scrolled": false
186
- },
187
- "outputs": [
188
- {
189
- "name": "stdout",
190
- "output_type": "stream",
191
- "text": [
192
- "5072\n"
193
- ]
194
- },
195
- {
196
- "data": {
197
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEPCAYAAACtCNj2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAsQklEQVR4nO3debhcVZnv8e+bBDJDRpKQBBI0TGGUEIEgIAgEAhkIoyC0oqgNtt22fRW19enbzdW+rfa1xQFUFAdATBhCCGMUFEFCGEOYEgRJEEhAwhAgQHjvH+9blV1FnXMqyalT5yS/z/Oc59TetYe19157vWutPZS5OyIiIgDdmp0AERHpPBQURESkTEFBRETKFBRERKRMQUFERMoUFEREpKxHsxOwMYYMGeJjxoxpdjJERLqUu++++3l3H1rruy4dFMaMGcPChQubnQwRkS7FzP7S0nfqPhIRkTIFBRERKVNQEBGRMgUFEREpU1AQEZEyBQURESlTUBARkTIFBRERKevSD68BrPzBLyuGh376tCalRESk61NLQUREyhQURESkTEFBRETKFBRERKRMQUFERMoUFEREpExBQUREyhQURESkTEFBRETKFBRERKRMQUFERMoUFEREpExBQUREyhQURESkTEFBRETKFBRERKRMQUFERMoUFEREpExBQUREyhoeFMysu5nda2Zzc3iQmd1kZkvy/8DCtOea2VIze9TMjmx02kREpFJHtBQ+CzxcGP4iMN/dxwHzcxgz2xU4GRgPTAa+b2bdOyB9IiKSGhoUzGwUMAX4cWH0NODi/HwxML0w/jJ3X+PuTwBLgYmNTJ+IiFRqdEvh/wH/C3inMG6Yuz8DkP+3yfEjgWWF6ZbnOBER6SANCwpmdgywwt3vrneWGuO8xnLPMrOFZrZw5cqVG5VGERGp1MiWwiRgqpk9CVwGHGpmvwSeM7MRAPl/RU6/HBhdmH8U8Nfqhbr7he4+wd0nDB06tIHJFxHZ/DQsKLj7ue4+yt3HEBeQf+vupwFzgDNysjOAq/PzHOBkM+tpZmOBccCCRqVPRETerUcT1vkN4HIzOxN4CjgBwN0Xm9nlwEPA28DZ7r62CekTEdlsdUhQcPdbgFvy8wvAYS1Mdx5wXkekSURE3k1PNIuISJmCgoiIlCkoiIhImYKCiIiUKSiIiEiZgoKIiJQpKIiISJmCgoiIlCkoiIhImYKCiIiUKSiIiEiZgoKIiJQpKIiISJmCgoiIlCkoiIhImYKCiIiUKSiIiEiZgoKIiJQpKIiISJmCgoiIlCkoiIhImYKCiIiUKSiIiEiZgoKIiJQpKIiISFmbQcHMTjCz/vn5K2Z2hZm9r/FJExGRjlZPS+Ff3f0VMzsQOBK4GPhBY5MlIiLNUE9QWJv/pwA/cPergS0blyQREWmWeoLC02Z2AXAiMM/MetY5n4iIdDH1FO4nAjcAk919FTAI+JdGJkpERJqjzaDg7q8BK4ADc9TbwJJGJkpERJqjnruPvgZ8ATg3R20B/LKRiRIRkeaop/toBjAVWA3g7n8F+jcyUSIi0hz1BIU33d0BBzCzvo1NkoiINEs9QeHyvPtogJl9ArgZ+FFjkyUiIs3Qo60J3P2bZnY48DKwE/BVd7+p4SkTEZEO12ZQAMggoEAgIrKJq+fuo1fM7OWqv2VmdqWZ7dDKfL3MbIGZ3W9mi83s33L8IDO7ycyW5P+BhXnONbOlZvaomR3ZPpsoIiL1qqel8G3gr8AlgAEnA8OBR4GLgENamG8NcKi7v2pmWwC3mdl1wHHAfHf/hpl9Efgi8AUz2zWXPR7YFrjZzHZ097UtLF9ERNpZPReaJ7v7Be7+iru/7O4XAke7+6+BgS3N5OHVHNwi/xyYRrxUj/w/PT9PAy5z9zXu/gSwFJi43lskIiIbrJ6g8I6ZnWhm3fLvxMJ33tqMZtbdzO4jnoi+yd3vBIa5+zMA+X+bnHwksKww+/IcJyIiHaSeoHAq8BGiYH8uP59mZr2Bc1qb0d3XuvtewChgopnt1srkVmsR75rI7CwzW2hmC1euXFlH8kVEpF713JL6Z+DYFr6+rZ6VuPsqM7sFmAw8Z2Yj3P0ZMxtBBBuIlsHowmyjiGsZ1cu6ELgQYMKECa22VEREZP3Uc/dRLzM728y+b2YXlf7qmG+omQ3Iz72BDwGPAHOAM3KyM4Cr8/Mc4GQz62lmY4FxwIL13iIREdlg9XQf/YK42+hI4FaiBv9KHfONAH5nZg8AdxHXFOYC3wAON7MlwOE5jLsvBi4HHgKuB87WnUciIh2rnltS3+vuJ5jZNHe/2MwuIX5foVXu/gCwd43xLwCHtTDPecB5daRJREQaoJ6Wwlv5f1VeKN4aGNOwFImISNPU01K4MJ86/lei378f8NWGpmojrfzhTyqGh37qzCalRESka6nn7qMf58dbgRZfayEiIl1fm0Eh7yA6negyKk/v7v/QsFSJiEhT1NN9NA/4E7AIeKexyWmclT88v2J46Kdafe5ORGSzVE9Q6OXun2t4SkREpOnqek7BzD5hZiPytdeDzGxQw1MmIiIdrp6WwpvAfwFfZt27iBxddBYR2eTUExQ+RzzA9nyjEyMiIs1VT/fRYuC1RidERESar56WwlrgPjP7HfFraoBuSRUR2RTVExSuyj8REdnE1fNE88VtTSMiIpuGFoOCmS2ilZ/bdPc9GpIiERFpmtZaCsd0WCpERKRTaDEouPtfOjIhIiLSfPXckioiIpsJBQURESlrMSiY2fz8/58dlxwREWmm1i40jzCzg4GpZnYZYMUv3f2ehqZMREQ6XGtB4avAF4FRwLervnPg0EYlSkREmqO1u49mAbPM7F/d/d87ME0iItIk9TzR/O9mNhU4KEfd4u5zG5ssERFphjbvPjKzrwOfBR7Kv8/mOBER2cTU80K8KcBe7v4OgJldDNwLnNvIhHWE535QeWPVsE9/oUkpERHpHOp9TmFA4fPWDUiHiIh0AvW0FL4O3Ju/p2DEtYUu30oQEZF3q+dC86VmdguwLxEUvuDuzzY6YSIi0vHqaSng7s8AcxqcFhERaTK9+0hERMrqailsTp75/pfLn0f8/XlNTImISMdrtaVgZt3M7MGOSoyIiDRXq0Ehn02438y266D0iIhIE9XTfTQCWGxmC4DVpZHuPrVhqRIRkaaoJyj8W8NTISIinUI9zyncambbA+Pc/WYz6wN0b3zSRESko9XzQrxPALOAC3LUSOCqBqZJRESapJ7uo7OBicCdAO6+xMy2aWsmMxsN/BwYDrwDXOju3zGzQcCvgTHAk8CJ7v5iznMucCawFvgHd79hfTeovS0//5MVw6POuaCFKUVEur56Hl5b4+5vlgbMrAfxy2tteRv4Z3ffBdgPONvMdiV+zW2+u48D5ucw+d3JwHhgMvB9M1M3lYhIB6onKNxqZl8CepvZ4cBvgGvamsndnyn9jrO7vwI8THQ9TQMuzskuBqbn52nAZe6+xt2fAJYSLRQREekg9QSFLwIrgUXAJ4F5wFfWZyVmNgbYm+iCGpbvUiq9U6nUFTUSWFaYbXmOExGRDlLP3Ufv5A/r3El0Gz3q7vV0HwFgZv2A2cA/uvvLZtbipLVWX2N5ZwFnAWy3nZ6pExFpT/XcfTQFeBz4H+B8YKmZHVXPws1sCyIg/Mrdr8jRz5nZiPx+BLAixy8HRhdmHwX8tXqZ7n6hu09w9wlDhw6tJxkiIlKnerqPvgV80N0PcfeDgQ8C/93WTBZNgp8AD7v7twtfzQHOyM9nAFcXxp9sZj3NbCwwDlhQ32aIiEh7qOeW1BXuvrQw/GfW1e5bMwn4CLDIzO7LcV8CvgFcbmZnAk8BJwC4+2Izuxx4iLhz6Wx3X1vXVoiISLtoMSiY2XH5cbGZzQMuJ/r4TwDuamvB7n4bta8TABzWwjznAXpftYhIk7TWUji28Pk54OD8vBIY2LAUiYhI07QYFNz9ox2ZEBERab42rynkRd/PEK+lKE+/Ob86+4nvTq8YHvuZq5qSDhGR9lbPheariLuIriHeYSQiIpuoeoLCG+7+Pw1PiYiINF09QeE7ZvY14EZgTWlk6b1GIiKy6agnKOxOPG9wKOu6jzyHRURkE1JPUJgB7FB8fbaIiGya6gkK9wMDqO8p5s3WQ9+rvBlr17PncO8Pj60Yt/enruFPFx5TMW6/s+Y2PG0iIvWqJygMAx4xs7uovKaw2d6SKiKyqaonKHyt4akQEZFOoZ7fU7i1IxIiIiLNV88Tza+w7sdutgS2AFa7+1aNTJiIiHS8eloK/YvDZjYd/XZyu/r9j6ZUDB/0iWublBIR2dzV8yM7Fdz9KvSMgojIJqme7qPjCoPdgAnU+O1kaV83/fjoiuHDPz6vSSkRkc1JPXcfFW+2fxt4EpjWkNSIiEhT1XNNQb+rICKymWjt5zi/2sp87u7/3oD0iIhIE7XWUlhdY1xf4ExgMKCgICKyiWnt5zi/VfpsZv2BzwIfBS4DvtXSfCIi0nW1ek3BzAYBnwNOBS4G3ufuL3ZEwkREpOO1dk3hv4DjgAuB3d391Q5LlYiINEVrLYV/Jt6K+hXgy2ZWGm/EhWa95qKDzftJ5bMLR5+pZxdEpH21dk1hvZ92FhGRrk0Fv4iIlCkoiIhIWT2vuZBO7KqLjqoYnv6x65qUEhHZFKilICIiZQoKIiJSpu6jTdDlP51cMXziR69vUkpEpKtRS0FERMrUUthM/PJnR1YMn/Z3NzQpJSLSmamlICIiZQoKIiJSpu6jzdhFFx9RMfyxM27kgl+s62b65EfUxSSyuVFLQUREyhoWFMzsIjNbYWYPFsYNMrObzGxJ/h9Y+O5cM1tqZo+a2ZG1lyoiIo3UyO6jnwHnAz8vjPsiMN/dv2FmX8zhL5jZrsDJwHhgW+BmM9vR3dc2MH1Sh+/+qjI+f+ZUdSmJbMoa1lJw998Df6saPY34BTfy//TC+MvcfY27PwEsBSY2Km0iIlJbR19TGObuzwDk/21y/EhgWWG65TlOREQ6UGe50Gw1xnnNCc3OMrOFZrZw5cqVDU6WiMjmpaODwnNmNgIg/6/I8cuB0YXpRgF/rbUAd7/Q3Se4+4ShQ4c2NLEiIpubjg4Kc4Az8vMZwNWF8SebWU8zGwuMAxZ0cNpERDZ7Dbv7yMwuBQ4BhpjZcuBrwDeAy83sTOAp4AQAd19sZpcDDwFvA2frziMRkY7XsKDg7qe08NVhLUx/HnBeo9IjIiJt02suZL1989LKZxc+f4qeXRDZVCgoSLv4j19XBoqvnKRAIdIVKShIw3zpN5W/APd/TtAvwIl0dp3lOQUREekEFBRERKRMQUFERMp0TUE61GeuqLzO8N3jdJ1BpDNRS0FERMoUFEREpEzdR9J0p1xV2aV06XR1KYk0i4KCdEpHXV35lpTrpl3apJSIbF7UfSQiImUKCiIiUqbuI+kyjrrqnIrh66af36SUiGy6FBSkSzv6qnMrhudN/3qTUiKyaVD3kYiIlKmlIJuco6/83xXD82Z8tUkpEel6FBRks3D0lf9ZMTxvxhealBKRzk1BQTZbU67474rha4/7pyalRKTzUFAQKZhyxffKn6897mymzL6g4vtrZ36yo5Mk0qEUFETW0zGzf1IxPHfmmU1KiUj7U1AQaQfHzL64YnjuzDOalBKRjaOgINIgx8z6VcXw3ONPbVJKROqnoCDSgY6Z9euK4bnHn9SklIjUpqAg0mTHzppdMXzN8TOblBIRBQWRTmnqrKsrhuccP42ps66tGjelI5MkmwkFBZEubNqsGyuGrz7+iCalRDYVeveRiIiUqaUgsomZMft3FcNXzvwgx83+Y8W4K2ZOYubsuyrGzZ65b8PTJp2fgoKIlJ0w+4Hy59/M3IOTZj9W8f2vZ+7Y0UmSDqagICLr5RNXPFUx/KPjtuMrVz5dMe4/ZozsyCRJO1JQEJGG+NaVz1YM//OM4U1KiawPBQUR6TAXXrGiYvis47ZpUkqkJQoKItJUl8xeWTH84ZlDuXLW8xXjZhw/hOt+XTnuqJOG8NtfVc576KlDG5PIzYiCgohsUv7488pAMen0oSy8qLKFMuFjaqG0REFBRDZLiy6oDBS7f1KBAhQURETKlpz/XPnzuHOG8dS3Ky+Wb/e5Tf9ieacLCmY2GfgO0B34sbt/o8lJEhEpe+b/Lq8YHvG/RvHsN5dWjBv++ffy7LcXV4773Hie++97K8YN+6e9G5PIjdCpgoKZdQe+BxwOLAfuMrM57v5Qc1MmItIYz33nzorhYZ99f5NSEjpVUAAmAkvd/c8AZnYZMA1QUBCRzcZz//OHiuFh//ABVnx3fsW4bT5zGCvOv75y3DmTWfG9OZXjzp66XuvubEFhJLCsMLwcaG7YFBHp4lZ8f1bd05q7NzAp68fMTgCOdPeP5/BHgInu/pnCNGcBZ+XgTsCj+XkIUHkj84aPa89ldcVxnSUdzRrXWdLRrHGdJR2daVxnSUd7jdve3Ws/1OHuneYP2B+4oTB8LnBunfMubK9x7bmsrjius6RD26/t7yzjOks6GjGu+q+z/Z7CXcA4MxtrZlsCJwNz2phHRETaSae6puDub5vZOcANxC2pF7n74jZmExGRdtKpggKAu88D5m3ArBe247j2XFZXHNdZ0tGscZ0lHc0a11nS0ZnGdZZ0NGJchU51oVlERJqrs11TEJHNjJlZs9Mg63TJoGBm/c1sWGG4ZqYysy3NbJSZtbmdZjbMzAYUhseZ2VYtrLt7G8vqVjVsrQ2vLzPrs77La4d1trSP616umfWsGt7bzIZsTLrWV97E0D0/N6Uwqne9rU3X3sfczHqbWUO6k82sm5ltYWZbVI3f1swGu7u3kr96mdlgM+vfyvLfNe96bvuW1WnrCGbWz8z61RjfavlSx3I3Kl93yaAAbAnsUSrEPfvAiid8GgTsC4wojTCzgdWBwsx6AzOAozMTDgUmABPNbOucZiczGwfMzHVbjh+VhdtYS8ChVYXdljlt96r07lw8gGY21Mz2qlF47mVmvQqj3mdme5QGCsvrX5inv5mNMbM9i9PUmK5vpn3b2ru6rFSQDsv/lifSITXS27d65pxvqpltn8MDgAOAw4rTt3CSDK0aHlBaTkty+wfWCOwjgRlm1sNb6TttYRsmmtmI/Fw8bluU/pvZIWb2ntLxqjWOdfuyVmHWszC+NN2+Vfm1HzCp6lhsXaMwGWZmB1pUcIrprT5e2wInAoNzeOvSeVI1XWmbisvaoVaBXbWO/sBkYF/LCk0elxOBz5rZkKr82TP/9yfO35nAB/I8fZdC/j+0sA+6m9lWZjawsNwBeU58oGoRuwFH5vldmnaQmY2vtb6q7exXtT/65j4fUTpmZjY691MxLSOBTwFHWJYxOX4IsEdheFT1ccjxPQqft7IIsLtW7Y/xtc6ntnSZoFB1Au0E7APsmSfEMDPbnyhkiid6L2AMkaG650l0OpFBS4X9cOJhuNXAk+7+BvA28BrQGygFkLeBHXKZawqZ+DDiIPYFSgVNL+DDZjYop9nXzKYBMwsZ/v3AacCOOdwr0z8ZKL/D18xOyW14s7BdfYnCeOfMhAeZ2enAtEJh9hbxNPgky8CQyxsAfNLMPpij3sl1zjCzvXKa0Wb2fjObbGZ9stA72Mw+AZxpZsM9vJXb+v4szAaY2SQiuO5bWOdWwH7AcKBbZvLDgRXAI+6+2qKm+vHcR4MK8+4PHJfLKBVgRwIn54lV3k9mtnshn/QBjsu0jCltFzAW2BnYq1QA50m8W2FZw4ETzezgHB5qZqcSr1zZ1syscOIdDhxuZt0L++N0oHSCvkXko/I44AAzOym3q1S52NbMjgE+TwT9AZmGScDf5XZ0y+0/hngIqVRodSMKzsPNbDDrTM7xu5I3lZjZEbnvSoGsL/CBnKZUuPcknhmaamY75XTDgI+a2bDCtk8GJgHTrTJoHQIcX8iLB2eaxwGDcr4PA68TbzA4Nretb+7ngy1uSR9HnOergbfc/fVc/lQz+3RhO8l0vg/YO+edAvwjUdj3ynEjgGFEpW5IztcLOATYncJ5B4wGdqrKxzOLgcLMtgE+C+xT2n53X53zfgjY0SIIHgjsCYw0sx657gOBVcD97v5SLm8Qcax3sahM9GZdwOqVZdgWZnZUHpti6+ag3G/jc1kfJs659S7jO93dRy0pZMSJRMF/K/BwNj2nAFsBzwBbAGssno5+C7gJeBYonUz9gGfd/cU8CLsCLxAPdTySGfkAoqC/3t0Xm9lxufzewB+AR8zsQzkf+f9Rd38rM/Uw4CVgbX6/FVFDfZGowZyS2/BT4FmL2ueOOf1d7r4st/VY4qS+BOhjZqtZV4t4Obe3P1FAvA1Y/gcYBQwAHgOW5PKGA8cDTxKtoFWZpkU5z5L8/zaRsYcSJ+1yoPRO4WW5bsxsKlF4PEY+JUkUxg8CT2em3ZoodN4Bnsr1zcjt+KG7P5rH93Uzu5nIyG/k8o8kCvHFeUy7AR8kguKt7v50TlcKIqOAJ7Og3YM4yR8DnreoMe2X6Zvn7vdY1Nw+ncfnt7n8/kSgLx1Xcl9sCTycy+th0VLrx7qn6s3MdicC3QLgiUzb7kT+WwA8kYWEE62AVbncNTnNC7nt77j7qtyOkcD5wF+Jwnrv/Puxu5eO13uIgnM18GZux2653IeBP2TePCWPx+NEcB5K5IengBvdfWkG3wNzH68BXsr9NDHT2h94LgumHYCrgBfc/Z3c3iOIc+1xYGczex+wkjhfryPy1vZEXn3E3W/JQDYSeG+mrxeRpyfmsbmulE8y4LxAPM/Uz91fNbOdieB0C5H31gKPEPn/KXd/IysEuxDn5Y3u/nwG2PGZvuvc/flcxylE3r8L+HPuzx1zPw82syWZzsOIc2FtYfv3Iypw3Yieij0zj8zPfDKaCF7DiXNhTc63F5E3lxHnY0/gzMwjz+Q29Mp5hxD5rDtRxu1DBNA7iPNkpzxOf8nv10unDwpVtbIZwNHAzcBsYAczK2WkN4iDvSaj5SQig1xHHJxS03AB0M+iqbUbMBC4HViZhf82xEG9zt0X5oHYncg4i9z9wUzLO0Rt4E9EQHnLzCYQ+3QhUZC9kge7N1EregGYSmT6N4Fl7v5mnpxHAPcAj5tZT3dfk2kdBPwul3EmceJcQpwAfXJ4DHESzs/tP43IlH/L9PXIgvO9xAn7aO6/gUSBfR8R1N7MAmBSTnc38TLCCUQme4Io/N/I7epJFFbXE7XSnYkM/SRx0u9OZP6dgMuIwuAYYClxspZeUQKAuz9pZsvcfW0WJu8lMv6jRIG/d27TwkIhcXSudwlxUvQCPkKc/H8kTuw+wAm5T/7k7vfkKlflfpgE3E+cbAfldIvc/UGLlsqemYYFWRMstfSeB57OfbwLUZguJvJnqevuAOA2Im++ZdH62J0oiG/L47U1EVyXAddm5eSwPKbbEvnmwPzcJ5dfemnkiUSB9QpRAeoFfJQIptcAV2XAHUO0fp8nAtuAPC7PA0vc/bEs/I7O7f0Ncf7slPv9LeD2DBx75L5aBfwtW9dk/h+e6Vzq7neb2T65jAsyT0BU3Ba7+y2Fw38cEWTuJgrK3YhzeiURGErHeiSR97+f23V0rm9rIt/1IPLiCuBmd3868/6k/JsPvJVlxHtKx7YQEN5HnHPP5rHsCXySOFeeJG6XH0CcE0Nyv6/KecflsVhFlDu75LY8CNxLnMOjc/sXZFpfzJbDh3L5pYrBQUSQv5Z1lZODiHJiLpGP38hKx3uIAHBPHr/XiHP6gVLran10+qBQCAgfICLrfCLzdyO6IPoRB+/erP2XmsKzc3xvoqm6jKgxPZg1iwOIKP8nd1+U67gNOJU4aRZlJu9LHJyn3f0POd0eOe4Bcsdn4XFIruc+IjOdQ5ycc4lMMhj4GFG4XuXub+Y2PmlmX3f3V6u2/Tkz+6W7r831Xkk85f0UEVT2JDLYIqJQW52ZfUV+f3fWpA7LdQ8jHghcatFVMZA4ya7OgDCI6JoZkst8DPgMcVI/TAS7nkQTt1ToXOvur5nZfKLAmpv74z3ESVia7y+5f/Yhuunm5zaVg35u89osTHcjCoR5mfYDiJPs94WAsDdRkLxAFACl7oXZRNfZPUTtdiJRe7yvEBBKeWuZmf0mj/O43NYbskIwk8hfTxGBqBQQjiFqiRcRFYqTiJbQm0QQ9Vz/c0SBcH8GhKOIc24JcEd2mw3O4zieqCQ8kgX9/sRDnHOIgDwgl/d0FraHmdkbRD6clfOW0ndVpum+PBYH5fAi4MeZtmFE0J3r7o/l/njHzO7I4/94prXU7Tfb3R/KY/PhPPb3Ffb5JCJv3k4UeCMsul5+lPuwP7AXUfD9uBRIcr0v5DGbQRSC3YjKyj25fc/m+XU0cDnwhMeDrvsQlbhXcvyWud/GEq2Xpy26vT5GtKovz2UbEUjuJ1qNb+c2nEoEyR8CVhg/j6hU3JDH9hQizy0gzocVmb6euY+X5fR9icrEn4iguiNxjqx09zty2YPzOKzMeUuV0N2JwPm8RRfuzEzbI0SZ80a2Snrk9lxBVLp2JQLrfVmxXG+d+jmF3GE7EgdiEnFyXlOombyXqBVcSNQW9yOidG+iEN4/h48gCqIfWfTVnkwcwBuJgq8vcaCvJ2o+r2TTfThx8t9Zaqpnl8ZU4JdE99WqzBBjidrp7939lZx2O6IveS5RsG1J1GhucvdS9K/e5opCssb3PYjC/GSiQLwO+D1x0n2YKNh+QRRiay26w04iuoBecvc7Lfp0pxKB844s1IcQ/bB9iBrx3bm+UTntpe7+YmG7TgJ+4u5/q0rbyFxX6frII0TtfkUei12IFs3qFrbvcLIbiAj0q7Lp/3GihnwHcWLvQBSkLxNdbquqlrNDLmcH4qS5290faGGd2xK16/uILo3HM5DuQ5zQdxVrXBZ9yUcTwfTFrIXvQQSTUnfATkS++ylRq3w198mLRC28O+u6qhYT+fxNIsh3y314P1EoTsttXeLul+fyjyWCyT1EfqroJrC4kF4q1IYTeeOW7DY7kMir/d399hr7owfRfXIg0d3zOhHY9yJqvmNz218qzDMYOIrIj3sSQWw1UavfgmghvgCscPf7a6yzd+6T3XO7uxfOo9Ny3/QlgtPLFt1Uh+T2X5/78kiiBfU6cQ3ivszXHycCx68yLTOI8/GGUiUh9+cZRIv2ilJ3UNU+GU0U4LvlPi/1GuxLBLGlucw1eY7sT1Rq+mVa7wP+XMgjI4iL7YuJQLIqp1uT05Xzq5mNzX3zOyJoH0yUed8izq8PZrpW5bF5sXof16tTBoVSwWjRfziR2Kl3EjX9l6um3SJrYbsThRrAD9z9pSxMTiOuA2xDRO3HiKbqWnefZXGNolSLft7d52YGP4c4oZcVWisfJCL+1kTXxPas62t8mKitVhR2WVM5mThB7iCa1RsUwauWux2RoS4qFcw57mSiJva3HB5P1H7vcvc/5nQjiJP0CuJkGkYUoKOBx939mqp1lQuYNsZtTwTvpcSJPZFoig8jTuhriQy/vNT6qZr/RKIr7CGiAHu18F0pfc8Qmd+IAvYed3+txrL6EwX3NkRN/fet7MsRxEXJ+4g+8plERWQJWSurMU/34jZUD+e4Ut6cAhwKXE10I6wFjiUqJsOIgmNVbt9kooC4hMhnfYmujP2Igra0D0cQheBV9RQA2TV0TG7XQHf/eeG7ioqIRRfioUQF4U6PrqWJRIG4BHioRj7vS3R77E30e0Psy1Jg2Z5old9VI23b5TxriBbXktzm14lgOyHH3ZMt39L1jAeJfPYW0f3Sh6g43g+8WWqJW1zH6ZPL35fY/w8WK2Z5nk4G5tTanxY3NfyaOGcWEMHodSKojyS7b4rlk8WdUIOJ83Qb4hrl7fldb6Ic6kX0fvQgAvdaoqL22xppKN2M8hJxbvXMNB1OVIRXEmXQy9Xzro9OGRRKsnk0kjg5rirWSqum+wBxcK4janrFGszArM1NIWoJ9xEFy35EpppCnJB3ZnfNKCKD7kHU7C/y6N7pw7prE3/M7papZFOVaMGU11uVvm2JKP+HWgXYhmqtsLZ1d2BsQ2TWu6qm654tiW2Igrw7cX2gB9EH7q21WFpIz3Bi3/UkCvY3iNrlK8DbrRXMOf8oovZzW0sFMevuHnqeaCLXmm5rIhAeQQSEa6qnqTHPYKIAXk4UOLsRXQtvtjpj7WUVr4NNJfLRWCIvvZDjRxO3JF7r7rdn10UvsoVEBL39iTx3KVGYe1uBqIX0bE8EkV2Jc6A3cc1kfo1phwPTidrn7e6+PGvqA4gupVu8Rj+1RZfqTkQF6QHiGL6cx/QwovX5cI35BhIF3VAiv9yTQWgo61q+C4FZGRA+QLTgtyRaCCOIlslLRGH6rha4xQ0PxxL78jWioJ7t7n+tmq7F/Zl56u+By9z9iUzfKURQX0i0HIqVmG5EkN+PCKZ/ISpmj2YAGkhUdtcQefmg3Mf3Az3d/dYawbofcWyGEGXOtVn5257oEryu1LraGJ02KGRzaQxx10Lpdr/Sd8WTbjKxM98iouS7CmaLOyrOIQ7Mox79xX2IbpGxwJUefbnbEk3Lp1l3PeIlomCbSNwF8iwRqEp356wiuiZqdocU0tCtuknaCFljOyrT+A5xYpe6gqozWV+iJjee7FrYiPX2I2pr44ng/BbRxB0M/MLX/ZpeW91jLe6nDOwDiRbCzdUtrtyeKUTQ+D1RsG3t7n9oa7011lVXgdvGMkrXJO4kWkevVn0/KE/q/Yla4y1EF9lWRN5cTRTeG/VSyCzAphHH4g8ZhLYsBrxC98huRCH7iLvPyu/eQ9Swry0WOjWC31hin8+pqpj1aakylMHxKKJ1tMTdlxa+247om7+IdV1LuxD76WHivJ9KXB+41Wt0hZXSSQSRycR5/RLwevXxaIuZbV21XdsT+/WiGsd2WyJAbkN0Bd2bwWkLIkhuTxTij2eQOJWowMyvlVezQjSeaNG/TrS6il2aG51fSzrlhWaLC3kDiKhuXtVfWsiIuxE76U0iI9bqRhjIugs+T2VAGEw0pZcQB+yRzJw7E7XcZ3zdNYS9iP20lGiSusUdJKOB39JC90K1jggIuZ7VZnY7kVkfLAWE/K6030qBY1ei4Lnb1/Wt1l145sk2mGjeb0t0E8wnAufOuex7SgGhmIZW0t/aflpEFE53VAeEnHe1md1JdKv0JyoUPepZb41lbWxA+DCxjy8lugzfrp6m0PJdQtQQbyNqxqU+/3u96g6tDUjHQKIW2ouorZcKzmIlaxRR6B5AXPtYAAzPQLE2C64nq/dJIT8dRhz70gXO6hsmWgoIfYkAtE9u69Kq+Z4ys+9ky/cYooB9kWjNDSVq4auJWvrCFtYxmOhGvJVozW/weVhd4XT3v5jZD6rLp1QKYgvd/d4cN564ZvAykS8Pzv36nJldWCtIFc7HA4nz9R6iolDRWmuvgACdtKWQNYR9gd95y11GJxCZ+FHgN7WajTldqe/1Go+7HIYRUfpDRA3uCaJWPZIIRIt93V1GHyIy7d1EE3FbovVQuo5w/vrWNjqKmfX2dXeG1Kp5jAQ+R1wYu3Ej1jOUqM31ILrmHiS6bZ4n7pR5uKU0bOD62mxxlWrgG7uujZEF7aFUXZBtZfrSheePEBea57r74xux/h5EV94uRGt2UTE45zSla3dHEMHoZeIW3keJBzHbvMfd4m6304lAcm09FaRM2wSiBb4EWFWsvNSY/kSiFfJHomttIHGjw2qiS+ZdLeHsHehPtCTeILqzltRYfMOUzsHs9fgb0cUznmg5P295zamNZfQhniXpTRyfud4OXUStrrMzBgVo++TPptsU4BKvuvOkxrTlZl8GnClEV9JjRBfLkUTNbEGptlLoqlhO3IHyDnHC7kzcjndPZw0I9SoWnhtSaGdA2IU4YRcR12r2J1pRd7j7gnZO8nppr0C0Eetfrya9xS3BnycKsA15fXz18kYR/fK/8xoXeHOabYk7Z94gum8eqmO5fYkujEOIStOLrOcdL1kpOZXoQindEl7zeOV27EJ0fb2RaZ5GdCG+q6DPgnQ6cS2rP9EKedf1jI5icYPKGPLOqPU9L2zdNYN5HVHmdNqgUA+rcaG1zvl6+brbWocSD4UtIE4ezz7eccSdDAtKzd8MKNOISL+qnTaj6da3yyj3UT/iVr+3Wdc3OprYl/OaHRC6qvZu5Vg+9dvK92OJu2Mudfen6lzmUOLa2zvErca3+Abc8WJm/eut9VZXElu7TpHfjyJ6AxZ63jraDBlAP0Z0S99Z6oXYgOW02zWDNtfVlYNCeyllzqxhnEB0I91JtAberJp2gwLRpsTiTozSw29L3P2GwnejgNHufkeza+pdWUfuu/UpnAvzjCXywM8a3Z2xodoKHB2w/qHE7aJ9iOeXHmtWWtaHgkJBXjgdRVyruLardw+1t6z1HAGUHux7wN1vqzFdh9VqpHnq6RPfXOW1zP2J8+RBb+N27M6ky7wltSN4WEbeE93s9HQ2Hrfd3k08oLSgFBAymBanU0DYDCggtKoHeZNKVwoIoJaCbACLH0apebeXiISu2pWqoCAbrCtldJFm6IpdqQoKIiJSpmsKIiJSpqAgIiJlCgoirbD44fSrzWyJmT1uZt8xsy3N7O/M7PwW5qn5YrY61jXd8sfXRZpFQUGkBXmr7RXEa9tLP7XYDzivtfnc/YANXOV04qVnIk2joCDSskOBN9z9p1B+/uKfiNcW9AFGm9n1ZvaomX2tNJOZFd+r/y9mdpeZPWBm/1YYf3qOu9/MfmFmBxAvb/svM7vP4nXVIh2uU746W6STGE88rFfm8cMxTxHnzkTi9wdeA+4ys2u98ArnwttHJxJPgc+x+L3kF4AvA5PybZml31WYQ7wFc1ZHbJxILQoKIi0z4hfPWhpf/q1tM7uCeOd98b3+R+Rf6X36/YggsSfx1PzzUPG7CiJNp+4jkZYtJt77X5bv6R9N/JZudcCoHjbg6+6+V/69191/QsvBRqTpFBREWjYf6GNmp0P5h3C+BfyM6DI63MwGWfwI+3TiR2CKbgA+lq8Zx8xGWvwm9nzgRItfBSv9jgKse/+/SNMoKIi0IF/hMQM4wcyWED/K9AbwpZzkNuAXxC/OzS5cT/Cc/0bgEuAOM1sEzAL6e/zm8nnArWZ2P/DtnO8y4F/M7F5daJZm0WsuRNpR1v7vcfftm50WkQ2hloJIO8mfibwD+Gaz0yKyodRSEBGRMrUURESkTEFBRETKFBRERKRMQUFERMoUFEREpExBQUREyv4/+QaYIWylDGsAAAAASUVORK5CYII=\n",
198
- "text/plain": [
199
- "<Figure size 432x288 with 1 Axes>"
200
- ]
201
- },
202
- "metadata": {
203
- "needs_background": "light"
204
- },
205
- "output_type": "display_data"
206
- }
207
- ],
208
- "source": [
209
- "import matplotlib.pyplot as plt\n",
210
- "import seaborn as sns\n",
211
- "\n",
212
- "# sort the dictionary \n",
213
- "objectwise_img_names = dict(sorted(objectwise_img_names.items(), key=lambda x: len(x[1]), reverse=True))\n",
214
- "\n",
215
- "# Extract object names and image counts\n",
216
- "obj_names = list(objectwise_img_names.keys())\n",
217
- "img_counts = [len(objectwise_img_names[obj]) for obj in objectwise_img_names]\n",
218
- "print(sum(img_counts))\n",
219
- "\n",
220
- "# Create bar plot\n",
221
- "sns.barplot(x=obj_names, y=img_counts)\n",
222
- "\n",
223
- "# Add x-axis and y-axis labels\n",
224
- "plt.xlabel('Object')\n",
225
- "plt.ylabel('Number of Images')\n",
226
- "\n",
227
- "plt.xticks(rotation=45, ha='right', fontsize=3)\n",
228
- "\n",
229
- "# Save the plot as a high-resolution image file\n",
230
- "out_path = osp.join(out_dir, 'image_per_object_category.png')\n",
231
- "plt.savefig(out_path, dpi=300)\n",
232
- "\n",
233
- "# Show plot\n",
234
- "plt.show()"
235
- ]
236
- },
237
- {
238
- "cell_type": "code",
239
- "execution_count": null,
240
- "metadata": {},
241
- "outputs": [],
242
- "source": [
243
- "\n",
244
- " "
245
- ]
246
- },
247
- {
248
- "cell_type": "code",
249
- "execution_count": null,
250
- "metadata": {},
251
- "outputs": [],
252
- "source": []
253
- }
254
- ],
255
- "metadata": {
256
- "kernelspec": {
257
- "display_name": "Python 3",
258
- "language": "python",
259
- "name": "python3"
260
- },
261
- "language_info": {
262
- "codemirror_mode": {
263
- "name": "ipython",
264
- "version": 3
265
- },
266
- "file_extension": ".py",
267
- "mimetype": "text/x-python",
268
- "name": "python",
269
- "nbconvert_exporter": "python",
270
- "pygments_lexer": "ipython3",
271
- "version": "3.8.5"
272
- }
273
- },
274
- "nbformat": 4,
275
- "nbformat_minor": 4
276
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/agniv_pose_filter/hico.npy DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:b01acf6e31dad34eb1e48277e227ea0668f17905f55eae44b640cc1d14a9e41c
3
- size 520245
 
 
 
 
hot_analysis/agniv_pose_filter/hot.npy DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:64872b84670cb2ec643f1649e1a7926aed950adcb8f6f952916924bc4ab10f37
3
- size 731363
 
 
 
 
hot_analysis/agniv_pose_filter/hot_dict.pkl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:f0c0a6e35bf87e98327189ef8d732aa19b0d1c85c963c1ee348e1e466864845e
3
- size 3679000
 
 
 
 
hot_analysis/agniv_pose_filter/pq_wnp.npy DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:7cad59d5aaf077141d60a492c3784d8994d53f4dfd020f9eb4e11b3e430ef65d
3
- size 25433
 
 
 
 
hot_analysis/agniv_pose_filter/vcoco.npy DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:14cc34940ff4a61cfc952d8c5b98e0e7b1a58392177198fa4589f8b2bcead02a
3
- size 184801
 
 
 
 
hot_analysis/count_objects_per_img.py DELETED
@@ -1,35 +0,0 @@
1
- # get average number of objects per image
2
- import os.path as osp
3
- import json
4
- import plotly.express as px
5
- import plotly.io as pio
6
-
7
- version = '1'
8
- dir = '/is/cluster/work/stripathi/pycharm_remote/dca_contact/hot_analysis/'
9
- out_dir_hico = osp.join(dir, f'filtered_data/v_{version}/hico')
10
- out_dir_vcoco = osp.join(dir, f'filtered_data/v_{version}/vcoco')
11
-
12
- imgwise_obj_dict_hico = osp.join(out_dir_hico, 'object_per_image_dict.json')
13
- imgwise_obj_dict_vcoco = osp.join(out_dir_vcoco, 'object_per_image_dict.json')
14
-
15
- with open(imgwise_obj_dict_hico, 'r') as fp:
16
- imgwise_obj_dict_hico = json.load(fp)
17
- with open(imgwise_obj_dict_vcoco, 'r') as fp:
18
- imgwise_obj_dict_vcoco = json.load(fp)
19
-
20
- # combine the dicts
21
- imgwise_obj_dict = imgwise_obj_dict_hico.copy()
22
- imgwise_obj_dict.update(imgwise_obj_dict_vcoco)
23
-
24
- # get average length of object in the object per image key
25
- avg_obj_per_img = sum([len(v) for v in imgwise_obj_dict.values()]) / len(imgwise_obj_dict)
26
- print(f'Average number of objects per image: {avg_obj_per_img}')
27
-
28
- # get average searately for hico and vcoco
29
- avg_obj_per_img_hico = sum([len(v) for v in imgwise_obj_dict_hico.values()]) / len(imgwise_obj_dict_hico)
30
- print(f'Average number of objects per image in hico: {avg_obj_per_img_hico}')
31
-
32
- avg_obj_per_img_vcoco = sum([len(v) for v in imgwise_obj_dict_vcoco.values()]) / len(imgwise_obj_dict_vcoco)
33
- print(f'Average number of objects per image in vcoco: {avg_obj_per_img_vcoco}')
34
-
35
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/create_combined_objectwise_plots.ipynb DELETED
@@ -1,291 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 22,
6
- "id": "1738c3a5",
7
- "metadata": {
8
- "scrolled": true
9
- },
10
- "outputs": [],
11
- "source": [
12
- "import os.path as osp\n",
13
- "import json\n",
14
- "import os\n",
15
- "\n",
16
- "version = '1'\n",
17
- "out_dir_hico = f'./filtered_data/v_{version}/hico'\n",
18
- "out_dir_vcoco = f'./filtered_data/v_{version}/vcoco'\n",
19
- "out_dir_phosa = f'./filtered_data/v_{version}/phosa_split'\n",
20
- "out_dir_behave = f'./filtered_data/v_{version}/behave_split'\n",
21
- "\n",
22
- "objectwise_img_dict_hico = osp.join(out_dir_hico, 'imgnames_per_object_dict.json')\n",
23
- "objectwise_img_dict_vcoco = osp.join(out_dir_vcoco, 'imgnames_per_object_dict.json')\n",
24
- "\n",
25
- "with open(objectwise_img_dict_hico, 'r') as fp:\n",
26
- " objectwise_img_dict_hico = json.load(fp)\n",
27
- "with open(objectwise_img_dict_vcoco, 'r') as fp:\n",
28
- " objectwise_img_dict_vcoco = json.load(fp)\n",
29
- "\n",
30
- "# sort the dictionary \n",
31
- "objectwise_img_names1 = dict(sorted(objectwise_img_dict_hico.items(), key=lambda x: len(x[1]), reverse=True))\n",
32
- "\n",
33
- "# # Extract object names and image counts\n",
34
- "# obj_names1 = list(objectwise_img_names_hico.keys())\n",
35
- "# print(sorted(obj_names1))\n",
36
- "# image_count1 = [len(objectwise_img_names_hico[obj]) for obj in objectwise_img_names_hico]\n",
37
- "# print(sum(image_count1))\n",
38
- "\n",
39
- "# sort the dictionary \n",
40
- "objectwise_img_names2 = dict(sorted(objectwise_img_dict_vcoco.items(), key=lambda x: len(x[1]), reverse=True))\n",
41
- "\n",
42
- "# # Extract object names and image counts\n",
43
- "# obj_names2 = list(objectwise_img_names_vcoco.keys())\n",
44
- "# print(sorted(obj_names2))\n",
45
- "# image_count2 = [len(objectwise_img_names_vcoco[obj]) for obj in objectwise_img_names_vcoco]\n",
46
- "# print(sum(image_count2))\n",
47
- "\n"
48
- ]
49
- },
50
- {
51
- "cell_type": "code",
52
- "execution_count": 18,
53
- "id": "2d6ad5ed",
54
- "metadata": {},
55
- "outputs": [
56
- {
57
- "name": "stdout",
58
- "output_type": "stream",
59
- "text": [
60
- "2119\n",
61
- "saved at ./filtered_data/v_1/phosa_split/imgnames_per_object_dict.json\n"
62
- ]
63
- }
64
- ],
65
- "source": [
66
- "# Extract image list for object in PHOSA\n",
67
- "def merge_dictionaries(dict1, dict2):\n",
68
- " merged_dict = {}\n",
69
- "\n",
70
- " # Merge values for common keys\n",
71
- " for key in set(dict1.keys()) | set(dict2.keys()):\n",
72
- " merged_dict[key] = list(set(dict1.get(key, [])) | set(dict2.get(key, [])))\n",
73
- "\n",
74
- " return merged_dict\n",
75
- "\n",
76
- "def filter_dictionary(dictionary, keys):\n",
77
- " filtered_dict = {key: dictionary[key] for key in keys if key in dictionary}\n",
78
- " return filtered_dict\n",
79
- "\n",
80
- "phosa_object_names = [\"bat\", \"bench\", \"bicycle\", \"laptop\", \"motorcycle\", \"skateboard\", \"surfboard\", \"tennis\"]\n",
81
- "combined_objectwise_img_names = merge_dictionaries(objectwise_img_names1, objectwise_img_names2)\n",
82
- "phosa_objectwise_img_names = filter_dictionary(combined_objectwise_img_names, phosa_object_names)\n",
83
- "net_img_count = 0\n",
84
- "for v in phosa_objectwise_img_names.values():\n",
85
- " net_img_count += len(v)\n",
86
- "print(net_img_count)\n",
87
- "# Save the object_wise dict\n",
88
- "os.makedirs(out_dir_phosa, exist_ok=True)\n",
89
- "out_path_phosa = osp.join(out_dir_phosa, 'imgnames_per_object_dict.json')\n",
90
- "with open(out_path_phosa, 'w') as fp:\n",
91
- " json.dump(phosa_objectwise_img_names, fp)\n",
92
- " print(f'saved at {out_path_phosa}')\n",
93
- " \n",
94
- " "
95
- ]
96
- },
97
- {
98
- "cell_type": "code",
99
- "execution_count": 23,
100
- "id": "3f2a5e62",
101
- "metadata": {},
102
- "outputs": [
103
- {
104
- "name": "stdout",
105
- "output_type": "stream",
106
- "text": [
107
- "saved at ./filtered_data/v_1/behave_split/imgnames_per_object_dict.json\n"
108
- ]
109
- }
110
- ],
111
- "source": [
112
- "# Extract image list for object in CHORE\n",
113
- "\n",
114
- "behave_object_names_original = [\"backpack\", \"basketball\", \"boxlarge\", \"boxlong\", \"boxmedium\", \"boxsmall\", \"boxtiny\", \"chairblack\", \"chairwood\", \"keyboard\", \"monitor\", \"plasticcontainer\", \"stool\", \"suitcase\", \"tablesmall\", \"tablesquare\", \"toolbox\", \"trashbin\", \"yogaball\", \"yogamat\"]\n",
115
- "behave_object_names_in_hot = [\"backpack\", \"chair\", \"keyboard\", \"suitcase\"]\n",
116
- "\n",
117
- "combined_objectwise_img_names = merge_dictionaries(objectwise_img_names1, objectwise_img_names2)\n",
118
- "behave_objectwise_img_names = filter_dictionary(combined_objectwise_img_names, behave_object_names_in_hot)\n",
119
- "net_img_count = 0\n",
120
- "for v in behave_objectwise_img_names.values():\n",
121
- " net_img_count += len(v)\n",
122
- "\n",
123
- "# Save the object_wise dict\n",
124
- "os.makedirs(out_dir_behave, exist_ok=True)\n",
125
- "out_path_behave = osp.join(out_dir_behave, 'imgnames_per_object_dict.json')\n",
126
- "with open(out_path_behave, 'w') as fp:\n",
127
- " json.dump(behave_objectwise_img_names, fp)\n",
128
- " print(f'saved at {out_path_behave}')"
129
- ]
130
- },
131
- {
132
- "cell_type": "code",
133
- "execution_count": 3,
134
- "id": "730e9ac2",
135
- "metadata": {},
136
- "outputs": [
137
- {
138
- "ename": "ModuleNotFoundError",
139
- "evalue": "No module named 'seaborn'",
140
- "output_type": "error",
141
- "traceback": [
142
- "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
143
- "\u001B[0;31mModuleNotFoundError\u001B[0m Traceback (most recent call last)",
144
- "Cell \u001B[0;32mIn[3], line 2\u001B[0m\n\u001B[1;32m 1\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mmatplotlib\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mpyplot\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m \u001B[38;5;21;01mplt\u001B[39;00m\n\u001B[0;32m----> 2\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mseaborn\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m \u001B[38;5;21;01msns\u001B[39;00m\n\u001B[1;32m 4\u001B[0m \u001B[38;5;66;03m# sort the dictionary \u001B[39;00m\n\u001B[1;32m 5\u001B[0m objectwise_img_names1 \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mdict\u001B[39m(\u001B[38;5;28msorted\u001B[39m(objectwise_img_names1\u001B[38;5;241m.\u001B[39mitems(), key\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mlambda\u001B[39;00m x: \u001B[38;5;28mlen\u001B[39m(x[\u001B[38;5;241m1\u001B[39m]), reverse\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m))\n",
145
- "\u001B[0;31mModuleNotFoundError\u001B[0m: No module named 'seaborn'"
146
- ]
147
- }
148
- ],
149
- "source": [
150
- "import matplotlib.pyplot as plt\n",
151
- "import seaborn as sns\n",
152
- "\n",
153
- "# sort the dictionary \n",
154
- "objectwise_img_names1 = dict(sorted(objectwise_img_names1.items(), key=lambda x: len(x[1]), reverse=True))\n",
155
- "\n",
156
- "# Extract object names and image counts\n",
157
- "obj_names1 = list(objectwise_img_names1.keys())\n",
158
- "print(obj_names1)\n",
159
- "img_counts1 = [len(objectwise_img_names1[obj]) for obj in objectwise_img_names1]\n",
160
- "print(sum(img_counts1))\n",
161
- "\n",
162
- "# sort the dictionary \n",
163
- "objectwise_img_names2 = dict(sorted(objectwise_img_names2.items(), key=lambda x: len(x[1]), reverse=True))\n",
164
- "\n",
165
- "# Extract object names and image counts\n",
166
- "obj_names2 = list(objectwise_img_names2.keys())\n",
167
- "print(obj_names2)\n",
168
- "img_counts2 = [len(objectwise_img_names2[obj]) for obj in objectwise_img_names2]\n",
169
- "print(sum(img_counts2))\n",
170
- "\n",
171
- "# Create a figure with two subplots\n",
172
- "fig, axs = plt.subplots(nrows=2, sharex=True, figsize=(10, 8))\n",
173
- "\n",
174
- "# Plot the first graph in the first subplot\n",
175
- "sns.barplot(x=obj_names1, y=img_counts1, ax=axs[0])\n",
176
- "\n",
177
- "# Add y-axis label to the first subplot\n",
178
- "axs[0].set_ylabel('Number of Images')\n",
179
- "\n",
180
- "# Set the rotation and alignment of x-tick labels in the first subplot\n",
181
- "axs[0].tick_params(axis='x', rotation=45)\n",
182
- "\n",
183
- "# Plot the second graph in the second subplot\n",
184
- "sns.barplot(x=obj_names2, y=img_counts2, ax=axs[1])\n",
185
- "\n",
186
- "# Add x-axis and y-axis labels to the second subplot\n",
187
- "axs[1].set_xlabel('Object')\n",
188
- "axs[1].set_ylabel('Number of Images')\n",
189
- "\n",
190
- "# Set the rotation and alignment of x-tick labels in the second subplot\n",
191
- "axs[1].tick_params(axis='x', rotation=45)\n",
192
- "\n",
193
- "# Save the plot as a high-resolution image file\n",
194
- "out_path = osp.join(out_dir, 'image_per_object_category.png')\n",
195
- "plt.savefig(out_path, dpi=300)\n",
196
- "\n",
197
- "# Show the plot\n",
198
- "plt.show()\n",
199
- "\n"
200
- ]
201
- },
202
- {
203
- "cell_type": "code",
204
- "execution_count": 6,
205
- "id": "23c503dd",
206
- "metadata": {},
207
- "outputs": [
208
- {
209
- "name": "stderr",
210
- "output_type": "stream",
211
- "text": [
212
- "/tmp/ipykernel_135310/1442551168.py:22: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
213
- " ax.set_xticklabels(X1)\n"
214
- ]
215
- },
216
- {
217
- "data": {
218
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1EAAALCCAYAAAA/AFnzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUsklEQVR4nO3deVyU5f7/8fcAMiKrGioUAhJppR1PZXXcyCVtsdL6tZipaC7ZappbJ/cKMYvqmJZZaracFivrtGCZS9FipZ7UMnEBSSp32RTEuX9/9GWOyKBcOXCzvJ6Ph49Hc9/X3NfnnrkaeHPf1zUOy7IsAQAAAAAqxMfuAgAAAACgJiFEAQAAAIABQhQAAAAAGCBEAQAAAIABQhQAAAAAGCBEAQAAAIABQhQAAAAAGCBEAQAAAIABQhQAAAAAGCBEAYCkxMRExcTEVNrxL7/8cl1++eWVdnxvmzJlihwOh/bu3VtpfWRkZMjhcGjhwoUnbbdw4UI5HA59//33lVZLTZWYmKigoKAq6Wvx4sVq1aqV6tWrp7CwsCrps7pwOByaMmWK3WUAqEYIUQBsc91116lBgwbKzc0tt02/fv3k7++vffv2nXZ/2dnZmjJlitavX3/ax7JLbTgH1DybN29WYmKi4uLi9MILL2jevHll2hw9elRt2rRRXFycDh8+XGZ/RkaGGjRooJtuukmSlJeXp8mTJ+vKK69Uo0aNKhSoq6sZM2bI4XAoNTXV4/6rr75aoaGhys7O1r59+/T444+rc+fOCg8PV1hYmC677DK98cYbVVw1gNNBiAJgm379+unw4cN69913Pe4vKCjQ0qVLdeWVV6px48an3V92dramTp3qMYC88MIL+uWXX067j8p2snMAKsvKlSvlcrn09NNPKzExUTfffHOZNvXq1dO8efO0Y8cOTZ8+vcz+e+65R/7+/nrmmWckSXv37tW0adP0888/629/+1uln0NlGj16tNq0aaO77rqrTIB866239PHHHyspKUmRkZH6+uuv9c9//lONGjXSww8/rEcffVQNGjTQrbfeqsmTJ9t0BgBMEaIA2Oa6665TcHCwXnvtNY/7ly5dqvz8fPXr1++0+ikuLlZRUdFJ29SrV09Op/O0+kHNVlBQUCnHrcj4q+52794tSae8je8f//iH7rzzTs2aNUubNm1yb1+yZIk+/PBDJSUlKSIiQpIUERGh3377TZmZmXr88ccrrfaqUBIgMzIySgXI3NxcjRw5UpdddpnuvPNOSdL555+v9PR0vffee7r//vt19913a/ny5eratauSk5OVn59v12kAMECIAmCbgIAA3XDDDVq+fLn7l7TjvfbaawoODtZ1110nSTp48KBGjhypqKgoOZ1OnX322UpOTpbL5XI/p2SezaxZs/TUU08pLi5OTqdTc+bMUbt27SRJgwYNksPhKHX7kKc5USV/eW/Tpo3q16+v8PBwXXnllaXm5ixYsEBdu3ZVkyZN5HQ6dd5552nu3Ll/+TX59NNP1bFjR4WFhSkoKEgtW7bUQw89JOnPqwEnO4cvvvhCN910k5o3by6n06moqCg98MADHm+t2rx5s26++WaFh4crICBALVu21D//+c+T1paZmamzzz5brVu31h9//CGpYu9JSbvExESFhoYqLCxMAwcO1MGDB41em4KCAg0fPlyNGzdWSEiIBgwYoAMHDpRqs3TpUl1zzTWKjIyU0+lUXFycpk+frmPHjpVqd/nll6t169b64Ycf1LlzZzVo0MD9Opfnrbfe0nnnnaf69eurdevWevfdd8uMm/LG308//aSioiJNmjRJF110kUJDQxUYGKhOnTppxYoVpfo5/hgpKSmKjo5WQECAEhIStHHjRo+17dq1S71791ZQUJDCw8P14IMPljnn8syZM0fnn3++nE6nIiMjdffdd5d6b2JiYtxXSMLDw085PygpKUlnnHGG7rzzTlmWpby8PI0cOdIdsEo4nU41a9asQjV68uOPPyoxMVEtWrRQ/fr11axZMw0ePLjMrb8l8/u2bt2qxMREhYWFKTQ0VIMGDSoTnAsLC/XAAw8oPDzc/dnz66+/VqiekqA0a9Ys/fTTT5Kkhx9+WLt379a8efPk4/Pnr1yxsbGKjo4u9VyHw6HevXursLBQ27dv/6svCYAq5Gd3AQDqtn79+mnRokV68803dc8997i379+/X6mpqerbt68CAgJUUFCghIQE7dq1S8OHD1fz5s311VdfacKECfrtt9/01FNPlTruggULdOTIEQ0bNkxOp1N9+vRRbm6uJk2apGHDhqlTp06SpPbt25db2x133KGFCxfqqquu0pAhQ1RcXKwvvvhC33zzjS6++GJJ0ty5c3X++efruuuuk5+fnz744APdddddcrlcuvvuu41ei02bNqlXr1664IILNG3aNDmdTm3dulVpaWmSpHPPPVfTpk0r9xzeeustFRQUaMSIEWrcuLHWrFmjf/3rX/r111/11ltvufv58ccf1alTJ9WrV0/Dhg1TTEyMtm3bpg8++ECPPvqox9q2bdumrl27qlGjRvr00091xhlnVPg9sSxL119/vb788kvdeeedOvfcc/Xuu+9q4MCBRq/PPffco7CwME2ZMkW//PKL5s6dq8zMTK1cuVIOh0PSn4tQBAUFadSoUQoKCtLnn3+uSZMmKScnp8zVjn379umqq67Srbfeqttvv11NmzYtt+8PP/xQt9xyi9q0aaOkpCQdOHBAd9xxh84880yP7U8cf40aNVJOTo7mz5+vvn37aujQocrNzdWLL76onj17as2aNWrbtm2pY7z88svKzc3V3XffrSNHjujpp59W165dtWHDhlK1Hjt2TD179tSll16qWbNm6bPPPtMTTzyhuLg4jRgx4qSv6ZQpUzR16lR1795dI0aMcL+u3333ndLS0lSvXj099dRTevnll/Xuu+9q7ty5CgoK0gUXXFDuMUNDQ/XMM8/opptu0vz58/XTTz/pjz/+0Mcff+x+n7zh008/1fbt2zVo0CA1a9ZMmzZt0rx587Rp0yZ98803Zfq6+eabFRsbq6SkJK1du1bz589XkyZNlJyc7G4zZMgQvfLKK7rtttvUvn17ff7557rmmmsqXFNSUpLee+89DR8+XE899ZSeffZZjRkzRm3atDnlc3///XdJ0hlnnFHh/gDYyAIAGxUXF1sRERHWP/7xj1Lbn3vuOUuSlZqaalmWZU2fPt0KDAy0tmzZUqrd+PHjLV9fX2vnzp2WZVnWjh07LElWSEiItXv37lJtv/vuO0uStWDBgjJ1DBw40IqOjnY//vzzzy1J1n333Vemrcvlcv93QUFBmf09e/a0WrRoUWpbQkKClZCQUPYFOE5KSoolydqzZ0+5bU52Dp5qSUpKshwOh5WZmene1rlzZys4OLjUNssqfV6TJ0921/Lzzz9bkZGRVrt27az9+/e721T0PXnvvfcsSdbMmTPdbYqLi61OnTqVey7HW7BggSXJuuiii6yioiL39pkzZ1qSrKVLl570NRg+fLjVoEED68iRI+5tCQkJliTrueeeO2nfJdq0aWOdddZZVm5urnvbypUrLUmlxs3Jxl9xcbFVWFhYatuBAwespk2bWoMHDy5zjICAAOvXX391b//2228tSdYDDzzg3jZw4EBLkjVt2rRSx/373/9uXXTRRSc9p927d1v+/v5Wjx49rGPHjrm3z54925JkvfTSS+5tx4+HiurVq5cVGhpq+fr6WhMmTDhp25ON6/J4eq9ff/11S5K1evXqMrUf/xpblmX16dPHaty4sfvx+vXrLUnWXXfdVardbbfdZkmyJk+eXKG63n77bUuS1ahRI6tFixYe6zzRvn37rCZNmlidOnWqUB8A7MftfABs5evrq1tvvVVff/21MjIy3Ntfe+01NW3aVN26dZP051WWTp06qWHDhtq7d6/7X/fu3XXs2DGtXr261HFvvPFGhYeH/+W6lixZIofD4XGi9/F/4Q4ICHD/96FDh7R3714lJCRo+/btOnTokFGfJfNNli5dWuZ2uIo4vpb8/Hzt3btX7du3l2VZWrdunSRpz549Wr16tQYPHqzmzZuXer6nqwQbN25UQkKCYmJi9Nlnn6lhw4bufRV9Tz766CP5+fmVuiri6+ure++91+j8hg0bpnr16rkfjxgxQn5+fvroo488vga5ubnau3evOnXqpIKCAm3evLnU8ZxOpwYNGnTKfrOzs7VhwwYNGDCg1HLiCQkJ5V5h8DT+fH195e/vL+nPW0X379+v4uJiXXzxxVq7dm2ZY/Tu3bvUla5LLrlEl156aanzLXH8bXKS1KlTp1PeFvbZZ5+pqKhII0eOdN9qJklDhw5VSEiIPvzww5M+/1SeffZZFRUVKSoqShMnTjytY3ly/Ht95MgR7d27V5dddpkkeXw9Pb1G+/btU05OjiS5X9f77ruvVLuRI0ca1XXjjTfq6quv1v79+/Xss8+WqtMTl8ulfv366eDBg/rXv/5l1BcA+xCiANiuZOGIkgUmfv31V33xxRe69dZb5evrK0lKT0/XJ598ovDw8FL/unfvLkll5lTFxsaeVk3btm1TZGSkGjVqdNJ2aWlp6t69uwIDAxUWFqbw8HD33BrTEHXLLbeoQ4cOGjJkiJo2bapbb71Vb775ZoUD1c6dO5WYmKhGjRq558YkJCSUqqXkF+vWrVtX6JjXXnutgoODlZqaqpCQkFL7KvqeZGZmKiIiosz3GbVs2bJCNZSIj48v9TgoKEgRERGlwvemTZvUp08fhYaGKiQkROHh4br99tsllX0/zjzzTHeoOZnMzExJ0tlnn11mn6dtUvnjb9GiRbrgggtUv359NW7cWOHh4frwww89jpUTz1eSzjnnnFLnK8k9X+94DRs2LDNf7EQl53Xi++Dv768WLVq49/9VzZs3V5MmTXT++eefMkj8Ffv379f999+vpk2bKiAgQOHh4e7X3dPreeIfDUr+IFDyOmVmZsrHx0dxcXGl2pmOU0nuuYslt/2ezL333qtPPvlE8+fPr/GrFAJ1CXOiANjuoosuUqtWrfT666/roYce0uuvvy7LskqtyudyuXTFFVdo7NixHo9xzjnnlHpcGb+0nWjbtm3q1q2bWrVqpSeffFJRUVHy9/fXRx99pJSUFOOrSQEBAVq9erVWrFihDz/8UJ988oneeOMNde3aVcuWLXMHSk+OHTumK664Qvv379e4cePUqlUrBQYGateuXUpMTPxLV7akP/+qvmjRIr366qsaPnx4qX2m70llO3jwoBISEhQSEqJp06YpLi5O9evX19q1azVu3Lgyr0FljhFPx37llVeUmJio3r17a8yYMWrSpIl8fX2VlJSkbdu2/eW+TjYuarObb75ZX331lcaMGaO2bdsqKChILpdLV155pcfxXt7rZFlWZZdarqlTp2rOnDmaMWOG+vfvb1sdAMwRogBUC/369dPEiRP1448/6rXXXlN8fLz7r7mSFBcXp7y8PPdVjr/CZFJ7XFycUlNTtX///nKvRn3wwQcqLCzU+++/X+qv3CeutmbCx8dH3bp1U7du3fTkk0/qscce0z//+U+tWLFC3bt3L/ccNmzYoC1btmjRokUaMGCAe/unn35aql2LFi0kqdxV3k70+OOPy8/PT3fddZeCg4N12223ufdV9D2Jjo7W8uXLlZeXV+pqlOn3cqWnp6tLly7ux3l5efrtt9909dVXS/pz9cJ9+/bpnXfeUefOnd3tduzYYdSPp/olaevWrWX2edpWnrffflstWrTQO++8U+p9LO+7gdLT08ts27JlS5lVJP+qkvP65Zdf3ONCkoqKirRjx47T+n+tsh04cEDLly/X1KlTNWnSJPd2T69ZRUVHR8vlcmnbtm2lrj5V1vfHPfvss5oyZYpGjhypcePGVUofACoPt/MBqBZKrjpNmjRJ69evL/PdUDfffLO+/vprpaamlnnuwYMHVVxcfMo+AgMD3e1P5cYbb5RlWZo6dWqZfSV/uS75y/bxf8k+dOiQFixYcMrje7J///4y20pWbCssLJRU/jl4qsWyLD399NOl2oWHh6tz58566aWXtHPnzlL7PP1F3uFwaN68efp//+//aeDAgXr//ffd+yr6nlx99dUqLi4utfT7sWPHjOd/zJs3T0ePHnU/njt3roqLi3XVVVdJ8vwaFBUVac6cOUb9nCgyMlKtW7fWyy+/rLy8PPf2VatWacOGDRU+jqf6vv32W3399dce27/33nvatWuX+/GaNWv07bffus/3dHXv3t395bfH1/Tiiy/q0KFDRqvSVTVPr6WkMqt0mih5XUu+DNgbxyzPG2+8ofvuu0/9+vXTk08+6fXjA6h8XIkCUC3Exsaqffv2Wrp0qSSVCVFjxozR+++/r169eikxMVEXXXSR8vPztWHDBr399tvKyMg45dLAcXFxCgsL03PPPafg4GAFBgbq0ksv9Th/pUuXLurfv7+eeeYZpaenu28R+uKLL9SlSxfdc8896tGjh/z9/XXttddq+PDhysvL0wsvvKAmTZrot99+M34Npk2bptWrV+uaa65RdHS0du/erTlz5uiss85Sx44dT3oOrVq1UlxcnB588EHt2rVLISEhWrJkicd5Mc8884w6duyoCy+8UMOGDVNsbKwyMjL04Ycfav369WXa+/j46JVXXlHv3r11880366OPPlLXrl0r/J5ce+216tChg8aPH6+MjAydd955euedd4znjBUVFalbt266+eab9csvv2jOnDnq2LGj+3vE2rdvr4YNG2rgwIG677775HA4tHjxYq/crvXYY4/p+uuvV4cOHTRo0CAdOHBAs2fPVuvWrUsFq5Pp1auX3nnnHfXp00fXXHONduzYoeeee07nnXeex2OcffbZ6tixo0aMGKHCwkI99dRTaty4cbm3T5oKDw/XhAkTNHXqVF155ZW67rrr3K9ru3bt3HPJKtPs2bN18OBBZWdnS/rz6m7J9zLde++9Cg0N9fi8kJAQde7cWTNnztTRo0d15plnatmyZad11bFt27bq27ev5syZo0OHDql9+/Zavny50dXGilizZo0GDBigxo0bq1u3bnr11VdL7W/fvn2pK4MAqik7lgQEAE+effZZS5J1ySWXeNyfm5trTZgwwTr77LMtf39/64wzzrDat29vzZo1y730dcny0I8//rjHYyxdutQ677zzLD8/v1JLKp+4xLll/bkk9eOPP261atXK8vf3t8LDw62rrrrK+uGHH9xt3n//feuCCy6w6tevb8XExFjJycnWSy+9ZEmyduzY4W5XkSXOly9fbl1//fVWZGSk5e/vb0VGRlp9+/Yts4R4eefw008/Wd27d7eCgoKsM844wxo6dKj13//+1+PS0Rs3brT69OljhYWFWfXr17datmxpTZw40b3f05LWBQUFVkJCghUUFGR98803FX5PLOvPJZz79+9vhYSEWKGhoVb//v2tdevWGS1xvmrVKmvYsGFWw4YNraCgIKtfv37Wvn37SrVNS0uzLrvsMisgIMCKjIy0xo4da6WmplqSrBUrVpR6P84///yT9nuif//731arVq0sp9NptW7d2nr//fetG2+80WrVqpW7zcnGn8vlsh577DErOjracjqd1t///nfrP//5T5mxd/wxnnjiCSsqKspyOp1Wp06drP/+97+ljjlw4EArMDCwTF8l719FzJ4922rVqpVVr149q2nTptaIESOsAwcOeDyeyRLnlmVZ0dHR1jXXXHPS/ZI8/jv+/x9Pfv31V/cYDg0NtW666SYrOzu7zHLk5dVeMq6O7+fw4cPWfffdZzVu3NgKDAy0rr32WisrK8toifOT9Xl8v+X9M1nmHYB9HJZl44xKAABqsLZt2yo8PLzM3LPTkZGRodjYWD3++ON68MEHvXZcAID3MCcKAIBTOHr0aJl5dytXrtR///tfXX755fYUBQCwDXOiAAA4hV27dql79+66/fbbFRkZqc2bN+u5555Ts2bNynyJKwCg9iNEAQBwCg0bNtRFF12k+fPna8+ePQoMDNQ111yjGTNmqHHjxnaXBwCoYsyJAgAAAAADzIkCAAAAAAOEKAAAAAAwUKfnRLlcLmVnZys4OFgOh8PucgAAAADYxLIs5ebmKjIyUj4+J7/WVKdDVHZ2tqKiouwuAwAAAEA1kZWVpbPOOuukbep0iAoODpb05wsVEhJiczUAAAAA7JKTk6OoqCh3RjiZOh2iSm7hCwkJIUQBAAAAqNA0HxaWAAAAAAADhCgAAAAAMECIAgAAAAADdXpOVEVYlqXi4mIdO3bM7lJs4evrKz8/P5aABwAAAP4PIeokioqK9Ntvv6mgoMDuUmzVoEEDRUREyN/f3+5SAAAAANsRosrhcrm0Y8cO+fr6KjIy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urXq1aun7du367PPPtOBAwc0bdo0TZw40e5yUU15+kwqLCzU7t27tWbNGm3cuFG+vr4aO3asHn30UTkcDpsrRnXmaTydKCwsTCNHjqzawuCRn90FoO544403lJ+fr1GjRumpp57Siy++SIjCX3L22WdrypQppbYVFhbqH//4h7755hutWrVKXbt2tac41AgPP/ywUlJS1LZtW7399tuKi4srtf/w4cOaPXu29u3bZ1OFqEk8fSZJ0pdffqn+/fsrKSlJvr6+mj59etUXhxqnvPGE6oXb+VBlXnzxRfn5+Wns2LHq0qWLli9frszMTLvLQi3hdDrVpUsXSdLevXttrgbV2datWzVz5kw1btxYn3zySZkAJUkBAQEaM2aMpk6dakOFqC06duyoTz75RE6nUzNnzlRWVpbdJQHwEkIUqsRPP/2kb775Rj169FDTpk01YMAAuVwuLViwwO7SUEsUFRVp5cqVcjgcatu2rd3loBpbuHChjh07puHDh6tp06Ynbet0OquoKtRWLVu21M0336yioiK99957dpcDwEu4nQ9V4sUXX5Qk9e/fX5J0ww036K677tKCBQs0adIk+fiQ51FxW7dudd/qYFmW9u7dq9TUVO3atUszZ87UOeecY2+BqNbS0tIkiVs+UWUuv/xyLV68WN99953dpaAGOP5n3Ikuu+wyXXnllVVbEDwiRKHSHT16VIsXL1ZISIh69+4tSQoKClKfPn30yiuv6LPPPlOPHj3sLRI1yrZt2zzeZtWrVy91797dhopQk/z++++SpLPOOsvmSlBXREZGSuJWY1RMeT/jJOn+++8nRFUT/PkflW7p0qXas2ePbrrpJtWvX9+9fcCAAZL+d5UKqKiePXvKsiz3v71792rp0qXauHGjOnTooG+//dbuEgEA+EtO/Bl3/L+nnnrK7vLwfwhRqHQlIakkNJXo1q2bzjzzTC1dulT79++3ozTUEo0bN9Z1112nF154QQUFBXr44YftLgnVWLNmzSRJu3btsrkS1BXZ2dmSpPDwcJsrAeAthChUqqysLC1btkySlJCQUOoL43x9fbVr1y4VFhbqlVdesblS1AaXXnqpJDHvACfVoUMHSdLy5cttrgR1xcqVKyVJ7dq1s7cQAF7DnChUqoULF8rlcqljx45q2bJlmf3FxcVatGiRXnzxRd133302VIja5MCBA5L+/CJVoDyJiYmaMWOG5s2bp5EjR5706kBhYSEr9OG0bNmyRW+++aacTqf69OljdzkAvIQQhUpjWZYWLFggh8OhRYsWqUWLFh7bbdmyRV9//bW+//57XXzxxVVcJWqTJ598UpLUuXNnmytBdXb22Wdr7NixSkpK0lVXXaW33npLsbGxpdocOXJEc+bM0Z49e5SUlGRTpajp0tLSdPvtt6uwsFCTJ0/WmWeeaXdJALyEEIVK8/nnn2vHjh1KSEgoN0BJ0qBBg/T111/rxRdfJEShQk5c/nX//v1KS0vT2rVr1bBhQyUnJ9tXHGqERx55REeOHFFKSopatmyprl27qnXr1qpXr5527Nihzz77TPv27dMjjzxid6moAY7/TCoqKtLu3bu1Zs0abdiwQb6+vnr44Yc1efJke4tEjXGyJc4lafz48aUW6oI9HJZlWXYXgdrptttu0+uvv64FCxYoMTGx3HY5OTlq1qyZ/P399dtvvykgIKDqikSNkpGRUeaKgfTnF6KeddZZ6tGjh8aPH6/mzZvbUB1qou+//15z587V6tWrtWvXLrlcLkVERKh9+/YaNGgQS+bjpDx9JgUEBCgsLEytWrVSx44dNXDgQMXFxdlUIWqS8n7GnejAgQMKCwur/IJwUoQoAAAAADDA6nwAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAgFrv2LFjat++vW644YZS2w8dOqSoqCj985//lCTdd999uuiii+R0OtW2bVsbKgUA1ASEKABArefr66uFCxfqk08+0auvvurefu+996pRo0aaPHmye9vgwYN1yy232FEmAKCG8LO7AAAAqsI555yjGTNm6N5771XXrl21Zs0a/fvf/9Z3330nf39/SdIzzzwjSdqzZ49+/PFHO8sFAFRjhCgAQJ1x77336t1331X//v21YcMGTZo0SX/729/sLgsAUMMQogAAdYbD4dDcuXN17rnnqk2bNho/frzdJQEAaiDmRAEA6pSXXnpJDRo00I4dO/Trr7/aXQ4AoAYiRAEA6oyvvvpKKSkp+s9//qNLLrlEd9xxhyzLsrssAEANQ4gCANQJBQUFSkxM1IgRI9SlSxe9+OKLWrNmjZ577jm7SwMA1DCEKABAnTBhwgRZlqUZM2ZIkmJiYjRr1iyNHTtWGRkZkqStW7dq/fr1+v3333X48GGtX79e69evV1FRkY2VAwCqG4fFfQwAgFpu1apV6tatm1auXKmOHTuW2tezZ08VFxfrs88+U5cuXbRq1aoyz9+xY4diYmKqqFoAQHVHiAIAAAAAA9zOBwAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAGCFEAAAAAYIAQBQAAAAAG/j+Bbsc5cxhiTQAAAABJRU5ErkJggg==\n",
219
- "text/plain": [
220
- "<Figure size 1000x800 with 1 Axes>"
221
- ]
222
- },
223
- "metadata": {},
224
- "output_type": "display_data"
225
- }
226
- ],
227
- "source": [
228
- "import matplotlib\n",
229
- "import matplotlib.pyplot as plt\n",
230
- "import numpy as np\n",
231
- "import seaborn as sns\n",
232
- "\n",
233
- "# Create data\n",
234
- "X1 = ['A', 'B', 'C', 'D', 'E']\n",
235
- "Y1 = [10, 15, 20, 25, 30]\n",
236
- "Y2 = [20, 25, 30, 35, 40]\n",
237
- "\n",
238
- "# Set color scheme and font\n",
239
- "colors = sns.color_palette(\"Blues\", 2)\n",
240
- "\n",
241
- "# Create bar plot\n",
242
- "fig, ax = plt.subplots(figsize=(10, 8))\n",
243
- "ax.bar(X1, Y1, color=colors[0], edgecolor='white', linewidth=1)\n",
244
- "ax.bar(X1, Y2, bottom=Y1, color=colors[1], edgecolor='white', linewidth=1)\n",
245
- "\n",
246
- "# Set axis labels and ticks\n",
247
- "ax.set_xlabel('X1')\n",
248
- "ax.set_ylabel('Y')\n",
249
- "ax.set_xticklabels(X1)\n",
250
- "ax.tick_params(axis='both', which='major', labelsize=14)\n",
251
- "ax.grid(axis='y', alpha=0.4)\n",
252
- "\n",
253
- "# Add legend and title\n",
254
- "ax.legend(['Y1', 'Y2'], loc='upper left')\n",
255
- "ax.set_title('Vertical stacked bar graph of Y1 and Y2')\n",
256
- "\n",
257
- "# Save the graph as PDF or PNG\n",
258
- "plt.savefig('vertical_stacked_bar_graph.png', dpi=300, bbox_inches='tight')"
259
- ]
260
- },
261
- {
262
- "cell_type": "code",
263
- "execution_count": null,
264
- "id": "4c055ec7",
265
- "metadata": {},
266
- "outputs": [],
267
- "source": []
268
- }
269
- ],
270
- "metadata": {
271
- "kernelspec": {
272
- "display_name": "Python 3 (ipykernel)",
273
- "language": "python",
274
- "name": "python3"
275
- },
276
- "language_info": {
277
- "codemirror_mode": {
278
- "name": "ipython",
279
- "version": 3
280
- },
281
- "file_extension": ".py",
282
- "mimetype": "text/x-python",
283
- "name": "python",
284
- "nbconvert_exporter": "python",
285
- "pygments_lexer": "ipython3",
286
- "version": "3.8.5"
287
- }
288
- },
289
- "nbformat": 4,
290
- "nbformat_minor": 5
291
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/create_part_probability_mesh.py DELETED
@@ -1,86 +0,0 @@
1
- import numpy as np
2
- import os
3
- import json
4
- import trimesh
5
- import seaborn as sns
6
-
7
-
8
- # Load the combined dca train, val and test npzs
9
- dir = '/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras'
10
- trainval_npz = np.load(os.path.join(dir, 'hot_dca_trainval.npz'), allow_pickle=True)
11
- test_npz = np.load(os.path.join(dir, 'hot_dca_test.npz'), allow_pickle=True)
12
-
13
- # combine the two npz
14
- combined_npz = {}
15
- for key in trainval_npz.keys():
16
- combined_npz[key] = np.concatenate([trainval_npz[key], test_npz[key]], axis=0)
17
-
18
- segmentation_path = 'data/smpl_vert_segmentation.json'
19
- with open(segmentation_path, 'rb') as f:
20
- part_segmentation = json.load(f)
21
-
22
- combine_keys = {'leftFoot': ['leftToeBase'],
23
- 'rightFoot': ['rightToeBase'],
24
- 'leftHand': ['leftHandIndex1'],
25
- 'rightHand': ['rightHandIndex1'],
26
- 'spine': ['spine1', 'spine2'],
27
- 'head': ['neck'],}
28
-
29
- for key in combine_keys:
30
- for subkey in combine_keys[key]:
31
- part_segmentation[key] += part_segmentation[subkey]
32
- del part_segmentation[subkey]
33
-
34
- # reverse the part segmentation
35
- part_segmentation_rev = {}
36
- for part in part_segmentation:
37
- for vert in part_segmentation[part]:
38
- part_segmentation_rev[vert] = part
39
-
40
- # count the number of contact instances per vertex
41
- per_vert_contact_count = np.zeros(6890)
42
- for cls in combined_npz['contact_label']:
43
- per_vert_contact_count += cls
44
-
45
- # calculate the maximum contact count per part
46
- part_contact_max = {}
47
- for part in part_segmentation:
48
- part_contact_max[part] = np.max(per_vert_contact_count[part_segmentation[part]])
49
-
50
- # calculate the contact probability globally
51
- contact_prob = np.zeros(6890)
52
- for vid in range(6890):
53
- contact_prob[vid] = (per_vert_contact_count[vid] / max(per_vert_contact_count)) ** 0.3
54
-
55
- # save the contact probability mesh
56
- outdir = "/is/cluster/work/stripathi/pycharm_remote/dca_contact/hot_analysis"
57
-
58
- # load template smpl mesh
59
- mesh = trimesh.load_mesh('data/smpl/smpl_neutral_tpose.ply')
60
- vertex_colors = trimesh.visual.interpolate(contact_prob, 'jet')
61
- # set the vertex colors of the mesh
62
- mesh.visual.vertex_colors = vertex_colors
63
- # save the mesh
64
- out_path = os.path.join(outdir, "contact_probability_mesh.obj")
65
- mesh.export(out_path)
66
-
67
- # # calculate the contact probability per part
68
- # contact_prob = np.zeros(6890)
69
- # for vid in range(6890):
70
- # if 'Hand' in part_segmentation_rev[vid]:
71
- # contact_prob[vid] = (per_vert_contact_count[vid] / part_contact_max[part_segmentation_rev[vid]]) ** 0.4 if 'Hand' not in part_segmentation_rev[vid] else (per_vert_contact_count[vid] / part_contact_max[part_segmentation_rev[vid]]) ** 0.8
72
- #
73
- # # save the contact probability mesh
74
- # outdir = "/is/cluster/work/stripathi/pycharm_remote/dca_contact/hot_analysis"
75
- #
76
- # # load template smpl mesh
77
- # mesh = trimesh.load_mesh('data/smpl/smpl_neutral_tpose.ply')
78
- # vertex_colors = trimesh.visual.interpolate(contact_prob, 'jet')
79
- # # set the vertex colors of the mesh
80
- # mesh.visual.vertex_colors = vertex_colors
81
- # # save the mesh
82
- # out_path = os.path.join(outdir, "contact_probability_mesh_part.obj")
83
- # mesh.export(out_path)
84
-
85
-
86
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/damon_qc_stats/compute_accuracy_iou_damon.py DELETED
@@ -1,59 +0,0 @@
1
- # load amt csv, go through each line in vertices, combine the vertices for each object label and then compute the iou with GT from RICH and PROX
2
- import pandas as pd
3
- import numpy as np
4
-
5
- # load csv
6
- csv_path = './quality_assurance_accuracy.csv'
7
- df = pd.read_csv(csv_path)
8
-
9
- # load gt npz
10
- gt_path = './qa_accuracy_gt_contact_combined.npz'
11
- gt = np.load(gt_path)
12
-
13
- def compute_iou(pred_verts, gt_verts):
14
- if len(pred_verts) != 0:
15
- intersect = list(set(pred_verts) & set(gt_verts))
16
- iou = len(intersect) / (len(pred_verts) + len(gt_verts) - len(intersect))
17
- else:
18
- iou = 0
19
- return iou
20
-
21
- all_ious = []
22
- # for loop each row in df
23
- for index, row in df.iterrows():
24
- combined_annotation_ids = []
25
- imgname = []
26
- # get vertices
27
- annotation_dict = eval(row['vertices'])
28
- worker_id = row['WorkerId']
29
- # single for loop in the dictionary
30
- for im, anno in annotation_dict.items():
31
- imgname.append(im)
32
- for ann in anno:
33
- # single for loop in the dict
34
- for k, v in ann.items():
35
- combined_annotation_ids.extend(v)
36
- # remove repeated values
37
- combined_annotation_ids = list(set(combined_annotation_ids))
38
-
39
- assert len(imgname) == 1
40
- imgname = imgname[0]
41
-
42
- # get gt for the imgname
43
- gt_ids = gt[imgname]
44
- if 'prox' in imgname:
45
- continue
46
-
47
- # compute iou
48
- iou = compute_iou(combined_annotation_ids, gt_ids)
49
- print('worker id: ', worker_id, 'imgname: ', imgname, 'iou: ', iou)
50
- all_ious.append(iou)
51
-
52
- # compute mean iou
53
- mean_iou = np.mean(all_ious)
54
- print('mean iou: ', mean_iou)
55
-
56
-
57
-
58
-
59
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/damon_qc_stats/compute_fleiss_kappa_damon.py DELETED
@@ -1,111 +0,0 @@
1
- import numpy as np
2
- import pandas as pd
3
- from scipy.stats import chi2
4
-
5
-
6
- def correct_supporting(vertices):
7
- # Copy vertices from objects to supporting since the dropdown option was missing in the QA app
8
- def add_supporting(verts, object_name):
9
- temp_supporting_vids = []
10
- supporting_vid = -1
11
- for id, v_i in enumerate(verts):
12
- # single key dict
13
- for k, v in v_i.items():
14
- if k == object_name:
15
- temp_supporting_vids = v
16
- if k == 'SUPPORTING':
17
- supporting_vid = id
18
- if supporting_vid != -1:
19
- # append to supporting
20
- verts[supporting_vid]['SUPPORTING'] += temp_supporting_vids
21
- return verts
22
-
23
- # correct supporting contacts
24
- for i, vert in enumerate(vertices):
25
- for k, v in vert.items():
26
- if k == 'hot/training/hake_train2015_HICO_train2015_00000019.jpg':
27
- # copy bicycle contacts to supporting
28
- v = add_supporting(v, 'BICYCLE')
29
- if k == 'hot/training/hake_train2015_HICO_train2015_00000020.jpg':
30
- # copy skateboard contacts to supporting
31
- v = add_supporting(v, 'SKATEBOARD')
32
- if k == 'hot/training/hake_train2015_HICO_train2015_00000942':
33
- # copy bench contacts to supporting
34
- v = add_supporting(v, 'BENCH')
35
-
36
- # combine all vert_ids into a single list no matter the object
37
- v = {ki: vi for d in v for ki, vi in d.items()}
38
- v = [vi for k, vi in v.items()]
39
- v = [item for sublist in v for item in sublist]
40
- v = list(set(v))
41
- # binarize the list to a numpy array
42
- v_np = np.zeros(6890)
43
- v_np[v] = 1
44
- vert[k] = v_np
45
- vertices[i] = vert
46
- return vertices
47
-
48
- def fleiss_kappa_per_img(vertices):
49
- """
50
- Compute Fleiss' kappa per imagename
51
- Parameters
52
- ----------
53
- vertices : list of np arrays where each array is of shape (6890,) and 1 indicates a vertex is selected
54
- """
55
- n = len(vertices) # number of raters
56
- N = 6890 # number of images
57
- k = 2 # number of categories
58
-
59
- # compute the observed agreement
60
- M = np.zeros((N, k))
61
-
62
- for i in range(k):
63
- M[:, i] = np.sum(vertices == i, axis=0)
64
-
65
- assert np.sum(M) == N * n
66
-
67
- # compute the expected agreement
68
- p = np.sum(M, axis=0) / (N * n)
69
- P = (np.sum(M * M, axis=1) - n) / (n * (n - 1))
70
- Pbar = np.mean(P)
71
- PbarE = np.sum(p * p)
72
-
73
- # compute Fleiss' kappa
74
- kappa = (Pbar - PbarE) / (1 - PbarE)
75
- return kappa
76
-
77
- def fleiss_kappa(data):
78
- """
79
- Compute Fleiss' kappa per imagename
80
- Parameters
81
- ----------
82
- data : list of dicts where keys are imgnames
83
- """
84
- imgnames = sorted(data[0].keys())
85
- kappas = []
86
- for img in imgnames:
87
- kappa_data = []
88
- for d in data:
89
- kappa_data.append(d[img])
90
- kappa_data = np.array(kappa_data)
91
- kappa_img = fleiss_kappa_per_img(kappa_data)
92
- print(f'Fleiss\' Kappa for {img}: {kappa_img}')
93
- kappas.append(kappa_img)
94
-
95
- # computer mean kappa
96
- kappa = np.mean(kappas)
97
- return kappa
98
-
99
-
100
- # Load the combined qa csv file
101
- csv_file = 'quality_assurance_fleiss.csv'
102
- df = pd.read_csv(csv_file)
103
-
104
- vertices = df['vertices'].values
105
- vertices = [eval(v) for v in vertices]
106
-
107
- vertices = correct_supporting(vertices)
108
-
109
- kappa = fleiss_kappa(vertices)
110
-
111
- print('Fleiss\' Kappa:', kappa)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/damon_qc_stats/qa_accuracy_gt_contact_combined.npz DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:b34393328dae058aa12245f547ee954f48508bf0c4ed7ecbe40a674245ba5717
3
- size 456742
 
 
 
 
hot_analysis/damon_qc_stats/quality_assurance_accuracy.csv DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/damon_qc_stats/quality_assurance_fleiss.csv DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/damon_qc_stats/successful_qualifications_fleiss.csv DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/hico/hico_imglist_all_140223.txt DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/hico/image_per_object_category.png DELETED
Binary file (86.2 kB)
 
hot_analysis/filtered_data/v_1/hico/imgnames_per_object_dict.json DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/hico/imgnames_per_object_dict.txt DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/hico/object_per_image_dict.json DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/hico/object_per_image_dict.txt DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/hico_imglist_all_140223.txt DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/image_per_object_category.png DELETED
Binary file (120 kB)
 
hot_analysis/filtered_data/v_1/imgnames_per_object_dict.json DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/imgnames_per_object_dict.txt DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/object_per_image_dict.json DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/object_per_image_dict.txt DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/vcoco/image_per_object_category.png DELETED
Binary file (84.7 kB)
 
hot_analysis/filtered_data/v_1/vcoco/imgnames_per_object_dict.json DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/vcoco/object_per_image_dict.json DELETED
The diff for this file is too large to render. See raw diff
 
hot_analysis/filtered_data/v_1/vcoco/vcoco_imglist_all_170223.txt DELETED
@@ -1,2368 +0,0 @@
1
- vcoco_000000051899.jpg
2
- vcoco_000000093127.jpg
3
- vcoco_000000455665.jpg
4
- vcoco_000000248389.jpg
5
- vcoco_000000403947.jpg
6
- vcoco_000000418634.jpg
7
- vcoco_000000065161.jpg
8
- vcoco_000000504606.jpg
9
- vcoco_000000535135.jpg
10
- vcoco_000000284098.jpg
11
- vcoco_000000318785.jpg
12
- vcoco_000000003770.jpg
13
- vcoco_000000343002.jpg
14
- vcoco_000000491784.jpg
15
- vcoco_000000342013.jpg
16
- vcoco_000000335909.jpg
17
- vcoco_000000489121.jpg
18
- vcoco_000000552365.jpg
19
- vcoco_000000526681.jpg
20
- vcoco_000000477136.jpg
21
- vcoco_000000438861.jpg
22
- vcoco_000000033958.jpg
23
- vcoco_000000548029.jpg
24
- vcoco_000000520528.jpg
25
- vcoco_000000568604.jpg
26
- vcoco_000000160480.jpg
27
- vcoco_000000579466.jpg
28
- vcoco_000000459576.jpg
29
- vcoco_000000053347.jpg
30
- vcoco_000000548592.jpg
31
- vcoco_000000491215.jpg
32
- vcoco_000000335274.jpg
33
- vcoco_000000343803.jpg
34
- vcoco_000000343860.jpg
35
- vcoco_000000561810.jpg
36
- vcoco_000000313145.jpg
37
- vcoco_000000094766.jpg
38
- vcoco_000000386677.jpg
39
- vcoco_000000517349.jpg
40
- vcoco_000000430259.jpg
41
- vcoco_000000412301.jpg
42
- vcoco_000000306426.jpg
43
- vcoco_000000057782.jpg
44
- vcoco_000000068646.jpg
45
- vcoco_000000341818.jpg
46
- vcoco_000000024446.jpg
47
- vcoco_000000482362.jpg
48
- vcoco_000000087328.jpg
49
- vcoco_000000284846.jpg
50
- vcoco_000000098596.jpg
51
- vcoco_000000492648.jpg
52
- vcoco_000000343619.jpg
53
- vcoco_000000026552.jpg
54
- vcoco_000000578780.jpg
55
- vcoco_000000012817.jpg
56
- vcoco_000000298139.jpg
57
- vcoco_000000343104.jpg
58
- vcoco_000000262414.jpg
59
- vcoco_000000521956.jpg
60
- vcoco_000000506126.jpg
61
- vcoco_000000271490.jpg
62
- vcoco_000000233863.jpg
63
- vcoco_000000577880.jpg
64
- vcoco_000000146454.jpg
65
- vcoco_000000515704.jpg
66
- vcoco_000000280114.jpg
67
- vcoco_000000196108.jpg
68
- vcoco_000000368040.jpg
69
- vcoco_000000334941.jpg
70
- vcoco_000000194545.jpg
71
- vcoco_000000435141.jpg
72
- vcoco_000000547830.jpg
73
- vcoco_000000234642.jpg
74
- vcoco_000000122672.jpg
75
- vcoco_000000386912.jpg
76
- vcoco_000000132272.jpg
77
- vcoco_000000219629.jpg
78
- vcoco_000000445211.jpg
79
- vcoco_000000039958.jpg
80
- vcoco_000000270474.jpg
81
- vcoco_000000430428.jpg
82
- vcoco_000000269551.jpg
83
- vcoco_000000538003.jpg
84
- vcoco_000000096832.jpg
85
- vcoco_000000126097.jpg
86
- vcoco_000000411740.jpg
87
- vcoco_000000080117.jpg
88
- vcoco_000000106525.jpg
89
- vcoco_000000332722.jpg
90
- vcoco_000000036827.jpg
91
- vcoco_000000550870.jpg
92
- vcoco_000000305752.jpg
93
- vcoco_000000263083.jpg
94
- vcoco_000000476349.jpg
95
- vcoco_000000528621.jpg
96
- vcoco_000000125257.jpg
97
- vcoco_000000435358.jpg
98
- vcoco_000000449914.jpg
99
- vcoco_000000366150.jpg
100
- vcoco_000000326128.jpg
101
- vcoco_000000419369.jpg
102
- vcoco_000000526360.jpg
103
- vcoco_000000378652.jpg
104
- vcoco_000000093853.jpg
105
- vcoco_000000419050.jpg
106
- vcoco_000000487698.jpg
107
- vcoco_000000356800.jpg
108
- vcoco_000000025244.jpg
109
- vcoco_000000474233.jpg
110
- vcoco_000000570458.jpg
111
- vcoco_000000341047.jpg
112
- vcoco_000000422586.jpg
113
- vcoco_000000573058.jpg
114
- vcoco_000000405093.jpg
115
- vcoco_000000510152.jpg
116
- vcoco_000000043968.jpg
117
- vcoco_000000216050.jpg
118
- vcoco_000000499396.jpg
119
- vcoco_000000067761.jpg
120
- vcoco_000000227359.jpg
121
- vcoco_000000506515.jpg
122
- vcoco_000000502936.jpg
123
- vcoco_000000020410.jpg
124
- vcoco_000000282557.jpg
125
- vcoco_000000492057.jpg
126
- vcoco_000000241396.jpg
127
- vcoco_000000285826.jpg
128
- vcoco_000000580778.jpg
129
- vcoco_000000183538.jpg
130
- vcoco_000000359399.jpg
131
- vcoco_000000405121.jpg
132
- vcoco_000000176091.jpg
133
- vcoco_000000401962.jpg
134
- vcoco_000000291962.jpg
135
- vcoco_000000048282.jpg
136
- vcoco_000000525876.jpg
137
- vcoco_000000355197.jpg
138
- vcoco_000000489207.jpg
139
- vcoco_000000536791.jpg
140
- vcoco_000000290979.jpg
141
- vcoco_000000047774.jpg
142
- vcoco_000000191632.jpg
143
- vcoco_000000355660.jpg
144
- vcoco_000000541108.jpg
145
- vcoco_000000470161.jpg
146
- vcoco_000000455948.jpg
147
- vcoco_000000486605.jpg
148
- vcoco_000000509020.jpg
149
- vcoco_000000226597.jpg
150
- vcoco_000000038431.jpg
151
- vcoco_000000017003.jpg
152
- vcoco_000000264758.jpg
153
- vcoco_000000250619.jpg
154
- vcoco_000000540183.jpg
155
- vcoco_000000360002.jpg
156
- vcoco_000000192656.jpg
157
- vcoco_000000462324.jpg
158
- vcoco_000000559908.jpg
159
- vcoco_000000409496.jpg
160
- vcoco_000000193429.jpg
161
- vcoco_000000136350.jpg
162
- vcoco_000000089078.jpg
163
- vcoco_000000499102.jpg
164
- vcoco_000000497915.jpg
165
- vcoco_000000486774.jpg
166
- vcoco_000000276006.jpg
167
- vcoco_000000078871.jpg
168
- vcoco_000000458103.jpg
169
- vcoco_000000014226.jpg
170
- vcoco_000000332087.jpg
171
- vcoco_000000195697.jpg
172
- vcoco_000000280968.jpg
173
- vcoco_000000563435.jpg
174
- vcoco_000000491118.jpg
175
- vcoco_000000341681.jpg
176
- vcoco_000000465247.jpg
177
- vcoco_000000433574.jpg
178
- vcoco_000000082969.jpg
179
- vcoco_000000131339.jpg
180
- vcoco_000000330650.jpg
181
- vcoco_000000363102.jpg
182
- vcoco_000000573063.jpg
183
- vcoco_000000320661.jpg
184
- vcoco_000000053058.jpg
185
- vcoco_000000579891.jpg
186
- vcoco_000000327804.jpg
187
- vcoco_000000525684.jpg
188
- vcoco_000000157948.jpg
189
- vcoco_000000531735.jpg
190
- vcoco_000000549746.jpg
191
- vcoco_000000378894.jpg
192
- vcoco_000000096800.jpg
193
- vcoco_000000068586.jpg
194
- vcoco_000000564091.jpg
195
- vcoco_000000010149.jpg
196
- vcoco_000000357356.jpg
197
- vcoco_000000008383.jpg
198
- vcoco_000000562062.jpg
199
- vcoco_000000318672.jpg
200
- vcoco_000000285013.jpg
201
- vcoco_000000486070.jpg
202
- vcoco_000000420347.jpg
203
- vcoco_000000246053.jpg
204
- vcoco_000000510078.jpg
205
- vcoco_000000270683.jpg
206
- vcoco_000000412876.jpg
207
- vcoco_000000204272.jpg
208
- vcoco_000000441995.jpg
209
- vcoco_000000404283.jpg
210
- vcoco_000000467843.jpg
211
- vcoco_000000529670.jpg
212
- vcoco_000000575348.jpg
213
- vcoco_000000382383.jpg
214
- vcoco_000000308053.jpg
215
- vcoco_000000303610.jpg
216
- vcoco_000000035093.jpg
217
- vcoco_000000029140.jpg
218
- vcoco_000000575719.jpg
219
- vcoco_000000515424.jpg
220
- vcoco_000000110693.jpg
221
- vcoco_000000559948.jpg
222
- vcoco_000000345252.jpg
223
- vcoco_000000032151.jpg
224
- vcoco_000000157651.jpg
225
- vcoco_000000085626.jpg
226
- vcoco_000000314645.jpg
227
- vcoco_000000326243.jpg
228
- vcoco_000000259585.jpg
229
- vcoco_000000063248.jpg
230
- vcoco_000000353835.jpg
231
- vcoco_000000291921.jpg
232
- vcoco_000000079031.jpg
233
- vcoco_000000181330.jpg
234
- vcoco_000000546658.jpg
235
- vcoco_000000137888.jpg
236
- vcoco_000000333626.jpg
237
- vcoco_000000452115.jpg
238
- vcoco_000000315742.jpg
239
- vcoco_000000411241.jpg
240
- vcoco_000000246436.jpg
241
- vcoco_000000280084.jpg
242
- vcoco_000000404820.jpg
243
- vcoco_000000110490.jpg
244
- vcoco_000000422918.jpg
245
- vcoco_000000020161.jpg
246
- vcoco_000000163085.jpg
247
- vcoco_000000515123.jpg
248
- vcoco_000000519905.jpg
249
- vcoco_000000534687.jpg
250
- vcoco_000000508724.jpg
251
- vcoco_000000546320.jpg
252
- vcoco_000000475271.jpg
253
- vcoco_000000456969.jpg
254
- vcoco_000000334530.jpg
255
- vcoco_000000448181.jpg
256
- vcoco_000000258761.jpg
257
- vcoco_000000571640.jpg
258
- vcoco_000000238502.jpg
259
- vcoco_000000365728.jpg
260
- vcoco_000000421253.jpg
261
- vcoco_000000207177.jpg
262
- vcoco_000000450567.jpg
263
- vcoco_000000386261.jpg
264
- vcoco_000000261902.jpg
265
- vcoco_000000036322.jpg
266
- vcoco_000000230851.jpg
267
- vcoco_000000417298.jpg
268
- vcoco_000000400080.jpg
269
- vcoco_000000038049.jpg
270
- vcoco_000000288486.jpg
271
- vcoco_000000475952.jpg
272
- vcoco_000000258769.jpg
273
- vcoco_000000158684.jpg
274
- vcoco_000000120994.jpg
275
- vcoco_000000134926.jpg
276
- vcoco_000000522413.jpg
277
- vcoco_000000575389.jpg
278
- vcoco_000000317018.jpg
279
- vcoco_000000503332.jpg
280
- vcoco_000000343438.jpg
281
- vcoco_000000006041.jpg
282
- vcoco_000000440554.jpg
283
- vcoco_000000109666.jpg
284
- vcoco_000000514468.jpg
285
- vcoco_000000381607.jpg
286
- vcoco_000000357769.jpg
287
- vcoco_000000576754.jpg
288
- vcoco_000000519351.jpg
289
- vcoco_000000296906.jpg
290
- vcoco_000000508949.jpg
291
- vcoco_000000515924.jpg
292
- vcoco_000000516339.jpg
293
- vcoco_000000564328.jpg
294
- vcoco_000000169854.jpg
295
- vcoco_000000457906.jpg
296
- vcoco_000000045086.jpg
297
- vcoco_000000387270.jpg
298
- vcoco_000000095854.jpg
299
- vcoco_000000228920.jpg
300
- vcoco_000000324971.jpg
301
- vcoco_000000505242.jpg
302
- vcoco_000000006189.jpg
303
- vcoco_000000562602.jpg
304
- vcoco_000000449661.jpg
305
- vcoco_000000069029.jpg
306
- vcoco_000000511325.jpg
307
- vcoco_000000501576.jpg
308
- vcoco_000000560632.jpg
309
- vcoco_000000514083.jpg
310
- vcoco_000000022371.jpg
311
- vcoco_000000258141.jpg
312
- vcoco_000000489573.jpg
313
- vcoco_000000541017.jpg
314
- vcoco_000000565570.jpg
315
- vcoco_000000503421.jpg
316
- vcoco_000000556083.jpg
317
- vcoco_000000450340.jpg
318
- vcoco_000000462676.jpg
319
- vcoco_000000520478.jpg
320
- vcoco_000000226374.jpg
321
- vcoco_000000436544.jpg
322
- vcoco_000000227250.jpg
323
- vcoco_000000482172.jpg
324
- vcoco_000000502113.jpg
325
- vcoco_000000346863.jpg
326
- vcoco_000000305156.jpg
327
- vcoco_000000292211.jpg
328
- vcoco_000000368602.jpg
329
- vcoco_000000457400.jpg
330
- vcoco_000000013985.jpg
331
- vcoco_000000248007.jpg
332
- vcoco_000000475919.jpg
333
- vcoco_000000087501.jpg
334
- vcoco_000000056669.jpg
335
- vcoco_000000510061.jpg
336
- vcoco_000000417870.jpg
337
- vcoco_000000353976.jpg
338
- vcoco_000000036663.jpg
339
- vcoco_000000302740.jpg
340
- vcoco_000000321776.jpg
341
- vcoco_000000011195.jpg
342
- vcoco_000000489313.jpg
343
- vcoco_000000106411.jpg
344
- vcoco_000000445933.jpg
345
- vcoco_000000138834.jpg
346
- vcoco_000000567530.jpg
347
- vcoco_000000342650.jpg
348
- vcoco_000000109232.jpg
349
- vcoco_000000318444.jpg
350
- vcoco_000000414923.jpg
351
- vcoco_000000185792.jpg
352
- vcoco_000000259565.jpg
353
- vcoco_000000140065.jpg
354
- vcoco_000000305760.jpg
355
- vcoco_000000561512.jpg
356
- vcoco_000000491058.jpg
357
- vcoco_000000236865.jpg
358
- vcoco_000000233188.jpg
359
- vcoco_000000172264.jpg
360
- vcoco_000000531633.jpg
361
- vcoco_000000541474.jpg
362
- vcoco_000000558006.jpg
363
- vcoco_000000460781.jpg
364
- vcoco_000000299116.jpg
365
- vcoco_000000419444.jpg
366
- vcoco_000000563912.jpg
367
- vcoco_000000062623.jpg
368
- vcoco_000000416072.jpg
369
- vcoco_000000111148.jpg
370
- vcoco_000000371555.jpg
371
- vcoco_000000313925.jpg
372
- vcoco_000000084004.jpg
373
- vcoco_000000183843.jpg
374
- vcoco_000000579060.jpg
375
- vcoco_000000129852.jpg
376
- vcoco_000000509526.jpg
377
- vcoco_000000484584.jpg
378
- vcoco_000000190277.jpg
379
- vcoco_000000400332.jpg
380
- vcoco_000000133620.jpg
381
- vcoco_000000239119.jpg
382
- vcoco_000000516261.jpg
383
- vcoco_000000323789.jpg
384
- vcoco_000000310131.jpg
385
- vcoco_000000504353.jpg
386
- vcoco_000000217486.jpg
387
- vcoco_000000439386.jpg
388
- vcoco_000000558089.jpg
389
- vcoco_000000441218.jpg
390
- vcoco_000000050782.jpg
391
- vcoco_000000395304.jpg
392
- vcoco_000000276893.jpg
393
- vcoco_000000279013.jpg
394
- vcoco_000000565518.jpg
395
- vcoco_000000579261.jpg
396
- vcoco_000000364433.jpg
397
- vcoco_000000024242.jpg
398
- vcoco_000000332916.jpg
399
- vcoco_000000443095.jpg
400
- vcoco_000000497343.jpg
401
- vcoco_000000400168.jpg
402
- vcoco_000000073172.jpg
403
- vcoco_000000445263.jpg
404
- vcoco_000000090628.jpg
405
- vcoco_000000341645.jpg
406
- vcoco_000000308145.jpg
407
- vcoco_000000133766.jpg
408
- vcoco_000000549683.jpg
409
- vcoco_000000060596.jpg
410
- vcoco_000000059685.jpg
411
- vcoco_000000039664.jpg
412
- vcoco_000000076901.jpg
413
- vcoco_000000290130.jpg
414
- vcoco_000000354290.jpg
415
- vcoco_000000572296.jpg
416
- vcoco_000000197862.jpg
417
- vcoco_000000381544.jpg
418
- vcoco_000000400925.jpg
419
- vcoco_000000047315.jpg
420
- vcoco_000000069965.jpg
421
- vcoco_000000158058.jpg
422
- vcoco_000000238857.jpg
423
- vcoco_000000435468.jpg
424
- vcoco_000000074838.jpg
425
- vcoco_000000505636.jpg
426
- vcoco_000000494782.jpg
427
- vcoco_000000016210.jpg
428
- vcoco_000000357413.jpg
429
- vcoco_000000432062.jpg
430
- vcoco_000000390435.jpg
431
- vcoco_000000072910.jpg
432
- vcoco_000000325838.jpg
433
- vcoco_000000483639.jpg
434
- vcoco_000000331367.jpg
435
- vcoco_000000374368.jpg
436
- vcoco_000000025282.jpg
437
- vcoco_000000334625.jpg
438
- vcoco_000000413217.jpg
439
- vcoco_000000221132.jpg
440
- vcoco_000000333924.jpg
441
- vcoco_000000076994.jpg
442
- vcoco_000000074349.jpg
443
- vcoco_000000284131.jpg
444
- vcoco_000000389577.jpg
445
- vcoco_000000323895.jpg
446
- vcoco_000000028692.jpg
447
- vcoco_000000230133.jpg
448
- vcoco_000000130513.jpg
449
- vcoco_000000285302.jpg
450
- vcoco_000000293554.jpg
451
- vcoco_000000034900.jpg
452
- vcoco_000000485902.jpg
453
- vcoco_000000443844.jpg
454
- vcoco_000000115898.jpg
455
- vcoco_000000377105.jpg
456
- vcoco_000000282564.jpg
457
- vcoco_000000413154.jpg
458
- vcoco_000000264819.jpg
459
- vcoco_000000395225.jpg
460
- vcoco_000000456566.jpg
461
- vcoco_000000048044.jpg
462
- vcoco_000000420167.jpg
463
- vcoco_000000576625.jpg
464
- vcoco_000000579760.jpg
465
- vcoco_000000399294.jpg
466
- vcoco_000000034356.jpg
467
- vcoco_000000358617.jpg
468
- vcoco_000000492968.jpg
469
- vcoco_000000325242.jpg
470
- vcoco_000000109537.jpg
471
- vcoco_000000459585.jpg
472
- vcoco_000000281008.jpg
473
- vcoco_000000029045.jpg
474
- vcoco_000000068277.jpg
475
- vcoco_000000444927.jpg
476
- vcoco_000000050638.jpg
477
- vcoco_000000532295.jpg
478
- vcoco_000000427941.jpg
479
- vcoco_000000452471.jpg
480
- vcoco_000000483066.jpg
481
- vcoco_000000501381.jpg
482
- vcoco_000000280761.jpg
483
- vcoco_000000403349.jpg
484
- vcoco_000000314154.jpg
485
- vcoco_000000456807.jpg
486
- vcoco_000000174176.jpg
487
- vcoco_000000441608.jpg
488
- vcoco_000000071124.jpg
489
- vcoco_000000400742.jpg
490
- vcoco_000000282943.jpg
491
- vcoco_000000445908.jpg
492
- vcoco_000000412879.jpg
493
- vcoco_000000386363.jpg
494
- vcoco_000000474026.jpg
495
- vcoco_000000047548.jpg
496
- vcoco_000000468299.jpg
497
- vcoco_000000398941.jpg
498
- vcoco_000000503976.jpg
499
- vcoco_000000169648.jpg
500
- vcoco_000000369936.jpg
501
- vcoco_000000433170.jpg
502
- vcoco_000000329498.jpg
503
- vcoco_000000372604.jpg
504
- vcoco_000000278462.jpg
505
- vcoco_000000093075.jpg
506
- vcoco_000000312985.jpg
507
- vcoco_000000358525.jpg
508
- vcoco_000000064310.jpg
509
- vcoco_000000280908.jpg
510
- vcoco_000000536214.jpg
511
- vcoco_000000578572.jpg
512
- vcoco_000000380330.jpg
513
- vcoco_000000403680.jpg
514
- vcoco_000000450687.jpg
515
- vcoco_000000436984.jpg
516
- vcoco_000000220457.jpg
517
- vcoco_000000104023.jpg
518
- vcoco_000000334813.jpg
519
- vcoco_000000494860.jpg
520
- vcoco_000000418384.jpg
521
- vcoco_000000064462.jpg
522
- vcoco_000000314204.jpg
523
- vcoco_000000431364.jpg
524
- vcoco_000000108425.jpg
525
- vcoco_000000461644.jpg
526
- vcoco_000000012938.jpg
527
- vcoco_000000066676.jpg
528
- vcoco_000000560969.jpg
529
- vcoco_000000502202.jpg
530
- vcoco_000000282733.jpg
531
- vcoco_000000480408.jpg
532
- vcoco_000000345139.jpg
533
- vcoco_000000400044.jpg
534
- vcoco_000000228135.jpg
535
- vcoco_000000440347.jpg
536
- vcoco_000000404373.jpg
537
- vcoco_000000476139.jpg
538
- vcoco_000000443204.jpg
539
- vcoco_000000437594.jpg
540
- vcoco_000000415109.jpg
541
- vcoco_000000443681.jpg
542
- vcoco_000000564304.jpg
543
- vcoco_000000349709.jpg
544
- vcoco_000000323153.jpg
545
- vcoco_000000385323.jpg
546
- vcoco_000000203631.jpg
547
- vcoco_000000477066.jpg
548
- vcoco_000000264179.jpg
549
- vcoco_000000535174.jpg
550
- vcoco_000000542723.jpg
551
- vcoco_000000133576.jpg
552
- vcoco_000000203809.jpg
553
- vcoco_000000353989.jpg
554
- vcoco_000000121083.jpg
555
- vcoco_000000308399.jpg
556
- vcoco_000000034428.jpg
557
- vcoco_000000422211.jpg
558
- vcoco_000000487898.jpg
559
- vcoco_000000444308.jpg
560
- vcoco_000000566518.jpg
561
- vcoco_000000426469.jpg
562
- vcoco_000000272095.jpg
563
- vcoco_000000091336.jpg
564
- vcoco_000000179526.jpg
565
- vcoco_000000419212.jpg
566
- vcoco_000000318179.jpg
567
- vcoco_000000446285.jpg
568
- vcoco_000000467875.jpg
569
- vcoco_000000204935.jpg
570
- vcoco_000000456345.jpg
571
- vcoco_000000554711.jpg
572
- vcoco_000000565203.jpg
573
- vcoco_000000313361.jpg
574
- vcoco_000000128113.jpg
575
- vcoco_000000408481.jpg
576
- vcoco_000000398798.jpg
577
- vcoco_000000144610.jpg
578
- vcoco_000000532449.jpg
579
- vcoco_000000267837.jpg
580
- vcoco_000000103722.jpg
581
- vcoco_000000476398.jpg
582
- vcoco_000000412681.jpg
583
- vcoco_000000447728.jpg
584
- vcoco_000000299254.jpg
585
- vcoco_000000361171.jpg
586
- vcoco_000000187001.jpg
587
- vcoco_000000309284.jpg
588
- vcoco_000000528966.jpg
589
- vcoco_000000231714.jpg
590
- vcoco_000000580847.jpg
591
- vcoco_000000475159.jpg
592
- vcoco_000000492535.jpg
593
- vcoco_000000054329.jpg
594
- vcoco_000000034825.jpg
595
- vcoco_000000266866.jpg
596
- vcoco_000000266715.jpg
597
- vcoco_000000578119.jpg
598
- vcoco_000000176312.jpg
599
- vcoco_000000202853.jpg
600
- vcoco_000000115584.jpg
601
- vcoco_000000123974.jpg
602
- vcoco_000000278973.jpg
603
- vcoco_000000461715.jpg
604
- vcoco_000000073333.jpg
605
- vcoco_000000114389.jpg
606
- vcoco_000000160828.jpg
607
- vcoco_000000275117.jpg
608
- vcoco_000000228505.jpg
609
- vcoco_000000031521.jpg
610
- vcoco_000000420156.jpg
611
- vcoco_000000450894.jpg
612
- vcoco_000000107430.jpg
613
- vcoco_000000467654.jpg
614
- vcoco_000000095916.jpg
615
- vcoco_000000561849.jpg
616
- vcoco_000000385154.jpg
617
- vcoco_000000409367.jpg
618
- vcoco_000000434637.jpg
619
- vcoco_000000535552.jpg
620
- vcoco_000000512455.jpg
621
- vcoco_000000331083.jpg
622
- vcoco_000000516318.jpg
623
- vcoco_000000288984.jpg
624
- vcoco_000000451751.jpg
625
- vcoco_000000295114.jpg
626
- vcoco_000000180584.jpg
627
- vcoco_000000494936.jpg
628
- vcoco_000000551175.jpg
629
- vcoco_000000536087.jpg
630
- vcoco_000000460997.jpg
631
- vcoco_000000561437.jpg
632
- vcoco_000000329307.jpg
633
- vcoco_000000035979.jpg
634
- vcoco_000000442695.jpg
635
- vcoco_000000307186.jpg
636
- vcoco_000000468612.jpg
637
- vcoco_000000426453.jpg
638
- vcoco_000000403109.jpg
639
- vcoco_000000521094.jpg
640
- vcoco_000000378499.jpg
641
- vcoco_000000343159.jpg
642
- vcoco_000000053121.jpg
643
- vcoco_000000008923.jpg
644
- vcoco_000000558454.jpg
645
- vcoco_000000402109.jpg
646
- vcoco_000000262642.jpg
647
- vcoco_000000570263.jpg
648
- vcoco_000000577980.jpg
649
- vcoco_000000500944.jpg
650
- vcoco_000000329016.jpg
651
- vcoco_000000517807.jpg
652
- vcoco_000000467113.jpg
653
- vcoco_000000498733.jpg
654
- vcoco_000000007333.jpg
655
- vcoco_000000308509.jpg
656
- vcoco_000000471601.jpg
657
- vcoco_000000109042.jpg
658
- vcoco_000000018250.jpg
659
- vcoco_000000427762.jpg
660
- vcoco_000000354976.jpg
661
- vcoco_000000057767.jpg
662
- vcoco_000000410066.jpg
663
- vcoco_000000195594.jpg
664
- vcoco_000000580972.jpg
665
- vcoco_000000438617.jpg
666
- vcoco_000000326420.jpg
667
- vcoco_000000349354.jpg
668
- vcoco_000000557396.jpg
669
- vcoco_000000492271.jpg
670
- vcoco_000000510138.jpg
671
- vcoco_000000496768.jpg
672
- vcoco_000000442097.jpg
673
- vcoco_000000324605.jpg
674
- vcoco_000000551439.jpg
675
- vcoco_000000314193.jpg
676
- vcoco_000000548224.jpg
677
- vcoco_000000526955.jpg
678
- vcoco_000000442094.jpg
679
- vcoco_000000517101.jpg
680
- vcoco_000000563302.jpg
681
- vcoco_000000497719.jpg
682
- vcoco_000000418074.jpg
683
- vcoco_000000431566.jpg
684
- vcoco_000000417911.jpg
685
- vcoco_000000166478.jpg
686
- vcoco_000000397777.jpg
687
- vcoco_000000535706.jpg
688
- vcoco_000000309120.jpg
689
- vcoco_000000396688.jpg
690
- vcoco_000000536607.jpg
691
- vcoco_000000321132.jpg
692
- vcoco_000000095211.jpg
693
- vcoco_000000266847.jpg
694
- vcoco_000000155873.jpg
695
- vcoco_000000080185.jpg
696
- vcoco_000000242612.jpg
697
- vcoco_000000555217.jpg
698
- vcoco_000000459258.jpg
699
- vcoco_000000177015.jpg
700
- vcoco_000000109503.jpg
701
- vcoco_000000390689.jpg
702
- vcoco_000000132430.jpg
703
- vcoco_000000431342.jpg
704
- vcoco_000000572749.jpg
705
- vcoco_000000557830.jpg
706
- vcoco_000000450709.jpg
707
- vcoco_000000310035.jpg
708
- vcoco_000000531696.jpg
709
- vcoco_000000334723.jpg
710
- vcoco_000000517941.jpg
711
- vcoco_000000467246.jpg
712
- vcoco_000000286953.jpg
713
- vcoco_000000550787.jpg
714
- vcoco_000000211604.jpg
715
- vcoco_000000495485.jpg
716
- vcoco_000000227370.jpg
717
- vcoco_000000477172.jpg
718
- vcoco_000000159213.jpg
719
- vcoco_000000376509.jpg
720
- vcoco_000000401310.jpg
721
- vcoco_000000480936.jpg
722
- vcoco_000000428254.jpg
723
- vcoco_000000316298.jpg
724
- vcoco_000000361384.jpg
725
- vcoco_000000451043.jpg
726
- vcoco_000000476738.jpg
727
- vcoco_000000504170.jpg
728
- vcoco_000000392443.jpg
729
- vcoco_000000053490.jpg
730
- vcoco_000000329841.jpg
731
- vcoco_000000358307.jpg
732
- vcoco_000000418907.jpg
733
- vcoco_000000312078.jpg
734
- vcoco_000000043872.jpg
735
- vcoco_000000550453.jpg
736
- vcoco_000000549937.jpg
737
- vcoco_000000247366.jpg
738
- vcoco_000000469198.jpg
739
- vcoco_000000379578.jpg
740
- vcoco_000000415885.jpg
741
- vcoco_000000111756.jpg
742
- vcoco_000000421309.jpg
743
- vcoco_000000373318.jpg
744
- vcoco_000000342770.jpg
745
- vcoco_000000379230.jpg
746
- vcoco_000000103705.jpg
747
- vcoco_000000160471.jpg
748
- vcoco_000000106575.jpg
749
- vcoco_000000374010.jpg
750
- vcoco_000000198426.jpg
751
- vcoco_000000321495.jpg
752
- vcoco_000000422517.jpg
753
- vcoco_000000180460.jpg
754
- vcoco_000000337439.jpg
755
- vcoco_000000441795.jpg
756
- vcoco_000000321907.jpg
757
- vcoco_000000460039.jpg
758
- vcoco_000000437592.jpg
759
- vcoco_000000084155.jpg
760
- vcoco_000000528517.jpg
761
- vcoco_000000412286.jpg
762
- vcoco_000000472394.jpg
763
- vcoco_000000132617.jpg
764
- vcoco_000000293353.jpg
765
- vcoco_000000554595.jpg
766
- vcoco_000000315200.jpg
767
- vcoco_000000498263.jpg
768
- vcoco_000000236141.jpg
769
- vcoco_000000321432.jpg
770
- vcoco_000000388468.jpg
771
- vcoco_000000487718.jpg
772
- vcoco_000000530543.jpg
773
- vcoco_000000405223.jpg
774
- vcoco_000000154362.jpg
775
- vcoco_000000417416.jpg
776
- vcoco_000000239204.jpg
777
- vcoco_000000570567.jpg
778
- vcoco_000000322362.jpg
779
- vcoco_000000160735.jpg
780
- vcoco_000000248831.jpg
781
- vcoco_000000518052.jpg
782
- vcoco_000000356505.jpg
783
- vcoco_000000208263.jpg
784
- vcoco_000000560704.jpg
785
- vcoco_000000387724.jpg
786
- vcoco_000000533159.jpg
787
- vcoco_000000399284.jpg
788
- vcoco_000000082936.jpg
789
- vcoco_000000154369.jpg
790
- vcoco_000000559209.jpg
791
- vcoco_000000508605.jpg
792
- vcoco_000000299723.jpg
793
- vcoco_000000075527.jpg
794
- vcoco_000000431480.jpg
795
- vcoco_000000570474.jpg
796
- vcoco_000000491449.jpg
797
- vcoco_000000398463.jpg
798
- vcoco_000000280083.jpg
799
- vcoco_000000343937.jpg
800
- vcoco_000000569758.jpg
801
- vcoco_000000265550.jpg
802
- vcoco_000000554059.jpg
803
- vcoco_000000397190.jpg
804
- vcoco_000000533742.jpg
805
- vcoco_000000569872.jpg
806
- vcoco_000000428288.jpg
807
- vcoco_000000077754.jpg
808
- vcoco_000000552188.jpg
809
- vcoco_000000573967.jpg
810
- vcoco_000000447330.jpg
811
- vcoco_000000513039.jpg
812
- vcoco_000000342929.jpg
813
- vcoco_000000396693.jpg
814
- vcoco_000000499027.jpg
815
- vcoco_000000312504.jpg
816
- vcoco_000000515785.jpg
817
- vcoco_000000119248.jpg
818
- vcoco_000000111910.jpg
819
- vcoco_000000053589.jpg
820
- vcoco_000000352399.jpg
821
- vcoco_000000260651.jpg
822
- vcoco_000000524047.jpg
823
- vcoco_000000384780.jpg
824
- vcoco_000000184227.jpg
825
- vcoco_000000549427.jpg
826
- vcoco_000000522054.jpg
827
- vcoco_000000338802.jpg
828
- vcoco_000000409198.jpg
829
- vcoco_000000158996.jpg
830
- vcoco_000000313220.jpg
831
- vcoco_000000396821.jpg
832
- vcoco_000000551763.jpg
833
- vcoco_000000039778.jpg
834
- vcoco_000000471762.jpg
835
- vcoco_000000408190.jpg
836
- vcoco_000000461884.jpg
837
- vcoco_000000208657.jpg
838
- vcoco_000000412296.jpg
839
- vcoco_000000513861.jpg
840
- vcoco_000000353740.jpg
841
- vcoco_000000551701.jpg
842
- vcoco_000000296459.jpg
843
- vcoco_000000276491.jpg
844
- vcoco_000000301443.jpg
845
- vcoco_000000399873.jpg
846
- vcoco_000000269015.jpg
847
- vcoco_000000551676.jpg
848
- vcoco_000000109937.jpg
849
- vcoco_000000553965.jpg
850
- vcoco_000000390315.jpg
851
- vcoco_000000329134.jpg
852
- vcoco_000000565877.jpg
853
- vcoco_000000053431.jpg
854
- vcoco_000000256475.jpg
855
- vcoco_000000270609.jpg
856
- vcoco_000000419262.jpg
857
- vcoco_000000487482.jpg
858
- vcoco_000000211520.jpg
859
- vcoco_000000528729.jpg
860
- vcoco_000000305004.jpg
861
- vcoco_000000453529.jpg
862
- vcoco_000000461898.jpg
863
- vcoco_000000499268.jpg
864
- vcoco_000000556892.jpg
865
- vcoco_000000536879.jpg
866
- vcoco_000000284831.jpg
867
- vcoco_000000338910.jpg
868
- vcoco_000000153797.jpg
869
- vcoco_000000450559.jpg
870
- vcoco_000000078436.jpg
871
- vcoco_000000546717.jpg
872
- vcoco_000000342174.jpg
873
- vcoco_000000047801.jpg
874
- vcoco_000000360297.jpg
875
- vcoco_000000417259.jpg
876
- vcoco_000000186711.jpg
877
- vcoco_000000517967.jpg
878
- vcoco_000000452964.jpg
879
- vcoco_000000036086.jpg
880
- vcoco_000000449603.jpg
881
- vcoco_000000315037.jpg
882
- vcoco_000000289572.jpg
883
- vcoco_000000446358.jpg
884
- vcoco_000000331858.jpg
885
- vcoco_000000132114.jpg
886
- vcoco_000000561223.jpg
887
- vcoco_000000120416.jpg
888
- vcoco_000000353968.jpg
889
- vcoco_000000511384.jpg
890
- vcoco_000000546295.jpg
891
- vcoco_000000547246.jpg
892
- vcoco_000000054516.jpg
893
- vcoco_000000343514.jpg
894
- vcoco_000000485027.jpg
895
- vcoco_000000573453.jpg
896
- vcoco_000000046893.jpg
897
- vcoco_000000330478.jpg
898
- vcoco_000000527002.jpg
899
- vcoco_000000017559.jpg
900
- vcoco_000000407441.jpg
901
- vcoco_000000365701.jpg
902
- vcoco_000000274870.jpg
903
- vcoco_000000311902.jpg
904
- vcoco_000000101065.jpg
905
- vcoco_000000498509.jpg
906
- vcoco_000000185479.jpg
907
- vcoco_000000121827.jpg
908
- vcoco_000000082666.jpg
909
- vcoco_000000456254.jpg
910
- vcoco_000000522758.jpg
911
- vcoco_000000084397.jpg
912
- vcoco_000000480747.jpg
913
- vcoco_000000431859.jpg
914
- vcoco_000000371497.jpg
915
- vcoco_000000431116.jpg
916
- vcoco_000000249046.jpg
917
- vcoco_000000316143.jpg
918
- vcoco_000000416188.jpg
919
- vcoco_000000260261.jpg
920
- vcoco_000000199381.jpg
921
- vcoco_000000465199.jpg
922
- vcoco_000000261569.jpg
923
- vcoco_000000524118.jpg
924
- vcoco_000000104999.jpg
925
- vcoco_000000189839.jpg
926
- vcoco_000000523997.jpg
927
- vcoco_000000554541.jpg
928
- vcoco_000000535100.jpg
929
- vcoco_000000529455.jpg
930
- vcoco_000000581062.jpg
931
- vcoco_000000420487.jpg
932
- vcoco_000000476827.jpg
933
- vcoco_000000373500.jpg
934
- vcoco_000000255495.jpg
935
- vcoco_000000050553.jpg
936
- vcoco_000000413044.jpg
937
- vcoco_000000384755.jpg
938
- vcoco_000000500005.jpg
939
- vcoco_000000401797.jpg
940
- vcoco_000000406294.jpg
941
- vcoco_000000274715.jpg
942
- vcoco_000000160001.jpg
943
- vcoco_000000446473.jpg
944
- vcoco_000000545525.jpg
945
- vcoco_000000551737.jpg
946
- vcoco_000000004386.jpg
947
- vcoco_000000045367.jpg
948
- vcoco_000000114458.jpg
949
- vcoco_000000249325.jpg
950
- vcoco_000000467257.jpg
951
- vcoco_000000504224.jpg
952
- vcoco_000000295154.jpg
953
- vcoco_000000516516.jpg
954
- vcoco_000000223214.jpg
955
- vcoco_000000112949.jpg
956
- vcoco_000000226660.jpg
957
- vcoco_000000519852.jpg
958
- vcoco_000000051181.jpg
959
- vcoco_000000170118.jpg
960
- vcoco_000000468162.jpg
961
- vcoco_000000565957.jpg
962
- vcoco_000000518370.jpg
963
- vcoco_000000371633.jpg
964
- vcoco_000000382307.jpg
965
- vcoco_000000533628.jpg
966
- vcoco_000000265810.jpg
967
- vcoco_000000454359.jpg
968
- vcoco_000000288576.jpg
969
- vcoco_000000276151.jpg
970
- vcoco_000000572326.jpg
971
- vcoco_000000459304.jpg
972
- vcoco_000000357916.jpg
973
- vcoco_000000173375.jpg
974
- vcoco_000000026132.jpg
975
- vcoco_000000450543.jpg
976
- vcoco_000000261318.jpg
977
- vcoco_000000458637.jpg
978
- vcoco_000000266160.jpg
979
- vcoco_000000419816.jpg
980
- vcoco_000000531036.jpg
981
- vcoco_000000537743.jpg
982
- vcoco_000000226562.jpg
983
- vcoco_000000437540.jpg
984
- vcoco_000000129379.jpg
985
- vcoco_000000258869.jpg
986
- vcoco_000000409523.jpg
987
- vcoco_000000494900.jpg
988
- vcoco_000000335650.jpg
989
- vcoco_000000511324.jpg
990
- vcoco_000000083778.jpg
991
- vcoco_000000054091.jpg
992
- vcoco_000000171016.jpg
993
- vcoco_000000554727.jpg
994
- vcoco_000000422545.jpg
995
- vcoco_000000132510.jpg
996
- vcoco_000000054007.jpg
997
- vcoco_000000562850.jpg
998
- vcoco_000000505234.jpg
999
- vcoco_000000208629.jpg
1000
- vcoco_000000521943.jpg
1001
- vcoco_000000278801.jpg
1002
- vcoco_000000175642.jpg
1003
- vcoco_000000016285.jpg
1004
- vcoco_000000262116.jpg
1005
- vcoco_000000332582.jpg
1006
- vcoco_000000549462.jpg
1007
- vcoco_000000220917.jpg
1008
- vcoco_000000553285.jpg
1009
- vcoco_000000240028.jpg
1010
- vcoco_000000524623.jpg
1011
- vcoco_000000517468.jpg
1012
- vcoco_000000043555.jpg
1013
- vcoco_000000107148.jpg
1014
- vcoco_000000415243.jpg
1015
- vcoco_000000555582.jpg
1016
- vcoco_000000147595.jpg
1017
- vcoco_000000497244.jpg
1018
- vcoco_000000117691.jpg
1019
- vcoco_000000381856.jpg
1020
- vcoco_000000576463.jpg
1021
- vcoco_000000250309.jpg
1022
- vcoco_000000510864.jpg
1023
- vcoco_000000269098.jpg
1024
- vcoco_000000483089.jpg
1025
- vcoco_000000490847.jpg
1026
- vcoco_000000574829.jpg
1027
- vcoco_000000085154.jpg
1028
- vcoco_000000498765.jpg
1029
- vcoco_000000431693.jpg
1030
- vcoco_000000408288.jpg
1031
- vcoco_000000000693.jpg
1032
- vcoco_000000330205.jpg
1033
- vcoco_000000097596.jpg
1034
- vcoco_000000316189.jpg
1035
- vcoco_000000462381.jpg
1036
- vcoco_000000565233.jpg
1037
- vcoco_000000536241.jpg
1038
- vcoco_000000407987.jpg
1039
- vcoco_000000436391.jpg
1040
- vcoco_000000298380.jpg
1041
- vcoco_000000534048.jpg
1042
- vcoco_000000345751.jpg
1043
- vcoco_000000395576.jpg
1044
- vcoco_000000453037.jpg
1045
- vcoco_000000575664.jpg
1046
- vcoco_000000535685.jpg
1047
- vcoco_000000016817.jpg
1048
- vcoco_000000333629.jpg
1049
- vcoco_000000397705.jpg
1050
- vcoco_000000095201.jpg
1051
- vcoco_000000376531.jpg
1052
- vcoco_000000578449.jpg
1053
- vcoco_000000097270.jpg
1054
- vcoco_000000143107.jpg
1055
- vcoco_000000161190.jpg
1056
- vcoco_000000185945.jpg
1057
- vcoco_000000491665.jpg
1058
- vcoco_000000468966.jpg
1059
- vcoco_000000177807.jpg
1060
- vcoco_000000336484.jpg
1061
- vcoco_000000515792.jpg
1062
- vcoco_000000480883.jpg
1063
- vcoco_000000544059.jpg
1064
- vcoco_000000483213.jpg
1065
- vcoco_000000232451.jpg
1066
- vcoco_000000033643.jpg
1067
- vcoco_000000426376.jpg
1068
- vcoco_000000025024.jpg
1069
- vcoco_000000399605.jpg
1070
- vcoco_000000223740.jpg
1071
- vcoco_000000263586.jpg
1072
- vcoco_000000311620.jpg
1073
- vcoco_000000140388.jpg
1074
- vcoco_000000053990.jpg
1075
- vcoco_000000410272.jpg
1076
- vcoco_000000527427.jpg
1077
- vcoco_000000063525.jpg
1078
- vcoco_000000570471.jpg
1079
- vcoco_000000267443.jpg
1080
- vcoco_000000379488.jpg
1081
- vcoco_000000008309.jpg
1082
- vcoco_000000241373.jpg
1083
- vcoco_000000540614.jpg
1084
- vcoco_000000056455.jpg
1085
- vcoco_000000158582.jpg
1086
- vcoco_000000004498.jpg
1087
- vcoco_000000076893.jpg
1088
- vcoco_000000319765.jpg
1089
- vcoco_000000563299.jpg
1090
- vcoco_000000533770.jpg
1091
- vcoco_000000275919.jpg
1092
- vcoco_000000502935.jpg
1093
- vcoco_000000276381.jpg
1094
- vcoco_000000358884.jpg
1095
- vcoco_000000346577.jpg
1096
- vcoco_000000331883.jpg
1097
- vcoco_000000549754.jpg
1098
- vcoco_000000310606.jpg
1099
- vcoco_000000151075.jpg
1100
- vcoco_000000418185.jpg
1101
- vcoco_000000328337.jpg
1102
- vcoco_000000117197.jpg
1103
- vcoco_000000152564.jpg
1104
- vcoco_000000502776.jpg
1105
- vcoco_000000517636.jpg
1106
- vcoco_000000182840.jpg
1107
- vcoco_000000471756.jpg
1108
- vcoco_000000332990.jpg
1109
- vcoco_000000076992.jpg
1110
- vcoco_000000487843.jpg
1111
- vcoco_000000576652.jpg
1112
- vcoco_000000534412.jpg
1113
- vcoco_000000366379.jpg
1114
- vcoco_000000002758.jpg
1115
- vcoco_000000123851.jpg
1116
- vcoco_000000467752.jpg
1117
- vcoco_000000074832.jpg
1118
- vcoco_000000383454.jpg
1119
- vcoco_000000440813.jpg
1120
- vcoco_000000440153.jpg
1121
- vcoco_000000025096.jpg
1122
- vcoco_000000094046.jpg
1123
- vcoco_000000038886.jpg
1124
- vcoco_000000545226.jpg
1125
- vcoco_000000537206.jpg
1126
- vcoco_000000419249.jpg
1127
- vcoco_000000456302.jpg
1128
- vcoco_000000549115.jpg
1129
- vcoco_000000563575.jpg
1130
- vcoco_000000581040.jpg
1131
- vcoco_000000454916.jpg
1132
- vcoco_000000308744.jpg
1133
- vcoco_000000488980.jpg
1134
- vcoco_000000235479.jpg
1135
- vcoco_000000322473.jpg
1136
- vcoco_000000291209.jpg
1137
- vcoco_000000262235.jpg
1138
- vcoco_000000482002.jpg
1139
- vcoco_000000554674.jpg
1140
- vcoco_000000108301.jpg
1141
- vcoco_000000281040.jpg
1142
- vcoco_000000423113.jpg
1143
- vcoco_000000207634.jpg
1144
- vcoco_000000292482.jpg
1145
- vcoco_000000141920.jpg
1146
- vcoco_000000520204.jpg
1147
- vcoco_000000548834.jpg
1148
- vcoco_000000490171.jpg
1149
- vcoco_000000271759.jpg
1150
- vcoco_000000490280.jpg
1151
- vcoco_000000552488.jpg
1152
- vcoco_000000141557.jpg
1153
- vcoco_000000407646.jpg
1154
- vcoco_000000351595.jpg
1155
- vcoco_000000544857.jpg
1156
- vcoco_000000361140.jpg
1157
- vcoco_000000282225.jpg
1158
- vcoco_000000527868.jpg
1159
- vcoco_000000078803.jpg
1160
- vcoco_000000375021.jpg
1161
- vcoco_000000340658.jpg
1162
- vcoco_000000088576.jpg
1163
- vcoco_000000426275.jpg
1164
- vcoco_000000213090.jpg
1165
- vcoco_000000110769.jpg
1166
- vcoco_000000383289.jpg
1167
- vcoco_000000079619.jpg
1168
- vcoco_000000463055.jpg
1169
- vcoco_000000578993.jpg
1170
- vcoco_000000536028.jpg
1171
- vcoco_000000381492.jpg
1172
- vcoco_000000248224.jpg
1173
- vcoco_000000393874.jpg
1174
- vcoco_000000418929.jpg
1175
- vcoco_000000146742.jpg
1176
- vcoco_000000515219.jpg
1177
- vcoco_000000083058.jpg
1178
- vcoco_000000291752.jpg
1179
- vcoco_000000386880.jpg
1180
- vcoco_000000482819.jpg
1181
- vcoco_000000051054.jpg
1182
- vcoco_000000120061.jpg
1183
- vcoco_000000030958.jpg
1184
- vcoco_000000523201.jpg
1185
- vcoco_000000030534.jpg
1186
- vcoco_000000203416.jpg
1187
- vcoco_000000424521.jpg
1188
- vcoco_000000462114.jpg
1189
- vcoco_000000527092.jpg
1190
- vcoco_000000503808.jpg
1191
- vcoco_000000140860.jpg
1192
- vcoco_000000372464.jpg
1193
- vcoco_000000335859.jpg
1194
- vcoco_000000258399.jpg
1195
- vcoco_000000299773.jpg
1196
- vcoco_000000480437.jpg
1197
- vcoco_000000547457.jpg
1198
- vcoco_000000420298.jpg
1199
- vcoco_000000044170.jpg
1200
- vcoco_000000290234.jpg
1201
- vcoco_000000490515.jpg
1202
- vcoco_000000439756.jpg
1203
- vcoco_000000084113.jpg
1204
- vcoco_000000018193.jpg
1205
- vcoco_000000381667.jpg
1206
- vcoco_000000272064.jpg
1207
- vcoco_000000455227.jpg
1208
- vcoco_000000122586.jpg
1209
- vcoco_000000360818.jpg
1210
- vcoco_000000575601.jpg
1211
- vcoco_000000459153.jpg
1212
- vcoco_000000171788.jpg
1213
- vcoco_000000447770.jpg
1214
- vcoco_000000008803.jpg
1215
- vcoco_000000481415.jpg
1216
- vcoco_000000568155.jpg
1217
- vcoco_000000402410.jpg
1218
- vcoco_000000137140.jpg
1219
- vcoco_000000035672.jpg
1220
- vcoco_000000521209.jpg
1221
- vcoco_000000050518.jpg
1222
- vcoco_000000345665.jpg
1223
- vcoco_000000376817.jpg
1224
- vcoco_000000537345.jpg
1225
- vcoco_000000450940.jpg
1226
- vcoco_000000454478.jpg
1227
- vcoco_000000368219.jpg
1228
- vcoco_000000331604.jpg
1229
- vcoco_000000295837.jpg
1230
- vcoco_000000580315.jpg
1231
- vcoco_000000457889.jpg
1232
- vcoco_000000342495.jpg
1233
- vcoco_000000451345.jpg
1234
- vcoco_000000191226.jpg
1235
- vcoco_000000460916.jpg
1236
- vcoco_000000291498.jpg
1237
- vcoco_000000388153.jpg
1238
- vcoco_000000438186.jpg
1239
- vcoco_000000485985.jpg
1240
- vcoco_000000075179.jpg
1241
- vcoco_000000576792.jpg
1242
- vcoco_000000298331.jpg
1243
- vcoco_000000549216.jpg
1244
- vcoco_000000002278.jpg
1245
- vcoco_000000560757.jpg
1246
- vcoco_000000234031.jpg
1247
- vcoco_000000068525.jpg
1248
- vcoco_000000519209.jpg
1249
- vcoco_000000184919.jpg
1250
- vcoco_000000324969.jpg
1251
- vcoco_000000401829.jpg
1252
- vcoco_000000504287.jpg
1253
- vcoco_000000478433.jpg
1254
- vcoco_000000576305.jpg
1255
- vcoco_000000493728.jpg
1256
- vcoco_000000462065.jpg
1257
- vcoco_000000388510.jpg
1258
- vcoco_000000114404.jpg
1259
- vcoco_000000467580.jpg
1260
- vcoco_000000578788.jpg
1261
- vcoco_000000465323.jpg
1262
- vcoco_000000294410.jpg
1263
- vcoco_000000290320.jpg
1264
- vcoco_000000506061.jpg
1265
- vcoco_000000168775.jpg
1266
- vcoco_000000398858.jpg
1267
- vcoco_000000450737.jpg
1268
- vcoco_000000412621.jpg
1269
- vcoco_000000413970.jpg
1270
- vcoco_000000278359.jpg
1271
- vcoco_000000239769.jpg
1272
- vcoco_000000499200.jpg
1273
- vcoco_000000258330.jpg
1274
- vcoco_000000478723.jpg
1275
- vcoco_000000438894.jpg
1276
- vcoco_000000537864.jpg
1277
- vcoco_000000075655.jpg
1278
- vcoco_000000258061.jpg
1279
- vcoco_000000442746.jpg
1280
- vcoco_000000099964.jpg
1281
- vcoco_000000367776.jpg
1282
- vcoco_000000579056.jpg
1283
- vcoco_000000203479.jpg
1284
- vcoco_000000408219.jpg
1285
- vcoco_000000353707.jpg
1286
- vcoco_000000431715.jpg
1287
- vcoco_000000357831.jpg
1288
- vcoco_000000143154.jpg
1289
- vcoco_000000309314.jpg
1290
- vcoco_000000498807.jpg
1291
- vcoco_000000484978.jpg
1292
- vcoco_000000341113.jpg
1293
- vcoco_000000118104.jpg
1294
- vcoco_000000516856.jpg
1295
- vcoco_000000409722.jpg
1296
- vcoco_000000048270.jpg
1297
- vcoco_000000175757.jpg
1298
- vcoco_000000447124.jpg
1299
- vcoco_000000551024.jpg
1300
- vcoco_000000365687.jpg
1301
- vcoco_000000310998.jpg
1302
- vcoco_000000295716.jpg
1303
- vcoco_000000368521.jpg
1304
- vcoco_000000160345.jpg
1305
- vcoco_000000570225.jpg
1306
- vcoco_000000365851.jpg
1307
- vcoco_000000439773.jpg
1308
- vcoco_000000467068.jpg
1309
- vcoco_000000548546.jpg
1310
- vcoco_000000081379.jpg
1311
- vcoco_000000395899.jpg
1312
- vcoco_000000312552.jpg
1313
- vcoco_000000476258.jpg
1314
- vcoco_000000415889.jpg
1315
- vcoco_000000268159.jpg
1316
- vcoco_000000405762.jpg
1317
- vcoco_000000313166.jpg
1318
- vcoco_000000142620.jpg
1319
- vcoco_000000248591.jpg
1320
- vcoco_000000244768.jpg
1321
- vcoco_000000322177.jpg
1322
- vcoco_000000469896.jpg
1323
- vcoco_000000247206.jpg
1324
- vcoco_000000389273.jpg
1325
- vcoco_000000505792.jpg
1326
- vcoco_000000158747.jpg
1327
- vcoco_000000487112.jpg
1328
- vcoco_000000541209.jpg
1329
- vcoco_000000278867.jpg
1330
- vcoco_000000170779.jpg
1331
- vcoco_000000404059.jpg
1332
- vcoco_000000473206.jpg
1333
- vcoco_000000509459.jpg
1334
- vcoco_000000240147.jpg
1335
- vcoco_000000043625.jpg
1336
- vcoco_000000042834.jpg
1337
- vcoco_000000404517.jpg
1338
- vcoco_000000077003.jpg
1339
- vcoco_000000397205.jpg
1340
- vcoco_000000338501.jpg
1341
- vcoco_000000031106.jpg
1342
- vcoco_000000146190.jpg
1343
- vcoco_000000409058.jpg
1344
- vcoco_000000432239.jpg
1345
- vcoco_000000520873.jpg
1346
- vcoco_000000408735.jpg
1347
- vcoco_000000574986.jpg
1348
- vcoco_000000410772.jpg
1349
- vcoco_000000464200.jpg
1350
- vcoco_000000574356.jpg
1351
- vcoco_000000040813.jpg
1352
- vcoco_000000497265.jpg
1353
- vcoco_000000247469.jpg
1354
- vcoco_000000118612.jpg
1355
- vcoco_000000492545.jpg
1356
- vcoco_000000330186.jpg
1357
- vcoco_000000568502.jpg
1358
- vcoco_000000572544.jpg
1359
- vcoco_000000263957.jpg
1360
- vcoco_000000304252.jpg
1361
- vcoco_000000008594.jpg
1362
- vcoco_000000105079.jpg
1363
- vcoco_000000029191.jpg
1364
- vcoco_000000027482.jpg
1365
- vcoco_000000445074.jpg
1366
- vcoco_000000564240.jpg
1367
- vcoco_000000065982.jpg
1368
- vcoco_000000510254.jpg
1369
- vcoco_000000290221.jpg
1370
- vcoco_000000264222.jpg
1371
- vcoco_000000055221.jpg
1372
- vcoco_000000330699.jpg
1373
- vcoco_000000406013.jpg
1374
- vcoco_000000068166.jpg
1375
- vcoco_000000290602.jpg
1376
- vcoco_000000474423.jpg
1377
- vcoco_000000525899.jpg
1378
- vcoco_000000433454.jpg
1379
- vcoco_000000393284.jpg
1380
- vcoco_000000475396.jpg
1381
- vcoco_000000571450.jpg
1382
- vcoco_000000325991.jpg
1383
- vcoco_000000547080.jpg
1384
- vcoco_000000206235.jpg
1385
- vcoco_000000350019.jpg
1386
- vcoco_000000564915.jpg
1387
- vcoco_000000156497.jpg
1388
- vcoco_000000129758.jpg
1389
- vcoco_000000413489.jpg
1390
- vcoco_000000187244.jpg
1391
- vcoco_000000134907.jpg
1392
- vcoco_000000572965.jpg
1393
- vcoco_000000501527.jpg
1394
- vcoco_000000493483.jpg
1395
- vcoco_000000566536.jpg
1396
- vcoco_000000405648.jpg
1397
- vcoco_000000484714.jpg
1398
- vcoco_000000067269.jpg
1399
- vcoco_000000336602.jpg
1400
- vcoco_000000113893.jpg
1401
- vcoco_000000325885.jpg
1402
- vcoco_000000519320.jpg
1403
- vcoco_000000011091.jpg
1404
- vcoco_000000476709.jpg
1405
- vcoco_000000333433.jpg
1406
- vcoco_000000106666.jpg
1407
- vcoco_000000525226.jpg
1408
- vcoco_000000304519.jpg
1409
- vcoco_000000152530.jpg
1410
- vcoco_000000293577.jpg
1411
- vcoco_000000298689.jpg
1412
- vcoco_000000276057.jpg
1413
- vcoco_000000410510.jpg
1414
- vcoco_000000247421.jpg
1415
- vcoco_000000381253.jpg
1416
- vcoco_000000316085.jpg
1417
- vcoco_000000508288.jpg
1418
- vcoco_000000448837.jpg
1419
- vcoco_000000444142.jpg
1420
- vcoco_000000314147.jpg
1421
- vcoco_000000369961.jpg
1422
- vcoco_000000282209.jpg
1423
- vcoco_000000097662.jpg
1424
- vcoco_000000077296.jpg
1425
- vcoco_000000260190.jpg
1426
- vcoco_000000454282.jpg
1427
- vcoco_000000566448.jpg
1428
- vcoco_000000510033.jpg
1429
- vcoco_000000566173.jpg
1430
- vcoco_000000548361.jpg
1431
- vcoco_000000485155.jpg
1432
- vcoco_000000451099.jpg
1433
- vcoco_000000222346.jpg
1434
- vcoco_000000446705.jpg
1435
- vcoco_000000506377.jpg
1436
- vcoco_000000079853.jpg
1437
- vcoco_000000513524.jpg
1438
- vcoco_000000368041.jpg
1439
- vcoco_000000124387.jpg
1440
- vcoco_000000369153.jpg
1441
- vcoco_000000041875.jpg
1442
- vcoco_000000309744.jpg
1443
- vcoco_000000231991.jpg
1444
- vcoco_000000541174.jpg
1445
- vcoco_000000470545.jpg
1446
- vcoco_000000317049.jpg
1447
- vcoco_000000461883.jpg
1448
- vcoco_000000406917.jpg
1449
- vcoco_000000552947.jpg
1450
- vcoco_000000272058.jpg
1451
- vcoco_000000350231.jpg
1452
- vcoco_000000465333.jpg
1453
- vcoco_000000505814.jpg
1454
- vcoco_000000147375.jpg
1455
- vcoco_000000493192.jpg
1456
- vcoco_000000275685.jpg
1457
- vcoco_000000248034.jpg
1458
- vcoco_000000416549.jpg
1459
- vcoco_000000126073.jpg
1460
- vcoco_000000501652.jpg
1461
- vcoco_000000323067.jpg
1462
- vcoco_000000015597.jpg
1463
- vcoco_000000510866.jpg
1464
- vcoco_000000461443.jpg
1465
- vcoco_000000567780.jpg
1466
- vcoco_000000497674.jpg
1467
- vcoco_000000321824.jpg
1468
- vcoco_000000572725.jpg
1469
- vcoco_000000298065.jpg
1470
- vcoco_000000354145.jpg
1471
- vcoco_000000380909.jpg
1472
- vcoco_000000449865.jpg
1473
- vcoco_000000136664.jpg
1474
- vcoco_000000542163.jpg
1475
- vcoco_000000135585.jpg
1476
- vcoco_000000454509.jpg
1477
- vcoco_000000535536.jpg
1478
- vcoco_000000509867.jpg
1479
- vcoco_000000404613.jpg
1480
- vcoco_000000308967.jpg
1481
- vcoco_000000331907.jpg
1482
- vcoco_000000569322.jpg
1483
- vcoco_000000519405.jpg
1484
- vcoco_000000447762.jpg
1485
- vcoco_000000092747.jpg
1486
- vcoco_000000250249.jpg
1487
- vcoco_000000519635.jpg
1488
- vcoco_000000487876.jpg
1489
- vcoco_000000570268.jpg
1490
- vcoco_000000409468.jpg
1491
- vcoco_000000468570.jpg
1492
- vcoco_000000542982.jpg
1493
- vcoco_000000295916.jpg
1494
- vcoco_000000540209.jpg
1495
- vcoco_000000236432.jpg
1496
- vcoco_000000543831.jpg
1497
- vcoco_000000464140.jpg
1498
- vcoco_000000384346.jpg
1499
- vcoco_000000468249.jpg
1500
- vcoco_000000237677.jpg
1501
- vcoco_000000061747.jpg
1502
- vcoco_000000472659.jpg
1503
- vcoco_000000400794.jpg
1504
- vcoco_000000341429.jpg
1505
- vcoco_000000079495.jpg
1506
- vcoco_000000368586.jpg
1507
- vcoco_000000305104.jpg
1508
- vcoco_000000273889.jpg
1509
- vcoco_000000163962.jpg
1510
- vcoco_000000420711.jpg
1511
- vcoco_000000448759.jpg
1512
- vcoco_000000334410.jpg
1513
- vcoco_000000427223.jpg
1514
- vcoco_000000183214.jpg
1515
- vcoco_000000232227.jpg
1516
- vcoco_000000339336.jpg
1517
- vcoco_000000145335.jpg
1518
- vcoco_000000461063.jpg
1519
- vcoco_000000121570.jpg
1520
- vcoco_000000061414.jpg
1521
- vcoco_000000011129.jpg
1522
- vcoco_000000187765.jpg
1523
- vcoco_000000114352.jpg
1524
- vcoco_000000549284.jpg
1525
- vcoco_000000553788.jpg
1526
- vcoco_000000507171.jpg
1527
- vcoco_000000431991.jpg
1528
- vcoco_000000057283.jpg
1529
- vcoco_000000023927.jpg
1530
- vcoco_000000341921.jpg
1531
- vcoco_000000233915.jpg
1532
- vcoco_000000403489.jpg
1533
- vcoco_000000033055.jpg
1534
- vcoco_000000465878.jpg
1535
- vcoco_000000283294.jpg
1536
- vcoco_000000524924.jpg
1537
- vcoco_000000245729.jpg
1538
- vcoco_000000405574.jpg
1539
- vcoco_000000515301.jpg
1540
- vcoco_000000231645.jpg
1541
- vcoco_000000533394.jpg
1542
- vcoco_000000079070.jpg
1543
- vcoco_000000251750.jpg
1544
- vcoco_000000292187.jpg
1545
- vcoco_000000407650.jpg
1546
- vcoco_000000516474.jpg
1547
- vcoco_000000488395.jpg
1548
- vcoco_000000014801.jpg
1549
- vcoco_000000046419.jpg
1550
- vcoco_000000186899.jpg
1551
- vcoco_000000419076.jpg
1552
- vcoco_000000513456.jpg
1553
- vcoco_000000484614.jpg
1554
- vcoco_000000043829.jpg
1555
- vcoco_000000420649.jpg
1556
- vcoco_000000221562.jpg
1557
- vcoco_000000322145.jpg
1558
- vcoco_000000119494.jpg
1559
- vcoco_000000036333.jpg
1560
- vcoco_000000343608.jpg
1561
- vcoco_000000233242.jpg
1562
- vcoco_000000385753.jpg
1563
- vcoco_000000456895.jpg
1564
- vcoco_000000407139.jpg
1565
- vcoco_000000441900.jpg
1566
- vcoco_000000459645.jpg
1567
- vcoco_000000346313.jpg
1568
- vcoco_000000327174.jpg
1569
- vcoco_000000441459.jpg
1570
- vcoco_000000020599.jpg
1571
- vcoco_000000462186.jpg
1572
- vcoco_000000185697.jpg
1573
- vcoco_000000554354.jpg
1574
- vcoco_000000482735.jpg
1575
- vcoco_000000463884.jpg
1576
- vcoco_000000389554.jpg
1577
- vcoco_000000068205.jpg
1578
- vcoco_000000357383.jpg
1579
- vcoco_000000158818.jpg
1580
- vcoco_000000442961.jpg
1581
- vcoco_000000512436.jpg
1582
- vcoco_000000049893.jpg
1583
- vcoco_000000492677.jpg
1584
- vcoco_000000421361.jpg
1585
- vcoco_000000180606.jpg
1586
- vcoco_000000414385.jpg
1587
- vcoco_000000406129.jpg
1588
- vcoco_000000154567.jpg
1589
- vcoco_000000445101.jpg
1590
- vcoco_000000364102.jpg
1591
- vcoco_000000014151.jpg
1592
- vcoco_000000475229.jpg
1593
- vcoco_000000016344.jpg
1594
- vcoco_000000018728.jpg
1595
- vcoco_000000393699.jpg
1596
- vcoco_000000273155.jpg
1597
- vcoco_000000135604.jpg
1598
- vcoco_000000239130.jpg
1599
- vcoco_000000296492.jpg
1600
- vcoco_000000185598.jpg
1601
- vcoco_000000290224.jpg
1602
- vcoco_000000373078.jpg
1603
- vcoco_000000263834.jpg
1604
- vcoco_000000530998.jpg
1605
- vcoco_000000488707.jpg
1606
- vcoco_000000249561.jpg
1607
- vcoco_000000433845.jpg
1608
- vcoco_000000565993.jpg
1609
- vcoco_000000408239.jpg
1610
- vcoco_000000304336.jpg
1611
- vcoco_000000437331.jpg
1612
- vcoco_000000552254.jpg
1613
- vcoco_000000231153.jpg
1614
- vcoco_000000490437.jpg
1615
- vcoco_000000495523.jpg
1616
- vcoco_000000129563.jpg
1617
- vcoco_000000463576.jpg
1618
- vcoco_000000574506.jpg
1619
- vcoco_000000172315.jpg
1620
- vcoco_000000519479.jpg
1621
- vcoco_000000526458.jpg
1622
- vcoco_000000326284.jpg
1623
- vcoco_000000403975.jpg
1624
- vcoco_000000391284.jpg
1625
- vcoco_000000329604.jpg
1626
- vcoco_000000082622.jpg
1627
- vcoco_000000348636.jpg
1628
- vcoco_000000419333.jpg
1629
- vcoco_000000579042.jpg
1630
- vcoco_000000381789.jpg
1631
- vcoco_000000248170.jpg
1632
- vcoco_000000276055.jpg
1633
- vcoco_000000245067.jpg
1634
- vcoco_000000206747.jpg
1635
- vcoco_000000378670.jpg
1636
- vcoco_000000414578.jpg
1637
- vcoco_000000000589.jpg
1638
- vcoco_000000441598.jpg
1639
- vcoco_000000282680.jpg
1640
- vcoco_000000491681.jpg
1641
- vcoco_000000522637.jpg
1642
- vcoco_000000287402.jpg
1643
- vcoco_000000444913.jpg
1644
- vcoco_000000379980.jpg
1645
- vcoco_000000563349.jpg
1646
- vcoco_000000354144.jpg
1647
- vcoco_000000246656.jpg
1648
- vcoco_000000070733.jpg
1649
- vcoco_000000345154.jpg
1650
- vcoco_000000085974.jpg
1651
- vcoco_000000482750.jpg
1652
- vcoco_000000530558.jpg
1653
- vcoco_000000389974.jpg
1654
- vcoco_000000460837.jpg
1655
- vcoco_000000417016.jpg
1656
- vcoco_000000158107.jpg
1657
- vcoco_000000004567.jpg
1658
- vcoco_000000361623.jpg
1659
- vcoco_000000315025.jpg
1660
- vcoco_000000348631.jpg
1661
- vcoco_000000558066.jpg
1662
- vcoco_000000109992.jpg
1663
- vcoco_000000367582.jpg
1664
- vcoco_000000011625.jpg
1665
- vcoco_000000437831.jpg
1666
- vcoco_000000355762.jpg
1667
- vcoco_000000581124.jpg
1668
- vcoco_000000089052.jpg
1669
- vcoco_000000562296.jpg
1670
- vcoco_000000489339.jpg
1671
- vcoco_000000102903.jpg
1672
- vcoco_000000349897.jpg
1673
- vcoco_000000501339.jpg
1674
- vcoco_000000069440.jpg
1675
- vcoco_000000434548.jpg
1676
- vcoco_000000532055.jpg
1677
- vcoco_000000279197.jpg
1678
- vcoco_000000157102.jpg
1679
- vcoco_000000067974.jpg
1680
- vcoco_000000007977.jpg
1681
- vcoco_000000254454.jpg
1682
- vcoco_000000494309.jpg
1683
- vcoco_000000380636.jpg
1684
- vcoco_000000261732.jpg
1685
- vcoco_000000378116.jpg
1686
- vcoco_000000145385.jpg
1687
- vcoco_000000525702.jpg
1688
- vcoco_000000265815.jpg
1689
- vcoco_000000512944.jpg
1690
- vcoco_000000347482.jpg
1691
- vcoco_000000073446.jpg
1692
- vcoco_000000484701.jpg
1693
- vcoco_000000556332.jpg
1694
- vcoco_000000064189.jpg
1695
- vcoco_000000396975.jpg
1696
- vcoco_000000308759.jpg
1697
- vcoco_000000283750.jpg
1698
- vcoco_000000290282.jpg
1699
- vcoco_000000546987.jpg
1700
- vcoco_000000456485.jpg
1701
- vcoco_000000093612.jpg
1702
- vcoco_000000230315.jpg
1703
- vcoco_000000490279.jpg
1704
- vcoco_000000441518.jpg
1705
- vcoco_000000048564.jpg
1706
- vcoco_000000484599.jpg
1707
- vcoco_000000400010.jpg
1708
- vcoco_000000286425.jpg
1709
- vcoco_000000434580.jpg
1710
- vcoco_000000562045.jpg
1711
- vcoco_000000258043.jpg
1712
- vcoco_000000305319.jpg
1713
- vcoco_000000499979.jpg
1714
- vcoco_000000364994.jpg
1715
- vcoco_000000324232.jpg
1716
- vcoco_000000424303.jpg
1717
- vcoco_000000550023.jpg
1718
- vcoco_000000398076.jpg
1719
- vcoco_000000053410.jpg
1720
- vcoco_000000578861.jpg
1721
- vcoco_000000153909.jpg
1722
- vcoco_000000527493.jpg
1723
- vcoco_000000330901.jpg
1724
- vcoco_000000166376.jpg
1725
- vcoco_000000188137.jpg
1726
- vcoco_000000429158.jpg
1727
- vcoco_000000075682.jpg
1728
- vcoco_000000069320.jpg
1729
- vcoco_000000424225.jpg
1730
- vcoco_000000357743.jpg
1731
- vcoco_000000562581.jpg
1732
- vcoco_000000556966.jpg
1733
- vcoco_000000469067.jpg
1734
- vcoco_000000417700.jpg
1735
- vcoco_000000558826.jpg
1736
- vcoco_000000438504.jpg
1737
- vcoco_000000171139.jpg
1738
- vcoco_000000537316.jpg
1739
- vcoco_000000296033.jpg
1740
- vcoco_000000356490.jpg
1741
- vcoco_000000067975.jpg
1742
- vcoco_000000433637.jpg
1743
- vcoco_000000073753.jpg
1744
- vcoco_000000335594.jpg
1745
- vcoco_000000539573.jpg
1746
- vcoco_000000303342.jpg
1747
- vcoco_000000412399.jpg
1748
- vcoco_000000519631.jpg
1749
- vcoco_000000046441.jpg
1750
- vcoco_000000437452.jpg
1751
- vcoco_000000278203.jpg
1752
- vcoco_000000563849.jpg
1753
- vcoco_000000469274.jpg
1754
- vcoco_000000460240.jpg
1755
- vcoco_000000361397.jpg
1756
- vcoco_000000355297.jpg
1757
- vcoco_000000418034.jpg
1758
- vcoco_000000374702.jpg
1759
- vcoco_000000376366.jpg
1760
- vcoco_000000456433.jpg
1761
- vcoco_000000564738.jpg
1762
- vcoco_000000278853.jpg
1763
- vcoco_000000436302.jpg
1764
- vcoco_000000580466.jpg
1765
- vcoco_000000297326.jpg
1766
- vcoco_000000402396.jpg
1767
- vcoco_000000574460.jpg
1768
- vcoco_000000549361.jpg
1769
- vcoco_000000527704.jpg
1770
- vcoco_000000156192.jpg
1771
- vcoco_000000365735.jpg
1772
- vcoco_000000431494.jpg
1773
- vcoco_000000117987.jpg
1774
- vcoco_000000429170.jpg
1775
- vcoco_000000535770.jpg
1776
- vcoco_000000412788.jpg
1777
- vcoco_000000233266.jpg
1778
- vcoco_000000424548.jpg
1779
- vcoco_000000444152.jpg
1780
- vcoco_000000303429.jpg
1781
- vcoco_000000493742.jpg
1782
- vcoco_000000465911.jpg
1783
- vcoco_000000463174.jpg
1784
- vcoco_000000037039.jpg
1785
- vcoco_000000347346.jpg
1786
- vcoco_000000313914.jpg
1787
- vcoco_000000561337.jpg
1788
- vcoco_000000015140.jpg
1789
- vcoco_000000398781.jpg
1790
- vcoco_000000563951.jpg
1791
- vcoco_000000350360.jpg
1792
- vcoco_000000136687.jpg
1793
- vcoco_000000449114.jpg
1794
- vcoco_000000577928.jpg
1795
- vcoco_000000049858.jpg
1796
- vcoco_000000555271.jpg
1797
- vcoco_000000228413.jpg
1798
- vcoco_000000460346.jpg
1799
- vcoco_000000382855.jpg
1800
- vcoco_000000519744.jpg
1801
- vcoco_000000456950.jpg
1802
- vcoco_000000431062.jpg
1803
- vcoco_000000419171.jpg
1804
- vcoco_000000109229.jpg
1805
- vcoco_000000056118.jpg
1806
- vcoco_000000310981.jpg
1807
- vcoco_000000027972.jpg
1808
- vcoco_000000244646.jpg
1809
- vcoco_000000294634.jpg
1810
- vcoco_000000134496.jpg
1811
- vcoco_000000213790.jpg
1812
- vcoco_000000313313.jpg
1813
- vcoco_000000070296.jpg
1814
- vcoco_000000561809.jpg
1815
- vcoco_000000563927.jpg
1816
- vcoco_000000396853.jpg
1817
- vcoco_000000147331.jpg
1818
- vcoco_000000512211.jpg
1819
- vcoco_000000538122.jpg
1820
- vcoco_000000037655.jpg
1821
- vcoco_000000414670.jpg
1822
- vcoco_000000361046.jpg
1823
- vcoco_000000143263.jpg
1824
- vcoco_000000415153.jpg
1825
- vcoco_000000475191.jpg
1826
- vcoco_000000491130.jpg
1827
- vcoco_000000172597.jpg
1828
- vcoco_000000192095.jpg
1829
- vcoco_000000571012.jpg
1830
- vcoco_000000236068.jpg
1831
- vcoco_000000564515.jpg
1832
- vcoco_000000117508.jpg
1833
- vcoco_000000435910.jpg
1834
- vcoco_000000455334.jpg
1835
- vcoco_000000308576.jpg
1836
- vcoco_000000134589.jpg
1837
- vcoco_000000055857.jpg
1838
- vcoco_000000057062.jpg
1839
- vcoco_000000202339.jpg
1840
- vcoco_000000402118.jpg
1841
- vcoco_000000580381.jpg
1842
- vcoco_000000533315.jpg
1843
- vcoco_000000146963.jpg
1844
- vcoco_000000534906.jpg
1845
- vcoco_000000110618.jpg
1846
- vcoco_000000465556.jpg
1847
- vcoco_000000347390.jpg
1848
- vcoco_000000416473.jpg
1849
- vcoco_000000358206.jpg
1850
- vcoco_000000028547.jpg
1851
- vcoco_000000302958.jpg
1852
- vcoco_000000464789.jpg
1853
- vcoco_000000438807.jpg
1854
- vcoco_000000565612.jpg
1855
- vcoco_000000010579.jpg
1856
- vcoco_000000472757.jpg
1857
- vcoco_000000433547.jpg
1858
- vcoco_000000294863.jpg
1859
- vcoco_000000063721.jpg
1860
- vcoco_000000204049.jpg
1861
- vcoco_000000574961.jpg
1862
- vcoco_000000491090.jpg
1863
- vcoco_000000552065.jpg
1864
- vcoco_000000416267.jpg
1865
- vcoco_000000525546.jpg
1866
- vcoco_000000136672.jpg
1867
- vcoco_000000018704.jpg
1868
- vcoco_000000552985.jpg
1869
- vcoco_000000412285.jpg
1870
- vcoco_000000400907.jpg
1871
- vcoco_000000501515.jpg
1872
- vcoco_000000512827.jpg
1873
- vcoco_000000293275.jpg
1874
- vcoco_000000551849.jpg
1875
- vcoco_000000171210.jpg
1876
- vcoco_000000383046.jpg
1877
- vcoco_000000284648.jpg
1878
- vcoco_000000177069.jpg
1879
- vcoco_000000274970.jpg
1880
- vcoco_000000299859.jpg
1881
- vcoco_000000447911.jpg
1882
- vcoco_000000162530.jpg
1883
- vcoco_000000430581.jpg
1884
- vcoco_000000562192.jpg
1885
- vcoco_000000345559.jpg
1886
- vcoco_000000541374.jpg
1887
- vcoco_000000151084.jpg
1888
- vcoco_000000391046.jpg
1889
- vcoco_000000002583.jpg
1890
- vcoco_000000094593.jpg
1891
- vcoco_000000263403.jpg
1892
- vcoco_000000167962.jpg
1893
- vcoco_000000577277.jpg
1894
- vcoco_000000198198.jpg
1895
- vcoco_000000461110.jpg
1896
- vcoco_000000393569.jpg
1897
- vcoco_000000497668.jpg
1898
- vcoco_000000434193.jpg
1899
- vcoco_000000550365.jpg
1900
- vcoco_000000184978.jpg
1901
- vcoco_000000549055.jpg
1902
- vcoco_000000531739.jpg
1903
- vcoco_000000215280.jpg
1904
- vcoco_000000482810.jpg
1905
- vcoco_000000261977.jpg
1906
- vcoco_000000305195.jpg
1907
- vcoco_000000425798.jpg
1908
- vcoco_000000327864.jpg
1909
- vcoco_000000380100.jpg
1910
- vcoco_000000539529.jpg
1911
- vcoco_000000507935.jpg
1912
- vcoco_000000578849.jpg
1913
- vcoco_000000414373.jpg
1914
- vcoco_000000239930.jpg
1915
- vcoco_000000204726.jpg
1916
- vcoco_000000251576.jpg
1917
- vcoco_000000507211.jpg
1918
- vcoco_000000474601.jpg
1919
- vcoco_000000355257.jpg
1920
- vcoco_000000537905.jpg
1921
- vcoco_000000580507.jpg
1922
- vcoco_000000336015.jpg
1923
- vcoco_000000290398.jpg
1924
- vcoco_000000137682.jpg
1925
- vcoco_000000534210.jpg
1926
- vcoco_000000141887.jpg
1927
- vcoco_000000396941.jpg
1928
- vcoco_000000192039.jpg
1929
- vcoco_000000442348.jpg
1930
- vcoco_000000246001.jpg
1931
- vcoco_000000082715.jpg
1932
- vcoco_000000192932.jpg
1933
- vcoco_000000328144.jpg
1934
- vcoco_000000364126.jpg
1935
- vcoco_000000034993.jpg
1936
- vcoco_000000170852.jpg
1937
- vcoco_000000373785.jpg
1938
- vcoco_000000505265.jpg
1939
- vcoco_000000327417.jpg
1940
- vcoco_000000489944.jpg
1941
- vcoco_000000298362.jpg
1942
- vcoco_000000524638.jpg
1943
- vcoco_000000364283.jpg
1944
- vcoco_000000075587.jpg
1945
- vcoco_000000459641.jpg
1946
- vcoco_000000138861.jpg
1947
- vcoco_000000063563.jpg
1948
- vcoco_000000108879.jpg
1949
- vcoco_000000388381.jpg
1950
- vcoco_000000113041.jpg
1951
- vcoco_000000551215.jpg
1952
- vcoco_000000072281.jpg
1953
- vcoco_000000286171.jpg
1954
- vcoco_000000200058.jpg
1955
- vcoco_000000380609.jpg
1956
- vcoco_000000328397.jpg
1957
- vcoco_000000564289.jpg
1958
- vcoco_000000518273.jpg
1959
- vcoco_000000399129.jpg
1960
- vcoco_000000202115.jpg
1961
- vcoco_000000399983.jpg
1962
- vcoco_000000377159.jpg
1963
- vcoco_000000525170.jpg
1964
- vcoco_000000492881.jpg
1965
- vcoco_000000071313.jpg
1966
- vcoco_000000049891.jpg
1967
- vcoco_000000264572.jpg
1968
- vcoco_000000415872.jpg
1969
- vcoco_000000163682.jpg
1970
- vcoco_000000430036.jpg
1971
- vcoco_000000287038.jpg
1972
- vcoco_000000334301.jpg
1973
- vcoco_000000137387.jpg
1974
- vcoco_000000137315.jpg
1975
- vcoco_000000166297.jpg
1976
- vcoco_000000275448.jpg
1977
- vcoco_000000558457.jpg
1978
- vcoco_000000355918.jpg
1979
- vcoco_000000495525.jpg
1980
- vcoco_000000394286.jpg
1981
- vcoco_000000013867.jpg
1982
- vcoco_000000526082.jpg
1983
- vcoco_000000511929.jpg
1984
- vcoco_000000412062.jpg
1985
- vcoco_000000494113.jpg
1986
- vcoco_000000473133.jpg
1987
- vcoco_000000529283.jpg
1988
- vcoco_000000452060.jpg
1989
- vcoco_000000528471.jpg
1990
- vcoco_000000460857.jpg
1991
- vcoco_000000561383.jpg
1992
- vcoco_000000140633.jpg
1993
- vcoco_000000461647.jpg
1994
- vcoco_000000350668.jpg
1995
- vcoco_000000560646.jpg
1996
- vcoco_000000206912.jpg
1997
- vcoco_000000381826.jpg
1998
- vcoco_000000109679.jpg
1999
- vcoco_000000546670.jpg
2000
- vcoco_000000514950.jpg
2001
- vcoco_000000046042.jpg
2002
- vcoco_000000006380.jpg
2003
- vcoco_000000559145.jpg
2004
- vcoco_000000490400.jpg
2005
- vcoco_000000350160.jpg
2006
- vcoco_000000001108.jpg
2007
- vcoco_000000436183.jpg
2008
- vcoco_000000321258.jpg
2009
- vcoco_000000572505.jpg
2010
- vcoco_000000048489.jpg
2011
- vcoco_000000330920.jpg
2012
- vcoco_000000270275.jpg
2013
- vcoco_000000547428.jpg
2014
- vcoco_000000147488.jpg
2015
- vcoco_000000558839.jpg
2016
- vcoco_000000078061.jpg
2017
- vcoco_000000485943.jpg
2018
- vcoco_000000525762.jpg
2019
- vcoco_000000117584.jpg
2020
- vcoco_000000096304.jpg
2021
- vcoco_000000147088.jpg
2022
- vcoco_000000434510.jpg
2023
- vcoco_000000301604.jpg
2024
- vcoco_000000319350.jpg
2025
- vcoco_000000292988.jpg
2026
- vcoco_000000467612.jpg
2027
- vcoco_000000561042.jpg
2028
- vcoco_000000401167.jpg
2029
- vcoco_000000563885.jpg
2030
- vcoco_000000548318.jpg
2031
- vcoco_000000304008.jpg
2032
- vcoco_000000128570.jpg
2033
- vcoco_000000529139.jpg
2034
- vcoco_000000195568.jpg
2035
- vcoco_000000339986.jpg
2036
- vcoco_000000221864.jpg
2037
- vcoco_000000536977.jpg
2038
- vcoco_000000315603.jpg
2039
- vcoco_000000135288.jpg
2040
- vcoco_000000560108.jpg
2041
- vcoco_000000556018.jpg
2042
- vcoco_000000553609.jpg
2043
- vcoco_000000459991.jpg
2044
- vcoco_000000401244.jpg
2045
- vcoco_000000304757.jpg
2046
- vcoco_000000430369.jpg
2047
- vcoco_000000119640.jpg
2048
- vcoco_000000153380.jpg
2049
- vcoco_000000480116.jpg
2050
- vcoco_000000012991.jpg
2051
- vcoco_000000461860.jpg
2052
- vcoco_000000331298.jpg
2053
- vcoco_000000349750.jpg
2054
- vcoco_000000278204.jpg
2055
- vcoco_000000129784.jpg
2056
- vcoco_000000532493.jpg
2057
- vcoco_000000313848.jpg
2058
- vcoco_000000513077.jpg
2059
- vcoco_000000188375.jpg
2060
- vcoco_000000345855.jpg
2061
- vcoco_000000295740.jpg
2062
- vcoco_000000398423.jpg
2063
- vcoco_000000106664.jpg
2064
- vcoco_000000386116.jpg
2065
- vcoco_000000500019.jpg
2066
- vcoco_000000254368.jpg
2067
- vcoco_000000286460.jpg
2068
- vcoco_000000278323.jpg
2069
- vcoco_000000459078.jpg
2070
- vcoco_000000204075.jpg
2071
- vcoco_000000094350.jpg
2072
- vcoco_000000365187.jpg
2073
- vcoco_000000312439.jpg
2074
- vcoco_000000348263.jpg
2075
- vcoco_000000332352.jpg
2076
- vcoco_000000123013.jpg
2077
- vcoco_000000499105.jpg
2078
- vcoco_000000320396.jpg
2079
- vcoco_000000052016.jpg
2080
- vcoco_000000096705.jpg
2081
- vcoco_000000143101.jpg
2082
- vcoco_000000404766.jpg
2083
- vcoco_000000404367.jpg
2084
- vcoco_000000511670.jpg
2085
- vcoco_000000363826.jpg
2086
- vcoco_000000487957.jpg
2087
- vcoco_000000430610.jpg
2088
- vcoco_000000029931.jpg
2089
- vcoco_000000189831.jpg
2090
- vcoco_000000301247.jpg
2091
- vcoco_000000489739.jpg
2092
- vcoco_000000576468.jpg
2093
- vcoco_000000324036.jpg
2094
- vcoco_000000304834.jpg
2095
- vcoco_000000581328.jpg
2096
- vcoco_000000083408.jpg
2097
- vcoco_000000440840.jpg
2098
- vcoco_000000557685.jpg
2099
- vcoco_000000235994.jpg
2100
- vcoco_000000118614.jpg
2101
- vcoco_000000465422.jpg
2102
- vcoco_000000300408.jpg
2103
- vcoco_000000094607.jpg
2104
- vcoco_000000052803.jpg
2105
- vcoco_000000281534.jpg
2106
- vcoco_000000401897.jpg
2107
- vcoco_000000292647.jpg
2108
- vcoco_000000425361.jpg
2109
- vcoco_000000312269.jpg
2110
- vcoco_000000556883.jpg
2111
- vcoco_000000038721.jpg
2112
- vcoco_000000053464.jpg
2113
- vcoco_000000016737.jpg
2114
- vcoco_000000556108.jpg
2115
- vcoco_000000044057.jpg
2116
- vcoco_000000308996.jpg
2117
- vcoco_000000187574.jpg
2118
- vcoco_000000563945.jpg
2119
- vcoco_000000097278.jpg
2120
- vcoco_000000011591.jpg
2121
- vcoco_000000497082.jpg
2122
- vcoco_000000513292.jpg
2123
- vcoco_000000480663.jpg
2124
- vcoco_000000037325.jpg
2125
- vcoco_000000342523.jpg
2126
- vcoco_000000334671.jpg
2127
- vcoco_000000535251.jpg
2128
- vcoco_000000080273.jpg
2129
- vcoco_000000422560.jpg
2130
- vcoco_000000543644.jpg
2131
- vcoco_000000406982.jpg
2132
- vcoco_000000301541.jpg
2133
- vcoco_000000434930.jpg
2134
- vcoco_000000431893.jpg
2135
- vcoco_000000535179.jpg
2136
- vcoco_000000316237.jpg
2137
- vcoco_000000577875.jpg
2138
- vcoco_000000439443.jpg
2139
- vcoco_000000033731.jpg
2140
- vcoco_000000573065.jpg
2141
- vcoco_000000029719.jpg
2142
- vcoco_000000475765.jpg
2143
- vcoco_000000357898.jpg
2144
- vcoco_000000351793.jpg
2145
- vcoco_000000574805.jpg
2146
- vcoco_000000027221.jpg
2147
- vcoco_000000493628.jpg
2148
- vcoco_000000199553.jpg
2149
- vcoco_000000056433.jpg
2150
- vcoco_000000134193.jpg
2151
- vcoco_000000298344.jpg
2152
- vcoco_000000124979.jpg
2153
- vcoco_000000378831.jpg
2154
- vcoco_000000467887.jpg
2155
- vcoco_000000558134.jpg
2156
- vcoco_000000300786.jpg
2157
- vcoco_000000505309.jpg
2158
- vcoco_000000484575.jpg
2159
- vcoco_000000416973.jpg
2160
- vcoco_000000457021.jpg
2161
- vcoco_000000159731.jpg
2162
- vcoco_000000442225.jpg
2163
- vcoco_000000168335.jpg
2164
- vcoco_000000210249.jpg
2165
- vcoco_000000343704.jpg
2166
- vcoco_000000385861.jpg
2167
- vcoco_000000388512.jpg
2168
- vcoco_000000154861.jpg
2169
- vcoco_000000257421.jpg
2170
- vcoco_000000277418.jpg
2171
- vcoco_000000566908.jpg
2172
- vcoco_000000039643.jpg
2173
- vcoco_000000378454.jpg
2174
- vcoco_000000214127.jpg
2175
- vcoco_000000270871.jpg
2176
- vcoco_000000484849.jpg
2177
- vcoco_000000346352.jpg
2178
- vcoco_000000299869.jpg
2179
- vcoco_000000037102.jpg
2180
- vcoco_000000146676.jpg
2181
- vcoco_000000154254.jpg
2182
- vcoco_000000467477.jpg
2183
- vcoco_000000448113.jpg
2184
- vcoco_000000399885.jpg
2185
- vcoco_000000575921.jpg
2186
- vcoco_000000307426.jpg
2187
- vcoco_000000478338.jpg
2188
- vcoco_000000433136.jpg
2189
- vcoco_000000359589.jpg
2190
- vcoco_000000520150.jpg
2191
- vcoco_000000339611.jpg
2192
- vcoco_000000285505.jpg
2193
- vcoco_000000472024.jpg
2194
- vcoco_000000144582.jpg
2195
- vcoco_000000540834.jpg
2196
- vcoco_000000397809.jpg
2197
- vcoco_000000102935.jpg
2198
- vcoco_000000052433.jpg
2199
- vcoco_000000038828.jpg
2200
- vcoco_000000379180.jpg
2201
- vcoco_000000152202.jpg
2202
- vcoco_000000199555.jpg
2203
- vcoco_000000314356.jpg
2204
- vcoco_000000208995.jpg
2205
- vcoco_000000314694.jpg
2206
- vcoco_000000171384.jpg
2207
- vcoco_000000580235.jpg
2208
- vcoco_000000563031.jpg
2209
- vcoco_000000499705.jpg
2210
- vcoco_000000367622.jpg
2211
- vcoco_000000559388.jpg
2212
- vcoco_000000412001.jpg
2213
- vcoco_000000247134.jpg
2214
- vcoco_000000058869.jpg
2215
- vcoco_000000078925.jpg
2216
- vcoco_000000527480.jpg
2217
- vcoco_000000221378.jpg
2218
- vcoco_000000158428.jpg
2219
- vcoco_000000327436.jpg
2220
- vcoco_000000283524.jpg
2221
- vcoco_000000209468.jpg
2222
- vcoco_000000454143.jpg
2223
- vcoco_000000311116.jpg
2224
- vcoco_000000357971.jpg
2225
- vcoco_000000401428.jpg
2226
- vcoco_000000360434.jpg
2227
- vcoco_000000290415.jpg
2228
- vcoco_000000474024.jpg
2229
- vcoco_000000416625.jpg
2230
- vcoco_000000010534.jpg
2231
- vcoco_000000369529.jpg
2232
- vcoco_000000178184.jpg
2233
- vcoco_000000502440.jpg
2234
- vcoco_000000551608.jpg
2235
- vcoco_000000534395.jpg
2236
- vcoco_000000458932.jpg
2237
- vcoco_000000444502.jpg
2238
- vcoco_000000347571.jpg
2239
- vcoco_000000464752.jpg
2240
- vcoco_000000345288.jpg
2241
- vcoco_000000337533.jpg
2242
- vcoco_000000568790.jpg
2243
- vcoco_000000391474.jpg
2244
- vcoco_000000376793.jpg
2245
- vcoco_000000063109.jpg
2246
- vcoco_000000042089.jpg
2247
- vcoco_000000347023.jpg
2248
- vcoco_000000311015.jpg
2249
- vcoco_000000523546.jpg
2250
- vcoco_000000270744.jpg
2251
- vcoco_000000109324.jpg
2252
- vcoco_000000410554.jpg
2253
- vcoco_000000456552.jpg
2254
- vcoco_000000574343.jpg
2255
- vcoco_000000263647.jpg
2256
- vcoco_000000178285.jpg
2257
- vcoco_000000561062.jpg
2258
- vcoco_000000299768.jpg
2259
- vcoco_000000497514.jpg
2260
- vcoco_000000171622.jpg
2261
- vcoco_000000485742.jpg
2262
- vcoco_000000112029.jpg
2263
- vcoco_000000114661.jpg
2264
- vcoco_000000371414.jpg
2265
- vcoco_000000191350.jpg
2266
- vcoco_000000448958.jpg
2267
- vcoco_000000516846.jpg
2268
- vcoco_000000113052.jpg
2269
- vcoco_000000336479.jpg
2270
- vcoco_000000252468.jpg
2271
- vcoco_000000474854.jpg
2272
- vcoco_000000187336.jpg
2273
- vcoco_000000075494.jpg
2274
- vcoco_000000422274.jpg
2275
- vcoco_000000082106.jpg
2276
- vcoco_000000227186.jpg
2277
- vcoco_000000438126.jpg
2278
- vcoco_000000114917.jpg
2279
- vcoco_000000419644.jpg
2280
- vcoco_000000400829.jpg
2281
- vcoco_000000209035.jpg
2282
- vcoco_000000557408.jpg
2283
- vcoco_000000441228.jpg
2284
- vcoco_000000340069.jpg
2285
- vcoco_000000131580.jpg
2286
- vcoco_000000414522.jpg
2287
- vcoco_000000361860.jpg
2288
- vcoco_000000495578.jpg
2289
- vcoco_000000468985.jpg
2290
- vcoco_000000419159.jpg
2291
- vcoco_000000368222.jpg
2292
- vcoco_000000138704.jpg
2293
- vcoco_000000079305.jpg
2294
- vcoco_000000256875.jpg
2295
- vcoco_000000378244.jpg
2296
- vcoco_000000058801.jpg
2297
- vcoco_000000447663.jpg
2298
- vcoco_000000422689.jpg
2299
- vcoco_000000577073.jpg
2300
- vcoco_000000113334.jpg
2301
- vcoco_000000107584.jpg
2302
- vcoco_000000392055.jpg
2303
- vcoco_000000531385.jpg
2304
- vcoco_000000405529.jpg
2305
- vcoco_000000168746.jpg
2306
- vcoco_000000463242.jpg
2307
- vcoco_000000411472.jpg
2308
- vcoco_000000431085.jpg
2309
- vcoco_000000365095.jpg
2310
- vcoco_000000191093.jpg
2311
- vcoco_000000479829.jpg
2312
- vcoco_000000361594.jpg
2313
- vcoco_000000286174.jpg
2314
- vcoco_000000035705.jpg
2315
- vcoco_000000439801.jpg
2316
- vcoco_000000264279.jpg
2317
- vcoco_000000061693.jpg
2318
- vcoco_000000386474.jpg
2319
- vcoco_000000077577.jpg
2320
- vcoco_000000532775.jpg
2321
- vcoco_000000288712.jpg
2322
- vcoco_000000183872.jpg
2323
- vcoco_000000377816.jpg
2324
- vcoco_000000365557.jpg
2325
- vcoco_000000048747.jpg
2326
- vcoco_000000531960.jpg
2327
- vcoco_000000426421.jpg
2328
- vcoco_000000462208.jpg
2329
- vcoco_000000444263.jpg
2330
- vcoco_000000103267.jpg
2331
- vcoco_000000173514.jpg
2332
- vcoco_000000420231.jpg
2333
- vcoco_000000410056.jpg
2334
- vcoco_000000428718.jpg
2335
- vcoco_000000430789.jpg
2336
- vcoco_000000005689.jpg
2337
- vcoco_000000410052.jpg
2338
- vcoco_000000578427.jpg
2339
- vcoco_000000323379.jpg
2340
- vcoco_000000480629.jpg
2341
- vcoco_000000408120.jpg
2342
- vcoco_000000508328.jpg
2343
- vcoco_000000442084.jpg
2344
- vcoco_000000560718.jpg
2345
- vcoco_000000519795.jpg
2346
- vcoco_000000357690.jpg
2347
- vcoco_000000564341.jpg
2348
- vcoco_000000192835.jpg
2349
- vcoco_000000044171.jpg
2350
- vcoco_000000291009.jpg
2351
- vcoco_000000284379.jpg
2352
- vcoco_000000576589.jpg
2353
- vcoco_000000570760.jpg
2354
- vcoco_000000082551.jpg
2355
- vcoco_000000479939.jpg
2356
- vcoco_000000046990.jpg
2357
- vcoco_000000476864.jpg
2358
- vcoco_000000134053.jpg
2359
- vcoco_000000232972.jpg
2360
- vcoco_000000288421.jpg
2361
- vcoco_000000013815.jpg
2362
- vcoco_000000326666.jpg
2363
- vcoco_000000321006.jpg
2364
- vcoco_000000406533.jpg
2365
- vcoco_000000486178.jpg
2366
- vcoco_000000368949.jpg
2367
- vcoco_000000463678.jpg
2368
- vcoco_000000126301.jpg
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/hico_analysis.ipynb DELETED
@@ -1,342 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 1,
6
- "metadata": {},
7
- "outputs": [],
8
- "source": [
9
- "import json\n",
10
- "import pandas as pd \n",
11
- "import ipdb\n",
12
- "import os\n",
13
- "import pickle as pkl\n",
14
- "import os.path as osp\n",
15
- "import numpy as np\n",
16
- "from PIL import Image\n"
17
- ]
18
- },
19
- {
20
- "cell_type": "code",
21
- "execution_count": 2,
22
- "metadata": {},
23
- "outputs": [
24
- {
25
- "name": "stdout",
26
- "output_type": "stream",
27
- "text": [
28
- "Total images found: 9642\n",
29
- "Images after KP filtering: 3895\n",
30
- "['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"
31
- ]
32
- }
33
- ],
34
- "source": [
35
- "# Load Agniv VITpose-base hico filtering\n",
36
- "filter_path = './agniv_pose_filter/hico.npy'\n",
37
- "pose_md = np.load(filter_path, allow_pickle=True)\n",
38
- "pose_md = pose_md.item()\n",
39
- "filter_img_names = {}\n",
40
- "\n",
41
- "print(f'Total images found: {len(pose_md)}')\n",
42
- "\n",
43
- "# Filter out images with < 10 visible keypoints \n",
44
- "kp_thresh = 10\n",
45
- "\n",
46
- "for imgname, pose_num in pose_md.items():\n",
47
- " if pose_num > kp_thresh:\n",
48
- " filter_img_names[imgname] = pose_num\n",
49
- " \n",
50
- "print(f'Images after KP filtering: {len(filter_img_names)}')\n",
51
- "\n",
52
- "print(list(filter_img_names.keys())[:5])\n"
53
- ]
54
- },
55
- {
56
- "cell_type": "code",
57
- "execution_count": 3,
58
- "metadata": {},
59
- "outputs": [],
60
- "source": [
61
- "# # Load Agniv VITpose-base hot dict\n",
62
- "# filter_path = \"./agniv_pose_filter/hot_dict.pkl\"\n",
63
- "# with open(filter_path, 'rb') as f:\n",
64
- "# pose_md_dict = pkl.load(f)\n",
65
- " \n",
66
- "# hico_dict = {}\n",
67
- "\n",
68
- "# for k, v in pose_md_dict.items():\n",
69
- "# if 'hake' in k:\n",
70
- "# hico_dict[k] = v\n",
71
- " \n",
72
- "# print(f'Total images found: {len(hico_dict)}')\n",
73
- "\n",
74
- "# # Filter out images with < 10 visible keypoints \n",
75
- "# kp_thresh = 10\n",
76
- "\n",
77
- "# filter_img_names = {}\n",
78
- "\n",
79
- "# for imgname, kp_md in hico_dict.items():\n",
80
- "# if kp_md == 0:\n",
81
- "# continue\n",
82
- "# if kp_md[\"num_persons\"] == 1 and kp_md[\"num_kpt\"][0.5][0] > kp_thresh:\n",
83
- "# filter_img_names[imgname] = kp_md[\"num_kpt\"][0.5][0]\n",
84
- " \n",
85
- "# print(f'Images after KP filtering: {len(filter_img_names)}')"
86
- ]
87
- },
88
- {
89
- "cell_type": "code",
90
- "execution_count": 4,
91
- "metadata": {},
92
- "outputs": [
93
- {
94
- "name": "stdout",
95
- "output_type": "stream",
96
- "text": [
97
- " 0 1 2\n",
98
- "0 1 airplane board\n",
99
- "1 2 airplane direct\n",
100
- "2 3 airplane exit\n",
101
- "3 4 airplane fly\n",
102
- "4 5 airplane inspect\n",
103
- ".. ... ... ...\n",
104
- "595 596 zebra feed\n",
105
- "596 597 zebra hold\n",
106
- "597 598 zebra pet\n",
107
- "598 599 zebra watch\n",
108
- "599 600 zebra no_interaction\n",
109
- "\n",
110
- "[600 rows x 3 columns]\n"
111
- ]
112
- }
113
- ],
114
- "source": [
115
- "\n",
116
- "hico_annot = json.load(open('/ps/project/datasets/HICO/hico-image-level/hico-training-set-image-level.json', 'rb'))\n",
117
- "hoi_mapping = pd.read_csv('/ps/project/datasets/HICO/hico-image-level/hico_hoi_list.txt', header=None, delim_whitespace=True)\n",
118
- "print(hoi_mapping)"
119
- ]
120
- },
121
- {
122
- "cell_type": "code",
123
- "execution_count": 5,
124
- "metadata": {
125
- "scrolled": true
126
- },
127
- "outputs": [
128
- {
129
- "name": "stdout",
130
- "output_type": "stream",
131
- "text": [
132
- "Final number of images 3154\n"
133
- ]
134
- }
135
- ],
136
- "source": [
137
- "version = '1'\n",
138
- "out_dir = f'./filtered_data/v_{version}'\n",
139
- "os.makedirs(out_dir, exist_ok=True)\n",
140
- "\n",
141
- "objectwise_img_names = {}\n",
142
- "imgwise_object_names = {}\n",
143
- "img_dir = '/ps/project/datasets/HICO/hico_20150920/images/train2015'\n",
144
- "\n",
145
- "bad_object_names = ['bear', 'bird', 'cat', 'cow', \n",
146
- " 'dog', 'elephant', 'giraffe', 'horse', \n",
147
- " 'mouse', 'person', 'sheep', 'zebra' ]\n",
148
- "bad_action_names = ['buy', 'chase', 'direct', 'greet', 'herd', 'hose',\n",
149
- " 'hug', 'hunt', 'milk', 'no_interaction', 'pet', 'point', 'teach',\n",
150
- " 'watch', 'wave']\n",
151
- "\n",
152
- "for i, (img_name, img_md) in enumerate(hico_annot.items()):\n",
153
- " \n",
154
- " # Apply keypoint number filtering on the images \n",
155
- " full_img_name = 'hake_train2015_' + img_name\n",
156
- " if full_img_name not in filter_img_names.keys():\n",
157
- " continue\n",
158
- " \n",
159
- " # show the image\n",
160
- " if i < 0:\n",
161
- " img = Image.open(osp.join(img_dir,img_name))\n",
162
- " display(img)\n",
163
- " \n",
164
- " obj_names = []\n",
165
- " action_names = []\n",
166
- " kp_num = filter_img_names[full_img_name]\n",
167
- " \n",
168
- " # travel through all hoi in the metadata, save obj_names and action_names for the hois\n",
169
- " for hoi_id in img_md['hoi_id']:\n",
170
- " img_md_row = hoi_mapping.loc[hoi_mapping[0] == hoi_id].iloc[0]\n",
171
- "\n",
172
- " obj_name = img_md_row[1]\n",
173
- " if obj_name in bad_object_names:\n",
174
- " continue\n",
175
- " action_name = img_md_row[2]\n",
176
- " if action_name in bad_action_names:\n",
177
- " continue\n",
178
- " \n",
179
- " obj_names.append(obj_name)\n",
180
- " action_names.append(action_name)\n",
181
- " \n",
182
- " if len(set(obj_names)) == 0 or len(action_names) == 0:\n",
183
- " continue\n",
184
- " \n",
185
- " imgwise_object_names.setdefault(full_img_name,[]).extend(list(set(obj_names)))\n",
186
- " \n",
187
- "# # # Display images with multiple objects\n",
188
- "# if len(set(obj_names)) > 1:\n",
189
- "# print(img_name)\n",
190
- "# print(obj_names)\n",
191
- "# print(action_names)\n",
192
- "# print(f'Number of Kps: {kp_num}')\n",
193
- "# img = Image.open(osp.join(img_dir,img_name))\n",
194
- "# display(img)\n",
195
- " \n",
196
- " for obj_name in set(obj_names):\n",
197
- " objectwise_img_names.setdefault(obj_name,[]).append(full_img_name)\n",
198
- " \n",
199
- "print(f'Final number of images {len(imgwise_object_names)}')"
200
- ]
201
- },
202
- {
203
- "cell_type": "code",
204
- "execution_count": 6,
205
- "metadata": {
206
- "scrolled": true
207
- },
208
- "outputs": [
209
- {
210
- "name": "stdout",
211
- "output_type": "stream",
212
- "text": [
213
- "saved at ./filtered_data/v_1/object_per_image_dict.json\n",
214
- "saved at ./filtered_data/v_1/imgnames_per_object_dict.json\n"
215
- ]
216
- }
217
- ],
218
- "source": [
219
- "# Save the imagewise_object dict\n",
220
- "out_path = osp.join(out_dir, 'object_per_image_dict.json')\n",
221
- "with open(out_path, 'w') as fp:\n",
222
- " json.dump(imgwise_object_names, fp)\n",
223
- " print(f'saved at {out_path}')\n",
224
- " \n",
225
- "# # save image_list \n",
226
- "# out_path = osp.join(out_dir, 'hico_imglist_all_140223.txt')\n",
227
- "# with open(out_path, 'w') as f:\n",
228
- "# f.write('\\n'.join(imgwise_object_names.keys()))\n",
229
- "# print(f'saved at {out_path}')\n",
230
- "\n",
231
- "\n",
232
- "# Save the object_wise dict\n",
233
- "out_path = osp.join(out_dir, 'imgnames_per_object_dict.json')\n",
234
- "with open(out_path, 'w') as fp:\n",
235
- " json.dump(objectwise_img_names, fp)\n",
236
- " print(f'saved at {out_path}')\n",
237
- "\n",
238
- " \n",
239
- "\n",
240
- " "
241
- ]
242
- },
243
- {
244
- "cell_type": "code",
245
- "execution_count": 7,
246
- "metadata": {},
247
- "outputs": [
248
- {
249
- "name": "stderr",
250
- "output_type": "stream",
251
- "text": [
252
- "/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",
253
- " warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
254
- ]
255
- },
256
- {
257
- "name": "stdout",
258
- "output_type": "stream",
259
- "text": [
260
- "3189\n"
261
- ]
262
- },
263
- {
264
- "data": {
265
- "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",
266
- "text/plain": [
267
- "<Figure size 640x480 with 1 Axes>"
268
- ]
269
- },
270
- "metadata": {},
271
- "output_type": "display_data"
272
- }
273
- ],
274
- "source": [
275
- "import matplotlib.pyplot as plt\n",
276
- "import seaborn as sns\n",
277
- "\n",
278
- "# sort the dictionary \n",
279
- "objectwise_img_names = dict(sorted(objectwise_img_names.items(), key=lambda x: len(x[1]), reverse=True))\n",
280
- "\n",
281
- "# Extract object names and image counts\n",
282
- "obj_names = list(objectwise_img_names.keys())\n",
283
- "img_counts = [len(objectwise_img_names[obj]) for obj in objectwise_img_names]\n",
284
- "print(sum(img_counts))\n",
285
- "\n",
286
- "# Create bar plot\n",
287
- "sns.barplot(x=obj_names, y=img_counts)\n",
288
- "\n",
289
- "# Add x-axis and y-axis labels\n",
290
- "plt.xlabel('Object')\n",
291
- "plt.ylabel('Number of Images')\n",
292
- "\n",
293
- "plt.xticks(rotation=45, ha='right', fontsize=3)\n",
294
- "\n",
295
- "# Save the plot as a high-resolution image file\n",
296
- "out_path = osp.join(out_dir, 'image_per_object_category.png')\n",
297
- "plt.savefig(out_path, dpi=300)\n",
298
- "\n",
299
- "# Show plot\n",
300
- "plt.show()"
301
- ]
302
- },
303
- {
304
- "cell_type": "code",
305
- "execution_count": null,
306
- "metadata": {},
307
- "outputs": [],
308
- "source": [
309
- "\n",
310
- " "
311
- ]
312
- },
313
- {
314
- "cell_type": "code",
315
- "execution_count": null,
316
- "metadata": {},
317
- "outputs": [],
318
- "source": []
319
- }
320
- ],
321
- "metadata": {
322
- "kernelspec": {
323
- "display_name": "Python 3 (ipykernel)",
324
- "language": "python",
325
- "name": "python3"
326
- },
327
- "language_info": {
328
- "codemirror_mode": {
329
- "name": "ipython",
330
- "version": 3
331
- },
332
- "file_extension": ".py",
333
- "mimetype": "text/x-python",
334
- "name": "python",
335
- "nbconvert_exporter": "python",
336
- "pygments_lexer": "ipython3",
337
- "version": "3.10.6"
338
- }
339
- },
340
- "nbformat": 4,
341
- "nbformat_minor": 4
342
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/image_per_object_category.png DELETED
Binary file (86.6 kB)
 
hot_analysis/jc_graphs/documents-export-2023-03-07/image_per_object_category.csv DELETED
@@ -1,70 +0,0 @@
1
- ,count
2
- surfboard,452
3
- chair,287
4
- snowboard,280
5
- laptop,237
6
- cell phone,224
7
- sports ball,208
8
- dining table,184
9
- skateboard,172
10
- tennis racket,172
11
- book,171
12
- frisbee,160
13
- cup,155
14
- car,138
15
- bed,129
16
- bottle,123
17
- bench,119
18
- couch,113
19
- handbag,113
20
- backpack,106
21
- knife,89
22
- bowl,86
23
- skis,85
24
- baseball glove,75
25
- potted plant,69
26
- tv,67
27
- mouse,59
28
- pizza,57
29
- suitcase,54
30
- fork,52
31
- keyboard,50
32
- tie,47
33
- spoon,46
34
- remote,44
35
- cake,43
36
- truck,40
37
- clock,39
38
- sandwich,35
39
- bicycle,34
40
- umbrella,33
41
- wine glass,31
42
- boat,28
43
- donut,28
44
- oven,27
45
- teddy bear,26
46
- sink,25
47
- refrigerator,23
48
- scissors,22
49
- vase,21
50
- baseball bat,18
51
- kite,16
52
- banana,16
53
- hot dog,16
54
- traffic light,16
55
- motorcycle,14
56
- microwave,14
57
- apple,12
58
- fire hydrant,10
59
- carrot,9
60
- bus,8
61
- broccoli,8
62
- orange,8
63
- toilet,7
64
- stop sign,6
65
- hair drier,6
66
- train,4
67
- airplane,4
68
- parking meter,4
69
- toothbrush,3
70
- toaster,1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/jc_graphs/documents-export-2023-03-07/object_nest_piechart_data.csv DELETED
@@ -1,77 +0,0 @@
1
- ,character,parent,value
2
- 0,transportation,objects,0
3
- 1,accessories,objects,0
4
- 2,furniture,objects,0
5
- 3,everyday objects,objects,0
6
- 4,sports equipment,objects,0
7
- 5,food items,objects,0
8
- 6,kitchen appliances,objects,0
9
- 7,motorcycle,transportation,14
10
- 8,bicycle,transportation,129
11
- 9,boat,transportation,33
12
- 10,car,transportation,106
13
- 11,truck,transportation,31
14
- 12,bus,transportation,34
15
- 13,train,transportation,172
16
- 14,airplane,transportation,85
17
- 15,backpack,accessories,280
18
- 16,tie,accessories,171
19
- 17,handbag,accessories,16
20
- 18,baseball glove,accessories,43
21
- 19,bench,furniture,113
22
- 20,chair,furniture,452
23
- 21,couch,furniture,75
24
- 22,bed,furniture,123
25
- 23,toilet,furniture,287
26
- 24,dining table,furniture,160
27
- 25,book,everyday objects,6
28
- 26,umbrella,everyday objects,28
29
- 27,cell phone,everyday objects,54
30
- 28,laptop,everyday objects,44
31
- 29,kite,everyday objects,16
32
- 30,suitcase,everyday objects,119
33
- 31,bottle,everyday objects,89
34
- 32,remote,everyday objects,46
35
- 33,toothbrush,everyday objects,67
36
- 34,teddy bear,everyday objects,237
37
- 35,scissors,everyday objects,224
38
- 36,keyboard,everyday objects,172
39
- 37,hair drier,everyday objects,138
40
- 38,traffic light,everyday objects,27
41
- 39,fire hydrant,everyday objects,208
42
- 40,stop sign,everyday objects,12
43
- 41,tv,everyday objects,18
44
- 42,vase,everyday objects,26
45
- 43,parking meter,everyday objects,113
46
- 44,clock,everyday objects,9
47
- 45,potted plant,everyday objects,155
48
- 46,mouse,everyday objects,8
49
- 47,frisbee,sports equipment,22
50
- 48,sports ball,sports equipment,28
51
- 49,tennis racket,sports equipment,50
52
- 50,baseball bat,sports equipment,47
53
- 51,skateboard,sports equipment,4
54
- 52,snowboard,sports equipment,16
55
- 53,skis,sports equipment,57
56
- 54,surfboard,sports equipment,184
57
- 55,banana,food items,6
58
- 56,cake,food items,3
59
- 57,apple,food items,4
60
- 58,carrot,food items,16
61
- 59,pizza,food items,40
62
- 60,donut,food items,21
63
- 61,hot dog,food items,35
64
- 62,sandwich,food items,8
65
- 63,broccoli,food items,7
66
- 64,orange,food items,25
67
- 65,knife,kitchen appliances,4
68
- 66,spoon,kitchen appliances,52
69
- 67,cup,kitchen appliances,86
70
- 68,wine glass,kitchen appliances,23
71
- 69,oven,kitchen appliances,10
72
- 70,fork,kitchen appliances,39
73
- 71,bowl,kitchen appliances,69
74
- 72,refrigerator,kitchen appliances,8
75
- 73,toaster,kitchen appliances,59
76
- 74,sink,kitchen appliances,14
77
- 75,microwave,kitchen appliances,1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/jc_graphs/documents-export-2023-03-07/partwise_contact_graph.csv DELETED
@@ -1,18 +0,0 @@
1
- ,count
2
- leftFoot,8109
3
- rightFoot,7928
4
- rightHand,5085
5
- leftHand,3949
6
- spine,3694
7
- hips,2346
8
- leftUpLeg,1870
9
- rightUpLeg,1847
10
- rightForeArm,736
11
- rightLeg,700
12
- head,692
13
- rightShoulder,670
14
- leftShoulder,667
15
- leftForeArm,635
16
- leftLeg,591
17
- rightArm,571
18
- leftArm,535
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/jc_graphs/plot_image_per_object.py DELETED
@@ -1,147 +0,0 @@
1
- import csv
2
- from pathlib import Path
3
-
4
- import matplotlib.pyplot as plt
5
- from matplotlib import gridspec
6
- import numpy as np
7
- import seaborn as sns
8
-
9
- # Input/output files
10
- CSV_FOLDER = Path(__file__).parent / "documents-export-2023-03-07"
11
- IMAGE_PER_OBJECT_FILE = CSV_FOLDER / "image_per_object_category.csv"
12
- PIE_CHART_DATA_FILE = CSV_FOLDER / "object_nest_piechart_data.csv"
13
- OUTPUT = 'output.pdf'
14
-
15
- # Some configuration
16
- FONTSIZE = 20
17
- FONTSIZE_PIE = 25
18
- COLOR_RANGE = (0.15, 0.85) # to avoid having exterme values
19
- CUTOFF = 30 # min number of counts for an object to be considered
20
- PIE_INNER_RADIUS = 0.3 # value used for the nested pie chart
21
- plt.rcParams['grid.color'] = (0.5, 0.5, 0.5, 0.1) # low grid opacity
22
-
23
- # Categories and associated objects
24
- categorization_unordered = {
25
- "transportation": [
26
- 'motorcycle', 'bicycle', 'boat', 'car', 'truck', 'bus', 'train', 'airplane',],
27
- "accessories": [
28
- 'backpack', 'tie', 'handbag', 'baseball glove'],
29
- "furniture": [
30
- 'bench', 'chair', 'couch', 'bed', 'toilet', 'dining table'],
31
- 'everyday objects': [
32
- 'book', 'umbrella', 'cell phone', 'laptop', 'kite', 'suitcase', 'bottle', 'remote',
33
- 'toothbrush', 'teddy bear', 'scissors', 'keyboard', 'hair drier', 'traffic light',
34
- 'fire hydrant', 'stop sign', 'tv', 'vase', 'parking meter', 'clock', 'potted plant',
35
- 'mouse'],
36
- 'sports equipment': [
37
- 'frisbee', 'sports ball', 'tennis racket', 'baseball bat',
38
- 'skateboard', 'snowboard', 'skis', 'surfboard'],
39
- 'food items': [
40
- 'banana', 'cake', 'apple', 'carrot', 'pizza', 'donut', 'hot dog',
41
- 'sandwich', 'broccoli', 'orange'],
42
- 'kitchen appliances': [
43
- 'knife', 'spoon', 'cup', 'wine glass', 'oven', 'fork', 'bowl',
44
- 'refrigerator', 'toaster', 'sink', 'microwave']}
45
-
46
- # Colors for each category
47
- cat_colors = {
48
- "transportation": plt.cm.spring,
49
- "accessories": plt.cm.Greys,
50
- "furniture": plt.cm.Purples,
51
- "everyday objects": plt.cm.Reds,
52
- "sports equipment": plt.cm.Blues,
53
- "food items": plt.cm.Wistia,
54
- "kitchen appliances": plt.cm.summer}
55
-
56
- # Read CSV files
57
- objects = {}
58
- with open(IMAGE_PER_OBJECT_FILE, newline='', encoding="utf-8") as csvfile:
59
- reader = csv.DictReader(csvfile)
60
- for row in reader:
61
- objects[row['']] = {}
62
- objects[row['']]['count'] = int(row['count'])
63
-
64
- # In each caterory, order object by count in descending order
65
- categorization = {
66
- cat: sorted(val, key=lambda _: objects[_]["count"])
67
- for cat, val in categorization_unordered.items()}
68
-
69
- # Some sanity checks :)
70
- assert list(categorization.keys()) == list(categorization_unordered.keys())
71
- assert list(categorization.keys()) == list(cat_colors.keys())
72
- for cat in categorization:
73
- assert len(categorization[cat]) == len(categorization_unordered[cat])
74
- assert set(categorization[cat]) == set(categorization_unordered[cat])
75
-
76
- # Cutoff objects and categorization
77
- selected_objects = [o for o, v in objects.items() if v["count"] > CUTOFF]
78
- selected_categorization = {}
79
- for k, v in categorization.items():
80
- selected_categorization[k] = [o for o in v if o in selected_objects]
81
-
82
- # Add a color for each object
83
- # All objects in one category use the same category color
84
- for cat, objs in selected_categorization.items():
85
- colors = [
86
- cat_colors[cat](x)
87
- for x in np.linspace(COLOR_RANGE[0], COLOR_RANGE[1], len(selected_categorization[cat]))]
88
- color_index = 0
89
- for obj in objs:
90
- objects[obj]['color'] = colors[color_index]
91
- color_index += 1
92
-
93
- # Plot: histogramm
94
- fig = plt.figure(figsize=(25, 22))
95
- gs = gridspec.GridSpec(1, 1)
96
- gs.update(wspace=0.15, hspace=0.15)
97
- axes = []
98
- for elem in gs:
99
- axes.append(fig.add_subplot(elem))
100
- axes[0].grid(axis='x', zorder=0)
101
- axes[0].set_xticks(range(0, 500, 50))
102
- sns.barplot(
103
- x=list(v["count"] for o, v in objects.items() if o in selected_objects),
104
- y=list(selected_objects),
105
- ax=axes[0],
106
- zorder=3,
107
- palette=list(v["color"] for o, v in objects.items() if o in selected_objects))
108
- axes[0].set_xticklabels(axes[0].get_xticklabels(), rotation=90)
109
- plt.xticks(rotation=0, fontsize=FONTSIZE)
110
- plt.yticks(fontsize=FONTSIZE)
111
- plt.xlabel('# images', labelpad=30, fontsize=FONTSIZE)
112
-
113
- # Plot: pie chart
114
- right_inset_ax = fig.add_axes([.3, .1, .5, .5], facecolor='k')
115
- outer_colors = [c(0.5) for c in cat_colors.values()]
116
- labels = [word.replace(' ', '\n') for word in list(selected_categorization)]
117
- # Need to be orderd by category
118
- vals = []
119
- groups = {cat: 0 for cat in selected_categorization.keys()}
120
- inner_colors = []
121
- for cat, members in selected_categorization.items():
122
- for _ in members:
123
- vals.append(objects[_]["count"])
124
- inner_colors.append(objects[_]["color"])
125
- groups[cat] += objects[_]["count"]
126
- right_inset_ax.pie(
127
- list(groups.values()),
128
- radius=1,
129
- colors=outer_colors,
130
- # labels=labels,
131
- autopct='%.1f%%',
132
- pctdistance=0.82,
133
- # labeldistance=1.5,
134
- textprops={'color': 'white', 'fontsize': FONTSIZE},
135
- wedgeprops={'width': PIE_INNER_RADIUS, 'edgecolor': 'w'})
136
- right_inset_ax.pie(
137
- vals,
138
- radius=1-PIE_INNER_RADIUS,
139
- colors=inner_colors,
140
- wedgeprops={'width': PIE_INNER_RADIUS, 'edgecolor': 'w'})
141
-
142
- # Plot: add legend and save
143
- plt.legend(
144
- labels, bbox_to_anchor=(1.2, 1.45),
145
- loc='upper right', prop={'size': 1.5*FONTSIZE})
146
- plt.savefig(OUTPUT)
147
- # plt.show()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/jc_graphs/plot_partwise_contacts.py DELETED
@@ -1,42 +0,0 @@
1
- import csv
2
- from pathlib import Path
3
-
4
- from matplotlib import gridspec
5
- from matplotlib import pyplot as plt
6
- import seaborn as sns
7
-
8
- # Input/output files
9
- CSV_FOLDER = Path(__file__).parent / "documents-export-2023-03-07"
10
- CONTACT_FILE = CSV_FOLDER / "partwise_contact_graph.csv"
11
- OUTPUT = 'output.pdf'
12
-
13
- # Some configuration
14
- FONTSIZE = 30
15
- plt.rcParams['grid.color'] = (0.5, 0.5, 0.5, 0.1) # low grid opacity
16
-
17
- # Read CSV file
18
- body_parts = []
19
- body_part_counts = []
20
- with open(CONTACT_FILE, newline='', encoding="utf-8") as csvfile:
21
- reader = csv.DictReader(csvfile)
22
- for row in reader:
23
- body_parts.append(row[''])
24
- body_part_counts.append(int(row['count']))
25
-
26
- # Plot
27
- fig = plt.figure(figsize=(25, 22))
28
- gs = gridspec.GridSpec(1, 1)
29
- gs.update(wspace=0.15, hspace=0.15)
30
- axes = []
31
- for elem in gs:
32
- axes.append(fig.add_subplot(elem))
33
- axes[0].grid(axis='y', zorder=0)
34
- sns.barplot(
35
- x=body_parts, y=body_part_counts, ax=axes[0], zorder=3,
36
- facecolor=(0.2, 0.4, 0.6, 0.6))
37
- axes[0].set_xticklabels(axes[0].get_xticklabels(), rotation=90)
38
- plt.xticks(rotation=45, ha='right', fontsize=FONTSIZE)
39
- plt.yticks(fontsize=FONTSIZE)
40
- plt.ylabel('# images', labelpad=30, fontsize=FONTSIZE)
41
- plt.savefig(OUTPUT)
42
- # plt.show()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/object_nest_piechart.py DELETED
@@ -1,136 +0,0 @@
1
- # make a nestest plotly pie chart given a list of labels and a list of values
2
- import os.path as osp
3
- import json
4
- import plotly.express as px
5
- import plotly.io as pio
6
-
7
- version = '1'
8
- dir = '/is/cluster/work/stripathi/pycharm_remote/dca_contact/hot_analysis/'
9
- out_dir_hico = osp.join(dir, f'filtered_data/v_{version}/hico')
10
- out_dir_vcoco = osp.join(dir, f'filtered_data/v_{version}/vcoco')
11
-
12
- objectwise_img_dict_hico = osp.join(out_dir_hico, 'imgnames_per_object_dict.json')
13
- objectwise_img_dict_vcoco = osp.join(out_dir_vcoco, 'imgnames_per_object_dict.json')
14
-
15
- with open(objectwise_img_dict_hico, 'r') as fp:
16
- objectwise_img_dict_hico = json.load(fp)
17
- # replace underscore with space
18
- objectwise_img_dict_hico = {k.replace('_', ' '): v for k, v in objectwise_img_dict_hico.items()}
19
- # replace values with lenght of values
20
- objectwise_img_dict_hico = {k: len(v) for k, v in objectwise_img_dict_hico.items()}
21
- with open(objectwise_img_dict_vcoco, 'r') as fp:
22
- objectwise_img_dict_vcoco = json.load(fp)
23
- # replace underscore with space
24
- objectwise_img_dict_vcoco = {k.replace('_', ' '): v for k, v in objectwise_img_dict_vcoco.items()}
25
- # replace values with lenght of values
26
- objectwise_img_dict_vcoco = {k: len(v) for k, v in objectwise_img_dict_vcoco.items()}
27
-
28
- # combine the dicts
29
- objectwise_img_dict = objectwise_img_dict_hico.copy()
30
- objectwise_img_dict.update(objectwise_img_dict_vcoco)
31
-
32
-
33
- categorization = {"transportation": ['motorcycle','bicycle','boat','car','truck','bus','train','airplane',],
34
- "accessories": ['backpack', 'tie', 'handbag', 'baseball glove'],
35
- "furniture": ['bench','chair','couch','bed','toilet','dining table'],
36
- 'everyday objects': ['book','umbrella','cell phone','laptop','kite','suitcase','bottle','remote',
37
- 'toothbrush','teddy bear','scissors','keyboard','hair drier','traffic light',
38
- 'fire hydrant','stop sign','tv','vase','parking meter','clock','potted plant','mouse',],
39
- 'sports equipment': ['frisbee','sports ball','tennis racket','baseball bat','skateboard','snowboard','skis','surfboard',],
40
- 'food items': ['banana','cake','apple','carrot','pizza','donut','hot dog','sandwich','broccoli','orange'],
41
- 'kitchen appliances': ['knife', 'spoon', 'cup', 'wine glass', 'oven', 'fork', 'bowl', 'refrigerator', 'toaster', 'sink', 'microwave',]}
42
-
43
- # get total lengths of each category
44
- objectwise_img_dict_categorized = {}
45
- for k, v in categorization.items():
46
- objectwise_img_dict_categorized[k] = sum([objectwise_img_dict[obj] for obj in v])
47
-
48
- # reverse categorization
49
- categorization_rev = {}
50
- for k, v in categorization.items():
51
- for obj in v:
52
- categorization_rev[obj] = k
53
-
54
-
55
-
56
- data = dict(
57
- character=list(categorization.keys()) + list(categorization_rev.keys()),
58
- parent= ["objects"] * len(categorization.keys()) + list(categorization_rev.values()),
59
- value =[0] * len(categorization.keys()) + list(objectwise_img_dict.values()),
60
- )
61
-
62
- # save data as pandas
63
- import pandas as pd
64
- df = pd.DataFrame(data)
65
- df.to_csv(osp.join(dir, 'object_nest_piechart_data.csv'))
66
-
67
-
68
- fig = px.sunburst(
69
- data,
70
- names='character',
71
- parents='parent',
72
- values='value',
73
- )
74
-
75
- # chage font size of the innermost level
76
- fig.update_traces(textfont_size=30)
77
-
78
- # save the figure
79
- out_path = osp.join(dir, "object_nest_piechart.html")
80
- fig.write_html(out_path)
81
- # Save plot as PNG wihtout transparent background
82
- out_path = osp.join(dir, "object_nest_piechart.png")
83
- fig.write_image(out_path,
84
- format='png',
85
- width=2000, height=1000, scale=1, engine='kaleido')
86
-
87
-
88
- # Set layout
89
- fig.update_layout(
90
- margin=dict(t=0, l=0, r=0, b=0),
91
- plot_bgcolor='rgba(0, 0, 0, 0)',
92
- paper_bgcolor='rgba(0, 0, 0, 0)'
93
- )
94
-
95
- # Save plot as HTML with transparent background
96
- out_path = osp.join(dir, "object_nest_piechart_transparent.html")
97
- pio.write_html(fig, file=out_path, auto_open=False, include_plotlyjs='cdn', config=dict(displayModeBar=False))
98
-
99
- # Save plot as PNG with transparent background
100
- out_path = osp.join(dir, "object_nest_piechart_transparent.png")
101
- pio.write_image(fig, file=out_path,
102
- format='png',
103
- width=2000, height=1000, scale=1, engine='kaleido')
104
-
105
- import matplotlib.pyplot as plt
106
- import seaborn as sns
107
-
108
- # make a bar plot of objectwise_img_dict
109
-
110
- # sort the dict
111
- objectwise_img_dict = {k: v for k, v in sorted(objectwise_img_dict.items(), key=lambda item: item[1], reverse=True)}
112
-
113
- # save as pandas
114
- import pandas as pd
115
- df = pd.DataFrame.from_dict(objectwise_img_dict, orient='index', columns=['count'])
116
- df.to_csv(osp.join(dir, 'image_per_object_category.csv'))
117
-
118
-
119
- plt.figure(figsize=(20, 10))
120
- sns.barplot(x=list(objectwise_img_dict.keys()), y=list(objectwise_img_dict.values()))
121
- # make horizontal grid lines
122
- plt.grid(axis='y', alpha=0.5)
123
-
124
- # Add x-axis and y-axis labels
125
- plt.xticks(rotation=45, ha='right', fontsize=15)
126
- plt.yticks(fontsize=15)
127
- plt.show()
128
- # avoid clipping of x-axis labels
129
- plt.tight_layout()
130
-
131
- # save the figure
132
- out_path = osp.join(dir, "image_per_object_category.png")
133
- plt.savefig(out_path, transparent=False)
134
- out_path = osp.join(dir, "image_per_object_category_transparent.png")
135
- plt.savefig(out_path, transparent=True)
136
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/partwise_contact_graph.py DELETED
@@ -1,98 +0,0 @@
1
- import numpy as np
2
- import os
3
- import json
4
- import os.path as osp
5
-
6
-
7
- # Load the combined dca train, val and test npzs
8
- dir = '/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras'
9
- trainval_npz = np.load(os.path.join(dir, 'hot_dca_trainval.npz'), allow_pickle=True)
10
- test_npz = np.load(os.path.join(dir, 'hot_dca_test.npz'), allow_pickle=True)
11
-
12
- # combine the two npz
13
- combined_npz = {}
14
- for key in trainval_npz.keys():
15
- combined_npz[key] = np.concatenate([trainval_npz[key], test_npz[key]], axis=0)
16
-
17
- segmentation_path = 'data/smpl_vert_segmentation.json'
18
- with open(segmentation_path, 'rb') as f:
19
- part_segmentation = json.load(f)
20
-
21
- # reverse the part segmentation
22
- part_segmentation_rev = {}
23
- for part in part_segmentation:
24
- for vert in part_segmentation[part]:
25
- part_segmentation_rev[vert] = part
26
-
27
- part_names_combined = []
28
- for cls in combined_npz['contact_label']:
29
- cls_idx = np.where(cls == 1)[0]
30
- part_names = [part_segmentation_rev[vert] for vert in cls_idx]
31
- # find count for every part in part_names
32
- part_count = {}
33
- for part in part_names:
34
- if part not in part_count:
35
- part_count[part] = 0
36
- part_count[part] += 1
37
- # find the parts with count > 10
38
- part_names = [part for part in part_count if part_count[part] > 10]
39
- part_names_combined.append(part_names)
40
-
41
- # make a histogram of the part names
42
- part_names_combined = [item for sublist in part_names_combined for item in sublist]
43
- part_names_combined = np.array(part_names_combined)
44
- unique, counts = np.unique(part_names_combined, return_counts=True)
45
- part_names_combined = dict(zip(unique, counts))
46
-
47
- print('Total number of parts: ', len(part_names_combined))
48
- print(part_names_combined.keys())
49
- # set keys to combine;
50
- combine_keys = {'leftFoot': ['leftToeBase'],
51
- 'rightFoot': ['rightToeBase'],
52
- 'leftHand': ['leftHandIndex1'],
53
- 'rightHand': ['rightHandIndex1'],
54
- 'spine': ['spine1', 'spine2'],
55
- 'head': ['neck'],}
56
-
57
- for key in combine_keys:
58
- for subkey in combine_keys[key]:
59
- part_names_combined[key] += part_names_combined[subkey]
60
- del part_names_combined[subkey]
61
-
62
- print('Total number of parts: ', len(part_names_combined))
63
-
64
- # sort the dictionary
65
- part_names_combined = {k: v for k, v in sorted(part_names_combined.items(), key=lambda item: item[1], reverse=True)}
66
-
67
- # convert to pandas
68
- import pandas as pd
69
- df = pd.DataFrame.from_dict(part_names_combined, orient='index', columns=['count'])
70
- df.to_csv(osp.join(dir, 'partwise_contact_graph.csv'))
71
-
72
-
73
-
74
- # make a beautiful bar plot using seabord and change the default color palette
75
- import seaborn as sns
76
- import matplotlib.pyplot as plt
77
-
78
- # set the color palette
79
-
80
- # make the plot
81
- fig, ax = plt.subplots(figsize=(20, 10))
82
- sns.barplot(x=list(part_names_combined.keys()), y=list(part_names_combined.values()), ax=ax,
83
- palette=sns.color_palette("rocket", len(part_names_combined)))
84
- ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
85
- plt.xticks(rotation=45, ha='right', fontsize=30)
86
- plt.yticks(fontsize=30)
87
- # avoid clipping of xtick labels
88
- plt.tight_layout()
89
-
90
-
91
-
92
- # save the plot
93
- outdir = "/is/cluster/work/stripathi/pycharm_remote/dca_contact/hot_analysis"
94
- out_path = os.path.join(outdir, "partwise_contact_graph.png")
95
- plt.savefig(out_path, transparent=True, dpi=300)
96
-
97
-
98
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
hot_analysis/vcoco_analysis.ipynb DELETED
@@ -1,276 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 30,
6
- "metadata": {},
7
- "outputs": [],
8
- "source": [
9
- "import json\n",
10
- "import pandas as pd \n",
11
- "import ipdb\n",
12
- "import os\n",
13
- "import pickle as pkl\n",
14
- "import os.path as osp\n",
15
- "import numpy as np\n",
16
- "from PIL import Image"
17
- ]
18
- },
19
- {
20
- "cell_type": "code",
21
- "execution_count": 31,
22
- "metadata": {},
23
- "outputs": [
24
- {
25
- "name": "stdout",
26
- "output_type": "stream",
27
- "text": [
28
- "Total images found: 5459\n",
29
- "Images after KP filtering: 2386\n",
30
- "['vcoco_000000051899.jpg', 'vcoco_000000093127.jpg', 'vcoco_000000455665.jpg', 'vcoco_000000248389.jpg', 'vcoco_000000403947.jpg']\n"
31
- ]
32
- }
33
- ],
34
- "source": [
35
- "# Load Agniv VITpose-base hot dict\n",
36
- "filter_path = \"./agniv_pose_filter/hot_dict.pkl\"\n",
37
- "with open(filter_path, 'rb') as f:\n",
38
- " pose_md_dict = pkl.load(f)\n",
39
- " \n",
40
- "vcoco_dict = {}\n",
41
- "\n",
42
- "for k, v in pose_md_dict.items():\n",
43
- " if 'vcoco' in k:\n",
44
- " vcoco_dict[k] = v\n",
45
- " \n",
46
- "print(f'Total images found: {len(vcoco_dict)}')\n",
47
- "\n",
48
- "# Filter out images with < 10 visible keypoints \n",
49
- "kp_thresh = 10\n",
50
- "\n",
51
- "filter_img_names = {}\n",
52
- "\n",
53
- "for imgname, kp_md in vcoco_dict.items():\n",
54
- " if kp_md == 0:\n",
55
- " continue\n",
56
- " if kp_md[\"num_persons\"] == 1 and kp_md[\"num_kpt\"][0.5][0] > kp_thresh:\n",
57
- " filter_img_names[imgname] = kp_md[\"num_kpt\"][0.5][0]\n",
58
- " \n",
59
- "print(f'Images after KP filtering: {len(filter_img_names)}')\n",
60
- "\n",
61
- "print(list(filter_img_names.keys())[:5])"
62
- ]
63
- },
64
- {
65
- "cell_type": "code",
66
- "execution_count": 35,
67
- "metadata": {},
68
- "outputs": [
69
- {
70
- "name": "stdout",
71
- "output_type": "stream",
72
- "text": [
73
- "loading annotations into memory...\n",
74
- "Done (t=1.30s)\n",
75
- "creating index...\n",
76
- "index created!\n",
77
- "Final number of images 2368\n"
78
- ]
79
- }
80
- ],
81
- "source": [
82
- "from pycocotools.coco import COCO\n",
83
- "version = '1'\n",
84
- "out_dir = f'./filtered_data/v_{version}/vcoco'\n",
85
- "os.makedirs(out_dir, exist_ok=True)\n",
86
- "\n",
87
- "coco_dir = '/is/cluster/work/stripathi/pycharm_remote/v-coco/data'\n",
88
- "coco = COCO(os.path.join(coco_dir, 'instances_vcoco_all_2014.json'))\n",
89
- "\n",
90
- "imgwise_object_names = {}\n",
91
- "img_dir = '/ps/project/datasets/HOT/Contact_Data/images/training/'\n",
92
- "\n",
93
- "bad_object_names = ['bird', 'cat', 'dog', 'horse', 'sheep', 'cow', \n",
94
- " 'elephant', 'bear', 'zebra', 'giraffe']\n",
95
- "\n",
96
- "# # Get all coco objects\n",
97
- "# count = 0\n",
98
- "# for id in range(91):\n",
99
- "# try: \n",
100
- "# print(coco.loadCats(id))\n",
101
- "# count += 1\n",
102
- "# except:\n",
103
- "# print(f'ID:{id} does not exist')\n",
104
- "# continue\n",
105
- "# print(count)\n",
106
- "\n",
107
- "objectwise_img_names = {}\n",
108
- "for img_name in filter_img_names.keys():\n",
109
- " img_id = int(os.path.splitext(img_name.split('_')[-1])[0])\n",
110
- " ann_ids = coco.getAnnIds([img_id])\n",
111
- " anns = coco.loadAnns(ann_ids)\n",
112
- " object_list = []\n",
113
- " for ann in anns:\n",
114
- " object_cat = coco.loadCats(ann[\"category_id\"])\n",
115
- " if len(object_cat) > 1:\n",
116
- " ipdb.set_trace()\n",
117
- " object_name = object_cat[0]['name']\n",
118
- " if object_name in bad_object_names:\n",
119
- " continue\n",
120
- " if object_name != 'person':\n",
121
- " object_list.append(object_name)\n",
122
- " if len(object_list) != 0:\n",
123
- " imgwise_object_names[img_name] = list(set(object_list))\n",
124
- " \n",
125
- " for obj_name in set(object_list):\n",
126
- " objectwise_img_names.setdefault(obj_name,[]).append(img_name)\n",
127
- " \n",
128
- "# # Visualize images \n",
129
- "# print(img_name)\n",
130
- "# print(list(set(object_list)))\n",
131
- "# img = Image.open(osp.join(img_dir,img_name))\n",
132
- "# display(img)\n",
133
- " \n",
134
- " \n",
135
- "print(f'Final number of images {len(imgwise_object_names)}')\n",
136
- " \n"
137
- ]
138
- },
139
- {
140
- "cell_type": "code",
141
- "execution_count": 36,
142
- "metadata": {
143
- "scrolled": true
144
- },
145
- "outputs": [
146
- {
147
- "name": "stdout",
148
- "output_type": "stream",
149
- "text": [
150
- "saved at ./filtered_data/v_1/vcoco/object_per_image_dict.json\n",
151
- "saved at ./filtered_data/v_1/vcoco/vcoco_imglist_all_170223.txt\n",
152
- "saved at ./filtered_data/v_1/vcoco/imgnames_per_object_dict.json\n"
153
- ]
154
- }
155
- ],
156
- "source": [
157
- "# Save the imagewise_object dict\n",
158
- "out_path = osp.join(out_dir, 'object_per_image_dict.json')\n",
159
- "with open(out_path, 'w') as fp:\n",
160
- " json.dump(imgwise_object_names, fp)\n",
161
- " print(f'saved at {out_path}')\n",
162
- " \n",
163
- "# save image_list \n",
164
- "out_path = osp.join(out_dir, 'vcoco_imglist_all_170223.txt')\n",
165
- "with open(out_path, 'w') as f:\n",
166
- " f.write('\\n'.join(imgwise_object_names.keys()))\n",
167
- " print(f'saved at {out_path}')\n",
168
- "\n",
169
- "\n",
170
- "# Save the object_wise dict\n",
171
- "out_path = osp.join(out_dir, 'imgnames_per_object_dict.json')\n",
172
- "with open(out_path, 'w') as fp:\n",
173
- " json.dump(objectwise_img_names, fp)\n",
174
- " print(f'saved at {out_path}')\n",
175
- "\n",
176
- " \n",
177
- "\n",
178
- " "
179
- ]
180
- },
181
- {
182
- "cell_type": "code",
183
- "execution_count": 37,
184
- "metadata": {
185
- "scrolled": false
186
- },
187
- "outputs": [
188
- {
189
- "name": "stdout",
190
- "output_type": "stream",
191
- "text": [
192
- "5072\n"
193
- ]
194
- },
195
- {
196
- "data": {
197
- "image/png": "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\n",
198
- "text/plain": [
199
- "<Figure size 432x288 with 1 Axes>"
200
- ]
201
- },
202
- "metadata": {
203
- "needs_background": "light"
204
- },
205
- "output_type": "display_data"
206
- }
207
- ],
208
- "source": [
209
- "import matplotlib.pyplot as plt\n",
210
- "import seaborn as sns\n",
211
- "\n",
212
- "# sort the dictionary \n",
213
- "objectwise_img_names = dict(sorted(objectwise_img_names.items(), key=lambda x: len(x[1]), reverse=True))\n",
214
- "\n",
215
- "# Extract object names and image counts\n",
216
- "obj_names = list(objectwise_img_names.keys())\n",
217
- "img_counts = [len(objectwise_img_names[obj]) for obj in objectwise_img_names]\n",
218
- "print(sum(img_counts))\n",
219
- "\n",
220
- "# Create bar plot\n",
221
- "sns.barplot(x=obj_names, y=img_counts)\n",
222
- "\n",
223
- "# Add x-axis and y-axis labels\n",
224
- "plt.xlabel('Object')\n",
225
- "plt.ylabel('Number of Images')\n",
226
- "\n",
227
- "plt.xticks(rotation=45, ha='right', fontsize=3)\n",
228
- "\n",
229
- "# Save the plot as a high-resolution image file\n",
230
- "out_path = osp.join(out_dir, 'image_per_object_category.png')\n",
231
- "plt.savefig(out_path, dpi=300)\n",
232
- "\n",
233
- "# Show plot\n",
234
- "plt.show()"
235
- ]
236
- },
237
- {
238
- "cell_type": "code",
239
- "execution_count": null,
240
- "metadata": {},
241
- "outputs": [],
242
- "source": [
243
- "\n",
244
- " "
245
- ]
246
- },
247
- {
248
- "cell_type": "code",
249
- "execution_count": null,
250
- "metadata": {},
251
- "outputs": [],
252
- "source": []
253
- }
254
- ],
255
- "metadata": {
256
- "kernelspec": {
257
- "display_name": "Python 3",
258
- "language": "python",
259
- "name": "python3"
260
- },
261
- "language_info": {
262
- "codemirror_mode": {
263
- "name": "ipython",
264
- "version": 3
265
- },
266
- "file_extension": ".py",
267
- "mimetype": "text/x-python",
268
- "name": "python",
269
- "nbconvert_exporter": "python",
270
- "pygments_lexer": "ipython3",
271
- "version": "3.8.5"
272
- }
273
- },
274
- "nbformat": 4,
275
- "nbformat_minor": 4
276
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/datascripts/add_imgname_column_to_deco_csv.py DELETED
@@ -1,23 +0,0 @@
1
- #python scripts/datascripts/add_imgname_column_to_deco_csv.py --csv_path /ps/scratch/ps_shared/stripathi/deco/4agniv/DCA/mturk_csvs_combined_temp.csv --out_path /ps/scratch/ps_shared/stripathi/deco/4agniv/DCA/mturk_csvs_combined_temp_with_imgnames.csv
2
-
3
- import argparse
4
- import pandas as pd
5
- import os
6
-
7
- def add_imagename_column(csv_path, out_path):
8
- # Load csv
9
- csv_data = pd.read_csv(csv_path)
10
-
11
- # Add column with image name from vertices column, where every element is a dictionary with key the image names as keys and values as the vertices
12
- csv_data['imgnames'] = csv_data['vertices'].apply(lambda x: os.path.basename(list(eval(x).keys())[0]))
13
-
14
- # Write combined data to new CSV file
15
- csv_data.to_csv(out_path, index=False)
16
-
17
- if __name__ == "__main__":
18
- parser = argparse.ArgumentParser()
19
- parser.add_argument('--csv_path', type=str, default='/ps/scratch/ps_shared/stripathi/deco/4agniv/hot/dca.csv')
20
- parser.add_argument('--out_path', type=str, default='/ps/scratch/ps_shared/stripathi/deco/4agniv/hot/dca_with_imgname.csv')
21
- args = parser.parse_args()
22
- add_imagename_column(args.csv_path, args.out_path)
23
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/datascripts/combine_cropped_npz.py DELETED
@@ -1,63 +0,0 @@
1
- '''
2
- Combine cropped npz given a folder of npz
3
- '''
4
-
5
- import argparse
6
- import os
7
- import numpy as np
8
-
9
- def combine_npz(npz_dir, out_npz):
10
- # get all npz files in the folder
11
-
12
- npz_files = [os.path.join(npz_dir, out_dir, f) for f in os.listdir(npz_dir, out_dir) if f.endswith('.npz')]
13
- print('Found {} npz files'.format(len(npz_files)))
14
-
15
- # combine all the values in all keys in all npz files
16
- c_imgname = []
17
- c_pose = []
18
- c_transl = []
19
- c_shape = []
20
- c_cam_k = []
21
- c_contact_label = []
22
- c_scene_seg = []
23
- c_part_seg = []
24
-
25
- for npz_file in npz_files:
26
- npz= np.load(npz_file)
27
- c_imgname.extend(npz['imgname'])
28
- c_pose.extend(npz['pose'])
29
- c_transl.extend(npz['transl'])
30
- c_shape.extend(npz['shape'])
31
- c_cam_k.extend(npz['cam_k'])
32
- c_contact_label.extend(npz['contact_label'])
33
- c_scene_seg.extend(npz['scene_seg'])
34
- c_part_seg.extend(npz['part_seg'])
35
-
36
- # convert to numpy arrays
37
- c_imgname = np.concatenate(c_imgname, axis=0)
38
- c_pose = np.concatenate(c_pose, axis=0)
39
- c_transl = np.concatenate(c_transl, axis=0)
40
- c_shape = np.concatenate(c_shape, axis=0)
41
- c_cam_k = np.concatenate(c_cam_k, axis=0)
42
- c_contact_label = np.concatenate(c_contact_label, axis=0)
43
- c_scene_seg = np.concatenate(c_scene_seg, axis=0)
44
- c_part_seg = np.concatenate(c_part_seg, axis=0)
45
-
46
- # save the new npz
47
- np.savez(out_npz,
48
- imgname=c_imgname,
49
- pose=c_pose,
50
- transl=c_transl,
51
- shape=c_shape,
52
- cam_k=c_cam_k,
53
- contact_label=c_contact_label,
54
- scene_seg=c_scene_seg,
55
- part_seg=c_part_seg)
56
- print('Saved combined npz to {}'.format(out_npz))
57
-
58
- if __name__ == "__main__":
59
- parser = argparse.ArgumentParser()
60
- parser.add_argument('--orig_npz_dir', type=str, default='/is/cluster/fast/achatterjee/rich/scene_npzs/train')
61
- parser.add_argument('--out_npz', type=str, required=True,default='/is/cluster/fast/achatterjee/rich/scene_npzs/train_combined.npz')
62
- args = parser.parse_args()
63
- combine_npz(npz_dir = args.orig_npz_dir, out_npz = args.out_npz)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/datascripts/combine_mturk_csvs.py DELETED
@@ -1,33 +0,0 @@
1
- # write a script to find all csvs in a folder and merge them
2
-
3
- import os
4
- import pandas as pd
5
- import argparse
6
-
7
- def combine_csvs(folder_path, out_path):
8
- # Create empty DataFrame to store combined data
9
- combined_data = pd.DataFrame()
10
-
11
- # Loop through all files in folder with .csv extension
12
- for file in os.listdir(folder_path):
13
- if file.endswith(".csv"):
14
- file_path = os.path.join(folder_path, file)
15
- # Read CSV file and append to combined_data
16
- csv_data = pd.read_csv(file_path)
17
- combined_data = combined_data.append(csv_data, ignore_index=True)
18
-
19
- # Write combined data to new CSV file
20
- combined_data.to_csv(out_path, index=False)
21
- print(f"Combined CSV file saved to {out_path}")
22
-
23
- if __name__ == "__main__":
24
- parser = argparse.ArgumentParser()
25
- parser.add_argument('--folder_path', type=str, default='/ps/scratch/ps_shared/stripathi/deco/4agniv/hot/')
26
- parser.add_argument('--out_path', type=str, default='/ps/scratch/ps_shared/stripathi/deco/4agniv/hot/combined.csv')
27
- args = parser.parse_args()
28
- folder_path = args.folder_path
29
- out_path = args.out_path
30
- combine_csvs(folder_path, out_path)
31
-
32
-
33
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/datascripts/combine_npzs.py DELETED
@@ -1,41 +0,0 @@
1
- '''
2
- Combine the npzs
3
- '''
4
-
5
- import numpy as np
6
-
7
- d1 = np.load('/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras/hot_noprox_supporting_False_trainval_0.npz',allow_pickle=True)
8
- d2 = np.load('/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras/hot_noprox_supporting_False_trainval_1.npz',allow_pickle=True)
9
- d3 = np.load('/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras/hot_noprox_supporting_False_trainval_2.npz',allow_pickle=True)
10
- d4 = np.load('/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras/hot_noprox_supporting_False_trainval_3.npz',allow_pickle=True)
11
-
12
-
13
- print(list(d1.keys()))
14
- print(type(d1['imgname']))
15
- print(d1['imgname'].shape)
16
-
17
- c_imgname = np.concatenate((d1['imgname'], d2['imgname'], d3['imgname'], d4['imgname']), axis=0)
18
- c_pose = np.concatenate((d1['pose'], d2['pose'], d3['pose'], d4['pose']), axis=0)
19
- c_transl = np.concatenate((d1['transl'], d2['transl'], d3['transl'], d4['transl']), axis=0)
20
- c_shape = np.concatenate((d1['shape'], d2['shape'], d3['shape'], d4['shape']), axis=0)
21
- c_cam_k = np.concatenate((d1['cam_k'], d2['cam_k'], d3['cam_k'], d4['cam_k']), axis=0)
22
- c_polygon_2d_contact = np.concatenate((d1['polygon_2d_contact'], d2['polygon_2d_contact'],
23
- d3['polygon_2d_contact'], d4['polygon_2d_contact']), axis=0)
24
- c_contact_label = np.concatenate((d1['contact_label'], d2['contact_label'], d3['contact_label'],
25
- d4['contact_label']), axis=0)
26
- c_scene_seg = np.concatenate((d1['scene_seg'], d2['scene_seg'], d3['scene_seg'], d4['scene_seg']), axis=0)
27
- c_part_seg = np.concatenate((d1['part_seg'], d2['part_seg'], d3['part_seg'], d4['part_seg']), axis=0)
28
-
29
- outfile = '/is/cluster/work/stripathi/pycharm_remote/dca_contact/data/dataset_extras/hot_noprox_supporting_False_trainval_combined.npz'
30
- np.savez(outfile,
31
- imgname=c_imgname,
32
- pose=c_pose,
33
- transl=c_transl,
34
- shape=c_shape,
35
- cam_k=c_cam_k,
36
- polygon_2d_contact=c_polygon_2d_contact,
37
- contact_label=c_contact_label,
38
- scene_seg=c_scene_seg,
39
- part_seg=c_part_seg
40
- )
41
- print(f'Saved to {outfile}')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/datascripts/convert_rich_npz_to_cropped.py DELETED
@@ -1,75 +0,0 @@
1
- '''
2
- Fix paths to cropped images, partmasks and segmasks
3
- '''
4
-
5
- import argparse
6
- import os
7
- import numpy as np
8
- from tqdm import tqdm
9
-
10
- def convert_rich_npz(orig_npz, out_dir):
11
- # go through all keys in the npz
12
- # if the key is imgname, partmask or segmask, replace the path with the new path
13
- # save the new npz
14
-
15
- # structs we use
16
- imgnames_ = []
17
- poses_, shapes_, transls_ = [], [], []
18
- cams_k_ = []
19
- contact_label_ = []
20
- scene_seg_, part_seg_ = [], []
21
-
22
- # load the npz
23
- npz = np.load(orig_npz)
24
- for i in tqdm(range(len(npz['imgname']))):
25
-
26
- if not os.path.exists(npz['imgname'][i]):
27
- print(npz['imgname'][i])
28
- continue
29
-
30
- new_scene_seg = os.path.exists(npz['scene_seg'][i].replace('seg_masks_new', 'segmentation_masks'))
31
-
32
- if not new_scene_seg:
33
- print(new_scene_seg)
34
- continue
35
-
36
- if not os.path.exists(npz['part_seg'][i]):
37
- print(npz['part_seg'][i])
38
- continue
39
-
40
- imgnames_.append(npz['imgname'][i])
41
- poses_.append(npz['pose'][i])
42
- transls_.append(npz['transl'][i])
43
- shapes_.append(npz['shape'][i])
44
- cams_k_.append(npz['cam_k'][i])
45
- contact_label_.append(npz['contact_label'][i])
46
- scene_seg_.append(npz['scene_seg'][i].replace('seg_masks_new', 'segmentation_masks'))
47
- part_seg_.append(npz['part_seg'][i])
48
-
49
- # save the new npz
50
- out_dir = out_dir+'_cropped'
51
- os.makedirs(out_dir, exist_ok=True)
52
- out_file = os.path.join(out_dir, os.path.basename(args.orig_npz))
53
- np.savez(out_file,
54
- imgname=imgnames_,
55
- pose=poses_,
56
- transl=transls_,
57
- shape=shapes_,
58
- cam_k=cams_k_,
59
- contact_label=contact_label_,
60
- scene_seg=scene_seg_,
61
- part_seg=part_seg_)
62
-
63
- print('Saved to: ', out_file)
64
-
65
-
66
- if __name__ == "__main__":
67
- parser = argparse.ArgumentParser()
68
- parser.add_argument('--orig_npz_dir', type=str, default='/is/cluster/fast/achatterjee/rich/scene_npzs/train')
69
- parser.add_argument('--cluster_idx', type=int)
70
- args = parser.parse_args()
71
- # get all npz files in the directory
72
- npz_files = [os.path.join(args.orig_npz_dir, f) for f in os.listdir(args.orig_npz_dir) if f.endswith('.npz')]
73
- # get the npz file for this cluster
74
- orig_npz = npz_files[args.cluster_idx]
75
- convert_rich_npz(orig_npz, out_dir=args.orig_npz_dir)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
scripts/datascripts/get_part_seg_mask.py DELETED
@@ -1,199 +0,0 @@
1
- # python scripts/datascripts/get_part_seg_mask.py --data_npz data/rich_val_smplx_small.npz --model_type 'smplx'
2
-
3
-
4
- import os
5
- import sys
6
- sys.path.append('/is/cluster/work/achatterjee/dca_contact')
7
- import cv2
8
- import argparse
9
- import numpy as np
10
- import torch
11
- from common import constants
12
- from models.smpl import SMPL
13
- from smplx import SMPLX
14
- from utils.mesh_utils import save_results_mesh
15
- import trimesh
16
- from tqdm import tqdm
17
- from utils.image_utils import get_body_part_texture, generate_part_labels
18
- from utils.diff_renderer import Pytorch3D
19
-
20
- class PART_LABELER:
21
- def __init__(self, body_params, img_w, img_h, model_type, debug=False):
22
- """
23
- Get part segmentation masks for images
24
-
25
- Args:
26
- body_params: SMPL parameters
27
- img_w: image width
28
- img_h: image height
29
- model_type: 'smpl' or 'smplx'
30
- """
31
- self.device = torch.device('cuda:{}'.format(args.gpu)) if torch.cuda.is_available() else torch.device('cpu')
32
-
33
- self.model_type = model_type
34
-
35
- # Setup the SMPL model
36
- if self.model_type == 'smpl':
37
- self.body_model = SMPL(constants.SMPL_MODEL_DIR).to(self.device)
38
- if self.model_type == 'smplx':
39
- self.body_model = SMPLX(constants.SMPL_MODEL_DIR,
40
- num_betas=10,
41
- use_pca=False).to(self.device)
42
-
43
- self.body_part_vertex_colors, self.body_part_texture = get_body_part_texture(self.body_model.faces,
44
- model_type=self.model_type,
45
- non_parametric=False)
46
- # bins are discrete part labels, add eps to avoid quantization error
47
- eps = 1e-2
48
- # self.part_label_bins = (torch.arange(int(constants.N_PARTS)) / float(constants.N_PARTS)) + eps
49
- self.part_label_bins = torch.linspace(0, constants.N_PARTS-1, constants.N_PARTS) + eps
50
-
51
- ## Run SMPL forward
52
- self.body_params = body_params
53
-
54
- self.smpl_verts, self.smpl_joints = self.get_posed_mesh(debug)
55
-
56
- # Assumbe same focal lenght for all frames in a seq
57
- focal_length = self.body_params['cam_k'][0, 0, 0]
58
- # focal_length = focal_length[0]
59
- # Setup Pyrender renderer
60
- # self.renderer = Renderer(focal_length=focal_length, img_w=img_w, img_h=img_h,
61
- # faces=self.smpl_model.faces,
62
- # same_mesh_color=False)
63
-
64
- # Setup Pytorch3D Renderer
65
- focal_length = torch.FloatTensor([focal_length])
66
- smpl_faces = torch.from_numpy(self.body_model.faces.astype(np.int32)).to(self.device)
67
- self.renderer = Pytorch3D(img_h=img_h,
68
- img_w=img_w,
69
- focal_length=focal_length,
70
- smpl_faces=smpl_faces,
71
- texture_mode='partseg',
72
- vertex_colors=self.body_part_vertex_colors,
73
- face_textures=self.body_part_texture,
74
- model_type=self.model_type)
75
-
76
- def get_posed_mesh(self, debug=False):
77
- betas = torch.from_numpy(self.body_params['shape']).float().to(self.device)
78
- pose = torch.from_numpy(self.body_params['pose']).float().to(self.device)
79
- transl = torch.from_numpy(self.body_params['transl']).float().to(self.device)
80
-
81
- # extra smplx params
82
- extra_args = {'jaw_pose': torch.zeros((betas.shape[0], 3)).float().to(self.device),
83
- 'leye_pose': torch.zeros((betas.shape[0], 3)).float().to(self.device),
84
- 'reye_pose': torch.zeros((betas.shape[0], 3)).float().to(self.device),
85
- 'expression': torch.zeros((betas.shape[0], 10)).float().to(self.device),
86
- 'left_hand_pose': torch.zeros((betas.shape[0], 45)).float().to(self.device),
87
- 'right_hand_pose': torch.zeros((betas.shape[0], 45)).float().to(self.device)}
88
-
89
- smpl_output = self.body_model(betas=betas,
90
- body_pose=pose[:, 3:],
91
- global_orient=pose[:, :3],
92
- pose2rot=True,
93
- transl=transl,
94
- **extra_args)
95
- smpl_verts = smpl_output.vertices.detach().cpu().numpy()
96
- smpl_joints = smpl_output.joints.detach().cpu().numpy()
97
-
98
- if debug:
99
- for mesh_i in range(smpl_verts.shape[0]):
100
- out_dir = 'temp_meshes'
101
- os.makedirs(out_dir, exist_ok=True)
102
- out_file = os.path.join(out_dir, f'temp_mesh_{mesh_i:04d}.obj')
103
- save_results_mesh(smpl_verts[mesh_i], self.body_model.faces, out_file)
104
- return smpl_verts, smpl_joints
105
-
106
- def bucketize_part_image(self, color_rgb, mask):
107
- # make single channel
108
- body_parts = color_rgb.clone()
109
- body_parts *= 255. # multiply it with 255 to make labels distant
110
- body_parts = body_parts.max(-1)[0] # reduce to single channel
111
- body_parts = torch.bucketize(body_parts, self.part_label_bins, right=True) # np.digitize(body_parts, bins, right=True)
112
- # add 1 to make background label 0
113
- body_parts = body_parts.long() + 1
114
- body_parts = body_parts * mask.detach()
115
- return body_parts.long()
116
-
117
- def create_part_masks(self, body_parts):
118
- # extract every pixel as a separate mask
119
- part_masks = []
120
- for part_id in range(1, constants.N_PARTS+1): # first one is for background
121
- part_mask = (body_parts == part_id)
122
- part_masks.append(part_mask)
123
- return part_masks
124
-
125
- def render_part_mask_p3d(self, img_paths, out_dir):
126
- with torch.no_grad():
127
- # os.makedirs(out_dir, exist_ok=True)
128
- for index, img_path in tqdm(enumerate(img_paths), dynamic_ncols=True):
129
- # Load the image
130
- if not os.path.exists(img_path):
131
- if 'train' in img_path:
132
- split = 'train'
133
- elif 'val' in img_path:
134
- split = 'val'
135
- else:
136
- split = 'test'
137
- new_img_name = img_path[img_path.index(split)+4:].replace('/', '_')
138
- new_path = os.path.join('/is/cluster/work/achatterjee/rich/images', split, new_img_name.replace('jpeg', 'bmp'))
139
- if not os.path.exists(new_path):
140
- new_path = new_path.replace('bmp', 'png')
141
- img_path = new_path
142
- if os.path.exists(out_dir[index]):
143
- continue
144
- # img_bgr = cv2.imread(img_path)
145
- chosen_vert_arr = torch.FloatTensor(self.smpl_verts[[index]]).to(self.device)
146
- front_view = self.renderer(chosen_vert_arr)
147
- front_view_rgb = front_view[0, :3, :, :].permute(1,2,0).detach().cpu()
148
- front_view_mask = front_view[0, 3, :, :].detach().cpu()
149
- # front_view_depth = front_view[0, 4, :, :].detach().cpu()
150
-
151
- body_parts = self.bucketize_part_image(front_view_rgb, front_view_mask)
152
- body_parts = body_parts.numpy()
153
- front_view_rgb = front_view_rgb.numpy()
154
-
155
- # body_part_masks = self.create_part_masks(body_parts)
156
- # display part masks
157
- # for part_id, part_mask in enumerate(body_part_masks):
158
- # part_mask = part_mask * 255
159
- # part_dir = os.path.join(out_dir, f'frame_{index:04d}_parts')
160
- # os.makedirs(part_dir, exist_ok=True)
161
- # out_file = os.path.join(part_dir, f'part_{part_id:02d}_{index:04d}.png')
162
- # cv2.imwrite(out_file, part_mask)
163
-
164
- # out_file = os.path.join(out_dir, f'front_view_{index:04d}.png')
165
- # cv2.imwrite(out_file, front_view_rgb[: ,:, [2, 1, 0]]*255)
166
- # print(f'wrote front view to {out_file}')
167
- body_parts = cv2.merge((body_parts, body_parts, body_parts))
168
- # out_file = os.path.join(out_dir, f'body_parts_{index:04d}.png')
169
- out_file = out_dir[index]
170
- cv2.imwrite(out_file, body_parts)
171
- # print(f'wrote body part masks to {out_file}')
172
-
173
-
174
- def main(args):
175
- out_dir = args.out_dir
176
- data_md = np.load(args.data_npz)
177
-
178
- # get all the jpg files in the folder
179
- img_paths = data_md['imgname']
180
- seg_paths = data_md['part_seg']
181
- print(f'found {len(img_paths)} images')
182
- # load first image
183
- img = cv2.imread(img_paths[0])
184
- img_h, img_w, _ = img.shape
185
-
186
- labeler = PART_LABELER(body_params=data_md, img_w=img_w, img_h=img_h,
187
- model_type=args.model_type, debug=args.debug)
188
- labeler.render_part_mask_p3d(img_paths=img_paths, out_dir=seg_paths)
189
-
190
- if __name__=='__main__':
191
- parser = argparse.ArgumentParser()
192
- parser.add_argument('--out_dir', type=str, default='./temp_part_masks/', help='image folder')
193
- parser.add_argument('--data_npz', type=str, default='.', help='folder with smpl/smpl-x npz')
194
- parser.add_argument('--model_type', type=str, default='smplx', choices=['smpl', 'smplx'], help='model type')
195
- parser.add_argument('--gpu', type=int, default=0, help='gpu id')
196
- parser.add_argument('--debug', action='store_true', help='debug mode', default=False)
197
- args = parser.parse_args()
198
-
199
- main(args)