86 def run_detector(self, images, bboxes=None):
87 """
88 포즈 추정기를 동작시키는 기능
89 args:
90 image (np.array): RGB 이미지
91 bboxes (np.array): 객체 영역의 박스
92 """
93
94
95 is_batch = isinstance(images, (list, tuple))
96
97
98 images = [images] if not is_batch else images
99 if not is_batch:
100 bboxes = [bboxes]
101 elif bboxes is None:
102 bboxes = [None]*len(images)
103
104
105 crop_images, bbox_list, track_ids, image_ids = [], [], [], []
106 for image_id, (image, bbox) in enumerate(zip(images, bboxes)):
107 crops, bbs, tids, imids = self.make_src(image, image_id, bbox)
108 crop_images.extend(crops)
109 bbox_list.append(bbs)
110 track_ids.append(tids)
111 image_ids.extend(imids)
112
113 bbox_list = np.vstack(bbox_list)
114 track_ids = np.hstack(track_ids)
115
116
117 crop_images = self.divide_into_batches(crop_images, self.batch_size)
118 with torch.no_grad():
119 results = []
120
121 for image in crop_images:
122
123 processed_input = self.task_processor.create_input(
124 image,
125 self.input_shape,
126 test_pipeline=self.test_pipeline
127 )[0]
128
129
130 inference_result = self.model.test_step(processed_input)
131
132
133 for item in inference_result:
134 results.append(item)
135
136
137
138
139 pose_results = []
140 pre_img_id = -1
141 for res, bbox, track_id, img_id in zip(results, bbox_list, track_ids, image_ids):
142 keypoints = res.pred_instances.keypoints + bbox[:2]
143 keypoint_scores = np.expand_dims(res.pred_instances.keypoint_scores, axis=-1)
144 keypoints = np.dstack((keypoints, keypoint_scores))
145
146
147 if keypoints.ndim == 3:
148 keypoints = keypoints[0]
149
150
151 if pre_img_id != img_id:
152 pre_img_id = img_id
153 pose_results.append([])
154
155
156 data = {'track_id': track_id, 'bbox': bbox, 'keypoints': keypoints}
157 pose_results[-1].append(data)
158
159
160 if is_batch:
161 return pose_results
162 else:
163 if len(pose_results) == 0:
164 return pose_results
165 return pose_results[0]
166