[應用] OCR 光學字元辨識的開發 (以百度 Paddle Inference 推理模型為核心)

        OCR 圖形轉文字的識別技術也是架構在深度學習的理論之上,是人工智慧的應用之一。OCR 技術的辨識過程分成三部分:文本偵測文本識別文字分類,每一部分都用到神經網路模型來訓練。本文不打算講模型訓練的過程,而是介紹訓練後的網路模型如何部署到應用端,在 Windows 上的 OCR 軟體如何開發。就核心基礎來說,神經網路的模型是基於百度的 PaddleOCR 所訓練得來,它在 Github 上有開放原始碼,除了用百度內建的模型之外,也可以自建模型來訓練。訓練後的模型,百度提供一套推理模型部署的方法,根據其技術文件的步驟操作,我們可以在 Windows 環境下編譯出 OCR 的應用程式,不過文件操作內容多半還是以 Linux 環境為主。底下我把在 Windows 的編譯過程寫下來。

代碼函數庫下載

        (1) OpenCV:到官網上面下載 Windows 版本,裡面包含程式碼和編譯後的函數庫。
        (2) PaddleOCR 原始碼:到 Github 上面下載,至少 v2.5 版本以上的代碼。
        (3) Paddle Inference 推理預測庫:這是模型的函數庫,可在百度官網下載 https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#windows,裡面分CPU 和 GPU (CUDA) 的版本,本文是下載 CPU 版本進行編譯。
        (4) 模型架構:OCR 需要下載三個模型架構,分別是偵測辨識和分類。在 Github 上面可以下載各種模型架構,https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/models_list.md
將上述的資料準備好後,如下圖所示,依序放到資料夾裡。接著,我們用 Visual Studio 2019 來開始編譯 OCR 應用程式。
圖一:開發前需要準備的資料庫

        編譯前,先確定 VS2019 有沒有安裝 CMake 元件,系統還要安裝 Git for Windows,沒有 Git 的話,在執行 CMake 過程會出錯。一切就緒後,上圖的目錄中\Paddle\PaddleOCR-2.5.0\deploy\cpp_infer 有一個 CMakeLists.txt 檔案,從 VS2019 IDE 環境下開啟這個 CMake 檔案,會出現如下圖二所示。點選步驟一的 CMake 設定後,便會產生出步驟二的設定檔,然後出現下圖三的配置畫面。
圖二:執行 CMake 檔案

        設定檔方面有幾點要注意,編譯模式是 Release 或 Debug,如果打算一步步除錯檢視程式碼的話,底下的欄位要選擇 RelWithDebInfo,這樣編譯後會產出 .pdb 檔。再來,三個函數庫的目錄定義要設定(下圖黃框標示),把 OpenCV 函數庫和 Paddle Inference 推理預測庫的目錄填好。最後,就是把 CMake 產生器選好,儲存這個配置檔案後,CMake 便自動開始產出編譯的 makefile,我們再執行 VS2019 選單上面 build 建置這個 ppocr 項目,看看編譯過程有沒有錯誤?成功後會產出 ppocr.exe 執行檔。

圖三:CMakeLists 的設定

執行 OCR

        當編譯產出 ppocr.exe 之後,我們在 CMD-line 運行看看,應該會彈出錯誤視窗說缺少甚麼 DLL,這是因為 CMake 沒有把 Paddle Inference 第三方支援的函數庫複製過來。將 paddle_inference.dllpaddle2onnx.dllonnxruntime.dll 放到與執行檔同一目錄,再執行看看。另外,試著從 VS 2019 IDE 設置斷點,如上圖二,看看能否除錯的方式運行 ppocr,這對我們熟悉程式碼有幫助。

        OCR 它有不少參數可以設定,試著輸入 "ppocr --help" 會列出所有參數的簡單說明。 底下指令是執行 OCR 完整的指令輸入,如一開始提到的分成三部分:檢測辨識分類,分別給定推理預測的模型架構,執行後就能看到結果。
ppocr --det_model_dir=D:\Paddle\ch_PP-OCRv3_det_infer --rec_model_dir=D:\Paddle\ch_PP-OCRv3_rec_infer --cls_model_dir=D:\Paddle\ch_ppocr_mobile_v2.0_cls_infer --image_dir=D:\yijen\source\repos\python\ppocr_img\imgs\12.jpg --rec_char_dict_path=.\ppocr_keys_v1.txt --use_angle_cls=true --det=true --rec=true --cls=true


以上述為例,程式會將檢測到圖片上的文本框出來,如上圖所示,左邊是原圖,右邊是檢測後的圖。
圖四:執行 OCR 的結果

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸

[應用] 藍芽 BLE client/server 架構:BLE remote controller