7from smdataset.AnnotationDataManager
import AnnotationDataManager
9from smutils.utils_os
import search_file, create_directory
10from smutils.utils_data
import save_pkl_data
15 어노테이션 데이터를 복제해서 더미데이터 리스트를 생성하는 기능
17 anno (dict): 복재하기 위한 어노테이션 데이터
19 return (list[dict]): 더미데이터 리스트
23 tmp_anno = copy.deepcopy(anno)
26 for i
in range(len(tmp_anno[
'keypoints'])):
27 tmp_anno[
'keypoints'][i][-1] = 0
29 tmp_anno[
'action_id'][
'action'] = -1
34 dummy_list.append(copy.deepcopy(tmp_anno))
41 anno_list (list[dict]): 확인하려는 데이터
42 valid : 유효성 파라미터, 1 or 0, 1이면 유효한 데이터, 0이면 유효하지 않는 데이터
43 ratio (float): 유효하지 않는 데이터 비율, 해당 비율보다 작으면 유효성 확인을 통과하지 못함
44 return (bool): 유효성 확인 결과, 유효성 확인을 통과하지 못하면 True, 통과하면 False
47 for anno
in anno_list:
48 sum_valid += anno[
'valid']
50 return sum_valid < len(anno_list)*ratio
56 anno_list (list[dict]): 데이터
57 필수 데이터 : action_id에 action 키가 존재 해야함, 해당 키에 해당 프레임에서의 클래스 정보가 입력되어 있어야함
58 ratio (float): 라벨 결정을 위한 데이터의 시작 위치(%), 클래스를 결정하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
59 valid_ratio (float): 유효하지 않는 데이터 비율, 해당 비율보다 작으면 유효성 확인을 통과하지 못함, 클래스 결정을 위한 구간에서 유효성 검사
60 return (int): 데이터의 클래스, 유효성 검사나 클래스 확인이 어려운 경우 None을 반환함
63 start_idx = int(l*ratio)
68 for i
in range(start_idx, end_idx):
72 if anno[
'action_id'][
'action'] < 0:
76 if anno[
'valid'] == 0:
79 label_list.append(anno[
'action_id'][
'action'])
82 if len(label_list) < (end_idx - start_idx)*valid_ratio:
86 values, counts = np.unique(np.array(label_list), return_counts=
True)
87 max_count = np.max(counts)
88 labels = values[counts == max_count]
89 labels = labels.tolist()
99 학습을 위한 데이터 1개를 생성하는 기능
100 데이터의 최근 3개의 프레임으로 클래스를 결정함
102 anno_list (list[dict]): 데이터
105 image_folder (str): 영상 폴더
107 keypoint (np.array): 스켈레톤 좌표
108 keypoint_score (np.array): 스켈레톤 스코어
109 frame_dir (str): 영상 폴더
110 img_shape (tuple): 원본 영상의 크기
111 original_shape (tuple): 원본 영상의 크기
112 total_frames (int): 데이터의 프레임 수
113 label (int): 샘플의 클래스 번호
117 label = anno_list[-1][
'action_id'][
'action']
124 len_data = len(anno_list)
125 for i
in range(1, 3):
126 if anno_list[len_data-i-1][
'action_id'][
'action'] != label:
137 for anno
in anno_list:
138 kps.append(anno[
'keypoints'])
140 kps = np.array([kps])
141 pkl_data[
'keypoint'] = kps[..., :2]
142 pkl_data[
'keypoint_score'] = kps[..., 2]
143 pkl_data[
'frame_dir'] = image_folder
144 pkl_data[
'img_shape'] = (h, w)
145 pkl_data[
'original_shape'] = (h, w)
146 pkl_data[
'total_frames'] = kps.shape[1]
147 pkl_data[
'label'] = anno_list[-1][
'action_id'][
'action']
153 학습을 위한 데이터 1개를 생성하는 기능
154 데이터의 중심 40% 구간에서 클래스를 결정함
156 anno_list (list[dict]): 데이터
159 image_folder (str): 영상 폴더
161 keypoint (np.array): 스켈레톤 좌표
162 keypoint_score (np.array): 스켈레톤 스코어
163 frame_dir (str): 영상 폴더
164 img_shape (tuple): 원본 영상의 크기
165 original_shape (tuple): 원본 영상의 크기
166 total_frames (int): 데이터의 프레임 수
167 label (int): 샘플의 클래스 번호
185 for anno
in anno_list:
186 kps.append(anno[
'keypoints'])
188 kps = np.array([kps])
189 pkl_data[
'keypoint'] = kps[..., :2]
190 pkl_data[
'keypoint_score'] = kps[..., 2]
191 pkl_data[
'frame_dir'] = image_folder
192 pkl_data[
'img_shape'] = (h, w)
193 pkl_data[
'original_shape'] = (h, w)
194 pkl_data[
'total_frames'] = kps.shape[1]
195 pkl_data[
'label'] = label
201 학습을 위한 데이터 1개를 생성하는 기능
203 행동 클래스는 데이터의 중심 40% 구간에서 클래스를 결정함
204 포즈 클래스는 데이터의 마지막 프레임으로 결정함
206 anno_list (list[dict]): 데이터
209 image_folder (str): 영상 폴더
211 keypoint (np.array): 스켈레톤 좌표
212 keypoint_score (np.array): 스켈레톤 스코어
213 frame_dir (str): 영상 폴더
214 img_shape (tuple): 원본 영상의 크기
215 original_shape (tuple): 원본 영상의 크기
216 total_frames (int): 데이터의 프레임 수
217 label_action (int): 샘플의 행동 클래스 번호
218 label_pose (int): 샘플의 포즈 클래스 번호
226 len_data = len(anno_list)
227 for i
in range(0, 3):
228 if anno_list[len_data-i-1][
'valid'] == 0:
235 if action_label
is None:
239 pose_label = anno_list[-1][
'action_id'][
'pose']
245 for anno
in anno_list:
246 kps.append(anno[
'keypoints'])
248 kps = np.array([kps])
249 pkl_data[
'keypoint'] = kps[..., :2]
250 pkl_data[
'keypoint_score'] = kps[..., 2]
251 pkl_data[
'frame_dir'] = image_folder
252 pkl_data[
'img_shape'] = (h, w)
253 pkl_data[
'original_shape'] = (h, w)
254 pkl_data[
'total_frames'] = kps.shape[1]
255 pkl_data[
'label_action'] = action_label
256 pkl_data[
'label_pose'] = pose_label
262 label = anno_list[-1][
'action_id'][
'action']
266 len_data = len(anno_list)
267 for i
in range(1, 3):
268 if anno_list[len_data-i-1][
'action_id'][
'action'] != label:
277 for anno
in anno_list:
278 kps.append(anno[
'keypoints'])
281 for anno
in anno_list:
282 bboxes.append(anno[
'bbox'])
285 for anno
in anno_list:
286 file_name = data_manager.get_image_name(anno[
'image_id'])
287 filename_list.append(file_name)
289 kps = np.array([kps])
290 bboxes = np.array([bboxes])
291 pkl_data[
'keypoint'] = kps[..., :2]
292 pkl_data[
'keypoint_score'] = kps[..., 2]
293 pkl_data[
'frame_dir'] = image_folder
294 pkl_data[
'img_shape'] = (h, w)
295 pkl_data[
'original_shape'] = (h, w)
296 pkl_data[
'total_frames'] = kps.shape[1]
297 pkl_data[
'label'] = anno_list[-1][
'action_id'][
'action']
298 pkl_data[
'start_index']=0
299 pkl_data[
'modality']=
'RGB'
300 pkl_data[
'keypoint_img_shape'] = (h, w)
301 pkl_data[
'filename_tmpl'] = filename_list
302 pkl_data[
'bbox'] = bboxes
308 하나의 클립에서 학습 데이터를 생성하는 기능
310 data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
311 k (int): 하나의 데이터를 만드는데 사용하는 프레임 숫자
312 mode (str): 단일 라벨 데이터인지 다중 라벨 데이터인지 설정하는 파라미터
315 return (dict): 하나의 클립에 대한 학습 데이터 리스트, 학습 데이터는 추적 아이디별로 저장됨, 추적 아이디의 학습 데이터는 list[dict]의 구조임
323 image_folder = data_manager.get_image_folder()
326 frames = data_manager.get_number_of_image()
331 track_data = data_manager.get_track_anno_data(filter=
True, start_frame=start_frame, end_frame=end_frame)
334 for track_id, anno_list
in track_data.items():
336 frame_no = len(anno_list)
338 image_idx_1st = data_manager.image_ids.index(anno_list[0][
'image_id'])
339 image_idx_end = data_manager.image_ids.index(anno_list[-1][
'image_id'])
340 interval = image_idx_end - image_idx_1st
348 simple_anno_list = cvt_labelmap_v21(anno_list, cvt_labelmap_v21_action_to_simple_ver, cvt_labelmap_v21_pose_to_simple_ver)
350 simple_anno_list = cvt_labelmap_v21_pose_and_action(anno_list, cvt_labelmap_v21_action_to_simple_ver2, cvt_labelmap_v21_pose_to_simple_ver2)
353 for i
in range(0, frame_no):
354 simple_anno_list[i][
'valid'] = 1
357 pkl_datas[track_id] = []
360 anno_q = [simple_anno_list[0]]
361 for i
in range(1, frame_no):
363 image_idx_end = data_manager.image_ids.index(simple_anno_list[i][
'image_id'])
364 image_idx_end_m1 = data_manager.image_ids.index(anno_q[-1][
'image_id'])
367 interval = image_idx_end - image_idx_end_m1
374 anno_q.append(simple_anno_list[i])
377 frame_num = len(anno_q)
393 pkl_datas[track_id].append(pkl_data)
396 if len(pkl_datas[track_id]) == 0:
397 del pkl_datas[track_id]
405 h, w = data_manager.read_image().shape[:2]
406 image_folder = data_manager.get_image_folder()
408 frames = data_manager.get_number_of_image()
410 track_data = data_manager.get_track_anno_data(filter=
True, start_frame=start_frame, end_frame=end_frame)
411 for track_id, anno_list
in track_data.items():
412 frame_no = len(anno_list)
414 image_idx_1st = data_manager.image_ids.index(anno_list[0][
'image_id'])
415 image_idx_end = data_manager.image_ids.index(anno_list[-1][
'image_id'])
416 interval = image_idx_end - image_idx_1st
420 simple_anno_list = cvt_labelmap_v21(anno_list, cvt_labelmap_v21_action_to_simple_ver, cvt_labelmap_v21_pose_to_simple_ver)
422 for i
in range(0, frame_no):
423 simple_anno_list[i][
'valid'] = 1
425 anno_q = [simple_anno_list[0]]
430 for i
in range(1, frame_no):
431 image_idx_end = data_manager.image_ids.index(simple_anno_list[i][
'image_id'])
432 image_idx_end_m1 = data_manager.image_ids.index(anno_q[-1][
'image_id'])
434 interval = image_idx_end - image_idx_end_m1
439 anno_q.append(simple_anno_list[i])
441 frame_num = len(anno_q)
445 pkl_data =
gen_pkl_data_dual(anno_q[frame_num-k:], h, w, image_folder, data_manager)
450 pkl_datas.append(pkl_data)
456 학습 데이터를 행동 클래스에 따라서 분리하는 기능
458 data_list (list[dict]): 학습 데이터 리스트, 데이터에는 label or label_action 키에 대한 값이 존재해야함
459 return (list[dict]) : 행동 클래스를 기준으로 분리된 학습 데이터
462 for data
in data_list:
464 label = data[
'label']
466 label = data[
'label_action']
468 if label
not in split_data:
469 split_data[label] = []
470 split_data[label].append(data)
475 학습 데이터를 포즈 클래스에 따라서 분리하는 기능
477 data_list (list[dict]): 학습 데이터 리스트, 데이터에는 label_pose 키에 대한 값이 존재해야함
478 return (list[dict]) : 포즈 클래스를 기준으로 분리된 학습 데이터
481 for data
in data_list:
482 label = data[
'label_pose']
484 if label
not in split_data:
485 split_data[label] = []
486 split_data[label].append(data)
492 클립 정보를 담고있는 어노테이션 파일들을 사용해서 학습데이터를 만드는 기능
494 pkl_root (str): 학습데이터를 저장할 폴더
495 dataset_folder (str): 클립 정보를 담고있는 어노테이션 파일들이 저장된 폴더
496 k (int): 학습데이터를 생성하는 프레임 수
497 mode (str): 단일 라벨 데이터인지 다중 라벨 데이터인지 설정하는 파라미터
501 data_manager = AnnotationDataManager()
503 create_directory(args.pkl_root)
505 json_name_list, json_path_list = search_file(args.dataset_folder,
'.json')
506 file_num = len(json_name_list)
508 for i, (json_path, json_name)
in enumerate(zip(json_path_list, json_name_list)):
509 data_manager.load_annotation(json_path)
510 data_manager.init_annotation()
515 for track_id, datas
in pkl_datas.items():
518 for action_label, data
in split_data.items():
519 pkl_name = json_name.replace(
'json',
'pkl')
520 name, ext = pkl_name.split(
'.')
521 if args.mode ==
'mc':
523 for pose_label, d
in s_data.items():
524 new_pkl_name = f
'{name}_{track_id:02d}_{action_label:03d}_{pose_label:03d}.{ext}'
525 save_pkl_path = os.path.join(args.pkl_root, new_pkl_name)
526 save_pkl_data(d, save_pkl_path)
529 print(f
"[mc][ {i+1} / {file_num} ] {save_pkl_path} : {len(d)}")
531 elif args.mode ==
'sc':
532 new_pkl_name = f
'{name}_{track_id:02d}_{action_label:03d}.{ext}'
533 save_pkl_path = os.path.join(args.pkl_root, new_pkl_name)
534 save_pkl_data(data, save_pkl_path)
537 print(f
"[sc][ {i+1} / {file_num} ] {save_pkl_path} : {len(datas)}")
544 학습데이터 파일들을 하나로 합치는 기능
546 folder (str): 학습데이터가 저장된 폴더
547 file_path_list (list[str]) : 학습데이터 경로 리스트, 설정하지 않으면 folder에서 찾음
548 return (list[dict]): 합쳐진 학습 데이터
550 if file_path_list ==
None:
551 file_name_list, file_path_list = search_file(folder, fileEx=
'.pkl')
553 merged_pkl_datas = []
554 for path
in file_path_list:
555 with open(path,
'rb')
as f:
556 pkl_data = pickle.load(f)
557 merged_pkl_datas += pkl_data
558 print(f
"{path} : {len(pkl_data)}")
560 return merged_pkl_datas
564 학습데이터 파일들을 하나로 합치고 저장하는 기능
566 pkl_root (str): 학습데이터가 저장된 폴더
567 merge_pkl_path (str): 합쳐진 데이터를 하나의 파일로 저장하는 경로
569 merged_pkl_datas = merge_pkl(args.pkl_root)
570 print(f
"total {args.merge_pkl_path} : {len(merged_pkl_datas)}")
571 save_pkl_data(merged_pkl_datas, args.merge_pkl_path)
576 데이터에 특정 카테고리의 특정 클래스가 존재하는지 확인하는 기능
578 anno_list (list[dict]): 데이터
579 필수 데이터 : action_id에 라벨 이름(category)에 대한 키가 존재 해야함, 해당 키에 해당 프레임에서의 클래스 정보가 입력되어 있어야함
580 category (str): 데이터에서 확인하려는 카테고리
581 target_label (int): 데이터에서 확인하려는 클래스
582 ratio (float): 라벨 확인을 위한 데이터의 시작 위치(%), 클래스를 확인하는데 사용하는 전체 범위는 데이터 중앙의 (1-2*ratio) *100 %가 됨
584 return (bool): 원하는 클래스 존재 유무
589 start_idx = int(l*ratio)
590 end_idx = l-start_idx
594 for i
in range(start_idx, end_idx):
598 if anno[
'action_id'][category] < 0:
602 if anno[
'valid'] == 0:
605 label_list.append(anno[
'action_id'][category])
607 return target_label
in label_list
617 학습을 위한 데이터 1개를 생성하는 기능
618 특정 카테고리의 특정 클래스에 해당하는 데이터를 생성함
619 데이터의 중심 40% 구간을 확인해서 클래스를 설정함
621 anno_list (list[dict]): 데이터
622 category (str): 데이터에서 확인하려는 카테고리
623 target_label (int): 데이터에서 확인하려는 클래스
626 image_folder (str): 영상 폴더
628 keypoint (np.array): 스켈레톤 좌표
629 keypoint_score (np.array): 스켈레톤 스코어
630 frame_dir (str): 영상 폴더
631 img_shape (tuple): 원본 영상의 크기
632 original_shape (tuple): 원본 영상의 크기
633 total_frames (int): 데이터의 프레임 수
634 category (str): 샘플의 카테고리
635 label (int): 샘플의 클래스 번호
652 for anno
in anno_list:
653 kps.append(anno[
'keypoints'])
655 kps = np.array([kps])
656 pkl_data[
'keypoint'] = kps[..., :2]
657 pkl_data[
'keypoint_score'] = kps[..., 2]
658 pkl_data[
'frame_dir'] = image_folder
659 pkl_data[
'img_shape'] = (h, w)
660 pkl_data[
'original_shape'] = (h, w)
661 pkl_data[
'total_frames'] = kps.shape[1]
662 pkl_data[
'category'] = category
663 pkl_data[
'label'] = label
669 하나의 클립에서 학습 데이터를 생성하는 기능
670 카테고리의 특정 클래스에 대한 데이터를 생성함
672 data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
673 category (str): 데이터에서 확인하려는 카테고리
674 target_label (int): 데이터에서 확인하려는 클래스
675 k (int): 하나의 데이터를 만드는데 사용하는 프레임 숫자
676 return (dict): 하나의 클립에 대한 학습 데이터 리스트, 학습 데이터는 추적 아이디별로 저장됨, 추적 아이디의 학습 데이터는 list[dict]의 구조임
683 image_folder = data_manager.get_image_folder()
686 start_frame = data_manager.dataset[
'info'][
'start']
687 end_frame = data_manager.dataset[
'info'][
'end']
690 track_data = data_manager.get_track_anno_data(filter=
True, start_frame=start_frame, end_frame=end_frame)
694 for track_id, anno_list
in track_data.items():
696 frame_no = len(anno_list)
698 image_idx_1st = data_manager.image_ids.index(anno_list[0][
'image_id'])
699 image_idx_end = data_manager.image_ids.index(anno_list[-1][
'image_id'])
702 interval = image_idx_end - image_idx_1st
707 simple_anno_list = cvt_labelmap_v22(anno_list)
710 for i
in range(0, frame_no):
711 simple_anno_list[i][
'valid'] = 1
714 pkl_datas[track_id] = []
717 anno_q = [simple_anno_list[0]]
718 for i
in range(1, frame_no):
721 image_idx_end = data_manager.image_ids.index(simple_anno_list[i][
'image_id'])
722 image_idx_end_m1 = data_manager.image_ids.index(anno_q[-1][
'image_id'])
725 interval = image_idx_end - image_idx_end_m1
732 anno_q.append(simple_anno_list[i])
735 frame_num = len(anno_q)
740 pkl_data =
gen_pkl_data_v22(anno_q[frame_num-k:], category, target_label, h, w, image_folder)
747 pkl_datas[track_id].append(pkl_data)
750 if len(pkl_datas[track_id]) == 0:
751 del pkl_datas[track_id]
758 클립 정보를 담고있는 어노테이션 파일들을 사용해서 학습데이터를 만드는 기능
760 category_k (dict): 카테고리별 학습데이터를 생성하는 프레임 수
761 data_root (str): 클립 정보를 담고있는 어노테이션 파일들이 저장된 폴더
762 pkl_root (str): 학습데이터를 저장할 폴더
766 data_manager = AnnotationDataManager()
769 category_k = args.category_k
771 data_root = args.data_root
772 for category, k
in category_k.items():
774 dataset_folder = os.path.join(data_root, category)
775 json_name_list, json_path_list = search_file(dataset_folder,
'.json')
778 save_folder = os.path.join(args.pkl_root, category)
779 for i, (json_path, json_name)
in enumerate(zip(json_path_list, json_name_list)):
780 target_label = json_path.split(
'/')[-2]
781 cat_label = os.path.join(save_folder, target_label)
782 create_directory(cat_label)
784 file_num = len(json_name_list)
786 for i, (json_path, json_name)
in enumerate(zip(json_path_list, json_name_list)):
790 data_manager.load_annotation(json_path)
791 data_manager.init_annotation()
794 target_label = int(json_path.split(
'/')[-2])
800 for track_id, datas
in pkl_datas.items():
801 pkl_name = json_name.replace(
'json',
'pkl')
802 save_pkl_path = os.path.join(save_folder, f
'{target_label:02d}', pkl_name)
803 save_pkl_data(datas, save_pkl_path)
804 total_data += len(datas)
805 print(f
"{category} -> [ {i+1} / {file_num} ] {save_pkl_path} : {len(datas):5d}/{total_data:}")
make_action_pkl_file_v22(data_manager, category, target_label, k)
gen_pkl_data_ver3(anno_list, h, w, image_folder)
run_generate_pkl_data_from_json(args)
gen_pkl_data_v22(anno_list, category, target_label, h, w, image_folder)
split_from_action(data_list)
run_generate_pkl_data_from_json_v22(args)
calc_label(anno_list, ratio=0.3, valid_ratio=0.5)
check_label_v22(anno_list, category, target_label, ratio=0.3)
make_action_pkl_file(data_manager, k, mode=None)
split_from_pose(data_list)
gen_pkl_data_dual(anno_list, h, w, image_folder, data_manager)
gen_pkl_data_ver2(anno_list, h, w, image_folder)
check_invaild(anno_list, ratio)
gen_pkl_data(anno_list, h, w, image_folder)
make_dummy_list(anno, num)
make_action_pkl_file_dual(data_manager, k)
merge_pkl(folder, file_path_list=None)