C#?PaddleOCRSharp?OCR進(jìn)行疲勞測(cè)試
關(guān)于 PaddleOCRSharp
PaddleOCRSharp 是百度飛槳封裝的.NET版本 OCR dll 類庫(kù),OCR(Optical Character Recognition)工具可以將圖像文件中的文本內(nèi)容進(jìn)行識(shí)別,轉(zhuǎn)換成可編輯的文本格式。從而進(jìn)一步進(jìn)行編輯、存儲(chǔ)和分析。
在實(shí)際的使用中,這款工具類庫(kù)的確很優(yōu)秀,無(wú)論從識(shí)別時(shí)間還是識(shí)別率來(lái)說(shuō),比較平衡比較令人滿意。
應(yīng)用范例演示
這是我們?cè)趯?shí)際應(yīng)用中開發(fā)的一款工具,基于 Windows WinForm 模式,用于識(shí)別客戶提供的電子檔案中的文字,并進(jìn)行文字識(shí)別存儲(chǔ)及后續(xù)的管理。其主界面運(yùn)行如下:

如圖,工具程序在導(dǎo)入前提供了一些選項(xiàng),包括:
(1)導(dǎo)入類型為圖片數(shù)據(jù)和個(gè)人信息(這包括了導(dǎo)入文本到數(shù)據(jù)庫(kù)的選項(xiàng))
(2)跳過(guò)OCR識(shí)別功能,是為了直接導(dǎo)入圖片到數(shù)據(jù)庫(kù),這里我們需要勾選掉以進(jìn)行測(cè)試
(3)對(duì)已導(dǎo)入數(shù)據(jù)執(zhí)行更新操作,這個(gè)選項(xiàng)是純數(shù)據(jù)庫(kù)更新操作
(4)不輸出導(dǎo)出報(bào)告,是為了減少內(nèi)存占用量,提升性能
快捷設(shè)置可以提供自動(dòng)設(shè)置4個(gè)選項(xiàng)的目的。
工具程序提供了全目錄全文件分析和單目錄分析,全目錄會(huì)遍歷該目錄下所有的電子圖片進(jìn)行識(shí)別操作,這里我們選擇的是單目錄文件分析(即選擇一個(gè)目錄,只查找該目錄下所有的圖片文件),并將最終的分析結(jié)果顯示在報(bào)告框中。
在實(shí)際的運(yùn)行應(yīng)用中,我們的檔案有共計(jì)幾千萬(wàn)份圖片,由于環(huán)境及硬件要求,僅提供了三臺(tái)配置雷人的臺(tái)式機(jī),發(fā)現(xiàn)運(yùn)行幾小時(shí)后,PaddleOCRSharp.dll 運(yùn)行崩潰報(bào)錯(cuò),如下圖:

因此需要對(duì)程序進(jìn)行一些改進(jìn)。
?范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
PaddleOCRSharp版本:2.2.0.0
數(shù)據(jù)庫(kù):Microsoft SQL Server 2016
.net版本: .netFramework4.0 或以上
開發(fā)工具:VS2019 C#
疲勞測(cè)試
添加組件庫(kù)
打 VS2019 創(chuàng)建 WinForm 應(yīng)用,在解決方案資源管理器中添加引用,成功后如下圖:

添加 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;
方法設(shè)計(jì)
首先在 WinForm (實(shí)例假設(shè)為 Form1),中初化如下變量,代碼如下:
OCRModelConfig config = null; OCRParameter oCRParameter = new OCRParameter(); PaddleOCREngine engi = null; OCRResult ocrResult = new OCRResult();
說(shuō)明表如下:
| 序號(hào) | 參數(shù)名 | 類型 | 說(shuō)明 |
|---|---|---|---|
| 1 | config | OCRModelConfig | OCR模型的配置對(duì)象 |
| 2 | oCRParameter | OCRParameter | OCR模型的識(shí)別參數(shù)對(duì)象 |
| 3 | engi | PaddleOCREngine | OCR模型的識(shí)別引擎對(duì)象 |
| 4 | ocrResult | OCRResult | OCR模型的識(shí)別結(jié)果對(duì)象 |
初始化對(duì)象是疲勞測(cè)試的關(guān)鍵設(shè)計(jì),如果每次都 new 一個(gè)對(duì)象,系統(tǒng)運(yùn)行一段時(shí)間后就會(huì)崩潰。
paddleOCR方法實(shí)現(xiàn)對(duì)于路徑圖片的文字識(shí)別提取,代碼如下:
string paddleOCR(string imagepath)
{
var imagebyte = File.ReadAllBytes(imagepath);
oCRParameter.cpu_math_library_num_threads = 10;// 預(yù)測(cè)并發(fā)線程數(shù)
oCRParameter.enable_mkldnn = false; // web部署該值建議設(shè)置為0,否則出錯(cuò),內(nèi)存如果使用很大,建議該值也設(shè)置為0.
oCRParameter.cls = false; // 是否執(zhí)行文字方向分類;默認(rèn)false
oCRParameter.use_angle_cls = false; // 是否開啟方向檢測(cè),用于檢測(cè)識(shí)別180旋轉(zhuǎn)
oCRParameter.det_db_score_mode = false; // 是否使用多段線,即文字區(qū)域是用多段線還是用矩形
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方法僅需要提供一個(gè)圖片完整路徑參數(shù)即可,方法中的參數(shù)對(duì)象需要說(shuō)明一下,見(jiàn)下表:
| 序號(hào) | 參數(shù)名 | 說(shuō)明 |
|---|---|---|
| 1 | cpu_math_library_num_threads | CPU預(yù)測(cè)時(shí)的線程數(shù),在機(jī)器核數(shù)充足的情況下,該值越大,預(yù)測(cè)速度越快;在我們應(yīng)用里設(shè)置為10 |
| 2 | enable_mkldnn | 即是否使用mkldnn庫(kù), web部署該值建議設(shè)置為false,否則出錯(cuò),內(nèi)存如果使用很大,建議該值也設(shè)置為false,在這里我們?cè)O(shè)置為false |
| 3 | cls | 是否執(zhí)行文字方向分類,在這里我們?cè)O(shè)置為false |
| 4 | use_angle_cls | 是否開啟方向檢測(cè),用于檢測(cè)識(shí)別180旋轉(zhuǎn),在這里我們?cè)O(shè)置為false |
| 5 | det_db_score_mode | 是否使用多段線,即文字區(qū)域是用多段線還是用矩形,在這里我們?cè)O(shè)置為false |
| 6 | det_db_unclip_ratio | 表示文本框的緊致程度,越小則文本框更靠近文本,在這里我們使用了默認(rèn)值 1.6f |
調(diào)用示例
在Form上假設(shè)有按鈕 Button1,則其點(diǎn)擊事件的調(diào)用代碼示例如下:
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("共識(shí)別提取了"+rv2.Length.ToString()+"個(gè)文字\r\n"+ rv2, "識(shí)別結(jié)果");
return;
}
小結(jié)
在實(shí)際的運(yùn)行中,三臺(tái)機(jī)器同時(shí)運(yùn)行,有兩臺(tái)機(jī)器運(yùn)行了7天以上暫無(wú)報(bào)錯(cuò),一臺(tái)運(yùn)行了5天左右報(bào)錯(cuò),唯一的區(qū)別在于報(bào)錯(cuò)機(jī)器的顯卡配置較低,不同于其它兩臺(tái)機(jī)器??傮w來(lái)說(shuō)對(duì)于幾個(gè)小時(shí)就會(huì)出錯(cuò),提升了不少,也給我們監(jiān)控運(yùn)行狀況提供了空間。
本實(shí)例是根據(jù)客戶提供的電子圖片類型、目錄結(jié)構(gòu)、JSON配置文件進(jìn)行的定制開發(fā),在實(shí)際應(yīng)用我們要根據(jù)情況進(jìn)行參數(shù)的設(shè)置和設(shè)計(jì)的調(diào)整,在測(cè)試中我們發(fā)現(xiàn)通過(guò)本實(shí)例的參數(shù)設(shè)置可以多識(shí)別出一些文字,而且識(shí)別率還是比較準(zhǔn)確的。
到此這篇關(guān)于C# PaddleOCRSharp OCR進(jìn)行疲勞測(cè)試的文章就介紹到這了,更多相關(guān)C# OCR疲勞測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#開發(fā)Android百度地圖手機(jī)應(yīng)用程序(多地圖展示)
這篇文章主要介紹了C#開發(fā)Android百度地圖手機(jī)應(yīng)用程序(多地圖展示)的相關(guān)資料,需要的朋友可以參考下2016-02-02
C# 控件屬性和InitializeComponent()關(guān)系案例詳解
這篇文章主要介紹了C# 控件屬性和InitializeComponent()關(guān)系案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
如何使用C#串口通訊實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收
本文詳細(xì)介紹了如何使用C#實(shí)現(xiàn)基于串口通訊的數(shù)據(jù)發(fā)送和接收,通過(guò)SerialPort類,我們可以輕松實(shí)現(xiàn)串口通訊,并結(jié)合事件機(jī)制實(shí)現(xiàn)數(shù)據(jù)的傳遞和處理,感興趣的朋友一起看看吧2025-03-03
winform模擬鼠標(biāo)按鍵的具體實(shí)現(xiàn)
這篇文章介紹了winform模擬鼠標(biāo)按鍵的具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-10-10
C#使用Free Spire.Doc查找并高亮Word中指定文本的實(shí)現(xiàn)步驟
在文檔處理場(chǎng)景中,如何高效地查找并高亮Word中的指定文本是一個(gè)常見(jiàn)痛點(diǎn),尤其在自動(dòng)化辦公、批量處理報(bào)告或數(shù)據(jù)提取等場(chǎng)景下,本文將分享一種基于Free Spire.Doc for .NET的免費(fèi)實(shí)現(xiàn)方案,幫助開發(fā)者在C#項(xiàng)目中實(shí)現(xiàn)查找 Word中指定文本并高亮顯示的功能2025-09-09

