项目里有个需求——识别一批扫描件里的文字,或者给系统加个图片中的文本提取功能。调研一圈下来,大家都在说 PaddleOCR 好用、精度高、开源免费。
然后你打开文档,发现它是 Python 的。
作为一个日常写 C# 的开发者,这一刻的感受大概是:"又要搭 Python 环境?又要维护一套 HTTP 接口?"
这种割裂感,我在好几个项目里都遇到过。要么是把 Python 推理服务单独部署,网络调用加延迟;要么是用一些精度有限的老旧 .NET OCR 库,效果差强人意;要么就是干脆放弃 AI 能力,用规则硬写。
直到接触到 PaddleSharp,这个局面才真正被打破。
读完这篇文章,你将了解:
要说清楚 PaddleSharp,得先说说它背后的东西。
百度飞桨(PaddlePaddle) 是国内最主流的深度学习框架之一,自 2016 年开源以来,积累了大量工业级 AI 模型。其中最广为人知的是 PaddleOCR——一套支持 80+ 语言、兼顾检测与识别的完整 OCR 工具链,以及 PaddleDetection,覆盖目标检测、关键点检测等视觉任务。
飞桨本身提供了一个叫 Paddle Inference 的 C++ 推理引擎,专门用于模型部署。理论上,任何语言只要能调用 C++ 动态库,就能跑飞桨的模型。
而 PaddleSharp 就是这件事在 C# 世界的实现。它由 GitHub 用户 sdcb 开发维护,本质是 Paddle Inference C API 的 C# 封装,NuGet 包名统一以 Sdcb. 开头。
核心设计理念只有一句话:让 C# 开发者无需理解 Python,也能直接调用工业级 AI 模型。
PaddleSharp 不是一个单一的包,而是一组按功能划分的 NuGet 模块,按需引入:
| 模块包名 | 功能定位 |
|---|---|
Sdcb.PaddleInference | 核心推理引擎封装,底层基础 |
Sdcb.PaddleInference.runtime.win64.mkl | Windows x64 CPU 推理运行时(MKL-DNN) |
Sdcb.PaddleInference.runtime.win64.cuda* | Windows GPU 推理运行时(CUDA) |
Sdcb.PaddleOCR | OCR 功能封装(检测+方向+识别) |
Sdcb.PaddleOCR.KnownModels | 预置模型定义与自动下载管理 |
Sdcb.PaddleDetection | 目标检测功能封装(PP-YOLO 等) |
OpenCvSharp4 | 图像处理依赖(Mat 格式转换等) |
这种分层解耦的设计很聪明——你只需要 OCR,就不必把检测模块也拉进来;你在 Linux 上部署,就换对应平台的运行时包。整个生态的依赖关系是清晰可控的。
支持的运行环境方面,PaddleSharp 覆盖了:
这是很多 C# 开发者最关心的问题。说实话,两种方案没有绝对的优劣,只有适不适合当前场景。
大多数团队用 Python AI 能力的方式是这样的:
C# 业务服务 → HTTP/gRPC → Python Flask/FastAPI 推理服务 → PaddleOCR
这套架构的优势很明显:
但代价也是真实存在的:
C# 业务服务 → PaddleSharp(进程内调用) → Paddle Inference C++ 引擎
核心差异在于:推理是在同一个进程内完成的,没有网络跳转,没有序列化开销。
优势:
劣势也要正视:
一个简单的判断标准:如果你的团队以 C# 为主,且主要需求是 OCR 或目标检测的推理部署,PaddleSharp 几乎是目前最合适的选择。
光说不练没意思,来看一段真实可运行的代码,感受一下 PaddleSharp 的调用方式。
环境准备,在 NuGet 安装以下包:
xml<PackageReference Include="OpenCvSharp4" Version="4.13.0.20260427" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.13.0.20260302" />
<PackageReference Include="Sdcb.PaddleInference" Version="3.0.1" />
<PackageReference Include="Sdcb.PaddleInference.runtime.win64.mkl" Version="3.1.0.54" />
<PackageReference Include="Sdcb.PaddleOCR" Version="3.0.1" />
<PackageReference Include="Sdcb.PaddleOCR.Models.Local" Version="3.0.1" />
核心调用代码:
csharpusing OpenCvSharp;
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleOCR.Models.Local;
namespace AppPaddleSharp01
{
internal class Program
{
static void Main(string[] args)
{
FullOcrModel model = LocalFullModels.ChineseV3;
using (PaddleOcrAll ocr = new PaddleOcrAll(model, PaddleDevice.Mkldnn())
{
AllowRotateDetection = false, // 白底黑字横排,关闭旋转检测提升精度
Enable180Classification = false
})
{
using Mat src = Cv2.ImRead("test.png", ImreadModes.Color);
if (src.Empty())
{
Console.WriteLine("图片加载失败");
return;
}
Console.WriteLine($"原图尺寸:{src.Width} x {src.Height}");
// 只做放大,不做二值化,保留彩色信息
using Mat processed = ResizeOnly(src);
Console.WriteLine($"处理后尺寸:{processed.Width} x {processed.Height}");
Cv2.ImWrite("test_processed.png", processed);
PaddleOcrResult result = ocr.Run(processed);
Console.WriteLine("识别结果:");
Console.WriteLine(result.Text);
Console.WriteLine();
foreach (PaddleOcrResultRegion region in result.Regions)
{
Console.WriteLine($"文本:{region.Text} 置信度:{region.Score:P1}");
}
}
}
/// <summary>
/// 仅做等比放大,目标让图片高度达到 600px 以上
/// 不做任何二值化或颜色转换,保留原始彩色信息
/// </summary>
static Mat ResizeOnly(Mat src)
{
// 目标:短边放大到至少 600px,让文字高度足够检测模型识别
double scale = Math.Max(1.0, 600.0 / src.Height);
// 同时限制放大倍数不超过 4 倍,避免图片过大
scale = Math.Min(scale, 4.0);
Console.WriteLine($"放大倍数:{scale:F1}x");
Mat resized = new Mat();
Cv2.Resize(src, resized,
new Size((int)(src.Width * scale), (int)(src.Height * scale)),
interpolation: InterpolationFlags.Cubic);
return resized;
}
}
}


就这些。没有 HTTP 请求,没有 Python 进程,没有端口配置,一个 PaddleOcrAll 对象,一次 Run() 调用,结果就出来了。
模型文件默认缓存在 .nuget/packages/sdcb.paddleocr.models.localv3/2.7.0.1/ 目录下,后续运行不再重复下载。如果需要离线部署,提前把模型文件放到对应路径即可。
在实际项目里,PaddleSharp 落地效果最好的场景大概有这几类:
适合的场景:
不太适合的场景:
PaddleSharp 目前由个人开发者 sdcb 维护,这一点值得正视。它不是百度官方的 .NET SDK,而是社区贡献的封装层。好处是源码完全开放、NuGet 发布记录清晰、版本与 Paddle Inference 同步;需要注意的是,遇到底层问题时,社区响应速度不如商业产品,GitHub Issues 是主要的问题反馈渠道。
从项目的引用情况来看,BotSharp、Kernel Memory 等知名 .NET AI 框架已经集成了 PaddleSharp,说明它在 .NET AI 生态里的认可度在稳步提升。
本文是系列的第一篇,主要建立整体认知。后续文章会逐步深入:
如果你在自己的项目里已经有过类似的 AI 能力集成经历——不管是 Python 服务、云 API,还是其他方案——欢迎在评论区聊聊你遇到的具体问题,这对后续文章的选题很有参考价值。
#C# #PaddleSharp #PaddleOCR .NET #AI推理部署 #图像识别
相关信息
我用夸克网盘给你分享了「AppPaddleSharp01.zip」,点击链接或复制整段内容,打开「夸克APP」即可获取。
/7c7c3YUjyZ:/
链接:https://pan.quark.cn/s/1ed9fdba09f6
提取码:ddBN
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!