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]]: # new_size: (height, width) 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)