模型输入预处理

#-----------------量化后的模型------------------

models = dnn.load(‘../models/mobilenetv1_224x224_nv12.bin’)

#--------------------模型输入预处理---------------

img_file = cv2.imread(‘./zebra_cls.jpg’)

h, w = get_hw(models[0].inputs[0].properties)

des_dim = (w, h)

resized_data = cv2.resize(img_file, des_dim, interpolation=cv2.INTER_AREA)

nv12_data = bgr2nv12_opencv(resized_data)

#---------------预测---------------------------

outputs = models[0].forward(nv12_data)

我的问题是,输入的归一化和标准化是在哪里?是已经在models[0].forward里面了吗?这里看得有点懵?请问有这方面得资料说明吗?

谢谢您上次的回复。我现在还有这三个问题看了Ai工具链手册不是很明白的,请问您有空解答一下吗?

您好,可以参考下我们的AI工具链手册,归一化等预处理操作已经在模型量化的时候加载在模型里面了,所以不需要进行处理了

问题一:

我有一个模型需要用到lstm,那请问量化支持序列模型吗?看了开发手册好像没有这方面的介绍。而且官方量化的例子都是图像,没有关于序列的。

问题二:

efficientnet_lite0_config.yaml 里面 ,怎么只有均值,没有方差,图像预处理缩放比例是指像素值除以255吗?

--------------------------------efficientnet_lite0_config.yaml文件的内容------------------------------

# 网络输入的预处理方法,主要有以下几种:

# no_preprocess 不做任何操作

# data_mean 减去通道均值mean_value

# data_scale 对图像像素乘以data_scale系数

# data_mean_and_scale 减去通道均值后再乘以scale系数

# -------------------------------------------------------------------------------------------

# preprocessing methods of network input, available options:

# ‘no_preprocess’ indicates that no preprocess will be made

# ‘data_mean’ indicates that to minus the channel mean, i.e. mean_value

# ‘data_scale’ indicates that image pixels to multiply data_scale ratio

# ‘data_mean_and_scale’ indicates that to multiply scale ratio after channel mean is minused

norm_type: ‘data_mean_and_scale’

# 图像减去的均值, 如果是通道均值,value之间必须用空格分隔

# --------------------------------------------------------------------------

# the mean value minused by image

# note that values must be seperated by space if channel mean value is used

mean_value: 0 0 0

# 图像预处理缩放比例,如果是通道缩放比例,value之间必须用空格分隔

# ---------------------------------------------------------------------------

# scale value of image preprocess

# note that values must be seperated by space if channel scale value is used

scale_value: 0.003921 0.003921 0.003921

问题三:

如果我训练的模型输入有标准化的操作,这里的内容也是要该的吗?

--------------------------------preprocess.py文件的内容------------------------------

def calibration_transformers():

“”"

step:

1、crop size 224 * 224 from padded center

2、resize to 224 * 224

3、Scale from 0 ~ 1 to 0 ~ 255

“”"

transformers = [

PaddedCenterCropTransformer(image_size=224, crop_pad=32),

# Cubic interpolation resize

ResizeTransformer(target_size=(224, 224), mode=‘skimage’, method=3),

ScaleTransformer(scale_value=255),

]

return transformers

关于问题1:

我们是支持的序列模型的,只是OE包中没有提供相关的示例而已。

关于问题2:

均值、方差、归一化都是配置在yaml文件中的,mean表示均值,scale中包括了方差和归一化,详细过程请参考:3.4.2. 转换内部过程解读

关于问题3:

其实和问题2有点重复,均值、方差、归一化会集成到模型中,其它的预处理部分需要您参考示例代码进行修改。

为了方便您的理解,在这里简单描述一下这个过程:

归一化,减均值,除方差–>归一化,减均值,乘方差倒数–>合并成两次计算,减去(255*均值),然后乘255倍方差倒数(芯片计算对加减乘法友好,对除法不友好)-

在yaml中配置mean/scale后,模型转换时,会在输入端新增一个HzPreprocess节点(BPU),相当于做了一次conv操作。在yaml中添加mean/scale后,就不需要在前处理内添加MeanTransformer和ScaleTransformer了。

明白了,谢谢您