博客 / 詳情

返回

推薦一款基於.NET和百度飛槳的OCR識別組件

隨着AI技術的發展,圖像識別技術應用越來越廣泛,OCR(Optical Character Recognition,光學字符識別)技術做為圖像識別技術的應用場景之一,廣泛的應用於零售,政務,工業,金融等領域,如車牌號識別,身份證識別等。今天以一個簡單的小例子,簡述在.NET開發中,如何利用第三方OCR組件庫進行圖像文字識別,僅供學習分享使用,如有不足之處,還請指正。

 

什麼是OCR

 

OCR (Optical Character Recognition,光學字符識別)是指電子設備(例如掃描儀或數碼相機)檢查紙上打印的字符,通過檢測暗、亮的模式確定其形狀,然後用字符識別方法將形狀翻譯成計算機文字的過程;通俗一點將,OCR技術就是識別圖像上的文本字符內容,進而用於分析或其他用途。

 

PaddleOCRSharp簡介

 

PaddleOCR是百度開源的OCR工具庫,基於PaddlePaddle深度學習框架構建,集成了文本檢測、方向分類和文字識別三大核心模塊。其技術架構採用CRNN(卷積循環神經網絡)與DB(Differentiable Binarization)算法的組合,在保持高精度的同時實現高效推理。PaddleOCRSharp是一款C#版的基於百度飛槳OCR進行封裝的文字識別組件,它簡化了PaddleOCR的相關調用,並可以不依賴網絡進行離線識別,並且識別效率和準確率也相當高。

image

 

應用實例

 

首先創建一個WinForm程序,並通過Nuget包管理器安裝PaddleOCRSharp組件,如下所示:

image

説明:PaddleOCRSharp組件運行時,依賴Paddle.Runtime.win_x64組件,否則無法運行,安裝成功後編譯程序,在輸出目錄下可以看到PaddleOCRSharp引用庫,以及模型文件,主要包含以下三種:

  1. inference目錄為離線模型文件夾,存放OCR文字識別所需的模型文件。
  2. Paddle開頭的為OCR識別的依賴庫
  3. 飛槳OCR技術是基於C++開發的,所以需要C++運行環境。

具體如下所示:

image

 

核心代碼

 

PaddleOCRSharp應用非常簡單,只需要幾行代碼即可實現文字識別,主要包含如下內容:

  1. 初始化PaddleOCREngine引擎實例對象,此對象可不必每次識別都初始化,可定義為全局變量,只在軟件啓動時進行初始化,頻繁的初始化可能會導致失敗或其他問題。
  2. 調用實例的DetectText方法即可,此方法接收一個Bitmap類型的圖像實例,並返回一個OCRResult結果。
  3. 遍歷OCRResult的的TextBlocks屬性,即可獲取所有識別的文本。

具體如下所示:

private void PaddleOcr()
{
    OCRModelConfig config = null;
    OCRParameter ocrParameter = new OCRParameter();

    // 初始化引擎
    PaddleOCREngine engine = new PaddleOCREngine(config, ocrParameter);
    Bitmap bmp = new Bitmap(this.txtImageFile.Text);

    // 調用OCR引擎進行識別
    OCRResult ocrResult = engine.DetectText(bmp);

    if (ocrResult != null)
    {
        foreach (var block in ocrResult.TextBlocks)
        {
            //Console.WriteLine($"文字: {block.Text}");
            //Console.WriteLine($"方向: {block.Direction}"); // 輸出文字方向信息
            if (string.IsNullOrEmpty(block.Text))
            {
                continue;
            }
            this.Invoke(() =>
			{
				this.txtInfo.AppendText(block.Text + Environment.NewLine);
			});
        }
    }
}

 

輔助代碼

 

本實例首先讀取用户選擇的圖片,並顯示到頁面上,代碼如下所示:

private void btnOpen_Click(object sender, EventArgs e)
{
    this.txtImageFile.Text = "";
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "圖片PNG|*.png|圖片JPG|*.jpg|圖片JPEG|*.jpeg";
    openFileDialog.Multiselect = false;
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        string imageFile = openFileDialog.FileName;
        using (Stream fs = new FileStream(imageFile, FileMode.Open))
        {
            Image image = Image.FromStream(fs);
            this.pbImg.Image = image;
        }
        this.txtImageFile.Text = imageFile;
    }
}

圖像識別,調用上述封裝好的PaddleOcr方法,由於PaddleOCR識別時間比較長,避免造成頁面卡頓,採用後台線程處理,並通過IProgress接口更新識別狀態,如下所示:

private void btnRecognize_Click(object sender, EventArgs e)
{
	if (string.IsNullOrEmpty(txtImageFile.Text) || !File.Exists(txtImageFile.Text))
	{
		MessageBox.Show("請選擇需要識別的圖片");
		return;
	} 
	this.txtInfo.Clear();
	Task task = Task.Run(() =>
	{
		this.progress.Report(true);
		PaddleOcr();
		this.progress.Report(false);
	});
}

 IProgress接口用於更新UI上識別進度,如下所示:

private IProgress<bool> progress;

private void FrmMain_Load(object sender, EventArgs e)
{
	this.progress = new Progress<bool>(UpdteProgressStatus);
}

private void UpdteProgressStatus(bool running)
{
	this.Invoke(() =>
	{
		if (running)
		{
			this.lblStatus.Text = "進行中";
			this.pbRecognizeStatus.Visible = true;
			this.lblStatus.ForeColor = Color.Red;
		}
		else
		{
			this.lblStatus.Text = "完成";
			this.pbRecognizeStatus.Visible = false;
			this.lblStatus.ForeColor = Color.Green;
		}
	});
}

 

OCR識別效果

 

上述代碼運行後實例,網上找了一張身份證示例圖片,識別結果如下:

image

 

進一步思考

 

在實際應用中,受限於圖像的清晰度,顏色,大小或其他干擾因素,只靠OCR識別並一定能準確完整的識別出其中的文本,此時可能需要結合其他的計算機視覺開發技術,如灰度,二值化等去噪技術進行預處理,才能提升識別的精確度。

以上就是《推薦一款基於.NET和百度飛槳的OCR識別組件》的全部內容,旨在拋磚引玉,一起學習,共同進步。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.