5.18.2. sail.ImagePreProcess
通用预处理接口,内部使用线程池的方式实现。
5.18.2.1. __init__
- 接口形式:
- def __init__(self, batch_size: int, resize_mode:sail_resize_type, tpu_id: int=0, queue_in_size: int=20, queue_out_size: int=20, use_mat_output: bool = False) 
参数说明:
- batch_size: int 
输入参数。输出结果的batch size。
- resize_mode: sail_resize_type 
输入参数。内部尺度变换的方法。
- tpu_id: int 
输入参数。使用的智能视觉深度学习处理器 id,默认为0。
- queue_in_size: int 
输入参数。输入图像队列缓存的最大长度,默认为20。
- queue_out_size: int 
输入参数。输出Tensor队列缓存的最大长度,默认为20。
- use_mat_output: bool 
输入参数。是否使用OpenCV的Mat作为图片的输出,默认为False,不使用。
5.18.2.2. SetResizeImageAtrr
设置图像尺度变换的属性。
- 接口形式:
- def SetResizeImageAtrr(self, output_width: int, output_height: int, bgr2rgb: bool, dtype: ImgDtype) -> None 
参数说明:
- output_width: int 
输入参数。尺度变换之后的图像宽度。
- output_height: int 
输入参数。尺度变换之后的图像高度。
- bgr2rgb: bool 
输入参数。是否将图像有BGR转换为GRB。
- dtype: ImgDtype 
输入参数。图像尺度变换之后的数据类型,当前版本只支持BM_FLOAT32,BM_INT8,BM_UINT8。可根据模型的输入数据类型设置。
5.18.2.3. SetPaddingAtrr
设置Padding的属性,只有在resize_mode为 BM_PADDING_VPP_NEAREST、BM_PADDING_TPU_NEAREST、BM_PADDING_TPU_LINEAR、BM_PADDING_TPU_BICUBIC时生效。
- 接口形式:
- def SetPaddingAtrr(self, padding_b: int=114, padding_g: int=114, padding_r: int=114, align: int=0) -> None 
参数说明: * padding_b: int
输入参数。要pdding的b通道像素值,默认为114。
- padding_g: int 
输入参数。要pdding的g通道像素值,默认为114。
- padding_r: int 
输入参数。要pdding的r通道像素值,默认为114。
- align: int 
输入参数。图像填充为位置,0表示从左上角开始填充,1表示居中填充,默认为0。
5.18.2.4. SetConvertAtrr
设置线性变换的属性。
- 接口形式:
- def SetConvertAtrr(self, alpha_beta) -> int 
参数说明:
- alpha_beta: (a0, b0), (a1, b1), (a2, b2)。输入参数。 - a0 描述了第 0 个 channel 进行线性变换的系数; - b0 描述了第 0 个 channel 进行线性变换的偏移; - a1 描述了第 1 个 channel 进行线性变换的系数; - b1 描述了第 1 个 channel 进行线性变换的偏移; - a2 描述了第 2 个 channel 进行线性变换的系数; - b2 描述了第 2 个 channel 进行线性变换的偏移; 
返回值说明:
设置成功返回0,其他值时设置失败。
5.18.2.5. PushImage
送入数据。
- 接口形式:
- def PushImage(self, channel_idx: int, image_idx: int, image: BMImage) -> int 
参数说明:
- channel_idx: int 
输入参数。输入图像的通道号。
- image_idx: int 
输入参数。输入图像的编号。
- image: BMImage 
输入参数。输入图像。
返回值说明:
设置成功返回0,其他值时表示失败。
5.18.2.6. GetBatchData
获取处理的结果。
- 接口形式:
- def GetBatchData(self) -> tuple[Tensor, list[BMImage],list[int],list[int],list[list[int]]] """ Get the Batch Data object 
返回值说明: tuple[data, images, channels, image_idxs, padding_attrs]
- data: Tensor - 处理后的结果Tensor。 
- images: list[BMImage] - 原始图像序列。 
- channels: list[int] - 原始图像的通道序列。 
- image_idxs: list[int] - 原始图像的编号序列。 
- padding_attrs: list[list[int]] - 填充图像的属性列表,填充的起始点坐标x、起始点坐标y、尺度变换之后的宽度、尺度变换之后的高度 
5.18.2.7. set_print_flag
设置打印日志的标志位,不调用此接口时不打印日志。
- 接口形式:
- def set_print_flag(self, flag: bool) -> None: 
返回值说明:
- flag: bool 
打印的标志位,False时表示不打印,True时表示打印。
- 示例代码:
- import sophon.sail as sail import numpy as np import cv2 as cv if __name__ == '__main__': tpu_id = 0 batch_size = 1 image_path = "./data/zidane.jpg" handle = sail.Handle(tpu_id) alpha_beta = (1, 0), (1, 0), (1, 0) decoder = sail.Decoder(image_path, False, tpu_id) sail_ipp = sail.ImagePreProcess(batch_size, sail.sail_resize_type.BM_RESIZE_VPP_NEAREST, tpu_id, 20, 20, False) sail_ipp.SetResizeImageAtrr(640, 640, False, sail.ImgDtype.DATA_TYPE_EXT_1N_BYTE) ret1 = sail_ipp.SetConvertAtrr(alpha_beta) # sail_ipp.set_print_flag(True) bm_i = sail.BMImage() for i in range(0, batch_size): decoder.read(handle, bm_i) sail_ipp.PushImage(0, i, bm_i) result = sail_ipp.GetBatchData() decoder.release() tensor = result[0] t_npy = tensor.asnumpy() result_img = t_npy[0].transpose(1, 2, 0) raw_img = cv.imread(image_path) resize_img = cv.resize(raw_img, (640, 640), interpolation=cv.INTER_NEAREST) max_diff = abs((resize_img.astype(int) - result_img.astype(int)).max()) min_diff = abs((resize_img.astype(int) - result_img.astype(int)).min()) diff = max(max_diff, min_diff) print(max_diff,min_diff,diff)