PaddleOCR之高性能Go语言实现OCR识别
最近为了让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")
三、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群,了解更多内容。




PaddleOCR之高性能Go语言实现OCR识别的更多相关文章
- 【Win10 应用开发】OCR识别
OCR,即Optical Character Recognition,光学字符识别.以下介绍来自搜索: OCR(Optical Character Recognition,光学字符识别)是指电子设备( ...
- Atitit ocr识别原理 与概论 attilax总结
Atitit ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...
- 基于Python实现对PDF文件的OCR识别
http://www.jb51.net/article/89955.htm https://pythontips.com/2016/02/25/ocr-on-pdf-files-using-pytho ...
- OCR识别-python版(一)
需求:识别图片中的文字信息环境:windows系统 开发语言:python 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.pyocr 网络通直接使用命令:pip ...
- 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片
http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...
- AI时代的OCR识别技术浅析
人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...
- OCR识别-python3.5版
刚接触,啥子都不会,按着教程走 需求:识别图片中的文字信息环境:windows系统 开发语言:python3.5 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.p ...
- 基于百度云的OCR识别(Python)
2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
百度为何开源深度机器学习平台? 有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举. 5月20日,百度在github上开源了其 ...
- 基于Tesseract的OCR识别小程序
一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...
随机推荐
- mysql 必知必会整理—视图[十二]
前言 简单整理一下视图. 正文 视图: 需要MySQL 5 MySQL 5添加了对视图的支持.因此,本章内容适用于MySQL 5及以后的版本. 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动 ...
- gitlib配置
第1步:下载Java并安装Java.一般来说下载jdk对应的版本就行. 第2步:配置Java环境变量,具体如下: 1. 新建:变量名:JAVA_HOME:变量值:C:\Program Files\Ja ...
- 房屋设计H51图纸
- Advanced .Net Debugging 7:托管堆与垃圾收集
一.简介 这是我的<Advanced .Net Debugging>这个系列的第七篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第五章,这一章主要讲的是从根本上认识托管堆和垃圾回收 ...
- 力扣495(java)-提莫攻击(简单)
题目: 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中 ...
- 力扣231(java)-2的幂(简单)
题目: 给你一个整数 n,请你判断该整数是否是 2 的幂次方.如果是,返回 true :否则,返回 false . 如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方. 示例 ...
- PolarDB for PostgreSQL 开源路线图
简介:作者:蔡乐 本文主要分享一下Polar DB for PG的开源路线图,虽然路线图已经拟定,但是作为开源产品,所有参与者都能提出修改意见,包括架构核心特性的技术以及周边生态和工具等,希望大家能 ...
- 当微服务遇上 Serverless | 微服务容器化最短路径,微服务 on Serverless 最佳实践
简介: 阿里云Serverless应用引擎(SAE)初衷是让客户不改任何代码,不改变应用部署方式,就可以享受到微服务+K8s+Serverless的完整体验,开箱即用免运维. 前言 微服务作为一种更 ...
- [FAQ] crontab 执行curl xxx 好像没有执行 ?
如果你的crontab任务中的curl命令没有执行,可能有几个原因需要检查: 1. 检查命令路径:确保你在crontab任务中指定了正确的curl命令路径.你可以使用 which curl 命令来 ...
- 使用 SizeBench 分析 Exe 文件体积
本文将介绍微软开源免费的 SizeBench 工具,使用 SizeBench 工具可以用来分析 Exe 二进制文件的体积,分析 Exe 文件大小里面有哪些是可以优化的 下载安装方式: 请前往应用商店安 ...