1 问题介绍
使用PTQ模型转换方案时,在准备校准数据过程中不知从何下手,直接给一张jpg图片,遇到cannot reshape array of size xxx into shape (x, xxx, xxx)的问题该如何解决?
报错截图2 解决方案
以ResNet18在imagenet数据集上的预处理为例,介绍最基本的校准数据准备过程。
2.1 pytorch数据预处理伪代码
image.convert(RGB)
data_transform = transforms.Compose(
image,
[transforms.Resize(224),
# ToTensor():数据归一化 + 图像从HWC变为CHW
transforms.ToTensor(),
# Imagenet数据集上,图片 RGB 的均值、标准差,注意顺序
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
2.2 文件准备
2.3 准备校准数据
准备校准数据的代码放在了preprocess.py中,其具体内容如下:
# src_dir:原始jpg图片
# dst_dir:处理后的图片存放的路径
# pic_ext:处理后的图片后缀名(影响不大,只是为了说明它的通道顺序)
## ------------------------------------------------------------#
src_dir = './origin_image'
dst_dir = './image_converted_rgb_f32' # yaml文件中cal_data_dir参数配置成这个路径即可
pic_ext = '.rgb'
os.mkdir(dst_dir)
# 一次只操作一张图片
## ---------------------------------------#
for src_name in sorted(os.listdir(src_dir)):
## -----------------------------#
# 把图片路径拼出来
## -----------------------------#
src_file = os.path.join(src_dir, src_name)
归一化、减均值、除标准差三个操作可以通过在模型中插入预处理节点进行加速实现,如何配置实现这样的功能在2.4节模型转换中详细介绍。
运行preprocess.py脚本:
2.4 模型转换
归一化、减均值、除标准差三个操作整合到yaml参数配置中,通过norm_type、mean_value、scale_value三个参数实现,下面结合本节示例对yaml中这三个参数的用法进行详细的介绍。
mean和scale的换算逻辑如下:
data=(input/255−mean)×(1/std)=(input−255mean)×(1/255std)data=(input/255-mean)×(1/std)=(input-255mean)×(1/255std)data=(input/255−mean)×(1/std)=(input−255mean)×(1/255std)
255mean就是yaml中的mean_value,1/(255std)就是yaml中的scale_value,故上式可以写成:
# 图像减去的均值, 如果是通道均值,value之间必须用空格分隔
# 注意:
# 此处的均值需要根据输入数据的范围确定,
# 例如ImageNet的R通道,应该是: 123.68 = 0.485x255
# ---------------------------------------------------#
mean_value: 123.68 116.28 103.53
# 图像预处理缩放比例,如果是通道缩放比例,value之间必须用空格分隔
# 注意:
# 此处,scale是乘,以前的标准差是除,需要根据输入数据的范围确定
# 例如ImageNet的R通道,应该是: 0.017 = 1 / (0.229x255)
# -------------------------------------------------------#
scale_value: 0.017 0.018 0.017
结合2.3节中生成的校准数据路径,配置yaml文件参数:cal_data_dir: './image_converted_rgb_f32',执行03_build.sh脚本即可完成模型转换。
cd $(dirname $0) || exit
model_type="onnx"
#build model
hb_mapper makertbin --config ${config_file}
--model-type ${model_type}
2022-11-16 10:30:05,057 INFO Start hb_mapper....
...
2022-11-16 10:30:38,935 INFO Convert to runtime bin file sucessfully!
2022-11-16 10:30:38,935 INFO End Model Convert



