我做的百度飞桨PaddleOCR .NET调用库
? ? .NET Conf 2021中國我做了一次《.NET玩轉(zhuǎn)計(jì)算機(jī)視覺OpenCV》的分享,其中提到了一個(gè)效果特別好的OCR識別引擎——百度飛槳PaddleOCR,后來我逐步把它封裝了一下,代碼全部開源(可點(diǎn)擊查看原文跳轉(zhuǎn)到Github):https://github.com/sdcb/paddlesharp,可以直接安裝NuGet包使用,支持.NET Framework/.NET Core、支持Linux、支持GPU調(diào)用,支持14種語言模型的自動下載:
這里有使用方法和示例代碼:
運(yùn)行效果:
促使我給PaddleOCR做.NET封裝的原因,是PaddleOCR令人驚訝的識別精度。我之前用過TesseractOCR,看到有人說是“世界上唯一”免費(fèi)且好用的OCR引擎,但我發(fā)現(xiàn)它不好用,它的精度一直介于“可用”與“不可用”之間,處于勉強(qiáng)可用的狀態(tài)——即使是我使用了Best的TesseractOCR模型也是如此(而且性能也不快)。
比如你看這個(gè)例子,用TesseractOCR跑的,耗時(shí)48秒,英語和數(shù)字識別還是可圈可點(diǎn)的,但中文……里面有空格不說,而且大量識別錯誤,非常不通順,詮釋了什么叫“介于可用與不可用之間”。
但PaddleOCR不同,去看看官網(wǎng)示例,全部都是效果爆炸的感覺,最令人我驚訝的是它的精度,尤其是文字在旋轉(zhuǎn)的狀態(tài)下的精度:
上文中同樣的例子,在PaddleOCR中的執(zhí)行結(jié)果:
可見精度好得多,耗時(shí)也只要9秒。
我是怎么封裝的?
我發(fā)現(xiàn)市場上有人封裝過,但他們都是基于C++ API,然后自己寫了一層C++,然后包裝成C API進(jìn)行封裝。這樣的好處是暴露出來的C API比較簡單,調(diào)用起來很方便,但缺點(diǎn)是不方便擴(kuò)展,使用起來笨重得多,跨平臺也很難。
基于C API使用起來不方便,但上層不是有咱們.NET/C#嘛,我相信再不方便的API,只要用上了C#/.NET去封裝它,都能做得很方便地去調(diào)用,于是我做出了這樣的一個(gè)架構(gòu)(這個(gè)架構(gòu)本質(zhì)是模仿了OpenCvSharp4)
最低層是C API的NuGet封裝包,這個(gè)用PInvoke來封裝C API,它的NuGet包名字是:Sdcb.PaddleInference
與低層配套的包叫native binding包,我提供了兩個(gè),一個(gè)是基于CPU的Sdcb.PaddleInference.runtime.win64.mkl,一個(gè)是基于GPU的Sdcb.PaddleInference.runtime.win64.cuda11_cudnn8_tr7。
值得注意的是,native binding包與低層包沒有任何依賴關(guān)系。
再往上層是應(yīng)用包,應(yīng)用包依賴于低層的推理庫包Sdcb.PaddleInference,文字識別OCR就是Paddle推理庫Inference的一個(gè)應(yīng)用,因此提供了一個(gè)Sdcb.PaddleOCR,封裝了PaddleDetector、PaddleClassificator、PaddleRecognizor以及PaddleOcrAll用來做串聯(lián)
最往上層走就是擴(kuò)展包,我提供了一個(gè)用于幫助用戶自動下載OCR模型的Sdcb.PaddleOCR.KnownModels,注意這個(gè)擴(kuò)展包與上述包沒有任何引用關(guān)系。
有了這些包,我做出來的這個(gè)封裝就比其它封裝更有競爭力,比如能支持GPU或者不支持GPU,比如支持Linux平臺,比如更換不同的模型,比如支持設(shè)置不同的參數(shù)——用戶甚至可以不基于我提供的應(yīng)用包,自己去使用自己的邏輯封裝PaddleOCR或者其它應(yīng)用。
這幾天我參與了百度飛槳的一個(gè)車牌號識別的3天訓(xùn)練營,我發(fā)現(xiàn)可以從百度的BML平臺下載模型之后,只需簡短的改動就能將我的PaddleSharp改成支持車牌號識別:
我發(fā)現(xiàn)通過這些綿薄之力,能為.NET社區(qū)帶來一些方便。比如有客戶已經(jīng)用上我的包,做了一個(gè)Word插件,是付費(fèi)產(chǎn)品,效果很不錯:
這些內(nèi)容都是開源的:https://github.com/sdcb/paddlesharp,各位可以點(diǎn)擊閱讀原文跳轉(zhuǎn)到Github,喜歡的朋友請給我一個(gè)star哦。
另外我還創(chuàng)建了一個(gè)QQ群,C#/.NET計(jì)算機(jī)視覺技術(shù)交流,里面也包括有關(guān)這個(gè)PaddleSharp的使用、部署答疑和技術(shù)討論,歡迎有興趣的同行一起參與!
總結(jié)
以上是生活随笔為你收集整理的我做的百度飞桨PaddleOCR .NET调用库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日志文件记录的重要性
- 下一篇: C#获2021年度编程语言奖,开发者们最