PaddleOCR之高性能Go语言实现OCR识别
最近为了让python语言能够直接调用PaddleOCR的C++的动态链接库,针对本人已经开源的PaddleOCR项目https://gitee.com/raoyutian/paddle-ocrsharp使用的PaddleOCR的C++动态库,进行了大量代码修改,修改后PaddleOCR,导出标准C函数接口,极大地方便了其他语言直接调用并进行OCR文字识别。
1 2 3 4 5 6 | __declspec ( dllexport ) void Initializejson( char * modelPath_det_infer, char * modelPath_cls_infer, char * modelPath_rec_infer, char * keys, char * parameterjson); __declspec ( dllexport ) char * Detect( char * imagefile); __declspec ( dllexport ) char * DetectByte( char * imagebytedata, size_t * size); __declspec ( dllexport ) char * DetectBase64( char * imagebase64); __declspec ( dllexport ) char * DetectByteData( const char * img, int nWidth, int nHeight, int nChannel); __declspec ( dllexport ) void FreeEngine(); |
本文将介绍python ,go ,c#几种开发语言的识别结果。
一 、pyhon:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import os import ctypes import Parameter from ctypes import * import json from datetime import datetime import numpy as np paddleOCR = cdll.LoadLibrary( ".\PaddleOCR.dll" ) #加载C++动态库 encode = "gbk" #传入OCR模型参数 root = "./" cls_infer = root + "/inference/ch_ppocr_mobile_v2.0_cls_infer" rec_infer = root + "/inference/ch_PP-OCRv3_rec_infer" det_infer = root + "/inference/ch_PP-OCRv3_det_infer" ocrkeys = root + "/inference/ppocr_keys.txt" #OCR识别参数对象,后面序列化为json字符串 parameter = Parameter.Parameter() p_cls_infer = cls_infer.encode(encode) p_rec_infer = rec_infer.encode(encode) p_det_infer = det_infer.encode(encode) p_ocrkeys = ocrkeys.encode(encode) def main(): #序列化参数为json字符串 parameterjson = json.dumps(parameter,default = Parameter.Parameter2dict) #初始化OCR引擎,一次即可 paddleOCR.Initializejson( p_det_infer, p_cls_infer, p_rec_infer, p_ocrkeys, parameterjson.encode(encode)) result = "" paddleOCR.Detect.restype = ctypes.c_wchar_p #识别结果是宽字节编码, imagepath = os.path.abspath( '.' ) + "\\image\\" imagefiles = os.listdir(imagepath) total = [] for image in imagefiles: imagefile = imagepath + image t1 = datetime.utcnow() #调用OCR识别接口,调用的是文件路径接口 result = paddleOCR.Detect(imagefile.encode(encode)) t2 = datetime.utcnow() c = t2 - t1 total.append(c) print ( "time:" ,c) print (result) print ( "平均时间:" , np.mean(total)) if __name__ = = "__main__" : main() input () |
Python直接调用C++的动态库进行OCR识别,相比python调用python的预测库进行OCR,性能提升了不少。
二、Go:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package main import ( "fmt" "syscall" "unsafe" "os" "bufio" "C" ) // 获取字符串的长度指针 func lenPtr(s string) uintptr { return uintptr(len(s)) } // 获取数字的指针 func intPtr(n int) uintptr { return uintptr(n) } // 获取字符串的指针 func strPtr(s string) uintptr { return uintptr(unsafe.Pointer(syscall.StringBytePtr(s))) } func main() { dll,err:= syscall.LoadDLL( "PaddleOCR.dll" ) if err!=nil { fmt.Println(err) return } Initjson,err:=dll.FindProc( "Initializejson" ) if err!=nil { fmt.Println(err) return } detect,err:=dll.FindProc( "Detect" ) if err!=nil { fmt.Println(err) return } Initjson.Call(strPtr( "D:\\PaddleOCR\\deploy\\Go\\inference\\ch_PP-OCRv3_det_infer" ), strPtr( "D:\\PaddleOCR\\deploy\\Go\\inference\\ch_ppocr_mobile_v2.0_cls_infer" ), strPtr( "D:\\PaddleOCR\\deploy\\Go\\inference\\ch_PP-OCRv3_rec_infer" ), strPtr( "D:\\PaddleOCR\\deploy\\Go\\inference\\ppocr_keys.txt" ),strPtr( "{}" )) res, _, _:=detect.Call(strPtr( "D:\\PaddleOCR\\deploy\\Go\\image\\test.jpg" )) p_result := (*C.char)(unsafe.Pointer(res)) ocrresult:= C.GoString(p_result) fmt.Println(ocrresult) input := bufio.NewScanner(os.Stdin) input.Scan() } |
go语言现学现卖。Go实现,主要采用CGo,syscall.LoadDLL("PaddleOCR.dll")
使用syscall.LoadDLL加载PaddleOCR.dll动态链接库。

三、C#
c#语言调用C++动态库,直接采用DllImport方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true )] internal static extern void Initialize( string det_infer, string cls_infer, string rec_infer, string keys, OCRParameter parameter); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true )] internal static extern void Initializejson( string det_infer, string cls_infer, string rec_infer, string keys, string parameterjson); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true )] internal static extern IntPtr Detect( string imagefile); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true )] internal static extern IntPtr DetectByte( byte [] imagebytedata, long size); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true )] internal static extern IntPtr DetectBase64( string imagebase64); [DllImport(PaddleOCRdllName, CallingConvention = CallingConvention.StdCall, SetLastError = true )] internal static extern int FreeEngine(); |
开源项目地址: https://gitee.com/raoyutian/paddle-ocrsharp
更多内容,欢迎关注公众号,加入QQ群,了解更多内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!