PaddleOCR转ONNX后输入预处理问题:需4D输入且预处理异常
PaddleOCR转ONNX后输入维度适配与预处理修正
为什么ONNX需要4D输入?
ONNX Runtime及大部分深度学习框架的标准输入格式是4D张量,结构为[batch_size, channels, height, width]:
batch_size:批量处理的图像数量,单张图像时设为1即可channels:图像通道数(RGB为3)height/width:图像的高和宽
原PaddleOCR封装了完整的预处理逻辑,自动帮你添加了批量维度,转ONNX后这一步需要手动实现。
你的预处理代码问题
你当前的transpose操作完全打乱了维度顺序:
image_array = np.transpose(image_array, (1, 3, 0, 2))
错误的维度排列会导致输入形状完全不匹配模型预期,ONNX Runtime会被迫做大量无效计算,最终引发CPU占用飙升、系统卡顿。
修正后的预处理代码
以下是符合ONNX输入要求的预处理逻辑:
import cv2 import numpy as np def preprocess_image(image_path): # 读取图像,OpenCV默认读为BGR格式,转成PaddleOCR要求的RGB image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 归一化到[0,1]区间 image_array = image.astype(np.float32) / 255.0 # 将OpenCV的(H, W, C)格式转为ONNX要求的(C, H, W) image_array = np.transpose(image_array, (2, 0, 1)) # 添加批量维度,转为4D张量[1, C, H, W] image_array = np.expand_dims(image_array, axis=0) return image_array
模型转换的关键注意点
用paddle2onnx转换时,必须明确指定输入形状,避免动态维度混乱:
paddle2onnx \ --model_dir ./你的PaddleOCR模型目录 \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --save_file ocr_model.onnx \ --input_shape "1,3,640,640" \ # 单张640*640的RGB图像,可根据你的模型调整尺寸 --opset_version 11
验证与测试
转换完成后先确认输入形状匹配:
import onnxruntime as rt ort_session = rt.InferenceSession('ocr_model.onnx') input_name = ort_session.get_inputs()[0].name input_shape = ort_session.get_inputs()[0].shape print(f"模型输入形状要求: {input_shape}") # 应输出类似[1,3,640,640]或动态维度[?,3,?,?] # 预处理并推理 img_path = "你的测试图像路径.jpg" input_data = preprocess_image(img_path) print(f"预处理后输入形状: {input_data.shape}") ort_outputs = ort_session.run(None, {input_name: input_data}) print("推理完成")
内容的提问来源于stack exchange,提问作者ha ze
相关产品推荐
相关产品推荐

