14
14
import numpy as np
15
15
16
16
from angel_system .data .common .load_data import activities_from_dive_csv
17
+ from angel_system .data .medical .data_paths import KNOWN_BAD_VIDEOS
17
18
18
19
os .environ ["CUDA_VISIBLE_DEVICES" ] = "0, 1, 2, 3"
19
20
20
- root_dir = "/data/PTG/medical/bbn_data/Release_v0.5/v0.52"
21
-
22
21
23
22
def dive_to_activity_file (videos_dir ):
23
+ """DIVE CSV to BBN TXT frame-level annotation file format
24
+ """
24
25
for dive_csv in glob .glob (f"{ videos_dir } /*/*.csv" ):
25
26
print (dive_csv )
26
27
video_dir = os .path .dirname (dive_csv )
@@ -40,9 +41,10 @@ def bbn_activity_data_loader(
40
41
video ,
41
42
step_map = None ,
42
43
lab_data = False ,
43
- add_inter_steps = False ,
44
- add_before_finished_task = False ,
45
44
):
45
+ """Create a dictionary of start and end times for each activity in
46
+ the BBN TXT frame-level annotation files
47
+ """
46
48
# Load ground truth activity
47
49
if lab_data :
48
50
skill_fn = glob .glob (f"{ videos_dir } /{ video } /*_skills_frame.txt" )
@@ -78,48 +80,13 @@ def bbn_activity_data_loader(
78
80
79
81
skill_f .close ()
80
82
81
- # Add in more time frames if applicable
82
- steps = list (step_map .keys ()) if step_map else {}
83
- if add_inter_steps :
84
- print ("Adding in-between steps" )
85
- for i , step in enumerate (steps [:- 1 ]):
86
- sub_step_str = step_map [step ][0 ][0 ].lower ().strip ().strip ("." ).strip ()
87
- next_sub_step_str = (
88
- step_map [steps [i + 1 ]][0 ][0 ].lower ().strip ().strip ("." ).strip ()
89
- )
90
- if (
91
- sub_step_str in gt_activity .keys ()
92
- and next_sub_step_str in gt_activity .keys ()
93
- ):
94
- start = gt_activity [sub_step_str ][0 ]["end" ]
95
- end = gt_activity [next_sub_step_str ][0 ]["start" ]
96
-
97
- gt_activity [f"In between { step } and { steps [i + 1 ]} " .lower ()] = [
98
- {"start" : start , "end" : end }
99
- ]
100
-
101
- if add_before_finished_task :
102
- print ("Adding before and finished" )
103
- # before task
104
- sub_step_str = step_map ["step 1" ][0 ][0 ].lower ().strip ().strip ("." ).strip ()
105
- if sub_step_str in gt_activity .keys ():
106
- end = gt_activity [sub_step_str ][0 ]["start" ] # when the first step starts
107
- gt_activity ["not started" ] = [{"start" : 0 , "end" : end }]
108
-
109
- # after task
110
- sub_step_str = step_map ["step 8" ][0 ][0 ].lower ().strip ().strip ("." ).strip ()
111
- if sub_step_str in gt_activity .keys ():
112
- start = gt_activity [sub_step_str ][0 ]["end" ] # when the last step ends
113
- end = len (glob .glob (f"{ videos_dir } /{ video } /_extracted/images/*.png" )) - 1
114
- gt_activity ["finished" ] = [{"start" : start , "end" : end }]
115
-
116
83
print (f"Loaded ground truth from { skill_fn } " )
117
84
118
85
return gt_activity
119
86
120
87
121
- def bbn_medical_data_loader (
122
- skill , valid_classes = "all" , split = "train" , filter_repeated_objs = False
88
+ def bbn_yolomodel_dataloader (
89
+ root_dir , skill , valid_classes = "all" , split = "train" , filter_repeated_objs = False
123
90
):
124
91
"""
125
92
Load the YoloModel data
@@ -138,8 +105,6 @@ def bbn_medical_data_loader(
138
105
bboxes_dir = f"{ data_dir } /LabeledObjects/{ split } "
139
106
140
107
for ann_fn in glob .glob (f"{ bboxes_dir } /*.txt" ):
141
- print (ann_fn )
142
-
143
108
try :
144
109
image_fn = ann_fn [:- 3 ] + "png"
145
110
assert os .path .exists (image_fn )
@@ -201,17 +166,6 @@ def bbn_medical_data_loader(
201
166
return valid_classes , data
202
167
203
168
204
- def data_loader (split , task_name ):
205
- # Load gt bboxes for task
206
- task_classes , task_bboxes = bbn_medical_data_loader (task_name , split = split )
207
-
208
- # Combine task and person annotations
209
- # gt_bboxes = {**person_bboxes, **task_bboxes}
210
- # all_classes = person_classes + task_classes
211
-
212
- return task_classes , task_bboxes
213
-
214
-
215
169
def save_as_kwcoco (classes , data , save_fn = "bbn-data.mscoco.json" ):
216
170
"""
217
171
Save the bboxes in the json file
@@ -251,9 +205,8 @@ def save_as_kwcoco(classes, data, save_fn="bbn-data.mscoco.json"):
251
205
dset .fpath = save_fn
252
206
dset .dump (dset .fpath , newlines = True )
253
207
254
- # print_class_freq(dset)
255
208
256
- def bbn_activity_txt_to_csv ():
209
+ def bbn_activity_txt_to_csv (root_dir ):
257
210
"""
258
211
Generate DIVE csv format activity annotations from BBN's text annotations
259
212
"""
@@ -264,8 +217,7 @@ def bbn_activity_txt_to_csv():
264
217
track_id = 0
265
218
video_dir = os .path .dirname (action_txt_fn )
266
219
video_name = os .path .basename (video_dir )
267
- if video_name is in ["M2-15" ]:
268
- # Known bad videos
220
+ if video_name in KNOWN_BAD_VIDEOS :
269
221
continue
270
222
271
223
action_f = open (action_txt_fn )
@@ -331,17 +283,3 @@ def bbn_activity_txt_to_csv():
331
283
track_id += 1
332
284
action_f .close ()
333
285
csv_f .close ()
334
-
335
- def main ():
336
- # Should be M1 folder, M2 folder, etc
337
- subfolders = os .listdir (root_dir )
338
- for task_name in subfolders :
339
- for split in ["train" , "test" ]:
340
- classes , gt_bboxes = data_loader (split , task_name )
341
-
342
- out = f"{ root_dir } /{ task_name } /YoloModel/{ task_name } _YoloModel_LO_{ split } .mscoco.json"
343
- save_as_kwcoco (classes , gt_bboxes , save_fn = out )
344
-
345
-
346
- if __name__ == "__main__" :
347
- bbn_activity_txt_to_csv ()
0 commit comments