[cmake]基于C++部署ppocrv5v6的tensorrt模型演示源码

作品简介

 


[cmake]基于C++部署ppocrv5v6的tensorrt模型PP-OCR v5/v6TensorRT部署(C++ 控制台版)

本项目是的 C++版本PPOCRv5和PPOCRv6的tensorrt模型实现,通过动态加载 TensorRT.PPOCRSharp.dll ,使用 TensorRTFP16引擎在 GPU 上加速运行 PaddleOCR v5/v6 系列模型,完成图片文字识别(OCR)。



1. 算法原理

PPOCR 采用经典的 Det → Cls → Rec 三阶段流水线:

输入图片
   │
   ▼
┌─────────────────────────────┐
│  Det(文本检测)              │  DB(Differentiable Binarization)
│  输出:文本区域四点坐标框       │  模型:*_det_*.engine
└──────────────┬──────────────┘
               │ 裁剪出每个文本框
               ▼
┌─────────────────────────────┐
│  Cls(方向分类,可选)         │  判断文本是否需要 180° 翻转
│  输出:0/180 度标签            │  模型:*_cls_*.engine
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│  Rec(文字识别)              │  CRNN / SVTR 识别网络
│  输出:UTF-8 文本 + 置信度     │  模型:*_rec_*.engine
└──────────────┬──────────────┘
               │
               ▼
        JSON 结果数组
 [{text, score, x1,y1,x2,y2,x3,y3,x4,y4}, ...]

本项目使用 TensorRT FP16 精度将 ONNX 模型编译为 .engine ,在 NVIDIAGPU上运行推理,相比纯 CPU 方式可获得数倍速度提升。

2. 环境要求

项目要求操作系统Windows 10/11 x64编译器Visual Studio 2019 及以上(MSVC)CMake≥ 3.24C++ 标准C++17平台仅 x64 (不支持 x86)OpenCV5.0(编译期链接,也可以是其他版本)CUDA12.9(与 cudart64_12.dll 对应)cuDNN9.10.2( cudnn64_9.dll )TensorRT10.16.1.11( nvinfer_10.dll )GPU支持 FP16 的 NVIDIA 显卡(计算能力 ≥ 7.5)

3. 安装步骤

3.1 准备 lib 目录

将以下文件全部放入项目根目录的 lib/ 文件夹:

  • • TensorRT.PPOCRSharp.dll (OCR 核心 DLL)
  • • 所有 CUDA / cuDNN / TensorRT 运行时 DLL( cublas64_12.dll 、 nvinfer_10.dll 等)
  • • opencv_world481.dll (OpenCvSharp 原生后端)
  • • inference/ 子目录(存放 ONNX 模型和字典文件)
  • • inference_trt/ 子目录(存放编译好的 TensorRT .engine 文件)
CMake 构建时会自动将 lib/ 全部内容复制到 exe 输出目录。


3.2 生成 TensorRT Engine(如缺少)

lib/inference_trt/ 中若缺少对应模型的 .engine 文件,程序启动时会打印转换命令。使用 trtexec.exe 手动转换:

# 示例:转换 v6 tiny det 模型
"\trtexec.exe" ^
    --onnx="lib/inference/PP-OCRv6_tiny_det.onnx" ^
    --saveEngine="lib/inference_trt/PP-OCRv6_tiny_det_fp16.engine" ^
    --fp16 ^
    --minShapes=x:1x3x32x32 --optShapes=x:1x3x960x960 --maxShapes=x:1x3x960x960
不同模型(det/rec/cls)的 shape 参数不同,程序会自动提示正确命令。
Engine 与显卡型号、驱动、CUDA、TensorRT 版本绑定,不可跨机器复用。

3.3 配置OpenCV路径

打开 CMakeLists.txt ,将 OpenCV_DIR 改为本机 OpenCVConfig.cmake 所在目录:

set(OpenCV_DIR "D:\\lufiles\\opencv500\\build\\x64\\vc16\\lib")

3.4CMake生成与编译

cd 项目根目录
cmake -B build -A x64 .
cmake --build build --config Release

编译成功后, build/Release/ 目录将包含:

  • • FIRC_CPP.exe
  • • 所有从 lib/ 复制过来的 DLL、模型、字典文件

4. 运行步骤

方式一:交互式运行(推荐)

直接双击或命令行启动 FIRC_CPP.exe :

========================================
  PPOCR v5/v6 TensorRT 控制台演示 (C++版)
========================================
[OK] TensorRT.PPOCRSharp.dll 加载成功

===== 选择 OCR 模型 =====
  [1] v5 mobile
  [2] v5 server
  [3] v6 small
  [4] v6 tiny
  [5] v6 medium
请选择 (1-5,默认4): 4

[初始化] 使用模型: v6 tiny
  det engine : inference_trt/PP-OCRv6_tiny_det_fp16.engine
  ...
[OK] 模型加载成功

请输入图片路径 (直接回车使用 3.jpg): 

输入图片路径后回车即可识别,输入 q 退出。

方式二:命令行直接指定图片

FIRC_CPP.exe D:\path\to\image.jpg

5. 注意事项

  1. 1. 仅支持 x64 平台 :所有 DLL 均为 64 位,CMake 生成时必须使用 -A x64 。
  2. 2. CMake 缓存问题 :修改 OpenCV_DIR 后若未生效,需删除 build/CMakeCache.txt 或整个 build/ 目录重新生成,因为该变量被缓存。
  3. 3. 中文路径编码 :程序启动时已调用 SetConsoleCP(65001) 和 SetConsoleOutputCP(65001) 设置 UTF-8 编码,但若图片路径含中文且读取失败,可尝试改为英文路径。
  4. 4. Engine 与硬件绑定 : inference_trt/*.engine 文件与生成时的显卡型号、驱动版本、CUDA/TensorRT 版本绑定,换机器或更新驱动后需重新用 trtexec 生成。
  5. 5. 首次初始化耗时 :TensorRT engine 首次加载时会进行 GPU 上下文初始化,耗时约 1~5 秒,后续推理速度正常。

6. 文件夹结构

FIRC_CPP/
│
├── CMakeLists.txt          # CMake 构建配置
├── main.cpp                # 控制台主程序(模型选择、OCR 循环、trtexec 提示)
├── ocr_engine.h            # OCREngine 类声明(DLL 动态加载封装)
├── ocr_engine.cpp          # OCREngine 实现(LoadDLL / Init / RunOCR / Destroy)
│
├── lib/                    # 运行时依赖(构建后自动复制到 exe 目录)
│   ├── TensorRT.PPOCRSharp.dll   # OCR 核心 DLL
│   ├── cublas64_12.dll           # CUDA 数学库
│   ├── cudnn64_9.dll             # cuDNN
│   ├── nvinfer_10.dll            # TensorRT 推理引擎
│   ├── opencv_world481.dll       # OpenCV 运行时
│   ├── trtexec.exe               # TensorRT 模型转换工具
│   ├── inference/                # ONNX 原始模型 + 字典
│   │   ├── PP-OCRv6_tiny_det.onnx
│   │   ├── PP-OCRv6_tiny_rec.onnx
│   │   ├── PP-OCRv6_tiny_rec_dict.txt
│   │   └── ...
│   └── inference_trt/            # 编译好的 TensorRT FP16 engine
│       ├── PP-OCRv6_tiny_det_fp16.engine
│       └── PP-OCRv6_tiny_rec_fp16.engine
│
└── build/                  # CMake 构建输出目录
    └── Release/
        ├── FIRC_CPP.exe    # 编译好的可执行文件
        └── (lib/ 全部内容自动复制于此)

 

创作时间: