我做的百度飞桨PaddleOCR .NET调用库

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

2bcccba622add0977f57b58944279ae4.png

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

05ccec2fdc556760d0e521ca4311fa4d.png

运行效果:

32d2b5d113e7eabf54d8cd9bbd1a54f1.png

28ce936d1eb77b48f4a6f61ab1009fd9.png

6f28372dd09f314c7b43268eff41a2cf.png

促使我给PaddleOCR做.NET封装的原因,是PaddleOCR令人惊讶的识别精度。我之前用过TesseractOCR,看到有人说是“世界上唯一”免费且好用的OCR引擎,但我发现它不好用,它的精度一直介于“可用”与“不可用”之间,处于勉强可用的状态——即使是我使用了Best的TesseractOCR模型也是如此(而且性能也不快)。

比如你看这个例子,用TesseractOCR跑的,耗时48秒,英语和数字识别还是可圈可点的,但中文……里面有空格不说,而且大量识别错误,非常不通顺,诠释了什么叫“介于可用与不可用之间”。

647a12d445e303b68da4137e5cc136a0.png

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

f30361b89d7b7300f97f1f216c626299.png

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

c2a56f392c3e171180f14d66a296920b.png

可见精度好得多,耗时也只要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。

    值得注意的是,native binding包与低层包没有任何依赖关系。

  3. 再往上层是应用包,应用包依赖于低层的推理库包Sdcb.PaddleInference,文字识别OCR就是Paddle推理库Inference的一个应用,因此提供了一个Sdcb.PaddleOCR,封装了PaddleDetector、PaddleClassificator、PaddleRecognizor以及PaddleOcrAll用来做串联

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

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

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

5fc9cdfc45b429b621328f50977fc9e0.png

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

ea3dd0f62422471093cf7f3fc83ad945.png

这些内容都是开源的:https://github.com/sdcb/paddlesharp,各位可以点击阅读原文跳转到Github,喜欢的朋友请给我一个star哦。

另外我还创建了一个QQ群,C#/.NET计算机视觉技术交流,里面也包括有关这个PaddleSharp的使用、部署答疑和技术讨论,欢迎有兴趣的同行一起参与!

e2ec461b05abb8fc794f654c30fcc64e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python核心模块之pickle和cPickle讲解

pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别。要和其他语言交互,可以使用内置的json包使用pickle模块你可以把 Python 对象直接保存到文件,而不需要把他们转化为字符串&#xff0…

反序列化层遍历二叉树

反序列化层遍历二叉树 规则: 序列化:如果这个节点有值,则打印“值!" 如果这个节点没有值,则打印“#!” 从上到下,从左到右 比如: 1 …

超棒的在线Bootstrap主题编辑工具 - lollytin

lollytin 是一款帮助制作Bootstrap3主题的在线工具,虽然现在仍旧是Beta版本,但是已经非常不错了。 主要功能: 通过拖拽来生成主题支持拖拽页头,页脚,内容,幻灯,地图,表单&#xff0c…

CentOS 5.9 yum安装LAMP(Apache+MySQL+PHP)

2019独角兽企业重金招聘Python工程师标准>>> 1、 yum -y install mysql mysql-server /*yum安装MySQL*/ 2、chkconfig --levels 235 mysqld on /*设置开机启动*/ 3、以MySQL用户root登陆: mysql -u root 登陆后设置root密码: set password for rootl…

C#获2021年度编程语言奖,开发者们最该关注这些亮点!

2022年的第一个好消息,应该就是C#获得“TIOBE 年度编程语言奖”。虽然眼下TIOBE的新闻尚未发布,但早在21年12月榜单发布的同时,TIOBE的CEO Paul Jansen表示,C#将获取“TIOBE 年度编程语言奖”。C#有着21年的悠久历史了&#xff0c…

编写程序在窗口中写出自己名字的拼音缩写_各类英文缩写:全称居然这么朴素?网友:最后一个我笑了...

提到听起来很牛的缩写,小优第一个想到的单词是VIP,一直认为它是一个很厉害的单词,那它的全称一定更厉害吧!直到初中,被英语老师打破幻想,原来VIP的全称就只是 Very Important Person! Excuse me ??好吧!那…

如何像Uber一样给工程师派单,解放外包生产力?

2019独角兽企业重金招聘Python工程师标准>>> 2014年,陈柯好的第一个创业项目失败,半年之内,陈柯好以技术合伙人的方式游走于旅游、电商、团购、票务等各种领域。正当他对职业方向感到迷茫时,“大众创业、万众创新”的口…

为什么越来越多的人消失在朋友圈?

全世界只有3.14 % 的人关注了爆炸吧知识微博上有个热门话题讨论:#越来越多的人开始消失在朋友圈#。网友们纷纷评论,也道出了背后的辛酸真相。“越来越觉得自己渺小和不重要。”“其实根本没人关心你朋友圈写的是什么。”……是的,越来越多的人…

判断一棵树是否为平衡二叉树

代码: 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法 平衡二叉树的常用算法有红黑树、AVL、 Treap 等。 最小二叉平衡树…

Java类集-list

Collection 子接口: ArrayList是List 接口和Collection接口的一个子类,用于实例化两种接口 package leiji; import java.util.ArrayList; import java.util.List; import java.util.Collection; public class ArryList { public static void main(String…

magento 插件

magento 后台删除订单插件 插件地址 http://www.magentocommerce.com/magento-connect/delete-orders-2.html转载于:https://www.cnblogs.com/echofrank/p/3867225.html

只显示标准采购订单

应用 Oracle Purchasing 层 Level Function 函数名 Funcgtion Name PO_POXPOVPO 表单名 Form Name POXPOVPO 说明 Description 只显示标准采购订单 条件 Condition 触发器事件 Tirgger Event WHEN-NEW-FORM-INSTANCE 触发器对象 Tirgger Object / 条件 Condit…

教你10分钟对接人大金仓EF Core 6.x

【导读】目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql、SqlSugar(排名不分先后)。FreeSql和SqlSugar都已早早支持国产数据库比如人大金仓、…

mfc怎么改按钮的按下状态_【荐读】马桶上一大一小的按钮该怎么按?原来这些年都错了...

马桶水箱上有两个冲水钮,一半大一半小,你知道它们有什么作用吗?日常使用马桶时两个冲水按钮,要怎么按才正确?今天终于有答案了.....两按钮的作用水箱一大一小的按钮,分别代表着满水和半水排水的功能。小按钮…

TCP/IP的基本工作原理

从以上体系结构来看,TCP/IP是OSI七层模型的简化,如图3-9所示,共分为4层:应用层,传输层,IP层和物理网络接口层。TCP/IP模型将与物理网络打交道的物理网络部分称为网络接口,它相当于OSI的物理层和…

linux centos7 root密码重置

转:http://blog.chinaunix.net/uid-21209618-id-4738916.html 分类: LINUX 三年左右没接触linux技术工作,忘记的有很多。不知该怎么去运用。突然间想到很久没接触喜爱的LINUX,便下下来centos7玩玩。在安装的过程中发现变化挺大。用…

史上最全几何技巧,远比傻做一千道题更实用!

▲ 点击查看爱因斯坦说:“一个人当他最初接触欧几里得几何学时,如果不曾为它的明晰性和可靠性所感动,那么他是不会成为一个科学家的。”我们现在再回过头想想,我们小时候学几何的时候,真的有感受到过这种爱因斯坦说的感…

Java类集-set

Set接口是Collection接口的子接口,Set接口中不能插入重复元素 Set接口的常用子类: HashSet是set接口的一个子类,特点:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序。 Treeset也是set接口的…

Color the ball

Color the ball Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 30 Accepted Submission(s) : 13 Problem DescriptionN个气球排成一排&#xff0c;从左到右依次编号为1,2,3....N.每次给定2个整数a b(a < b),l…