首页 > 其他分享 >【转载】百度飞桨PaddleOCR .NET调用库

【转载】百度飞桨PaddleOCR .NET调用库

时间:2023-02-24 12:55:45浏览次数:48  
标签:封装 PaddleOCR 飞桨 API NET 识别 Sdcb

NET Conf 2021中国我做了一次《.NET玩转计算机视觉OpenCV》的分享,其中提到了一个效果特别好的OCR识别引擎——百度飞桨PaddleOCR,可离线部署,后来我逐步把它封装了一下,代码全部开源(可点击查看原文跳转到Github):https://github.com/sdcb/paddlesharp,可以直接安装NuGet包使用,支持.NET Framework/.NET Core、支持Linux、支持GPU调用,支持14种语言模型的自动下载:

这里有使用方法和示例代码:

运行效果:


促使我给PaddleOCR做.NET封装的原因,是PaddleOCR令人惊讶的识别精度。我之前用过TesseractOCR,看到有人说是“世界上唯一”免费且好用的OCR引擎,但我发现它不好用,它的精度一直介于“可用”与“不可用”之间,处于勉强可用的状态——即使是我使用了Best的TesseractOCR模型也是如此(而且性能也不快)。
比如你看这个例子,用TesseractOCR跑的,耗时48秒,英语和数字识别还是可圈可点的,但中文……里面有空格不说,而且大量识别错误,非常不通顺,诠释了什么叫“介于可用与不可用之间”。

但PaddleOCR不同,去看看官网示例,全部都是效果爆炸的感觉,最令人我惊讶的是它的精度,尤其是文字在旋转的状态下的精度:

上文中同样的例子,在PaddleOCR中的执行结果:

可见精度好得多,耗时也只要9秒。

我是怎么封装的?

我发现市场上有人封装过,但他们都是基于C++ API,然后自己写了一层C++,然后包装成C API进行封装。这样的好处是暴露出来的C API比较简单,调用起来很方便,但缺点是不方便扩展,使用起来笨重得多,跨平台也很难。

基于C API使用起来不方便,但上层不是有咱们.NET/C#嘛,我相信再不方便的API,只要用上了C#/.NET去封装它,都能做得很方便地去调用,于是我做出了这样的一个架构(这个架构本质是模仿了OpenCvSharp4)

  1. 最底层是C API的NuGet封装包,这个用PInvoke来封装C API,它的NuGet包名字是:Sdcb.PaddleInference
  2. 与底层配套的包叫native binding包,我提供了两个,一个是基于CPU的Sdcb.PaddleInference.runtime.win64.mkl,一个是基于GPU的Sdcb.PaddleInference.runtime.win64.cuda11_cudnn8_tr7。
  3. 值得注意的是,native binding包与低层包没有任何依赖关系。
  4. 再往上层是应用包,应用包依赖于低层的推理库包Sdcb.PaddleInference,文字识别OCR就是Paddle推理库Inference的一个应用,因此提供了一个Sdcb.PaddleOCR,封装了PaddleDetector、PaddleClassificator、PaddleRecognizor以及PaddleOcrAll用来做串联

最往上层走就是扩展包,我提供了一个用于帮助用户自动下载OCR模型的Sdcb.PaddleOCR.KnownModels,注意这个扩展包与上述包没有任何引用关系。

有了这些包,我做出来的这个封装就比其它封装更有竞争力,比如能支持GPU或者不支持GPU,比如支持Linux平台,比如更换不同的模型,比如支持设置不同的参数——用户甚至可以不基于我提供的应用包,自己去使用自己的逻辑封装PaddleOCR或者其它应用。

这几天我参与了百度飞桨的一个车牌号识别的3天训练营,我发现可以从百度的BML平台下载模型之后,只需简短的改动就能将我的PaddleSharp改成支持车牌号识别:

我发现通过这些绵薄之力,能为.NET社区带来一些方便。比如有客户已经用上我的包,做了一个Word插件,是付费产品,效果很不错:

这些内容都是开源的:https://github.com/sdcb/paddlesharp,喜欢的朋友请给我一个star哦。

标签:封装,PaddleOCR,飞桨,API,NET,识别,Sdcb
From: https://www.cnblogs.com/ivan0915/p/17151014.html

相关文章

  • Kubernetes:通过 kubectl 插件 ketall 查看所有对象资源
    写在前面分享一个查看集群所有资源的小工具博文内容涉及:下载安装常用命令Demo理解不足小伙伴帮忙指正出其东门,有女如云。虽则如云,匪我思存。缟衣綦巾,聊乐我员......
  • 一文详解 Netty 组件
    作者:京东物流张弓言一、背景Netty是一款优秀的高性能网络框架,内部通过NIO的方式来处理网络请求,在高负载下也能可靠和高效地处理I/O操作作为较底层的网络通信框架,......
  • Quartz.Net 主要概念介绍和吐槽
    我们经常遇到需要定时执行某些任务的情况,比如清理缓存、异步结果轮询等,如果不打算造轮子,那么选择一款合适的定时任务组件就很关键了。所幸,.Net世界中的选项并不多:)选型主......
  • 一文详解 Netty 组件
    作者:京东物流张弓言一、背景Netty是一款优秀的高性能网络框架,内部通过NIO的方式来处理网络请求,在高负载下也能可靠和高效地处理I/O操作作为较底层的网络通信框架,其被......
  • 云原生|kubernetes|kubernetes中的资源(一)---service详解
    前言:每个Pod都有自己的IP地址,但是如果Pod重新启动了的话那么他的IP很有可能也就变化了。这就会带来一个问题:例如我们有一些后端的Pod的集合为集群中的其他前端的......
  • 云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)
    前言:一,MySQL的主从复制优点如下:数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据性能大大提升:一主多从,不同用户从不同数据库读取,性能提升扩展性更优:流量增大时,可......
  • 云原生|kubernetes|CKA模拟测试-2022(1---10题)(一)
    第一题:Taskweight:1%Youhaveaccesstomultipleclustersfromyourmainterminalthrough ​​kubectl​​ contexts.Writeallthosecontextnamesinto ​​/o......
  • 云原生|kubernetes|CKA真题解析-------(6-10题)
    第六题:service配置 解析:考察两个知识点:deployment控制器内的port命名暴露一个pod内的端口到新建的服务内的这里有一个需要注意的地方,没有告诉你deployment控制器在哪个name......
  • MegEngine 使用小技巧:使用 Netron 实现模型可视化
    近期社区有多个同学问,如何查看MegEngine训练出的模型网络结构。其实在去年8月,MegEngine就已经集成到了Netron平台上。目前Netron已支持MegEngine模型:TracedMod......
  • ASP.NET Core - 依赖注入(二)
    .NETCore依赖注入的基本用法话接上篇,这一章介绍.NETCore框架自带的轻量级Ioc容器下服务使用的一些知识点,大家可以先看看上一篇文章[ASP.NETCore-依赖注入(......