目錄
關于 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();
說明表如下:?
序號 | 參數名 | 類型 | 說明 |
---|---|---|---|
1 | config? | OCRModelConfig | OCR模型的配置對象 |
2 | oCRParameter? | OCRParameter | OCR模型的識別參數對象 |
3 | engi | PaddleOCREngine | OCR模型的識別引擎對象 |
4 | ocrResult? | OCRResult | OCR模型的識別結果對象 |
初始化對象是疲勞測試的關鍵設計,如果每次都 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方法僅需要提供一個圖片完整路徑參數即可,方法中的參數對象需要說明一下,見下表:
序號 | 參數名 | 說明 |
---|---|---|
1 | cpu_math_library_num_threads | CPU預測時的線程數,在機器核數充足的情況下,該值越大,預測速度越快;在我們應用里設置為10 |
2 | enable_mkldnn ? ? ? ? ? ? | 即是否使用mkldnn庫, web部署該值建議設置為false,否則出錯,內存如果使用很大,建議該值也設置為false,在這里我們設置為false |
3 | cls ? ? ? ? ? ? | 是否執行文字方向分類,在這里我們設置為false |
4 | use_angle_cls ? ? ? ? ? ? | 是否開啟方向檢測,用于檢測識別180旋轉,在這里我們設置為false |
5 | det_db_score_mode ? ? ? ? ? ? | 是否使用多段線,即文字區域是用多段線還是用矩形,在這里我們設置為false |
6 | det_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配置文件進行的定制開發,在實際應用我們要根據情況進行參數的設置和設計的調整,在測試中我們發現通過本實例的參數設置可以多識別出一些文字,而且識別率還是比較準確的。?
本示例代碼僅供您參考,感謝您的閱讀,希望本文能夠對您有所幫助。