34 어노테이션 데이터(한명에 해당하는 데이터)에서 행동별로 클립을 생성하는 기능
36 anno_list (list[dict]): 어노테이션 데이터 리스트(한명에 대한 정보), 데이터에는 카테고리별 클래스가 설정된 'action_id'키를 포함하여야함
37 image_ids (list(int)): 어노테이션 데이터의 이미지 아이디 리스트
38 frame_num (int): 어노테이션 데이터의 총 프레임 수
39 train_frame (int): 학습 데이터 생성에 사용되는 프레임 수
40 return (dict): 카테고리별 클래스의 클립 리스트, 클립은 클립의 시작 프레임 인덱스(start), 끝 프레임 인덱스(end), 카테고리의 클래스 번호(label), 중복방지를 위한 순번(seq)을 포함하고 있음
45 cat_list=[
'action_upper',
'action_lower',
'pose',
'hand',
'foot']
47 cat_info[cat] = dict()
49 cat_info[
'action_upper'][
'info'] = cvt_labelmap_v22_action_upper
50 cat_info[
'action_lower'][
'info'] = cvt_labelmap_v22_action_lower
51 cat_info[
'pose'][
'info'] = cvt_labelmap_v22_action_pose
52 cat_info[
'hand'][
'info'] = cvt_labelmap_v22_action_hand
53 cat_info[
'foot'][
'info'] = cvt_labelmap_v22_action_foot
73 clip_info[cat] = dict()
74 label_list = label_info[cat]
75 for label
in label_list:
76 clip_info[cat][label] = [[]]
80 for anno
in anno_list:
81 image_idx = image_ids.index(anno[
'image_id'])
85 label = anno[
'action_id'][cat]
87 if len(clip_info[cat][label][-1]) == 0:
88 clip_info[cat][label][-1].append(image_idx)
90 if image_idx - clip_info[cat][label][-1][-1] < clip_interval:
91 clip_info[cat][label][-1].append(image_idx)
93 clip_info[cat][label].append([image_idx])
104 clip_list[cat] = dict()
105 label_list = label_info[cat]
106 for label
in label_list:
107 clip_list[cat][label] = []
110 for cat, cat_clip_info
in clip_info.items():
111 for label, clip_frame_list
in cat_clip_info.items():
114 if label < 0
or label
is None:
119 for frame_list
in clip_frame_list:
122 start, end = frame_list[0], frame_list[-1]
125 clip_len = end - start +1
126 if clip_len < cat_info[cat][
'info'][label][3]:
130 if cat_info[cat][
'info'][label][4]:
132 margin = max( (90 - clip_len)//2, 30)
133 start = max(0, start - margin)
134 end = min(frame_num-1, max(start + train_frame, end + margin))
137 if (end - start +1) < train_frame:
138 start = max(0, end - train_frame)
142 start = max(0, start - margin)
143 end = min(frame_num-1, end + margin)
146 if (end - start +1) < train_frame:
150 clip = dict(start=start, end=end, label=label, seq=seq)
151 clip_list[cat][label].append(clip)
157def save_clip_v22(clip_list, input_anno_list, image_ids, base_anno, save_folder, json_name):
159 한사람에 대해 행동별로 생성된 클립을 저장하는 기능
161 clip_list (dict): 카테고리별 클래스의 클립정보(한명에 대한 정보)
164 '카테고리 명': {클래스 번호: [ {클립정보(start, end, lable, seq)} ]}
167 {'action_upper': {0: [{'start': 20, 'end': 60, 'label':0, 'seq':0}]},
168 'action_lower': {0: []},
170 'hand': {0: [], 1: []},
172 input_anno_list (list[dict]): 한사람에 대한 어노테이션 데이터
173 image_ids (list[str]): 이미지 아이디 리스트
174 base_anno : 어노테이션 데이터 원본, 파일을 읽었을때의 초기 상태
175 save_folder (str): 클립 데이터를 저장할 폴더
176 json_name (str): 원본 클립의 이름
181 for i, anno
in enumerate(input_anno_list):
182 image_idx = image_ids.index(anno[
'image_id'])
183 idx_link[image_idx] = i
186 for cat, label_clip_info
in clip_list.items():
187 for label, clip_list
in label_clip_info.items():
188 for clip
in clip_list:
189 start = clip[
'start']
191 label = clip[
'label']
196 for image_idx
in range(start, end+1):
198 anno = input_anno_list[idx_link[image_idx]]
if image_idx
in idx_link
else None
202 anno_list.append(anno)
205 base_anno[
'annotations'] = anno_list
206 base_anno[
'info'][
'start'] = start
207 base_anno[
'info'][
'end'] = end
210 track_id = anno_list[0][
'track_id']
211 new_name = json_name.replace(
'.json', f
'T{track_id:02d}L{label:02d}S{seq:02d}.json')
212 save_path = os.path.join(save_folder, cat, f
'{label:02d}', new_name)
213 save_json(base_anno, save_path)
214 print(
' saved : ', save_path)
216def generate_clip(json_folder, save_folder):
218 어노테이션 데이터들을 개별 행동 클립으로 분할하는 기능
220 json_folder (str): 어노테이션 파일이 저장된 폴더
221 save_folder (str): 클립 데이터를 저장할 폴더
225 json_name_list, json_path_list = search_file(json_folder,
'.json')
228 data_manager = AnnotationDataManager()
231 N = len(json_name_list)
232 for i, (json_name, json_path)
in enumerate(zip(json_name_list, json_path_list)):
233 print(f
'{i}/{N} {json_path}')
236 data_manager.load_annotation(json_path)
237 data_manager.init_annotation()
240 base_anno = copy.deepcopy(data_manager.dataset)
242 frames = data_manager.get_number_of_image()
245 track_data = data_manager.get_track_anno_data(filter=
True)
248 for track_id, anno_list
in track_data.items():
249 simple_anno_list = cvt_labelmap_v22(anno_list)
251 save_clip_v22(clip_list, anno_list, data_manager.image_ids, base_anno, save_folder, json_name)