首页 > 其他分享 >PaddleOCR之高性能Go语言实现OCR识别

PaddleOCR之高性能Go语言实现OCR识别

时间:2023-03-24 20:11:23浏览次数:52  
标签:string PaddleOCR char encode CallingConvention Go OCR infer

最近为了让python语言能够直接调用PaddleOCR的C++的动态链接库,针对本人已经开源的PaddleOCR项目https://gitee.com/raoyutian/paddle-ocrsharp使用的PaddleOCR的C++动态库,进行了大量代码修改,修改后PaddleOCR,导出标准C函数接口,极大地方便了其他语言直接调用并进行OCR文字识别。

__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:

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:

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方法。

 

        [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群,了解更多内容。

 

 

 

 

 

 

标签:string,PaddleOCR,char,encode,CallingConvention,Go,OCR,infer
From: https://www.cnblogs.com/raoyutian/p/17253205.html

相关文章

  • Go Xorm简单使用
    官网相关文档https://xorm.io/zh/docs/chapter-01/1.engine/https://gitea.com/xorm/xorm/src/branch/master/README_CN.mdxorm是一个简单而强大的Go语言ORM库.通过......
  • GitOps 实操手册 5:构建 ArgoCD GitOps 工作流
    内容简介本实验手册系列包含七个主题,涵盖了从应用容器化到GitOps工作流的实现与高级特性。通过这些实验手册,您将学习到如何构建、部署和管理应用,以及如何在Kubernetes集......
  • golang pprof 监控系列(1) —— go trace 统计原理与使用
    golangpprof监控系列(1)——gotrace统计原理与使用服务监控系列文章服务监控系列视频关于gotooltrace的使用,网上有相当多的资料,但拿我之前初学golang的经验来......
  • Linux+Typora+Picgo图床配置
    Linux+Typora+Picgo图床配置首先不建议安装在UbuntuStore里的版本,会有一些限制。首先安装node.js去官网下载编译好的源码,配置软连接,使全局都可以使用node命令。ln-......
  • RunnerGo与JMeter在产品设计方面的比较分析
    当谈到对于性能测试的需求时,JMeter和RunnerGo在测试场景设置、执行性能测试、性能测试结果分析等方面都提供了很多功能,但两个工具的结构方面仍然存在一些区别。以下是详细的......
  • 性能测试:如何在RunnerGo 中寻找高效的解决方案
    性能测试是软件质量保障的关键环节之一,性能测试可以评估应用的可靠性、稳定性和响应时间。然而,性能测试通常需要大量的时间和资源,因此需要使用高效的性能测试工具来减少测试......
  • 性能测试:如何在RunnerGo 中寻找高效的解决方案
    性能测试是软件质量保障的关键环节之一,性能测试可以评估应用的可靠性、稳定性和响应时间。然而,性能测试通常需要大量的时间和资源,因此需要使用高效的性能测试工具来减少测......
  • RunnerGo与JMeter在产品设计方面的比较分析
    当谈到对于性能测试的需求时,JMeter和RunnerGo在测试场景设置、执行性能测试、性能测试结果分析等方面都提供了很多功能,但两个工具的结构方面仍然存在一些区别。以下是详细......
  • Django 大数据 orm 操作 - 报错及解决方法记录
    报错:django.db.utils.OperationalError:(1153,"Gotapacketbiggerthan'max_allowed_packet'bytes")解决方法:修改mysql配置文件的max_allowed_packet配置参数......
  • go
     1、深拷贝(DeepCopy)拷贝的是数据本身,创造一个样的新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值。......