mtomnet/tbd/utils/reformat_labels_ours.py

106 lines
4.7 KiB
Python
Raw Normal View History

2025-01-10 15:39:20 +01:00
import pandas as pd
import os
import glob
import pickle
DATASET_LOCATION = "YOUR_PATH_HERE"
def reframe_annotation():
annotation_path = f'{DATASET_LOCATION}/retrieve_annotation/all/'
save_path = f'{DATASET_LOCATION}/reformat_annotation/'
if not os.path.exists(save_path):
os.makedirs(save_path)
tasks = glob.glob(annotation_path + '*.txt')
id_map = pd.read_csv('id_map.csv')
for task in tasks:
if not task.split('/')[-1].split('_')[2] == '1.txt':
continue
with open(task, 'r') as f:
lines = f.readlines()
task_id = int(task.split('/')[-1].split('_')[1]) + 1
clip = id_map.loc[id_map['ID'] == task_id].folder
print(task_id, len(clip))
if len(clip) == 0:
continue
with open(save_path + clip.item() + '.txt', 'w') as f:
for line in lines:
words = line.split()
f.write(words[0] + ',' + words[1] + ',' + words[2] + ',' + words[3] + ',' + words[4] + ',' + words[5] +
',' + words[6] + ',' + words[7] + ',' + words[8] + ',' + words[9] + ',' + ' '.join(words[10:]) + '\n')
f.close()
def get_grid_location(obj_frame):
x_min = obj_frame['x_min']#.item()
y_min = obj_frame['y_min']#.item()
x_max = obj_frame['x_max']#.item()
y_max = obj_frame['y_max']#.item()
gridLW = 1280 / 25.
gridLH = 720 / 15.
center_x, center_y = (x_min + x_max)/2, (y_min + y_max)/2
X, Y = int(center_x / gridLW), int(center_y / gridLH)
return X, Y
def regenerate_annotation():
annotation_path = f'{DATASET_LOCATION}/reformat_annotation/'
save_path=f'{DATASET_LOCATION}/regenerate_annotation/'
if not os.path.exists(save_path):
os.makedirs(save_path)
tasks = glob.glob(annotation_path + '*.txt')
for task in tasks:
print(task)
annt = pd.read_csv(task, sep=",", header=None)
annt.columns = ["obj_id", "x_min", "y_min", "x_max", "y_max", "frame", "lost", "occluded", "generated", "name", "label"]
obj_records = {}
for index, obj_frame in annt.iterrows():
if obj_frame['name'].startswith('P'):
continue
else:
assert obj_frame['name'].startswith('O')
obj_name = obj_frame['name']
# 0: enter 1: disappear 2: update 3: unchange
frame_id = obj_frame['frame']
curr_loc = get_grid_location(obj_frame)
mind_dict = {'m1': {'fluent': 3, 'loc': None}, 'm2': {'fluent': 3, 'loc': None},
'm12': {'fluent': 3, 'loc': None},
'm21': {'fluent': 3, 'loc': None}, 'mc': {'fluent': 3, 'loc': None},
'mg': {'fluent': 3, 'loc': curr_loc}}
mind_dict['mg']['loc'] = curr_loc
if not type(obj_frame['label']) == float:
mind_labels = obj_frame['label'].split()
for mind_label in mind_labels:
if mind_label == 'in_m1' or mind_label == 'in_m2' or mind_label == 'in_m12' \
or mind_label == 'in_m21' or mind_label == 'in_mc' or mind_label == '"in_m1"' or mind_label == '"in_m2"'\
or mind_label == '"in_m12"' or mind_label == '"in_m21"' or mind_label == '"in_mc"':
mind_name = mind_label.split('_')[1].split('"')[0]
mind_dict[mind_name]['loc'] = curr_loc
else:
mind_name = mind_label.split('_')[0].split('"')
if len(mind_name) > 1:
mind_name = mind_name[1]
else:
mind_name = mind_name[0]
last_loc = obj_records[obj_name][frame_id - 1][mind_name]['loc']
mind_dict[mind_name]['loc'] = last_loc
for mind_name in mind_dict.keys():
if frame_id > 0:
curr_loc = mind_dict[mind_name]['loc']
last_loc = obj_records[obj_name][frame_id - 1][mind_name]['loc']
if last_loc is None and curr_loc is not None:
mind_dict[mind_name]['fluent'] = 0
elif last_loc is not None and curr_loc is None:
mind_dict[mind_name]['fluent'] = 1
elif not last_loc == curr_loc:
mind_dict[mind_name]['fluent'] = 2
if obj_name not in obj_records:
obj_records[obj_name] = [mind_dict]
else:
obj_records[obj_name].append(mind_dict)
with open(save_path + task.split('/')[-1].split('.')[0] + '.p', 'wb') as f:
pickle.dump(obj_records, f)
if __name__ == '__main__':
reframe_annotation()
regenerate_annotation()