C# 关于 PaddleOCRSharp OCR识别的疲劳测试

目录

关于 PaddleOCRSharp

应用范例演示

​范例运行环境

疲劳测试

添加组件库

方法设计 

调用示例 

小结


关于 PaddleOCRSharp

PaddleOCRSharp 是百度飞桨封装的.NET版本 OCR dll 类库,OCR(Optical Character Recognition)工具可以将图像文件中的文本内容进行识别,转换成可编辑的文本格式。从而进一步进行编辑、存储和分析。

在实际的使用中,这款工具类库的确很优秀,无论从识别时间还是识别率来说,比较平衡比较令人满意。

应用范例演示

这是我们在实际应用中开发的一款工具,基于 Windows WinForm 模式,用于识别客户提供的电子档案中的文字,并进行文字识别存储及后续的管理。其主界面运行如下:

如图,工具程序在导入前提供了一些选项,包括:

(1)导入类型为图片数据和个人信息(这包括了导入文本到数据库的选项)

(2)跳过OCR识别功能,是为了直接导入图片到数据库,这里我们需要勾选掉以进行测试

(3)对已导入数据执行更新操作,这个选项是纯数据库更新操作

(4)不输出导出报告,是为了减少内存占用量,提升性能

快捷设置可以提供自动设置4个选项的目的。

工具程序提供了全目录全文件分析和单目录分析,全目录会遍历该目录下所有的电子图片进行识别操作,这里我们选择的是单目录文件分析(即选择一个目录,只查找该目录下所有的图片文件),并将最终的分析结果显示在报告框中。

在实际的运行应用中,我们的档案有共计几千万份图片,由于环境及硬件要求,仅提供了三台配置雷人的台式机,发现运行几小时后,PaddleOCRSharp.dll 运行崩溃报错,如下图:

因此需要对程序进行一些改进。

​范例运行环境

操作系统: Windows Server 2019 DataCenter

PaddleOCRSharp版本:2.2.0.0

数据库:Microsoft SQL Server 2016

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

疲劳测试

添加组件库

打 VS2019 创建 WinForm 应用,在解决方案资源管理器中添加引用,成功后如下图:

 添加 using PaddleOCRSharp; 引用,示例如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PaddleOCRSharp;
using System.IO;
using System.Collections;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Security.Cryptography;

方法设计 

首先在 WinForm (实例假设为 Form1),中初化如下变量,代码如下:

OCRModelConfig config = null;
OCRParameter oCRParameter = new OCRParameter();
PaddleOCREngine engi = null;
OCRResult ocrResult = new OCRResult();

说明表如下: 

序号参数名类型说明
1config OCRModelConfigOCR模型的配置对象
2oCRParameter OCRParameterOCR模型的识别参数对象
3engiPaddleOCREngineOCR模型的识别引擎对象
4ocrResult OCRResultOCR模型的识别结果对象

初始化对象是疲劳测试的关键设计,如果每次都 new 一个对象,系统运行一段时间后就会崩溃。

paddleOCR方法实现对于路径图片的文字识别提取,代码如下:

string paddleOCR(string imagepath)
{var imagebyte = File.ReadAllBytes(imagepath);oCRParameter.cpu_math_library_num_threads = 10;// 预测并发线程数oCRParameter.enable_mkldnn = false; // web部署该值建议设置为0,否则出错,内存如果使用很大,建议该值也设置为0.oCRParameter.cls = false; // 是否执行文字方向分类;默认falseoCRParameter.use_angle_cls = false; // 是否开启方向检测,用于检测识别180旋转oCRParameter.det_db_score_mode = false; // 是否使用多段线,即文字区域是用多段线还是用矩形oCRParameter.det_db_unclip_ratio = 1.6f;engi = new PaddleOCREngine(config, oCRParameter);ocrResult = engi.DetectText(imagebyte);engi.Dispose();if (ocrResult != null){return ocrResult.Text;}return "";
}

paddleOCR方法仅需要提供一个图片完整路径参数即可,方法中的参数对象需要说明一下,见下表:

序号参数名说明
1cpu_math_library_num_threadsCPU预测时的线程数,在机器核数充足的情况下,该值越大,预测速度越快;在我们应用里设置为10
2enable_mkldnn
           
即是否使用mkldnn库, web部署该值建议设置为false,否则出错,内存如果使用很大,建议该值也设置为false,在这里我们设置为false
3cls
           
是否执行文字方向分类,在这里我们设置为false
4use_angle_cls
           
是否开启方向检测,用于检测识别180旋转,在这里我们设置为false
5det_db_score_mode
           
是否使用多段线,即文字区域是用多段线还是用矩形,在这里我们设置为false
6det_db_unclip_ratio表示文本框的紧致程度,越小则文本框更靠近文本,在这里我们使用了默认值 1.6f

调用示例 

在Form上假设有按钮 Button1,则其点击事件的调用代码示例如下:

private void Button1_Click(object sender, EventArgs e)
{OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";if (ofd.ShowDialog() != DialogResult.OK) return;string rv2 = paddleOCR(ofd.FileName);MessageBox.Show("共识别提取了"+rv2.Length.ToString()+"个文字\r\n"+ rv2, "识别结果");return;
}

小结

在实际的运行中,三台机器同时运行,有两台机器运行了7天以上暂无报错,一台运行了5天左右报错,唯一的区别在于报错机器的显卡配置较低,不同于其它两台机器。总体来说对于几个小时就会出错,提升了不少,也给我们监控运行状况提供了空间。

本实例是根据客户提供的电子图片类型、目录结构、JSON配置文件进行的定制开发,在实际应用我们要根据情况进行参数的设置和设计的调整,在测试中我们发现通过本实例的参数设置可以多识别出一些文字,而且识别率还是比较准确的。 

本示例代码仅供您参考,感谢您的阅读,希望本文能够对您有所帮助。

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

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

相关文章

【Java面向对象】抽象类和接口

文章目录 1.抽象类2.常见的抽象类2.1 Number类2.2 Calendar 和GregorianCalendar 3.接口4.常见接口4.1 Comparable 接口4.2 Cloneable 接口4.3 深浅拷贝 5.类的设计原则 1.抽象类 在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追…

Unty 崩溃问题(Burst 1.8.2)

错误代码: Assertion failed on expression: exception SCRIPTING_NULL UnityEngine.StackTraceUtility:ExtractStackTrace () Unity.Burst.BurstCompiler:SendRawCommandToCompiler (string Unity版本:2021.3.17F1,Burst 1.8.2 表现&…

python安装talib库教程

【talib介绍】 Talib介绍 Talib,全称“Technical Analysis Library”,即技术分析库,是一个广泛应用于金融量化领域的Python库。该库由C语言编写,支持Python调用,为投资者、交易员和数据分析师提供了强大的技术分析工…

酷炫末世意境背景404单页HTML源码

源码介绍 酷炫末世意境背景404单页HTML源码,背景充满着破坏一切的意境,彷佛末世的到来,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 …

餐边柜不踩坑的尺寸和做法

大家问餐边柜怎么做好看不踩坑      十做十不做,有尺寸和总结      1,柜子的深度30和35cm就行,低于30太窄放不了东西      高于35餐厅会显得窄,      2,镂空的地方一定要做背板,      3,柜子不用装修反弹器,也不做拉手,一个容易坏,一个不好看      建议…

论文学习——基于自适应选择的动态多目标进化优化有效响应策略

论文题目:Effective response strategies based on adaptive selection for dynamic multi-objective evolutionary optimization 基于自适应选择的动态多目标进化优化有效响应策略(Xiaoli Li a,b,c, Anran Cao a,∗, Kang Wang a)Applied S…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

App Inventor 2 天气预报App开发 - 第三方API接入的通用方法(2)

本文来自AppInventor2中文网(www.fun123.cn)参考文档,调用第三方天气接口获取天气JSON数据,解析并展示在App上。 App效果图,展示未来7日的天气预报,包括日期、天气图示和温度: App原理介绍 通…

Linux/Windows 系统分区

1. Windows 系统 1.1 系统分区 系统分区也叫做磁盘分区,即分盘; 举个例子,好比家里有一个大柜子,把衣服,鞋子,袜子都放在里面,由于没有隔断,找的时候非常麻烦,找是能找…

C++ Primer:3.2 标准库类型string

其他章节&#xff1a;C Primer 学习心得 标准库类型string表示可变长的字符序列&#xff0c;使用string类型必须首先头文件&#xff0c;string定义在命名空间std中 #include <string> using std::string定义和初始化string对象 初始化类的对象是由类本身决定的&#x…

借力Jersey,铸就卓越RESTful API体验

目录 maven 创建 jersey 项目 运行 支持返回 json 数据对象 1. 引言 在当今数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为连接不同软件系统和服务的桥梁。RESTful API以其简洁、轻量级和易于理解的特点&#xff0c;成为了API设计的首选标准。本…

Hive函数之-posexplode()

1、概念描述&#xff1a; posexplode() 是一个内建函数&#xff0c;用于处理数组数据&#xff0c;并将数组的每个元素及其索引&#xff08;位置&#xff09;转换为两列的表格式数据。posexplode() 函数对于处理需要元素位置信息的数组特别有用。pos就是postion的缩写&#xff…

Windows双网卡上网原理以及配置方法

目录 1. 背景 2. IP路由原理 3. windows双网卡上网解决方案 3.1. 基础配置解决方案 3.2. 高阶配置解决方案 1. 背景 在windwos上使用多网卡在工作和生活中是一个常见的操作&#xff0c;比如为了获取内部消息将有线连接到内部局域网中&#xff0c;为而了访问外网又将电脑的…

华为云GaussDB部署指南:主备架构的常见问题与解决方案

文章目录 华为云GaussDB部署指南&#xff1a;主备架构的常见问题与解决方案背景介绍部署步骤1.修改主机名2.软件安装检查3.禁用交换内存4.创建数据目录并挂载5.配置NTP时钟同步6.添加资源限制参数7.修改网卡的MTU8.上传安装工具包9.编辑集群配置文件10.修改集群安装模板11.安装…

木舟0基础学习Java的第二十天(线程,实现,匿名有名,休眠,守护,加入,设计,计时器,通信)

多线程 并发执行的技术 并发和并行 并发&#xff1a;同一时间 有多个指令 在单个CPU上 交替执行 并行&#xff1a;同一时间 有多个指令 在多个CPU上 执行 进程和线程 进程&#xff1a;独立运行 任何进程 都可以同其他进程一起 并发执行 线程&#xff1a;是进程中的单个顺…

【.NET全栈】ASP.NET开发Web应用——站点导航技术

文章目录 前言一、站点地图1、定义站点地图文件2、使用SiteMapPath控件3、SiteMap类4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以编程的方式添加节点3、使用TreeView控件导航4、绑定到XML文件5、按需加载节点6、带复选框的TreeView控件 三、Menu控件1、使用Menu控…

Hutool-Guava

目录 一、Guava 二、Hutool 三、区别与联系 四、使用场景 五、Guava工具类 1.集合工具类 2.字符串工具类 3.并发工具类 六、Hutool 1.字符串工具类 2.文件工具类 Hutool 和 Guava 都是 Java 开发中非常实用的工具库&#xff0c;它们提供了许多方便的工具类和方法&am…

字节抖音电商 后端开发岗位 一面

笔者整理答案&#xff0c;以供参考 自我介绍 项目&#xff08;20分钟&#xff09; RocketMQ延时消息的底层实现 回答&#xff1a; 延时消息的实现主要依赖于RocketMQ中的定时任务机制。消息被发送到Broker时&#xff0c;会先存储在一个特定的延时消息队列中。Broker会定时扫…

c++ extern 关键字

C中的extern关键字和跨语言互操作 变量的声明与定义 extern关键字用于声明在另一个翻译单元&#xff08;文件&#xff09;中定义的变量或函数。通过extern关键字&#xff0c;可以在多个文件中访问全局变量或函数。 变量声明示例 文件&#xff1a;main.cpp #include <io…

chatglm2-6b-prompt尝试

参考https://cloud.tencent.com/developer/article/2426296 chatglm2-6b&#xff0c;通过prompt来实现zero-shot/fewshot的自然语言处理任务 import json import re import os from modelscope.utils.constant import Tasks from modelscope import Model from modelscope.pi…