基于C# winform PP-OCRv5/v6 TensorRT 推理部署

基于C# winform PP-OCRv5/v6 TensorRT 推理部署

一、项目简介

这是一个基于 Windows Forms 的光学字符识别(OCR)桌面应用程序,集成百度 PaddleOCR PP-OCRv5 和 PP-OCRv6 系列模型,使用 TensorRT 推理引擎在 NVIDIA GPU 上实现高性能加速推理。项目支持多种模型规格(mobile、server、tiny、small、medium),并提供可视化的检测结果展示。

二、算法原理

采用 OCR 三阶段流水线架构:

复制代码
输入图片 → [文本检测] → [方向分类(可选)] → [文本识别] → 输出结果

2.1 文本检测(Detection)

采用 DB(Differentiable Binarization) 算法,基于分割的方法检测图像中的文本区域,输出四点多边形框(四点坐标 x1,y1 ~ x4,y4)。主要参数:

参数 说明 默认值
det_db_thresh 二值化阈值 0.3
det_db_box_thresh 框置信度阈值 0.6
det_db_unclip_ratio 文本框膨胀比例 1.6
limit_side_len 图片长边限制(像素) 960

2.2 方向分类(Classification,可选)

对检测到的文本区域进行方向判断(0° / 180°),用于纠转正反颠倒的文字,分类阈值为 cls_thresh = 0.9,可在 UI 中开启或关闭。

2.3 文本识别(Recognition)

采用 CRNN(Convolutional Recurrent Neural Network)+ CTC Loss 架构,将裁剪后的文本区域图像(统一缩放至 48×320 像素)转换为字符序列输出。

2.4 推理加速

所有模型均转换为 TensorRT FP16 精度引擎(.engine 文件),相比 ONNX Runtime 可大幅提升推理速度,同时保持较高的识别精度。

2.5 支持的模型规格

模型版本 模型名称 适用场景
PP-OCRv5 mobile 轻量级移动端模型 速度优先,一般场景
PP-OCRv5 server 服务端大模型 精度优先,复杂场景
PP-OCRv6 tiny 超轻量模型 极快速推理
PP-OCRv6 small 轻量模型 速度与精度平衡
PP-OCRv6 medium 中等规模模型 较高精度需求

三、环境要求

项目 要求
操作系统 Windows 10/11(64 位)
开发工具 Visual Studio 2019 及以上
.NET 框架 .NET Framework 4.8
目标平台 x64(强制)
CUDA 版本 12.9(强制)
cuDNN 版本 9.10.2(强制)
TensorRT 版本 10.16.1.11(强制)
GPU 要求 NVIDIA RTX 20 系列及以上(RTX 20/30/40/50 均支持)
显卡驱动 需支持 CUDA 12.9 的 NVIDIA 驱动(强制)

四、安装步骤

4.1 克隆或下载项目

bash 复制代码
git clone firc-projects
# 或直接下载 ZIP 解压

4.2 使用 Visual Studio 打开解决方案

用 Visual Studio 打开根目录下的 FIRC.sln 文件。

4.3 配置构建平台

在 Visual Studio 中将解决方案平台设置为 x64 (必须),构建配置选择 DebugRelease(需要提前复制Debug目录下面所有文件)

4.4 确认依赖库

项目依赖以下 DLL 文件,需确保它们存在于 bin\x64\Debug\ 目录下:

  • TensorRT.PPOCRSharp.dll --- OCR 核心推理封装库
  • OpenCvSharp.dll --- 图像处理库
  • opencv_world481.dll --- OpenCV 原生库
  • Newtonsoft.Json.dll --- JSON 序列化库
  • CUDA / cuDNN / TensorRT 相关 DLL(cudart64_12.dll、cudnn64_9.dll、nvinfer_10.dll 等)

4.5 转换 TensorRT 引擎文件

项目已附带预编译的 PP-OCRv6 tiny 引擎文件,如需使用其他模型,需在包含 trtexec.exe 的目录下执行转换命令:

bash 复制代码
# 示例:转换 PP-OCRv6 small 检测模型
trtexec --onnx="inference\PP-OCRv6_small_det.onnx" --saveEngine="inference_trt\PP-OCRv6_small_det_fp16.engine" --fp16 --minShapes=x:1x3x32x32 --optShapes=x:1x3x960x960 --maxShapes=x:1x3x960x960

# 示例:转换 PP-OCRv6 small 识别模型
trtexec --onnx="inference\PP-OCRv6_small_rec.onnx" --saveEngine="inference_trt\PP-OCRv6_small_rec_fp16.engine" --fp16 --minShapes=x:1x3x48x32 --optShapes=x:4x3x48x320 --maxShapes=x:16x3x48x1280

五、运行步骤

5.1 启动程序

在 Visual Studio 中按 F5 运行,或双击编译输出的 FIRC.exe 直接启动。

5.2 选择模型

在主界面顶部「模型选择」分组框中选择目标模型:

  • PP-OCRv5 mobile / server
  • PP-OCRv6 tiny / small / medium

5.3 加载模型

点击 「加载模型」 按钮,等待模型初始化完成,文本框会提示「模型加载成功!」。

5.4 选择图片

点击 「选择图片」 按钮,从文件对话框中选择待识别的图片(支持 bmp、jpg、jpeg、tiff、tif、png 格式)。程序启动时默认加载目录中的 3.jpg 作为示例图片。

5.5 执行推理

点击 「开始推理」 按钮,程序调用 TensorRT 引擎进行 OCR 识别:

  • 左侧图片区域显示原图并用红色多边形标注检测到的文本区域
  • 右侧文本框显示识别结果及耗时
  • 勾选「完整显示识别结果」复选框可显示包含坐标、置信度的完整 JSON 格式结果

5.6 释放模型

关闭程序时会自动释放模型资源;也可在需要切换模型时重新点击「加载模型」按钮(内部自动先释放再加载)。

六、注意事项

  1. 必须使用 x64 平台:项目依赖的原生 DLL 均为 64 位,构建平台必须设为 x64,不能使用 AnyCPU 或 x86。

  2. GPU 驱动要求:确保 NVIDIA 显卡驱动版本支持 CUDA 12.9,建议使用最新稳定版驱动。

  3. Engine 文件绑定硬件 :TensorRT .engine 文件与生成它的 GPU 型号、驱动版本、CUDA 版本、TensorRT 版本强绑定,不可跨机器复用,换机或升级驱动后需重新转换。

  4. 目录结构不可随意改动inference/(ONNX 模型)和 inference_trt/(TensorRT 引擎)目录结构及文件名需保持原样,程序通过固定路径加载模型。

  5. 首次推理较慢:TensorRT 引擎首次推理可能有预热开销,后续推理速度趋于稳定。若推理时间不稳定可参考相关博文。

  6. 方向分类模型可选:若 cls 引擎文件不存在,程序会自动禁用方向分类功能,不影响检测与识别正常工作。

  7. 内存释放 :程序在关闭时会自动调用 destroy 释放 GPU 资源,请勿强制终止进程,以免造成显存泄漏。

  8. 图片大小建议:程序会将图片长边缩放至 960 像素再进行检测,超大图片建议提前裁剪或缩小以提高效率。

七、文件夹结构介绍

复制代码
FIRC/
├── FIRC.sln                    # Visual Studio 解决方案文件
├── FIRC.csproj                 # 项目配置文件(.NET Framework 4.8,x64)
├── Form1.cs                    # 主窗体逻辑(模型加载/推理/资源释放)
├── Form1.Designer.cs           # 主窗体 UI 组件定义
├── Form1.resx                  # 窗体资源文件
├── OCRResult.cs                # OCR 识别结果数据模型(文本、分数、四点坐标)
├── Program.cs                  # 程序入口
├── App.config                  # 应用程序配置文件
├── 说明.txt                    # 测试环境说明及 trtexec 转换命令示例
├── Properties/                 # 项目属性(程序集信息、资源配置等)
├── imgs/                       # 示例测试图片
├── bin/x64/Debug/
│   ├── FIRC.exe               # 编译输出的可执行文件
│   ├── FIRC.exe.config
│   ├── FIRC.pdb               # 调试符号文件
│   ├── TensorRT.PPOCRSharp.dll  # OCR 推理封装核心 DLL
│   ├── OpenCvSharp.dll          # OpenCvSharp 托管包装 DLL
│   ├── opencv_world481.dll      # OpenCV C++ 原生库
│   ├── Newtonsoft.Json.dll      # JSON 序列化库
│   ├── cuda*.dll / cudnn*.dll / nvinfer*.dll 等  # CUDA/cuDNN/TensorRT 运行时库
│   ├── dll/x64/
│   │   ├── OpenCvSharpExtern.dll         # OpenCvSharp P/Invoke 原生桥接 DLL
│   │   └── opencv_videoio_ffmpeg480_64.dll
│   ├── inference/              # ONNX 原始模型文件及字典文件
│   │   ├── PP-OCRv5_mobile_det_onnx.onnx
│   │   ├── PP-OCRv5_mobile_rec_onnx.onnx
│   │   ├── PP-OCRv5_mobile_cls_onnx.onnx
│   │   ├── PP-OCRv5_server_det_infer.onnx
│   │   ├── PP-OCRv5_server_rec_infer.onnx
│   │   ├── PP-OCRv6_tiny_det.onnx
│   │   ├── PP-OCRv6_tiny_rec.onnx
│   │   ├── PP-OCRv6_tiny_rec_dict.txt
│   │   ├── PP-OCRv6_small_det.onnx
│   │   ├── PP-OCRv6_small_rec.onnx
│   │   ├── PP-OCRv6_small_rec_dict.txt
│   │   ├── PP-OCRv6_medium_det.onnx
│   │   ├── PP-OCRv6_medium_rec.onnx
│   │   ├── PP-OCRv6_medium_rec_dict.txt
│   │   └── ppocrv5_dict.txt
│   ├── inference_trt/          # TensorRT FP16 引擎文件(由 trtexec 转换生成)
│   │   ├── PP-OCRv6_tiny_det_fp16.engine
│   │   └── PP-OCRv6_tiny_rec_fp16.engine
│   ├── trtexec.exe             # TensorRT 模型转换工具
│   └── trtexec_convert_commands.txt  # 自动生成的转换命令参考文件
└── .vs/                        # Visual Studio 用户配置(无需版本控制)