4.17.1. ImagePreProcess

通用预处理接口,内部使用线程池的方式实现。

4.17.1.1. 构造函数

接口形式:
ImagePreProcess(
    int batch_size,
    sail_resize_type resize_mode,
    int tpu_id=0,
    int queue_in_size=20,
    int queue_out_size=20,
    bool use_mat_flag=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,不使用。

4.17.1.2. SetResizeImageAtrr

设置图像尺度变换的属性。

接口形式:
void SetResizeImageAtrr(
    int output_width,
    int output_height,
    bool bgr2rgb,
    bm_image_data_format_ext  dtype);

参数说明:

  • output_width: int

输入参数。尺度变换之后的图像宽度。

  • output_height: int

输入参数。尺度变换之后的图像高度。

  • bgr2rgb: bool

输入参数。是否将图像有BGR转换为GRB。

  • dtype: ImgDtype

输入参数。图像尺度变换之后的数据类型,当前版本只支持BM_FLOAT32,BM_INT8,BM_UINT8。可根据模型的输入数据类型设置。

4.17.1.3. SetPaddingAtrr

设置Padding的属性,只有在resize_mode为 BM_PADDING_VPP_NEAREST、BM_PADDING_TPU_NEAREST、BM_PADDING_TPU_LINEAR、BM_PADDING_TPU_BICUBIC时生效。

接口形式:
void SetPaddingAtrr(
    int padding_b=114,
    int padding_g=114,
    int padding_r=114,
    int align=0);

参数说明: * padding_b: int

输入参数。要pdding的b通道像素值,默认为114。

  • padding_g: int

输入参数。要pdding的g通道像素值,默认为114。

  • padding_r: int

输入参数。要pdding的r通道像素值,默认为114。

  • align: int

输入参数。图像填充为位置,0表示从左上角开始填充,1表示居中填充,默认为0。

4.17.1.4. SetConvertAtrr

设置线性变换的属性。

接口形式:
int SetConvertAtrr(
   const std::tuple<
       std::pair<float, float>,
       std::pair<float, float>,
       std::pair<float, float>> &alpha_beta);

参数说明:

  • 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,其他值时设置失败。

4.17.1.5. PushImage

送入数据。

接口形式:
int PushImage(
    int channel_idx,
    int image_idx,
    BMImage &image);

参数说明:

  • channel_idx: int

输入参数。输入图像的通道号。

  • image_idx: int

输入参数。输入图像的编号。

  • image: BMImage

输入参数。输入图像。

返回值说明:

设置成功返回0,其他值时表示失败。

4.17.1.6. GetBatchData

获取处理的结果。

接口形式:
std::tuple<sail::Tensor,
    std::vector<BMImage>,
    std::vector<int>,
    std::vector<int>,
    std::vector<std::vector<int>>> GetBatchData();

返回值说明: tuple[data, images, channels, image_idxs, padding_attrs]

  • data: Tensor

    处理后的结果Tensor。

  • images: std::vector<BMImage>

    原始图像序列。

  • channels: std::vector<int>

    原始图像的通道序列。

  • image_idxs: std::vector<int>

    原始图像的编号序列。

  • padding_attrs: std::vector<std::vector<int> >

    填充图像的属性列表,填充的起始点坐标x、起始点坐标y、尺度变换之后的宽度、尺度变换之后的高度

4.17.1.7. set_print_flag

设置打印日志的标志位,不调用此接口时不打印日志。

接口形式:
void set_print_flag(bool print_flag);

返回值说明:

  • flag: bool

打印的标志位,False时表示不打印,True时表示打印。

示例代码:
#include <sail/cvwrapper.h>
#include <opencv2/opencv.hpp>
#include <vector>

int main() {
    int tpu_id = 0;
    int batch_size = 1;
    std::string image_path = "./data/zidane.jpg";
    sail::Handle handle(tpu_id);

    std::vector<std::pair<int, int>> alpha_beta = {{1, 0}, {1, 0}, {1, 0}};
    sail::Decoder decoder(image_path, false, tpu_id);

    sail::ImagePreProcess sail_ipp(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);
    sail_ipp.SetConvertAtrr(alpha_beta);
    // sail_ipp.set_print_flag(true);
    sail::BMImage bm_i;
    for (int i = 0; i < batch_size; i++) {
        decoder.read(handle, bm_i);
        sail_ipp.PushImage(0, i, bm_i);
    }
    auto result = sail_ipp.GetBatchData();
    decoder.release();

    auto tensor = result[0];
    auto t_npy = tensor.asnumpy();
    auto result_img = t_npy[0].transpose({1, 2, 0});

    cv::Mat raw_img = cv::imread(image_path);
    cv::Mat resize_img = cv::resize(raw_img, cv::Size(640, 640), cv::INTER_NEAREST);
    double max_diff = abs((resize_img.astype(double) - result_img.astype(double)).max());
    double min_diff = abs((resize_img.astype(double) - result_img.astype(double)).min());
    double diff = std::max(max_diff, min_diff);
    std::cout << max_diff << " " << min_diff << " " << diff << std::endl;
    return 0;
}