专栏算法工具链图片校准数据准备问题介绍与处理

图片校准数据准备问题介绍与处理

颜值即正义2022-11-17
291
3

1 问题介绍

使用PTQ模型转换方案时,在准备校准数据过程中不知从何下手,直接给一张jpg图片,遇到cannot reshape array of size xxx into shape (x, xxx, xxx)的问题该如何解决?

报错截图报错截图

2 解决方案

以ResNet18在imagenet数据集上的预处理为例,介绍最基本的校准数据准备过程。

2.1 pytorch数据预处理伪代码

def Data():
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'
if not os.path.exists(dst_dir):
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,故上式可以写成:

data=(input−meanvalue)×scalevaluedata=(input-meanvalue)×scalevaluedata=(input−meanvalue)×scalevalue
# ---------------------------------------------------#
# 图像减去的均值, 如果是通道均值,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

config_file="./resnet18_baseline_config.yaml"
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

算法工具链
征程3征程5杂谈
+2
评论1
0/1000
  • Allenpandas
    Lv.1

    我的预处理文件(按照你上面来的):

    我的config.yaml文件:

    目前在执行makerbin的时候仍然报错,内容如下:

    ERROR load cal data for input 'images' error

    ERROR cannot reshape array of size 150528 into shape (3,640,640)

    麻烦帮忙看看是什么原因

    2022-11-19
    0
    2
    • 颜值即正义回复Allenpandas:

      你好,从代码看,校准数据准备的是224x224的,但你的模型输入尺寸是640x640的,两个尺寸是需要保持一致的哈~

      2022-11-21
      0
    • zoumengchao回复颜值即正义:

      按照这个用户的写法,在推理的时候输入图像的格式应该是 224*224*3 然后被网络变成1*3*224*224然后在送入下一步么?

      2023-08-22
      0