(self, img, ori_shape, crop_size, stride_rate, device=None)
| 186 | return pred |
| 187 | |
| 188 | def scale_process(self, img, ori_shape, crop_size, stride_rate, device=None): |
| 189 | new_rows, new_cols, c = img.shape |
| 190 | long_size = new_cols if new_cols > new_rows else new_rows |
| 191 | |
| 192 | if long_size <= crop_size: |
| 193 | input_data, margin = self.process_image(img, crop_size) |
| 194 | score = self.val_func_process(input_data, device) |
| 195 | score = score[:, margin[0] : (score.shape[1] - margin[1]), margin[2] : (score.shape[2] - margin[3])] |
| 196 | else: |
| 197 | stride = int(np.ceil(crop_size * stride_rate)) |
| 198 | img_pad, margin = pad_image_to_shape(img, crop_size, cv2.BORDER_CONSTANT, value=0) |
| 199 | |
| 200 | pad_rows = img_pad.shape[0] |
| 201 | pad_cols = img_pad.shape[1] |
| 202 | r_grid = int(np.ceil((pad_rows - crop_size) / stride)) + 1 |
| 203 | c_grid = int(np.ceil((pad_cols - crop_size) / stride)) + 1 |
| 204 | data_scale = torch.zeros(self.class_num, pad_rows, pad_cols).cuda(device) |
| 205 | count_scale = torch.zeros(self.class_num, pad_rows, pad_cols).cuda(device) |
| 206 | |
| 207 | for grid_yidx in range(r_grid): |
| 208 | for grid_xidx in range(c_grid): |
| 209 | s_x = grid_xidx * stride |
| 210 | s_y = grid_yidx * stride |
| 211 | e_x = min(s_x + crop_size, pad_cols) |
| 212 | e_y = min(s_y + crop_size, pad_rows) |
| 213 | s_x = e_x - crop_size |
| 214 | s_y = e_y - crop_size |
| 215 | img_sub = img_pad[s_y:e_y, s_x:e_x, :] |
| 216 | count_scale[:, s_y:e_y, s_x:e_x] += 1 |
| 217 | |
| 218 | input_data, tmargin = self.process_image(img_sub, crop_size) |
| 219 | temp_score = self.val_func_process(input_data, device) |
| 220 | temp_score = temp_score[ |
| 221 | :, |
| 222 | tmargin[0] : (temp_score.shape[1] - tmargin[1]), |
| 223 | tmargin[2] : (temp_score.shape[2] - tmargin[3]), |
| 224 | ] |
| 225 | data_scale[:, s_y:e_y, s_x:e_x] += temp_score |
| 226 | # score = data_scale / count_scale |
| 227 | score = data_scale |
| 228 | score = score[:, margin[0] : (score.shape[1] - margin[1]), margin[2] : (score.shape[2] - margin[3])] |
| 229 | |
| 230 | score = score.permute(1, 2, 0) |
| 231 | data_output = cv2.resize(score.cpu().numpy(), (ori_shape[1], ori_shape[0]), interpolation=cv2.INTER_LINEAR) |
| 232 | |
| 233 | return data_output |
| 234 | |
| 235 | def val_func_process(self, input_data, device=None): |
| 236 | input_data = np.ascontiguousarray(input_data[None, :, :, :], dtype=np.float32) |
no test coverage detected