如何用YOLO+Tesseract實現訂製OCR系統?
- 2019 年 12 月 27 日
- 筆記
來源:AI開發者
在本文中,你將學習如何在深度學習的幫助下製作自己自定義的 OCR 來讀取影像中的文字內容。我將通過 PAN-Card 影像的示例,帶你學習如何進行文本檢測和文本識別。但首先,讓我們熟悉一下光學字元識別的過程。
OCR 指的是光學字元識別。它用於從掃描的文檔或圖片中讀取文本。這項技術被用來將幾乎任何一種包含書面文本(手寫或者機器寫的字)的影像轉換成機器可讀的文本數據。
在這裡,我們將構建一個 OCR,它只讀取您你望它從給定文檔中讀取的資訊。
OCR 有兩個主要模組:
- 文本檢測
- 文本識別
文本檢測
我們的第一個任務是從影像/文檔中檢測所需的文本。通常,根據需要,你不想閱讀整個文檔,而只想閱讀一條資訊,如信用卡號、Aadhaar/PAN 卡號、姓名、賬單金額和日期等。檢測所需文本是一項艱巨的任務,但由於深度學習,我們將能夠有選擇地從影像中讀取文本。
文本檢測或一般的目標檢測是隨著深度學習而加速的一個密集研究領域。今天,文本檢測可以通過兩種方法來實現。
- 基於區域的檢測器
- 單點檢測器
在基於區域的方法中,第一個目標是找到所有有對象的區域,然後將這些區域傳遞給分類器,分類器為我們提供所需對象的位置。所以,這是個過程分為 2 步。
首先,它找到邊界框,然後找到它的類。這種方法更準確,但與單點檢測方法相比速度相對較慢。Faster R-CNN 和 R-FCN 等演算法採用這種方法。
然而,單點檢測器同時預測邊界盒和類。作為一個單步過程,它要快得多。然而,必須注意的是,單點檢測器在檢測較小物體時表現不佳。SSD 和 YOLO 就是單點檢測器。
在選擇目標檢測器時,通常會在速度和精度之間進行權衡。例如,速度更快的 R-CNN 具有最高的準確性,而 YOLO 則是最快的。這裡有一篇很好的文章(https://medium.com/@jonathan_hui/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359),它比較了不同的檢測器,並對它們的工作原理提供了全面的見解。
決定使用哪一個,完全取決於你的訴求。在這裡,我們使用 YOLOv3 主要是因為:
- 在速度方面誰也比不上它
- 對我們的應用來說有足夠的準確性
- YOLOv3 具有特徵金字塔網路(FPN)以更好地檢測小目標
說得夠多了,讓我們深入了解 YOLO。
使用YOLO進行文本檢測

YOLO 是一個最先進的實時目標檢測網路,有很多版本,YOLOv3 是最新、最快的版本。
YOLOv3 使用 Darknet-53 作為特徵提取程式。它總共有 53 個卷積層,因此被命名為「Darknet-53」。它有連續的 3×3 和 1×1 卷積層,並有一些短連接。
為了分類,獨立的邏輯分類器與二元交叉熵損失函數一起使用。
使用Darknet框架訓練YOLO
我們將使用 Darknet 神經網路框架進行訓練和測試。該框架採用多尺度訓練、大量數據擴充和批量規範化。它是一個用 C 和 CUDA 編寫的開源神經網路框架。它速度快,易於安裝,支援 CPU 和 GPU 計算。
你可以在 GitHub 上找到源程式碼:https://github.com/pjreddie/darknet
下面是安裝 Darknet 框架的簡單方法。只有 3 行!(如果要使用 GPU,請在 makefile 中更新 GPU=1 和 CUDNN=1。)
git clone https://github.com/pjreddie/darknet.git cd darknet make
我們開始吧~
首先獲取數據
在任何基於機器學習的項目中,數據都是第一步也是最重要的。所以,無論你的應用程式是什麼,確保你有大約 100 個影像。如果你的影像數量較少,則使用影像增強來增加數據的大小。在影像增強中,我們主要通過改變影像的大小、方向、光線、顏色等來改變影像。
有許多方法可用於增強,你可以很容易地選擇任何你喜歡的方法。我想提到一個名為 Albumentations 的影像增強庫,它是由 Kaggle Masters 和 Grandmaster 構建的。
我收集了 50 互聯網上的 PAN 卡影像,利用影像增強技術,創建了一個包含 100 張 PAN 卡影像的數據集。
數據標註
一旦我們收集了數據,我們就進入下一步,即標記它。有許多可用的免費數據注釋工具。我使用 VoTT v1 ,因為它是一個簡單的工具,工作起來很方便。按照此鏈接(https://github.com/Microsoft/VoTT/tree/v1),了解數據標註的過程。
請注意,標記要從影像數據中讀取的所有文本欄位非常重要。它還生成訓練期間所需的數據文件夾。
標記後,請確保將導出格式設置為 YOLO。標註後,將所有生成的文件複製到存儲庫的數據文件夾中。
訓練
為了消除所有的困惑,Darknet 有兩個存儲庫,一個是原作者的,另一個是分支。我們使用分支存儲庫,它的文檔很好。
要開始訓練 OCR,首先需要修改配置文件。你將在名為「yolov3.cfg」的「cfg」文件夾中獲得所需的配置文件。在這裡,你需要更改批大小、細分、類數和篩選器參數。按照文檔中給出的配置文件中所需的更改進行操作。
我們將開始訓練,預先訓練 darknet-53,這將有助於我們的模型早日收斂。
用這個命令開始訓練:
./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74
最好的是它有多個 GPU 支援。當你看到平均損失'0.xxxxxx avg'在一定次數的迭代後不再減少時,你應該停止訓練。正如你在下面的圖表中看到的,當損失變為常數時,我停止了 14200 次迭代。

損失曲線
從上一個權重文件中獲得最佳結果並不總是這樣。我在第 8000 次迭代中得到了最好的結果。你需要根據 mAP(平均精度)得分對它們進行評估。選擇具有最高分數的權重文件。所以現在,當你在一個樣本影像上運行這個檢測器時,你將得到檢測到的文本欄位的邊界框,從中你可以很容易地裁剪該區域。

虛擬 PAN 卡上的文本檢測
文本識別
現在我們已經實現了用於文本檢測的自定義文本檢測器,接下來我們將繼續進行文本識別。你可以構建自己的文本識別器,也可以使用開源的文本識別器。
雖然,實現自己的文本識別器是一個很好的實踐,但是獲取標籤數據是一個挑戰。但是,如果你已經有很多標籤數據來創建自定義文本識別器,那麼它的準確性可能會提高。
然而,在本文中,我們將使用 Tesseract OCR 引擎進行文本識別。只要稍加調整,Tesseract OCR 引擎就可以為我們的應用程式創造奇蹟。我們將使用 Tesseract 4,這是最新版本。謝天謝地,它還支援多種語言。
安裝Tesseract OCR引擎
它支援 Ubuntu 14.04、16.04、17.04、17.10 版本,對於 Ubuntu 18.04 版本,跳過前兩個命令。
sudo add-apt-repository ppa:alex-p/tesseract-ocr sudo apt-get update sudo apt install tesseract-ocr sudo apt install libtesseract-dev sudo pip install pytesseract
組合在一起
一旦我們實現了文本檢測和文本識別的過程,就應該將它們結合起來,以實現以下流程:
- 從影像中檢測請求的區域
- 把檢測到的區域傳給 Tesseract
- 將 Tesseract 的結果存儲為所需的格式

從上面的圖中,你可以了解到,首先 PAN 卡的影像被傳遞到 YOLO 中。然後,YOLO 檢測到所需的文本區域並從影像中裁剪出來。稍後,我們將這些區域逐一傳遞給 Tesseract。Tesseract 讀取它們之後,我們存儲這些資訊。
現在,你可以選擇任何形式的來表示結果。在這裡,我使用 excel 表格來顯示結果。
我已經開放了整個管道。複製存儲庫並將數據文件夾和訓練後生成的權重文件移動到此存儲庫目錄。你需要通過以下命令在此處安裝 darknet。
bash ./darknet.sh
現在用這個命令運行你的 OCR:
pan.py -d -t
祝賀你!現在你可以在輸出文件夾中以 CSV 文件的形式看到 OCR 結果。檢測自定義 OCR 時,可能需要更改影像的大小。為此,請調整 locate_asset.py 文件中的 basewidth 參數。
資源
- Object detection https://towardsdatascience.com/object-detection-using-deep-learning-approaches-an-end-to-end-theoretical-perspective-4ca27eee8a9a
- Region-based methods https://medium.com/@jonathan_hui/understanding-region-based-fully-convolutional-networks-r-fcn-for-object-detection-828316f07c99
- Single-shot methods https://medium.com/@jonathan_hui/real-time-object-detection-with-yolo-yolov2-28b1b93e2088
- Comparison of various detectors https://medium.com/@jonathan_hui/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359
通過本文,我希望你能夠全面了解光學字元識別中涉及的各個步驟,並在閱讀本文的同時實現自己的 OCR 程式。我鼓勵你在不同的影像集上嘗試這種方法,並為你的應用程式使用不同的檢測器,看看什麼樣的方法最有效。
via:https://medium.com/saarthi-ai/how-to-build-your-own-ocr-a5bb91b622ba