Skip to content

Commit 1df6207

Browse files
author
Hannah DeFazio
committed
Move bbn yolomodel to kwcoco conversion to a cli script file
1 parent 3df497b commit 1df6207

File tree

2 files changed

+45
-102
lines changed

2 files changed

+45
-102
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,55 @@
1+
import os
12
import argparse
23

34
from pathlib import Path
45

5-
from angel_system.data.load_bbn_medical_data import data_loader, save_as_kwcoco
6-
from angel_system.data.data_paths import grab_data
6+
from angel_system.data.medical.load_bbn_data import bbn_yolomodel_dataloader, save_as_kwcoco
77

88

99
def main():
1010
all_skills = ["M2"]
1111

1212
parser = argparse.ArgumentParser()
1313
parser.add_argument(
14-
"--skill",
14+
"--root-dir",
1515
type=str,
16-
default="M2",
17-
help=f"Title of skill to run. Options are {all_skills}",
16+
default="/data/PTG/medical/bbn_data/Release_v0.5/",
17+
help=f"Path to the dataset",
18+
)
19+
parser.add_argument(
20+
"--version",
21+
type=str,
22+
default="v0.56",
23+
help=f"BBN dataset version",
24+
)
25+
parser.add_argument(
26+
"--output-root",
27+
type=str,
28+
default="/data/PTG/medical/object_anns",
29+
help=f"BBN dataset version",
1830
)
19-
2031
args = parser.parse_args()
21-
if args.skill not in all_skills:
22-
print(f"Must select one of: {all_skills}")
23-
return
24-
25-
(
26-
ptg_root,
27-
data_dir,
28-
activity_config_fn,
29-
activity_gt_dir,
30-
ros_bags_dir,
31-
training_split,
32-
obj_dets_dir,
33-
obj_config,
34-
) = grab_data(args.recipe, "gyges")
35-
36-
dive_f = f"{obj_dets_dir}/berkeley/dive"
37-
dst_dir = f"{data_dir}/images/{args.recipe}/berkeley/"
38-
Path(dst_dir).mkdir(parents=True, exist_ok=True)
3932

40-
output_dir = f"{obj_dets_dir}/berkeley/"
33+
root_dir_version = f"{args.root_dir}/{args.version}"
34+
# Should be M1 folder, M2 folder, etc
35+
subfolders = os.listdir(root_dir_version)
36+
for task_name in subfolders:
37+
print(task_name)
38+
39+
task_id = task_name.split("_")[0].lower()
40+
output_dir = f"{args.output_root}/{task_id}/{args.version}"
41+
Path(output_dir).mkdir(exist_ok=True, parents=True)
4142

42-
for split in ["train", "test"]:
43-
classes, gt_bboxes = data_loader(split)
43+
for split in ["train", "test"]:
44+
classes, gt_bboxes = bbn_yolomodel_dataloader(
45+
root_dir=root_dir_version,
46+
skill=task_name,
47+
split=split
48+
)
4449

45-
out = f"{root_dir}/M2_Tourniquet/YoloModel/M2_YoloModel_LO_{split}.mscoco.json"
46-
save_as_kwcoco(classes, gt_bboxes, save_fn=out)
50+
out = f"{output_dir}/{task_name}_YoloModel_LO_{split}.mscoco.json"
51+
save_as_kwcoco(classes, gt_bboxes, save_fn=out)
4752

4853

4954
if __name__ == "__main__":
50-
main()
55+
main()

angel_system/data/medical/load_bbn_medical_data.py angel_system/data/medical/load_bbn_data.py

+10-72
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
import numpy as np
1515

1616
from angel_system.data.common.load_data import activities_from_dive_csv
17+
from angel_system.data.medical.data_paths import KNOWN_BAD_VIDEOS
1718

1819
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1, 2, 3"
1920

20-
root_dir = "/data/PTG/medical/bbn_data/Release_v0.5/v0.52"
21-
2221

2322
def dive_to_activity_file(videos_dir):
23+
"""DIVE CSV to BBN TXT frame-level annotation file format
24+
"""
2425
for dive_csv in glob.glob(f"{videos_dir}/*/*.csv"):
2526
print(dive_csv)
2627
video_dir = os.path.dirname(dive_csv)
@@ -40,9 +41,10 @@ def bbn_activity_data_loader(
4041
video,
4142
step_map=None,
4243
lab_data=False,
43-
add_inter_steps=False,
44-
add_before_finished_task=False,
4544
):
45+
"""Create a dictionary of start and end times for each activity in
46+
the BBN TXT frame-level annotation files
47+
"""
4648
# Load ground truth activity
4749
if lab_data:
4850
skill_fn = glob.glob(f"{videos_dir}/{video}/*_skills_frame.txt")
@@ -78,48 +80,13 @@ def bbn_activity_data_loader(
7880

7981
skill_f.close()
8082

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-
11683
print(f"Loaded ground truth from {skill_fn}")
11784

11885
return gt_activity
11986

12087

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
12390
):
12491
"""
12592
Load the YoloModel data
@@ -138,8 +105,6 @@ def bbn_medical_data_loader(
138105
bboxes_dir = f"{data_dir}/LabeledObjects/{split}"
139106

140107
for ann_fn in glob.glob(f"{bboxes_dir}/*.txt"):
141-
print(ann_fn)
142-
143108
try:
144109
image_fn = ann_fn[:-3] + "png"
145110
assert os.path.exists(image_fn)
@@ -201,17 +166,6 @@ def bbn_medical_data_loader(
201166
return valid_classes, data
202167

203168

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-
215169
def save_as_kwcoco(classes, data, save_fn="bbn-data.mscoco.json"):
216170
"""
217171
Save the bboxes in the json file
@@ -251,9 +205,8 @@ def save_as_kwcoco(classes, data, save_fn="bbn-data.mscoco.json"):
251205
dset.fpath = save_fn
252206
dset.dump(dset.fpath, newlines=True)
253207

254-
# print_class_freq(dset)
255208

256-
def bbn_activity_txt_to_csv():
209+
def bbn_activity_txt_to_csv(root_dir):
257210
"""
258211
Generate DIVE csv format activity annotations from BBN's text annotations
259212
"""
@@ -264,8 +217,7 @@ def bbn_activity_txt_to_csv():
264217
track_id = 0
265218
video_dir = os.path.dirname(action_txt_fn)
266219
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:
269221
continue
270222

271223
action_f = open(action_txt_fn)
@@ -331,17 +283,3 @@ def bbn_activity_txt_to_csv():
331283
track_id += 1
332284
action_f.close()
333285
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

Comments
 (0)