15 한프레임에서 검출된 박스에대해 포즈 모델을 inference하는 기능
17 model: smpose로 빌드한 포즈 모델
18 image (np.array): 원본 이미지
19 bboxes (np.array): 검출 박스(x,y,x,y), shape (num_person, 4 or 5 or 6)
21 kp (np.array): 모든 사람에 대한 스켈레톤 좌표, shape (num_person, 17, 3)
22 pose_result (list[dict]):
23 track_id (int): 추적 아이디
24 bbox (np.array): 박스 위치(x, y, x, y)
25 keypoints (np.array): 스켈레톤 좌표, shape (17, 3)
28 num_person = bboxes.shape[0]
29 kp = np.zeros((num_person, 17, 3), dtype=np.float32)
31 pose_result = model.run_detector(image, bboxes)
32 for j, item
in enumerate(pose_result):
33 kp[j] = item[
'keypoints']
35 return kp, pose_result
40 어노테이션 파일에 포즈모델로 예측한 스켈레톤을 업데이트하는 기능
42 model: smpose로 빌드한 포즈 모델
43 data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
44 save_pose_img_folder: 스켈레톤 시각화 이미지를 저장할 폴더, 설정하지 않으면 시각화하지 않음
48 if save_pose_img_folder
is not None:
49 create_directory(save_pose_img_folder)
52 img_num = data_manager.get_number_of_image()
53 for i
in tqdm(range(img_num)):
55 anno_data = data_manager.get_anno_data_in_image()
57 img_path = data_manager.get_image_path()
61 for anno
in anno_data:
62 bbox_tmp = copy.deepcopy(anno[
'bbox'])
63 bbox_tmp[2] += bbox_tmp[0]
64 bbox_tmp[3] += bbox_tmp[1]
65 bbox_tmp[0] = max(bbox_tmp[0], 0)
66 bbox_tmp[1] = max(bbox_tmp[1], 0)
68 bbox_in_image.append(bbox_tmp)
71 if len(bbox_in_image) == 0:
72 data_manager.move_image_right()
75 bboxes = np.array(bbox_in_image)
76 image = cv2.imread(img_path)
80 for anno, kp
in zip(anno_data, key_points):
82 data_manager.update_annotation_data_by_anno_id(anno[
'id'],
'keypoints', kp)
85 if save_pose_img_folder
is not None:
87 image = vis_pose_coco_skeleton(image, pose_result)
90 file_name = img_path.split(
'/')[-1]
91 save_path = os.path.join(save_pose_img_folder, file_name)
94 cv2.imwrite(save_path, image)
97 data_manager.move_image_right()
100 data_manager.save_annotation()
105 어노테이션 파일들에 포즈모델로 예측한 스켈레톤을 업데이트하는 기능
107 save_json_root (str): 스켈레톤이 업데이트된 어노테이션을 저장할 폴더, 지정하지 않으면 원본 파일에 덮어씀
108 pose_config (str): smpose 모델이 정의된 config 파일 경로
109 dataset_folder_list (list[str]): 어노테이션 파일이 저장된 폴더 리스트
110 skip (int): 스킵할 어노테이션 파일 수량
111 save_pose_img_root (str): 스켈레톤 시각화 영상을 저장할 폴더, 설정하지 않으면 시각화 하지 않음
115 if args.save_json_root
is not None:
116 create_directory(args.save_json_root)
119 model = smrunner.build_model(args.pose_config)
122 data_manager = AnnotationDataManager()
127 for dataset_folder
in args.dataset_folder_list:
128 name_list, path_list = search_file(dataset_folder,
'.json')
129 json_name_list.extend(name_list)
130 json_path_list.extend(path_list)
132 file_num = len(json_path_list)
133 for i, (json_name, json_path)
in enumerate(zip(json_name_list, json_path_list)):
140 if args.save_json_root
is not None:
141 save_path = os.path.join(args.save_json_root, json_name)
144 data_manager.load_annotation(json_path, save_path=save_path)
145 data_manager.init_annotation()
148 print(f
"[ {i+1} / {file_num}] : load path : {json_path}")
149 print(f
"[ {i+1} / {file_num}] : save path : {data_manager.get_save_path()}")
152 save_pose_img_folder =
None
153 if args.save_pose_img_root
is not None:
154 folder = json_name.split(
'.')[0]
155 save_pose_img_folder = os.path.join(args.save_pose_img_root, folder)