4.1.7. 图像数据处理
TCIM支持调整图像大小、裁剪、以及填充等操作。
TCIM 根据不同使用场景提供“固定输入尺寸”处理方式。除在 TCIM 中配置图像预处理参数外,用户也可在量化阶段通过HMQuantool工具设置图像预处理参数,用于量化过程及后续推理复用。
上述方式均在模型推理前完成图像预处理,但配置方式、灵活性与适用场景存在差异,如下表所示:
方式 |
应用场景 |
操作 |
处理时机 |
对比 |
|---|---|---|---|---|
原始输入图像尺寸固定,且模型输入尺寸固定的场景。 |
设置 |
根据图像处理参数设置,在量化生成的模型文件中添加相关算子,推理时自动处理。 |
若想获得更好的性能,可结合使用 TCIM固定输入尺寸方式。 |
|
原始输入图像尺寸固定的场景,如单路视频流中,每帧图像的尺寸相同。 |
通过模型编译参数配置,模型推理时输入原始图像数据,TCIM自动完成图像预处理,如图 。 |
推理前手动设置,推理时自动处理。 |
由于处理后的图像数据存储在推理内存中,可直接用于模型推理,减少了内存拷贝带来的开销,因此性能表现优于 TCIM可变输入尺寸方式。 |
4.1.7.1. 量化时图像预处理
该方式下,主要操作步骤如下:
使用HMQuantool量化工具设置图像预处理参数。示例如下:
resizer_config = ResizerScheme( size=(512,512), align_corners=False, fmt="rgb", int_trans=True, crop_size=(0, 0), crop_offset=(0, 0), pad_size=(0, 0, 0, 0), pad_value=0, mean=[0.0,0.0,0.0], std=[1.0/255,1.0/255,1.0/255], dynamic_crop=False, model_inp_fmt="rgb", ).to_dict() calib_dataset = [ torch.randint(low=0, high=255, size=input_shape, dtype=torch.uint8), ]更多参数说明可参看 《HMQuantool量化工具用户手册》。
设置模型输入和输出。示例如下:
onnx_model = onnx.load(onnx_model_path) input_names = [_input.name for _input in onnx_model.graph.input] output_names = [_output.name for _output in onnx_model.graph.output] dims = onnx_model.graph.input[0].type.tensor_type.shape.dim input_shape = [dim.dim_value for dim in dims]
完成模型量化阶段图像预处理。示例如下:
quant_scheme = QuantScheme( target_device=DeviceType.XH2a, quant_type=w8a8h1_sefp, inupt_ppc_config=[ resizer_config ] ) quant_config = create_quant_config(quant_scheme) quant_config = ConfigDict(quant_config) convert_onnx_to_hmonnx( onnx_model, calib_dataset, device_type=DeviceType.XH2a, out_hmonnx_file="hm.onnx", quant_config=quant_config, input_names=input_names, output_names=output_names, )使用 TCIM 提供的
tcim.builder.api.build_from_hmonnxPython接口编译模型。需根据实际batch数设置batch参数值。tcim.build_from_hmonnx( model, output_name="dynmaic_multi_roi", output_dir="./output_dyn1v4", work_dir="./output_dyn1v4/tcim", target="xh2", ncore=1, batch=n, opt_level="02", enable_profile=False )详情参看 《TCIM开发者手册》。
模型推理。
4.1.7.2. 固定输入尺寸
该方式下,用户可在模型编译时设置是否启用动态图像处理,编译生成的二进制模型文件中将包含用于图像处理的相关输入。在模型推理前,用户可通过该模型输入传递图像预处理配置,TCIM会在推理时完成图像预处理。
固定输入尺寸动态裁剪方式下,输入图像尺寸相同,推理前设置图像处理配置后,图像预处理作为模型推理的一部分,在执行推理时自动完成,如下图所示:
图 4.6 固定输入尺寸开发处理流程
4.1.7.2.1. 图像处理流程和限制
图像处理过程为:先对原始图像做裁剪、再在裁剪后的图像上做缩放,最后做图像填充,如下图所示:
图 4.7 图像数据处理流程和限制
使用限制如下,用户需调整图像处理的参数值(单位为像素),以满足要求:
输入图像
输入图像限制如下:
图像的高度和宽度必须是偶数。
支持格式:YUV420SP、YUV422SP、YUV444SP。
图像最大尺寸(width x height):4096 x 4096
当宽度大于2048像素时,宽度必须是32的整数倍,否则可能导致编译失败。
输出图像
输出图像限制如下:
图像的高度和宽度必须是偶数。
支持格式:YUV420SP、YUV422SP、YUV444SP。
图像最大尺寸(width x height):4096 x 4096
注:输出图像尺寸过大时,图像处理效率可能下降。
裁剪
裁剪限制如下:
裁剪X和Y坐标必须是偶数。
裁剪的宽度和高度必须是偶数。
裁剪的宽度最小值为2。
裁剪的X坐标最小值为0。
缩放
缩放限制如下:
缩放倍数要求:
当量化阶段的图像预处理配置中
align_corners设置为True:高度:
(缩放后图像高度 - 1) / (缩放前图像高度 - 1)的取值范围为[1/32,16]其中缩放前图像高度指裁剪后的图像高度。
宽度:
(缩放后图像宽度 - 1) / (缩放前图像宽度 - 1)的取值范围为[1/32, 16]其中缩放前图像宽度指裁剪后的图像宽度。
当量化阶段的图像预处理配置中
align_corners设置为False:高度:
缩放后图像高度 / 缩放前图像高度的取值范围为[1/32,16]其中缩放前图像高度指裁剪后的图像高度。
宽度:
缩放后图像宽度 / 缩放前图像宽度的取值范围为[1/32,16]其中缩放前图像宽度指裁剪后的图像宽度。
对于以下场景,宽度缩放比例的取值范围如下:
图像格式为YUV420SP或YUV422SP,且裁剪宽度大于1024像素时,取值范围为[1/16, 16]。
图像格式为YUV444SP,且裁剪宽度大于512像素时,取值范围为[1/8, 16]。
缩放后图像的高度和宽度必须是偶数。
缩放后图像的高度和宽度需满足下面要求:
高度:
dst_height = out_height - pad_top - pad_bottom宽度:
dst_width = out_width - pad_left - pad_right
其中:
dst_height和dst_width分别表示缩放后图像的高度和宽度。out_height和out_width分别表示填充后输出图像的高度和宽度。pad_top、pad_bottom、pad_left和pad_right分别表示图像上、下、左、右方向的填充值。
填充
填充限制如下:
图像图像顶部的垂直填充(
pad_top)、图像底部的垂直填充(pad_bottom)、图像左侧的水平填充(pad_left)、图像右侧的水平填充(pad_right)的值必须是偶数。水平方向左侧填充参数(
pad_left)必须小于32。
4.1.7.2.2. 参数说明
输入tensor形状维度说明如下,参数单位均为像素:
cropY: 裁剪区域左上角的垂直坐标。cropX: 裁剪区域左上角的水平坐标。crop_height: 裁剪区域的高度。crop_width: 裁剪区域的宽度。resize_height: 调整图像大小输出的目标高度。resize_width: 调整图像大小输出的目标宽度。pad_top: 图像顶部的垂直填充。pad_left: 图像左侧的水平填充。pad_bottom: 图像底部的垂直填充。pad_right: 图像右侧的水平填充。
4.1.7.2.3. 单图单区域动态裁剪
该场景适用于对一张输入图像裁剪出一个 ROI区域。图像处理尺寸设置需在模型编译完成后至推理开始前完成。步骤如下:
使用该方法动态处理图像的主要流程如下:
图 4.8 固定输入尺寸主要开发流程
使用HMQuantool量化工具量化模型。量化前,需设置图像预处理参数
dynamic_crop为True使能图像动态裁剪功能:resizer_config = ResizerScheme( size=(224, 224), mode="nearest", align_corners=False, fmt="yuv420", int_trans=True, crop_size=(0, 0), crop_offset=(0, 0), pad_size=(0, 0, 0, 0), pad_value=0, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], dynamic_crop=True, model_inp_fmt="rgb", ).to_dict() dims = onnx_model.graph.input[0].type.tensor_type.shape.dim input_shape = [dim.dim_value for dim in dims] params = [[0, 0, dst_h, dst_w, dst_h, dst_w, 0, 0, 0, 0]] crop_input = torch.tensor(params) calib_dataset = [ torch.randint(low=0, high=255, size=input_shape, dtype=torch.uint8), crop_input, ]params参数表示动态裁剪输入,表示为[cropY, cropX, crop_height, crop_width, resize_height, resize_width, pad_top, pad_left, pad_bottom, pad_right]更多参数说明可参看 《HMQuantool量化工具用户手册》。
加载要量化的ONNX模型,并设置模型输入和输出。示例如下:
注意
用户需在模型输入名称列表
input_names末尾使用append()添加一个自定义名称,该名称用于标识预处理输入tensor,以便在后续推理前方便定位该tensor,并对其进行动态图像处理。onnx_model = onnx.load(onnx_model_path) input_names = [_input.name for _input in onnx_model.graph.input] output_names = [_output.name for _output in onnx_model.graph.output] input_names.append("dyn_info")示例中,输入名称列表末尾添加
dyn_info名称。完成模型量化阶段图像预处理。示例如下:
quant_scheme = QuantScheme( target_device=DeviceType.XH2a, quant_type=w8a8h1_sefp, inupt_ppc_config=[ resizer_config ] ) quant_config = create_quant_config(quant_scheme) quant_config = ConfigDict(quant_config) convert_onnx_to_hmonnx( onnx_path, calib_dataset, device_type=DeviceType.XH2a, out_hmonnx_file="hm.onnx", quant_config=quant_config, input_names=input_names, output_names=output_names, )使用 TCIM 提供的
tcim.builder.api.build_from_hmonnxPython接口编译模型。需设置one_img_multi_roi参数为True,并将batch参数设置为1。tcim.build_from_hmonnx( model, output_name="dynmaic_multi_roi", output_dir="./", work_dir="./work_space", target="xh2", ncore=1, batch=1, opt_level="02", enable_profile=False, one_img_multi_roi=True )详情参看 《TCIM开发者手册》。
设置图像处理参数。编译后模型中会包含一个输入tensor,用于表示图像的所有处理配置。上面示例中,该输入tensor名为上面设置的
dyn_info,其形状为 [1, 10]:[cropY, cropX, crop_height, crop_width, resize_height, resize_width, pad_top, pad_left, pad_bottom, pad_right]通过设置该输入的每个维度的值来设置 图像处理参数,参数限制参看 图像处理流程和限制。Python示例如下:
注意
dyn_info中设置的裁剪、缩放和填充参数将覆盖第一步中ResizerScheme的相应的配置,但ResizerScheme中其他图像处理配置,如align_corners等仍在图像预处理中生效。# Get the information of dyn_info tensor dyn_info_name = "dyn_info" dyn_info_tensor_info = model.get_input_info(dyn_info_name) # Set the configurations for image crop, resize, and padding dyn_info_data = np.array([0, 0, crop_height, crop_width, resize_height, 0, 0, 0, 0, 0], dtype=np.int32) # Set the dyn_info tensor as model input dyn_info_input_tensor = tcim_lite.runtime.Tensor(dyn_info_tensor_info, dyn_info_data) model.set_input(dyn_info_name, dyn_info_input_tensor)
模型推理。
4.1.7.2.4. 单图多区域动态裁剪
该场景针对单张输入图像,裁剪出多个 ROI区域。
图 4.9 单图多区域动态裁剪
量化阶段仅支持为所有图像设置相同的图像处理参数,模型编译完成后至推理开始前,可为图像单独设置每个ROI处理参数。
主要步骤如下:
使用HMQuantool量化工具量化模型。量化前,需设置图像预处理参数
dynamic_crop为True使能图像动态裁剪功能:resizer_config = ResizerScheme( size=(224, 224), mode="nearest", align_corners=False, fmt="yuv420", int_trans=True, crop_size=(0, 0), crop_offset=(0, 0), pad_size=(0, 0, 0, 0), pad_value=0, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], dynamic_crop=True, model_inp_fmt="rgb", ).to_dict() dims = onnx_model.graph.input[0].type.tensor_type.shape.dim input_shape = [dim.dim_value for dim in dims] params = [[0, 0, dst_h, dst_w, dst_h, dst_w, 0, 0, 0, 0]] crop_input = torch.tensor(params) calib_dataset = [ torch.randint(low=0, high=255, size=input_shape, dtype=torch.uint8), crop_input, ]params参数表示动态裁剪输入,表示为[cropY, cropX, crop_height, crop_width, resize_height, resize_width, pad_top, pad_left, pad_bottom, pad_right]更多参数说明可参看 《HMQuantool量化工具用户手册》。
加载要量化的ONNX模型,并设置模型输入和输出。示例如下:
注意
用户需在模型输入名称列表
input_names末尾使用append()添加一个自定义名称,该名称用于标识预处理输入tensor,以便在后续推理前方便定位这些 tensor,并对其进行动态图像处理。onnx_model = onnx.load(onnx_model_path) input_names = [_input.name for _input in onnx_model.graph.input] output_names = [_output.name for _output in onnx_model.graph.output] input_names.append("dyn_info")示例中,输入名称列表末尾添加
dyn_info名称。完成模型量化阶段图像预处理。示例如下:
quant_scheme = QuantScheme( target_device=DeviceType.XH2a, quant_type=w8a8h1_sefp, inupt_ppc_config=[ resizer_config ] ) quant_config = create_quant_config(quant_scheme) quant_config = ConfigDict(quant_config) convert_onnx_to_hmonnx( onnx_path, calib_dataset, device_type=DeviceType.XH2a, out_hmonnx_file="hm.onnx", quant_config=quant_config, input_names=input_names, output_names=output_names, )使用 TCIM 提供的
tcim.builder.api.build_from_hmonnxPython接口编译模型。需设置one_img_multi_roi参数为True,并将batch参数设置为所需的 ROI 数量。下面示例设置ROI的数量为
n,用户应根据实际需求进行替换:tcim.build_from_hmonnx( model, output_name="dynmaic_multi_roi", output_dir="./", work_dir="./work_space", target="xh2", ncore=1, batch=n, opt_level="02", enable_profile=False, one_img_multi_roi=True )详情参看 《TCIM开发者手册》。
设置图像处理参数。编译后模型中会包含一个输入tensor,用于表示图像的所有处理配置。上面示例中,该输入tensor名为上面设置的
dyn_info,其形状为 [1, 10],表示共 n 组图像处理配置,与上一步设置的 batch 值相同。[cropY, cropX, crop_height, crop_width, resize_height, resize_width, pad_top, pad_left, pad_bottom, pad_right]通过设置该输入的每个维度的值来设置 图像处理参数,参数限制参看 图像处理流程和限制。
注意
- 用户必须设置与模型输入 batch 数一致的 n 组图像处理参数。否则图像处理过程将失败。- 输出图像的尺寸建议小于 512 x 512,否则可能导致图像处理失败。模型推理。
4.1.7.2.5. 多图多区域动态裁剪
该场景适用于对多张图像处理,每张图像仅裁剪一个ROI区域。
图 4.10 多图多区域动态裁剪
量化阶段仅支持为所有图像设置相同的图像处理参数,模型编译完成后至推理开始前,可为每张图像单独设置图像处理参数。主要步骤如下:
使用HMQuantool量化工具量化模型。量化前,需设置图像预处理参数
dynamic_crop为True使能图像动态裁剪功能:resizer_config = ResizerScheme( size=(224, 224), mode="nearest", align_corners=False, fmt="yuv420", int_trans=True, crop_size=(0, 0), crop_offset=(0, 0), pad_size=(0, 0, 0, 0), pad_value=0, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], dynamic_crop=True, model_inp_fmt="rgb", ).to_dict() dims = onnx_model.graph.input[0].type.tensor_type.shape.dim input_shape = [dim.dim_value for dim in dims] params = [[0, 0, dst_h, dst_w, dst_h, dst_w, 0, 0, 0, 0]] crop_input = torch.tensor(params) calib_dataset = [ torch.randint(low=0, high=255, size=input_shape, dtype=torch.unit8), crop_input, ]params参数表示动态裁剪输入,表示为[cropY, cropX, crop_height, crop_width, resize_height, resize_width, pad_top, pad_left, pad_bottom, pad_right]更多参数说明可参看 《HMQuantool量化工具用户手册》。
加载要量化的ONNX模型,并设置模型输入和输出。示例如下:
注意
用户需在模型输入名称列表
input_names末尾使用append()添加一个自定义名称,该名称用于标识预处理输入tensor,以便在后续推理前方便定位这些 tensor,并对其进行动态图像处理。onnx_model = onnx.load(onnx_model_path) input_names = [_input.name for _input in onnx_model.graph.input] output_names = [_output.name for _output in onnx_model.graph.output] input_names.append("dyn_info")示例中,输入名称列表末尾添加
dyn_info名称。完成模型量化阶段图像预处理。示例如下:
quant_scheme = QuantScheme( target_device=DeviceType.XH2a, quant_type=w8a8h1_sefp, inupt_ppc_config=[ resizer_config ] ) quant_config = create_quant_config(quant_scheme) quant_config = ConfigDict(quant_config) convert_onnx_to_hmonnx( onnx_path, calib_dataset, device_type=DeviceType.XH2a, out_hmonnx_file="hm.onnx", quant_config=quant_config, input_names=input_names, output_names=output_names, )使用 TCIM 提供的
tcim.builder.api.build_from_hmonnxPython接口编译模型。需设置one_img_multi_roi参数为False,并将batch参数设置为所需的输入图像和ROI的数量。下面示例设置输入图像和ROI的数量为
n,用户应根据实际需求进行替换:tcim.build_from_hmonnx( model, output_name="dynmaic_multi_roi", output_dir="./", work_dir="./work_space", target="xh2", ncore=1, batch=n, opt_level="02", enable_profile=False, one_img_multi_roi=False )设置图像处理参数。编译后模型中会包含一个输入tensor,用于表示图像的所有处理配置。上面示例中,该输入tensor名为上面设置的
dyn_info,其形状为 [n, 10],表示共 n 组图像处理配置,与上一步设置的 batch 值相同。[cropY, cropX, crop_height, crop_width, resize_height, resize_width, pad_top, pad_left, pad_bottom, pad_right]通过设置该输入的每个维度的值来设置 图像处理参数,参数限制参看 图像处理流程和限制。
注意
- 用户必须设置与模型输入 batch 数一致的 n 组图像处理参数。否则图像处理过程将失败。- 输出图像的尺寸建议小于 512 x 512,否则可能导致图像处理失败。模型推理。