You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:42:40