4.1.4.1. norm_type配置说明¶
4.1.4.1.1. 参数说明解析¶
norm_type 参数讲解
参数作用:此参数为在模型中添加的输入数据预处理方法。
参数取值范围及说明:
no_preprocess
表示不添加任何数据预处理。data_mean
表示提供减均值预处理。data_scale
表示提供乘scale系数预处理。data_mean_and_scale
表示提供先减均值再乘scale系数前处理。
注意
当输入节点多于一个时,设置的节点顺序需要与 input_name
中的顺序严格保持一致。
mean_value 参数讲解
参数作用:此参数表示指定预处理方法的图像减去的均值。
使用说明:当
norm_type
取值为data_mean_and_scale
或data_mean
时需要配置该参数。参数说明:
当只有一个输入节点时,仅需要配置一个数值,表示所有通道都减去这个均值。
当有多个节点时,提供与通道数量一致的数值(这些数值以空格分隔开),表示每个通道都会减去不同的均值。
注意
配置的输入节点数量必须与
norm_type
配置的节点数量一致。如果存在某个节点不需要
mean
处理,则为该节点配置'None'
。
scale_value 参数讲解
参数作用:此参数表示指定预处理方法的数值scale系数。
使用说明:当
norm_type
取值为data_mean_and_scale
或data_scale
时需要配置该参数。参数说明:
当只有一个输入节点时,仅需要配置一个数值,表示所有通道都乘以这个系数。
当有多个节点时,提供与通道数量一致的数值(这些数值以空格分隔开),表示每个通道都会乘以不同的系数。
注意
配置的输入节点数量必须与
norm_type
配置的节点数量一致。如果存在某个节点不需要
scale
处理,则为该节点配置'None'
。
4.1.4.1.2. 计算公式及示例说明¶
4.1.4.1.2.1. 模型训练时的数据标准化处理计算公式¶
yaml文件中的mean和scale参数与训练时的mean、std需要进行换算。
预处理节点中数据标准化操作的计算方式(即HzPreprocess节点中的计算公式)为:\(norm\_data = ( data − mean ) * scale\) 。
以yolov3为例,其训练时的预处理代码为:
def base_transform(image, size, mean, std):
x = cv2.resize(image, (size, size).astype(np.float32))
x /= 255
x -= mean
x /= std
return x
class BaseTransform:
def __init__(self, size, mean=(0.406, 0.456, 0.485), std=(0.225, 0.224, 0.229)):
self.size = size
self.mean = np.array(mean, dtype=np.float32)
self.std = np.array(std, dtype=np.float32)
则计算公式为:\(norm\_data= (\frac{data}{255} −𝑚𝑒𝑎𝑛) * \frac{1}{𝑠𝑡𝑑}\),
改写为HzPreprocess节点的计算方式:\(norm\_data= (\frac{data}{255} −𝑚𝑒𝑎𝑛) * \frac{1}{𝑠𝑡𝑑} =(data−255𝑚𝑒𝑎𝑛) * \frac{1}{255𝑠𝑡𝑑}\) ,
则:\(mean\_yaml = 255 mean、𝑠𝑐𝑎𝑙𝑒\_𝑦𝑎𝑚𝑙= \frac{1}{255 𝑠𝑡𝑑}\) 。
4.1.4.1.2.2. 模型推理时的计算公式¶
通过对yaml配置文件中的配置参数,决定是否加入HzPreprocess节点。 当配置mean/scale时,做模型转换时,会在输入端新增一个HzPreprocess节点,HzPreprocess节点可以理解为对输入数据做了一个conv操作。
HzPreprocess内的计算公式为: \(((input(取值范围[-128,127])+ 128) - mean) * scale\),其中 weight=scale
, bias=(128-mean) * scale
。
注意
在yaml中添加mean/scale后,就不需要在前处理内添加MeanTransformer和ScaleTransformer了。
在yaml中添加mean/scale,会将参数放入到HzPreprocess节点内,HzPreprocess节点为BPU 节点。