58 folder (str): 학습데이터가 저장된 폴더
59 file_path_list (list[str]) : 학습데이터 경로 리스트, 설정하지 않으면 folder에서 찾음
60 return (list[dict]): 합쳐진 학습 데이터
63 if file_path_list ==
None:
64 file_name_list, file_path_list = search_file(folder, fileEx=
'.pkl')
67 for path
in file_path_list:
68 with open(path,
'rb')
as f:
69 pkl_data = pickle.load(f)
70 merged_pkl_datas += pkl_data
71 print(f
"{path} : {len(pkl_data)}")
73 return merged_pkl_datas
130 anno_list (list[dict]): 어노테이션 데이터 리스트, 각 항목은 'action_id'키를 포함해야 하며, 이키는 해당 프레임의 클래스 정보를 담고 있는 category(리스트) 키들을 포함해야 함
131 category (list): 생성하려는 학습 데이터의 카테고리 리스트
132 category_margin_ratio (dict): 카테고리별 라벨 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
133 return (dict): 카테고리별 데이터의 클래스, 유효성 검사나 클래스 확인이 어려운 경우 None을 반환함
145 ratio = category_margin_ratio[cat]
146 start_idx = int(l*ratio)
147 end_idx = l-start_idx
149 for i
in range(start_idx, end_idx):
153 if anno[
'action_id'][cat] < 0:
157 if anno[
'valid'] == 0:
160 label_dict[cat].append(anno[
'action_id'][cat])
166 if len(label_dict[cat]) == 0:
167 ret_label[
'gt_'+cat] = -1
171 values, counts = np.unique(np.array(label_dict[cat]), return_counts=
True)
172 max_count = np.max(counts)
173 labels = values[counts == max_count]
174 labels = labels.tolist()
175 ret_label[
'gt_'+cat] = labels[0]
181 학습을 위한 이미지 특징을 생성하는 기능
183 anno_list (list[dict]): 어노테이션 데이터 리스트, 각 항목은 'image_id'와 'valid' 키를 포함하고 있어야함
184 img_feats (dict): 이미지 아이디에 대응하는 이미지 특징, 이미지 특징은 Tenosr 타입이고 shpae은 (C,)임
185 return (Tensor): 데이터에 대한 이미지 특징, shape (T, C, 1)
190 for anno
in anno_list:
191 image_id = anno[
'image_id']
194 if anno[
'valid'] == 0:
198 feat_size = img_feats[image_id].shape[0]
203 for anno
in anno_list:
204 image_id = anno[
'image_id']
207 if anno[
'valid'] == 0:
208 img_feat_list.append(torch.zeros(feat_size))
210 img_feat_list.append(img_feats[image_id])
213 return torch.stack(img_feat_list, dim=1).unsqueeze(-1)
215def gen_pkl_data_v22(anno_list, train_category, category, target_label, category_margin_ratio, h, w, image_folder, img_feats=None):
217 학습을 위한 데이터 1개를 생성하는 기능
218 학습 카테고리별로 학습 클래스를 설정함
219 category(메인 카테고리)의 클래스는 데이터의 중심 40% 구간에 target_label이 존재하면 target_label로 설정됨, target_label이 존재하지 않는다면 데이터는 생성하지 않음
222 anno_list (list[dict]): 어노테이션 데이터 리스트
223 train_category (list[str]): 학습 카테고리 리스트
224 category (str): 학습 데이터의 메인 카테고리
225 target_label (int): 메인 카테고리에 해당하는 타겟 클래스, target_label 정보가 존재해야 학습 데이터를 생성함
226 category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
229 image_folder (str): 영상 폴더
230 img_feats (dict): 이미지 아이디에 대응하는 이미지 특징, 이미지 특징은 Tenosr 타입이고 shpae은 (C,)임, 파라미터를 설정하지 않으면 이미지 특징은 학습데이터에 포함하지 않음
232 keypoint (np.array): 스켈레톤 좌표
233 keypoint_score (np.array): 스켈레톤 스코어
234 frame_dir (str): 영상 폴더
235 img_shape (tuple): 원본 영상의 크기
236 original_shape (tuple): 원본 영상의 크기
237 total_frames (int): 데이터의 프레임 수
238 category (str): 샘플의 메인 카테고리
239 gt_{category_key} (int): 카테고리별 클래스
240 image_feature (Tensor): 이미지 특징, shape (T, C, 1)
251 label[
'gt_'+category] = target_label
256 non_target_category = remove_items(train_category, [category])
257 label.update(
make_label_v22(anno_list, non_target_category, category_margin_ratio))
263 for anno
in anno_list:
264 kps.append(anno[
'keypoints'])
266 kps = np.array([kps])
267 pkl_data[
'keypoint'] = kps[..., :2]
268 pkl_data[
'keypoint_score'] = kps[..., 2]
269 pkl_data[
'frame_dir'] = image_folder
270 pkl_data[
'img_shape'] = (h, w)
271 pkl_data[
'original_shape'] = (h, w)
272 pkl_data[
'total_frames'] = kps.shape[1]
273 pkl_data[
'category'] = category
274 pkl_data.update(label)
277 if img_feats
is not None:
284 하나의 클립에서 학습 데이터를 생성하는 기능
285 학습 카테고리별로 학습 클래스를 설정함
287 data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
288 train_category (list[str]): 학습 카테고리 리스트
289 category (str): 학습 데이터의 메인 카테고리
290 target_label (int): 메인 카테고리에 해당하는 타겟 클래스, target_label 정보가 존재해야 학습 데이터를 생성함
291 category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
292 k (int): 하나의 데이터를 만드는데 사용하는 프레임 숫자
293 img_feat_dict (dict): 추적 아이디의 이미지 특징 데이터, 이미지 특징 데이터는 dict 구조로 이미지 아이디별 각 프레임에서의 이미지 특징을 담고 있음.
294 return (dict): 하나의 클립에 대한 학습 데이터 리스트, 학습 데이터는 추적 아이디별로 저장됨, 추적 아이디의 학습 데이터는 list[dict]의 구조임
303 image_folder = data_manager.get_image_folder()
306 start_frame = data_manager.dataset[
'info'][
'start']
307 end_frame = data_manager.dataset[
'info'][
'end']
310 track_data = data_manager.get_track_anno_data(filter=
True, start_frame=start_frame, end_frame=end_frame+1)
314 for track_id, anno_list
in track_data.items():
318 if img_feat_dict
is not None:
319 img_feats = img_feat_dict[track_id]
321 frame_no = len(anno_list)
323 image_idx_1st = data_manager.image_ids.index(anno_list[0][
'image_id'])
324 image_idx_end = data_manager.image_ids.index(anno_list[-1][
'image_id'])
327 interval = image_idx_end - image_idx_1st
332 simple_anno_list = cvt_labelmap_v22(anno_list)
335 for i
in range(0, frame_no):
336 simple_anno_list[i][
'valid'] = 1
339 pkl_datas[track_id] = []
342 anno_q = [simple_anno_list[0]]
343 for i
in range(1, frame_no):
346 image_idx_end = data_manager.image_ids.index(simple_anno_list[i][
'image_id'])
347 image_idx_end_m1 = data_manager.image_ids.index(anno_q[-1][
'image_id'])
350 interval = image_idx_end - image_idx_end_m1
357 anno_q.append(simple_anno_list[i])
360 frame_num = len(anno_q)
365 pkl_data =
gen_pkl_data_v22(anno_q[frame_num-k:], train_category, category, target_label, category_margin_ratio, h, w, image_folder, img_feats=img_feats)
372 pkl_datas[track_id].append(pkl_data)
375 if len(pkl_datas[track_id]) == 0:
376 del pkl_datas[track_id]
383 클립 정보를 담고있는 어노테이션 파일들을 사용해서 학습데이터를 만드는 기능
385 category_k (dict): 카테고리별 학습데이터를 생성하는 프레임 수
386 train_category (list[str]): 학습 카테고리 리스트
387 category_margin_ratio (dict): 카테고리별 클래스 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
388 data_root (str): 클립 정보를 담고있는 어노테이션 파일들이 저장된 폴더
389 pkl_root (str): 학습데이터를 저장할 폴더
390 image_feat_folder (str): 이미지 특징이 저장된 폴더
394 data_manager = AnnotationDataManager()
397 category_k = args.category_k
398 train_category = args.train_category
399 category_margin_ratio = args.category_margin_ratio
401 data_root = args.data_root
402 for category, k
in category_k.items():
404 dataset_folder = os.path.join(data_root, category)
405 json_name_list, json_path_list = search_file(dataset_folder,
'.json')
408 save_folder = os.path.join(args.pkl_root, category)
409 for i, (json_path, json_name)
in enumerate(zip(json_path_list, json_name_list)):
410 target_label = json_path.split(
'/')[-2]
411 cat_label = os.path.join(save_folder, target_label)
412 create_directory(cat_label)
414 file_num = len(json_name_list)
416 for i, (json_path, json_name)
in enumerate(zip(json_path_list, json_name_list)):
420 data_manager.load_annotation(json_path)
421 data_manager.init_annotation()
424 target_label = int(json_path.split(
'/')[-2])
427 if args.image_feat_folder
is not None:
428 img_feat_file = json_name[:17] +
'.pkl'
429 img_feat_path = os.path.join(args.image_feat_folder, img_feat_file)
430 img_feat_dict = load_pkl_data(img_feat_path)
433 pkl_datas =
make_action_pkl_file_v22(data_manager, train_category, category, target_label, category_margin_ratio, k, img_feat_dict=img_feat_dict)
436 for track_id, datas
in pkl_datas.items():
437 pkl_name = json_name.replace(
'json',
'pkl')
438 save_pkl_path = os.path.join(save_folder, f
'{target_label:02d}', pkl_name)
439 save_pkl_data(datas, save_pkl_path)
440 total_data += len(datas)
441 print(f
"{category} -> [ {i+1} / {file_num} ] {save_pkl_path} : {len(datas):5d}/{total_data:}")
gen_pkl_data_v22(anno_list, train_category, category, target_label, category_margin_ratio, h, w, image_folder, img_feats=None)