# PaddleOCRv5_TensorRT_cpp **Repository Path**: chen-liangwei/PaddleOCRv5_TensorRT_cpp ## Basic Information - **Project Name**: PaddleOCRv5_TensorRT_cpp - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-19 - **Last Updated**: 2026-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PaddleOCRv5_TensorRT_cpp 使用 TensorRT 10.x 对 PaddleOCR v5 进行高性能 C++ 推理,支持简体中文、繁体中文、英文、日文四种主要语言的 OCR 识别。 --- ## 效果展示 | 输入图像 | 识别结果 | |---|---| | ![subtitle](images/subtitle1.png) | ![result](results/subtitle1.png-result.jpg) | | ![subtitle](images/subtitle2.jpeg) | ![result](results/subtitle2.jpeg-result.jpg) | | ![test](images/test.png) | ![result](results/test.png-result.jpg) | | ![japan](images/japan.png) | ![result](results/japan.png-result.jpg) | | ![subtitle](images/japan2.png) | ![result](results/japan2.png-result.jpg) | | ![subtitle](images/japan3.png) | ![result](results/japan3.png-result.jpg) | | ![subtitle](images/motto.png) | ![result](results/motto.png-result.jpg) | --- ## 特性 - 基于 TensorRT 10.x 加速推理,充分利用 NVIDIA GPU 性能 - 完整的三阶段 OCR Pipeline:文本检测(DBNet)、方向分类(ClsNet)、文本识别(CRNNNet) - 支持动态输入尺寸,自动适配 TensorRT optimization profile 范围 - 支持简体中文、繁体中文、英文、日文(字典包含 18383 个字符) - 方向分类可选,支持对倒置文字自动旋转校正 - 支持 FP16 推理,适配 Jetson Orin 等边缘设备 - 结果可视化:检测框 + 识别文字侧边栏展示 --- ## 环境依赖 | 依赖 | 版本要求 | |---|---| | CUDA |12.6.85 | | TensorRT | 10.7.0.23 | | OpenCV |4.10.0(含 freetype 模块)| | CMake | >= 3.18 | | C++ | >= 17 | Jetson 平台推荐使用 JetPack 6.x(已包含 CUDA / TensorRT / cuDNN)。 --- ## 项目结构 ``` PaddleOCRv5_TensorRT_cpp/ ├── CMakeLists.txt ├── images/ # 测试图像 ├── results/ # 识别结果输出 ├── include/ │ ├── angle_net.h # 方向分类网络 │ ├── crnn_net.h # 文本识别网络 │ ├── db_net.h # 文本检测网络 │ ├── paddle_ocr.h # 主推理接口 │ ├── ocr_struct.hpp # 数据结构定义 │ ├── ocr_utils.h # 工具函数 │ └── common.hpp # TensorRT 公共工具 ├── src/ │ ├── main.cpp │ ├── angle_net.cpp │ ├── crnn_net.cpp │ ├── db_net.cpp │ ├── paddle_ocr.cpp │ └── ocr_utils.cpp └── weights/ ├── det/ # 检测模型 (DBNet) │ ├── det.onnx │ └── det.engine ├── cls/ # 方向分类模型 (ClsNet) │ ├── cls.onnx │ └── cls.engine ├── rec/ # 识别模型 (CRNNNet) │ ├── rec.onnx │ └── rec.engine ├── ppocrv5_dict.txt # 识别字典(18383 字符) └── simfang.ttf # 可视化字体 ``` --- ## 模型准备 ### 1. 下载 和转换PaddleOCR v5 ONNX 模型 (这一步在本项目中可以省略) 以下的脚本文件是我在`Kaggle`上转的,可供参考(这一步可不做,因为我已经将转好的`.onnx`权重放到`weights`文件夹下了): ```bash # 先安装依赖 !pip install paddle2onnx !pip install paddlepaddle # det网络转换 !wget https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-OCRv5_mobile_det_infer.tar !tar -xvf /kaggle/working/PP-OCRv5_mobile_det_infer.tar !paddle2onnx \ --model_dir /kaggle/working/PP-OCRv5_mobile_det_infer \ --model_filename inference.json \ --params_filename inference.pdiparams \ --save_file ./PP-OCRv5_mobile_det_infer.onnx \ --opset_version 17 \ --enable_onnx_checker True #cls网络转换 !wget https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-LCNet_x1_0_textline_ori_infer.tar !tar -xvf /kaggle/working/PP-LCNet_x1_0_textline_ori_infer.tar !paddle2onnx \ --model_dir /kaggle/working/PP-LCNet_x1_0_textline_ori_infer \ --model_filename inference.json \ --params_filename inference.pdiparams \ --save_file ./PP-LCNet_x1_0_textline_ori_infer.onnx \ --opset_version 17 \ --enable_onnx_checker True #rec网络转换 !wget https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-OCRv5_mobile_rec_infer.tar !tar -xvf /kaggle/working/PP-OCRv5_mobile_rec_infer.tar !paddle2onnx \ --model_dir /kaggle/working/PP-OCRv5_mobile_rec_infer \ --model_filename inference.json \ --params_filename inference.pdiparams \ --save_file ./PP-OCRv5_mobile_rec_infer.onnx \ --opset_version 17 \ --enable_onnx_checker True ``` ### 2. 转换为 TensorRT Engine 使用 `trtexec` 将 ONNX 转换为 TensorRT engine,各模型参数如下: **检测模型(DBNet):** ```bash trtexec \ --onnx=weights/det/det.onnx \ --saveEngine=weights/det/det.engine \ --minShapes=x:1x3x32x32 \ --optShapes=x:1x3x320x320 \ --maxShapes=x:1x3x992x992 \ --fp16 \ --memPoolSize=workspace:4096MiB ``` **方向分类模型(ClsNet):** ```bash # 固定输入 [1,3,80,160],无需动态 shape trtexec \ --onnx=weights/cls/cls.onnx \ --saveEngine=weights/cls/cls.engine \ --fp16 \ --memPoolSize=workspace:4096MiB ``` **识别模型(CRNNNet):** ```bash trtexec \ --onnx=weights/rec/rec.onnx \ --saveEngine=weights/rec/rec.engine \ --minShapes=x:1x3x48x10 \ --optShapes=x:1x3x48x320 \ --maxShapes=x:1x3x48x640 \ --fp16 \ --memPoolSize=workspace:8192MiB ``` > **注意**:Jetson Orin 上转换时间较长(可能需要数分钟),建议在设备上直接转换以获得最佳性能。 --- ## 编译 需要提前配置`CMakeLists.txt`所需要的环境依赖。 ```bash git clone https://github.com/zhahoi/PaddleOCRv5_TensorRT_cpp.git cd PaddleOCRv5_TensorRT_cpp mkdir build && cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DTENSORRT_ROOT=/usr/src/tensorrt make -j$(nproc) ``` --- ## 使用 ```bash # 基本用法 ./paddle_ocr -d -i # 示例 ./paddle_ocr \ -d /path/to/weights \ -i /path/to/images/test.png ``` ### 参数说明 | 参数 | 说明 | 默认值 | |---|---|---| | `-d` | 模型权重目录 | 必填 | | `-i` | 输入图像路径 | 必填 | | `--padding` | 图像边缘填充大小 | 50 | | `--maxSideLen` | 输入图像最长边限制 | 960 | | `--boxScoreThresh` | 文本框置信度阈值 | 0.6 | | `--boxThresh` | DB二值化阈值 | 0.3 | | `--unClipRatio` | 文本框扩张比例 | 2.0 | | `--doAngle` | 是否启用方向分类 | true | | `--mostAngle` | 是否使用投票决定整图方向 | true | --- ## Pipeline 说明 ``` 输入图像 │ ▼ DBNet 文本检测 │ 输出文本区域的四边形检测框 ▼ 图像裁剪 (getRotateCropImage) │ 将检测框区域透视变换为矩形 ▼ ClsNet 方向分类(可选) │ 判断文字是否倒置(0°或180°) │ 支持 mostAngle 投票模式 ▼ CRNNNet 文字识别 │ 输出 [B, T, C] 格式,CTC 解码 ▼ 结果输出(文字 + 可视化) ``` --- ## 注意事项 - 字典文件 `ppocrv5_dict.txt` 共 18383 行,第一行为全角空格,对应 class index=1,class index=0 为 CTC blank - TensorRT engine 与构建它的设备绑定,**不可跨设备复用**,需在目标设备上重新转换 - 输入图像尺寸超出 engine profile 范围时,程序会自动缩放至合法范围内再推理 - 方向分类模型输入固定为 `[1,3,80,160]`,识别前会自动缩放裁剪图 --- ## Reference - [chineseocr_lite_tensorRT](https://github.com/zhahoi/chineseocr_lite_tensorRT) - [OnnxOCR](https://github.com/jingsongliujing/OnnxOCR) --- ## License [Apache 2.0](LICENSE)