Safemotion Lib
Loading...
Searching...
No Matches
Functions
update_anno_pose Namespace Reference

Functions

 pose_inference_one_frame (model, image, bboxes)
 
 update_annotation_pose_data (model, data_manager, save_pose_img_folder=None)
 
 run_update_annotation_pose_data (args)
 

Function Documentation

◆ pose_inference_one_frame()

update_anno_pose.pose_inference_one_frame ( model,
image,
bboxes )
한프레임에서 검출된 박스에대해 포즈 모델을 inference하는 기능
args:
    model: smpose로 빌드한 포즈 모델
    image (np.array): 원본 이미지
    bboxes (np.array): 검출 박스(x,y,x,y), shape (num_person, 4 or 5 or 6)
return:
    kp (np.array): 모든 사람에 대한 스켈레톤 좌표, shape (num_person, 17, 3)
    pose_result (list[dict]): 
        track_id (int): 추적 아이디
        bbox (np.array): 박스 위치(x, y, x, y)
        keypoints (np.array): 스켈레톤 좌표, shape (17, 3)

Definition at line 13 of file update_anno_pose.py.

13def pose_inference_one_frame(model, image, bboxes):
14 """
15 한프레임에서 검출된 박스에대해 포즈 모델을 inference하는 기능
16 args:
17 model: smpose로 빌드한 포즈 모델
18 image (np.array): 원본 이미지
19 bboxes (np.array): 검출 박스(x,y,x,y), shape (num_person, 4 or 5 or 6)
20 return:
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)
26 """
27
28 num_person = bboxes.shape[0]
29 kp = np.zeros((num_person, 17, 3), dtype=np.float32)
30
31 pose_result = model.run_detector(image, bboxes)
32 for j, item in enumerate(pose_result):
33 kp[j] = item['keypoints']
34
35 return kp, pose_result
36
37

◆ run_update_annotation_pose_data()

update_anno_pose.run_update_annotation_pose_data ( args)
어노테이션 파일들에 포즈모델로 예측한 스켈레톤을 업데이트하는 기능
args:
    save_json_root (str): 스켈레톤이 업데이트된 어노테이션을 저장할 폴더, 지정하지 않으면 원본 파일에 덮어씀
    pose_config (str): smpose 모델이 정의된 config 파일 경로
    dataset_folder_list (list[str]): 어노테이션 파일이 저장된 폴더 리스트
    skip (int): 스킵할 어노테이션 파일 수량
    save_pose_img_root (str): 스켈레톤 시각화 영상을 저장할 폴더, 설정하지 않으면 시각화 하지 않음

Definition at line 103 of file update_anno_pose.py.

103def run_update_annotation_pose_data(args):
104 """
105 어노테이션 파일들에 포즈모델로 예측한 스켈레톤을 업데이트하는 기능
106 args:
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): 스켈레톤 시각화 영상을 저장할 폴더, 설정하지 않으면 시각화 하지 않음
112 """
113
114 #json 저장 폴더 생성
115 if args.save_json_root is not None:
116 create_directory(args.save_json_root)
117
118 #모델 빌드
119 model = smrunner.build_model(args.pose_config)
120
121 #어노테이션 관리자 생성
122 data_manager = AnnotationDataManager()
123
124 #어노테이션 리스트, 입력된 폴더에 존재하는 모든 어노테이션 파일을 리스트에 저장
125 json_name_list = []
126 json_path_list = []
127 for dataset_folder in args.dataset_folder_list:
128 name_list, path_list = search_file(dataset_folder, '.json') #dataset_folder에 저장된 어노테이션 파일 경로들을 찾음
129 json_name_list.extend(name_list)
130 json_path_list.extend(path_list)
131
132 file_num = len(json_path_list) #파일 수량, 진행 정도 표시를 위함
133 for i, (json_name, json_path) in enumerate(zip(json_name_list, json_path_list)):
134 #스킵
135 if i < args.skip:
136 continue
137
138 #저장 위치 설정
139 save_path = None
140 if args.save_json_root is not None:
141 save_path = os.path.join(args.save_json_root, json_name)
142
143 #어노테이션 관리자 초기화
144 data_manager.load_annotation(json_path, save_path=save_path) #로드
145 data_manager.init_annotation() #초기화
146
147 #진행도 출력
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()}")
150
151 #저장 경로 설정
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)
156
157 #어노테이션 파일 하나에 대해서 스켈레톤 업데이트 진행
158 update_annotation_pose_data(model, data_manager, save_pose_img_folder)
159 print('')

◆ update_annotation_pose_data()

update_anno_pose.update_annotation_pose_data ( model,
data_manager,
save_pose_img_folder = None )
어노테이션 파일에 포즈모델로 예측한 스켈레톤을 업데이트하는 기능
args:
    model: smpose로 빌드한 포즈 모델
    data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
    save_pose_img_folder: 스켈레톤 시각화 이미지를 저장할 폴더, 설정하지 않으면 시각화하지 않음

Definition at line 38 of file update_anno_pose.py.

38def update_annotation_pose_data(model, data_manager, save_pose_img_folder=None):
39 """
40 어노테이션 파일에 포즈모델로 예측한 스켈레톤을 업데이트하는 기능
41 args:
42 model: smpose로 빌드한 포즈 모델
43 data_manager: AnnotationDataManager 객체, 어노테이션 데이터파일로 초기화까지 진행
44 save_pose_img_folder: 스켈레톤 시각화 이미지를 저장할 폴더, 설정하지 않으면 시각화하지 않음
45 """
46
47 #시각화 이미지를 저장할 폴더 생성
48 if save_pose_img_folder is not None:
49 create_directory(save_pose_img_folder)
50
51 #이미지 숫자 체크
52 img_num = data_manager.get_number_of_image()
53 for i in tqdm(range(img_num)):
54 #이미지에 있는 어노테이션 데이터를 가져옴
55 anno_data = data_manager.get_anno_data_in_image()
56 #이미지 경로를 가져옴
57 img_path = data_manager.get_image_path()
58
59 #어노테이션 박스 구조 변경 (x, y, w, h) -> (x, y, x, y)
60 bbox_in_image = []
61 for anno in anno_data:
62 bbox_tmp = copy.deepcopy(anno['bbox'])
63 bbox_tmp[2] += bbox_tmp[0] #TODO: 영상 크기로 최대치 체크
64 bbox_tmp[3] += bbox_tmp[1] #TODO: 영상 크기로 최대치 체크
65 bbox_tmp[0] = max(bbox_tmp[0], 0)
66 bbox_tmp[1] = max(bbox_tmp[1], 0)
67
68 bbox_in_image.append(bbox_tmp)
69
70 #박스가 없으면 다음 이미지로 넘어감
71 if len(bbox_in_image) == 0:
72 data_manager.move_image_right()
73 continue
74
75 bboxes = np.array(bbox_in_image) #박스 타입 변경
76 image = cv2.imread(img_path) #이미지 로드
77 key_points, pose_result = pose_inference_one_frame(model, image, bboxes) #포즈 inference
78
79 #스켈레톤 데이터 업데이트 진행
80 for anno, kp in zip(anno_data, key_points):
81 kp = kp.tolist() #스켈레톤 데이터를 리스트로 변경(이중리스트가 됨)
82 data_manager.update_annotation_data_by_anno_id(anno['id'], 'keypoints', kp) #업데이트
83
84 #스켈레톤 시각화 이미지 저장
85 if save_pose_img_folder is not None:
86 #이미지에 스켈레톤 그리기
87 image = vis_pose_coco_skeleton(image, pose_result)
88
89 #저장 경로 생성
90 file_name = img_path.split('/')[-1]
91 save_path = os.path.join(save_pose_img_folder, file_name)
92
93 #시각화 이미지 저장
94 cv2.imwrite(save_path, image)
95
96 #다음 이미지로 이동
97 data_manager.move_image_right()
98
99 #스켈레톤 업데이트된 어노테이션 데이터 저장
100 data_manager.save_annotation()
101
102