基于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 (必须),构建配置选择 Debug 或 Release(需要提前复制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 释放模型
关闭程序时会自动释放模型资源;也可在需要切换模型时重新点击「加载模型」按钮(内部自动先释放再加载)。
六、注意事项
-
必须使用 x64 平台:项目依赖的原生 DLL 均为 64 位,构建平台必须设为 x64,不能使用 AnyCPU 或 x86。
-
GPU 驱动要求:确保 NVIDIA 显卡驱动版本支持 CUDA 12.9,建议使用最新稳定版驱动。
-
Engine 文件绑定硬件 :TensorRT
.engine文件与生成它的 GPU 型号、驱动版本、CUDA 版本、TensorRT 版本强绑定,不可跨机器复用,换机或升级驱动后需重新转换。 -
目录结构不可随意改动 :
inference/(ONNX 模型)和inference_trt/(TensorRT 引擎)目录结构及文件名需保持原样,程序通过固定路径加载模型。 -
首次推理较慢:TensorRT 引擎首次推理可能有预热开销,后续推理速度趋于稳定。若推理时间不稳定可参考相关博文。
-
方向分类模型可选:若 cls 引擎文件不存在,程序会自动禁用方向分类功能,不影响检测与识别正常工作。
-
内存释放 :程序在关闭时会自动调用
destroy释放 GPU 资源,请勿强制终止进程,以免造成显存泄漏。 -
图片大小建议:程序会将图片长边缩放至 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 用户配置(无需版本控制)