| from typing import List, Tuple, Union
|
|
|
| import cv2
|
| import numpy as np
|
| from config import ModelType
|
| from numpy import ndarray
|
|
|
|
|
| class Preprocess:
|
|
|
| def __init__(self, model_type: ModelType):
|
| if model_type in (ModelType.YOLOV5, ModelType.YOLOV6, ModelType.YOLOV7,
|
| ModelType.YOLOV8):
|
| mean = np.array([0, 0, 0], dtype=np.float32)
|
| std = np.array([255, 255, 255], dtype=np.float32)
|
| is_rgb = True
|
| elif model_type == ModelType.YOLOX:
|
| mean = np.array([0, 0, 0], dtype=np.float32)
|
| std = np.array([1, 1, 1], dtype=np.float32)
|
| is_rgb = False
|
| elif model_type == ModelType.PPYOLOE:
|
| mean = np.array([123.675, 116.28, 103.53], dtype=np.float32)
|
| std = np.array([58.395, 57.12, 57.375], dtype=np.float32)
|
| is_rgb = True
|
|
|
| elif model_type == ModelType.PPYOLOEP:
|
| mean = np.array([0, 0, 0], dtype=np.float32)
|
| std = np.array([255, 255, 255], dtype=np.float32)
|
| is_rgb = True
|
| elif model_type == ModelType.RTMDET:
|
| mean = np.array([103.53, 116.28, 123.675], dtype=np.float32)
|
| std = np.array([57.375, 57.12, 58.3955], dtype=np.float32)
|
| is_rgb = False
|
| else:
|
| raise NotImplementedError
|
|
|
| self.mean = mean.reshape((3, 1, 1))
|
| self.std = std.reshape((3, 1, 1))
|
| self.is_rgb = is_rgb
|
|
|
| def __call__(self,
|
| image: ndarray,
|
| new_size: Union[List[int], Tuple[int]] = (640, 640),
|
| **kwargs) -> Tuple[ndarray, Tuple[float, float]]:
|
|
|
| height, width = image.shape[:2]
|
| ratio_h, ratio_w = new_size[0] / height, new_size[1] / width
|
| image = cv2.resize(
|
| image, (0, 0),
|
| fx=ratio_w,
|
| fy=ratio_h,
|
| interpolation=cv2.INTER_LINEAR)
|
| image = np.ascontiguousarray(image.transpose(2, 0, 1))
|
| image = image.astype(np.float32)
|
| image -= self.mean
|
| image /= self.std
|
| return image[np.newaxis], (ratio_w, ratio_h)
|
|
|