0
本文作者: skura | 2019-12-25 14:20 |
在本文中,你將學(xué)習(xí)如何在深度學(xué)習(xí)的幫助下制作自己自定義的 OCR 來讀取圖像中的文字內(nèi)容。我將通過 PAN-Card 圖像的示例,帶你學(xué)習(xí)如何進(jìn)行文本檢測和文本識別。但首先,讓我們熟悉一下光學(xué)字符識別的過程。
什么是 OCR?
OCR 指的是光學(xué)字符識別。它用于從掃描的文檔或圖片中讀取文本。這項技術(shù)被用來將幾乎任何一種包含書面文本(手寫或者機(jī)器寫的字)的圖像轉(zhuǎn)換成機(jī)器可讀的文本數(shù)據(jù)。
在這里,我們將構(gòu)建一個 OCR,它只讀取您你望它從給定文檔中讀取的信息。
OCR 有兩個主要模塊:
文本檢測
文本識別
文本檢測
我們的第一個任務(wù)是從圖像/文檔中檢測所需的文本。通常,根據(jù)需要,你不想閱讀整個文檔,而只想閱讀一條信息,如信用卡號、Aadhaar/PAN 卡號、姓名、賬單金額和日期等。檢測所需文本是一項艱巨的任務(wù),但由于深度學(xué)習(xí),我們將能夠有選擇地從圖像中讀取文本。
文本檢測或一般的目標(biāo)檢測是隨著深度學(xué)習(xí)而加速的一個密集研究領(lǐng)域。今天,文本檢測可以通過兩種方法來實現(xiàn)。
基于區(qū)域的檢測器
單點檢測器
在基于區(qū)域的方法中,第一個目標(biāo)是找到所有有對象的區(qū)域,然后將這些區(qū)域傳遞給分類器,分類器為我們提供所需對象的位置。所以,這是個過程分為 2 步。
首先,它找到邊界框,然后找到它的類。這種方法更準(zhǔn)確,但與單點檢測方法相比速度相對較慢。Faster R-CNN 和 R-FCN 等算法采用這種方法。
然而,單點檢測器同時預(yù)測邊界盒和類。作為一個單步過程,它要快得多。然而,必須注意的是,單點檢測器在檢測較小物體時表現(xiàn)不佳。SSD 和 YOLO 就是單點檢測器。
在選擇目標(biāo)檢測器時,通常會在速度和精度之間進(jìn)行權(quán)衡。例如,速度更快的 R-CNN 具有最高的準(zhǔn)確性,而 YOLO 則是最快的。這是一篇很好的文章,它比較了不同的檢測器,并對它們的工作原理提供了全面的見解。
決定使用哪一個,完全取決于你的訴求。在這里,我們使用 YOLOv3 主要是因為:
在速度方面誰也比不上它
對我們的應(yīng)用來說有足夠的準(zhǔn)確性
YOLOv3 具有特征金字塔網(wǎng)絡(luò)(FPN)以更好地檢測小目標(biāo)
說得夠多了,讓我們深入了解 YOLO。
使用 YOLO 進(jìn)行文本檢測
YOLO 是一個最先進(jìn)的實時目標(biāo)檢測網(wǎng)絡(luò),有很多版本,YOLOv3 是最新、最快的版本。
YOLOv3 使用 Darknet-53 作為特征提取程序。它總共有 53 個卷積層,因此被命名為「Darknet-53」。它有連續(xù)的 3×3 和 1×1 卷積層,并有一些短連接。
為了分類,獨立的邏輯分類器與二元交叉熵?fù)p失函數(shù)一起使用。
使用 Darknet 框架訓(xùn)練 YOLO
我們將使用 Darknet 神經(jīng)網(wǎng)絡(luò)框架進(jìn)行訓(xùn)練和測試。該框架采用多尺度訓(xùn)練、大量數(shù)據(jù)擴(kuò)充和批量規(guī)范化。它是一個用 C 和 CUDA 編寫的開源神經(jīng)網(wǎng)絡(luò)框架。它速度快,易于安裝,支持 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
我們開始吧~
首先獲取數(shù)據(jù)
在任何基于機(jī)器學(xué)習(xí)的項目中,數(shù)據(jù)都是第一步也是最重要的。所以,無論你的應(yīng)用程序是什么,確保你有大約 100 個圖像。如果你的圖像數(shù)量較少,則使用圖像增強(qiáng)來增加數(shù)據(jù)的大小。在圖像增強(qiáng)中,我們主要通過改變圖像的大小、方向、光線、顏色等來改變圖像。
有許多方法可用于增強(qiáng),你可以很容易地選擇任何你喜歡的方法。我想提到一個名為 Albumentations 的圖像增強(qiáng)庫,它是由 Kaggle Masters 和 Grandmaster 構(gòu)建的。
我收集了 50 互聯(lián)網(wǎng)上的 PAN 卡圖像,利用圖像增強(qiáng)技術(shù),創(chuàng)建了一個包含 100 張 PAN 卡圖像的數(shù)據(jù)集。
數(shù)據(jù)標(biāo)注
一旦我們收集了數(shù)據(jù),我們就進(jìn)入下一步,即標(biāo)記它。有許多可用的免費數(shù)據(jù)注釋工具。我使用 VoTT v1 ,因為它是一個簡單的工具,工作起來很方便。按照此鏈接,了解數(shù)據(jù)標(biāo)注的過程。
請注意,標(biāo)記要從圖像數(shù)據(jù)中讀取的所有文本字段非常重要。它還生成訓(xùn)練期間所需的數(shù)據(jù)文件夾。
標(biāo)記后,請確保將導(dǎo)出格式設(shè)置為 YOLO。標(biāo)注后,將所有生成的文件復(fù)制到存儲庫的數(shù)據(jù)文件夾中。
訓(xùn)練
為了消除所有的困惑,Darknet 有兩個存儲庫,一個是原作者的,另一個是分支。我們使用分支存儲庫,它的文檔很好。
要開始訓(xùn)練 OCR,首先需要修改配置文件。你將在名為「yolov3.cfg」的「cfg」文件夾中獲得所需的配置文件。在這里,你需要更改批大小、細(xì)分、類數(shù)和篩選器參數(shù)。按照文檔中給出的配置文件中所需的更改進(jìn)行操作。
我們將開始訓(xùn)練,預(yù)先訓(xùn)練 darknet-53,這將有助于我們的模型早日收斂。
用這個命令開始訓(xùn)練:
./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74
最好的是它有多個 GPU 支持。當(dāng)你看到平均損失'0.xxxxxx avg'在一定次數(shù)的迭代后不再減少時,你應(yīng)該停止訓(xùn)練。正如你在下面的圖表中看到的,當(dāng)損失變?yōu)槌?shù)時,我停止了 14200 次迭代。
損失曲線
從上一個權(quán)重文件中獲得最佳結(jié)果并不總是這樣。我在第 8000 次迭代中得到了最好的結(jié)果。你需要根據(jù) mAP(平均精度)得分對它們進(jìn)行評估。選擇具有最高分?jǐn)?shù)的權(quán)重文件。所以現(xiàn)在,當(dāng)你在一個樣本圖像上運行這個檢測器時,你將得到檢測到的文本字段的邊界框,從中你可以很容易地裁剪該區(qū)域。
虛擬 PAN 卡上的文本檢測
文本識別
現(xiàn)在我們已經(jīng)實現(xiàn)了用于文本檢測的自定義文本檢測器,接下來我們將繼續(xù)進(jìn)行文本識別。你可以構(gòu)建自己的文本識別器,也可以使用開源的文本識別器。
雖然,實現(xiàn)自己的文本識別器是一個很好的實踐,但是獲取標(biāo)簽數(shù)據(jù)是一個挑戰(zhàn)。但是,如果你已經(jīng)有很多標(biāo)簽數(shù)據(jù)來創(chuàng)建自定義文本識別器,那么它的準(zhǔn)確性可能會提高。
然而,在本文中,我們將使用 Tesseract OCR 引擎進(jìn)行文本識別。只要稍加調(diào)整,Tesseract OCR 引擎就可以為我們的應(yīng)用程序創(chuàng)造奇跡。我們將使用 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
組合在一起
一旦我們實現(xiàn)了文本檢測和文本識別的過程,就應(yīng)該將它們結(jié)合起來,以實現(xiàn)以下流程:
從圖像中檢測請求的區(qū)域
把檢測到的區(qū)域傳給 Tesseract
將 Tesseract 的結(jié)果存儲為所需的格式
從上面的圖中,你可以了解到,首先 PAN 卡的圖像被傳遞到 YOLO 中。然后,YOLO 檢測到所需的文本區(qū)域并從圖像中裁剪出來。稍后,我們將這些區(qū)域逐一傳遞給 Tesseract。Tesseract 讀取它們之后,我們存儲這些信息。
現(xiàn)在,你可以選擇任何形式的來表示結(jié)果。在這里,我使用 excel 表格來顯示結(jié)果。
我已經(jīng)開放了整個管道。復(fù)制存儲庫并將數(shù)據(jù)文件夾和訓(xùn)練后生成的權(quán)重文件移動到此存儲庫目錄。你需要通過以下命令在此處安裝 darknet。
bash ./darknet.sh
現(xiàn)在用這個命令運行你的 OCR:
pan.py -d -t
祝賀你!現(xiàn)在你可以在輸出文件夾中以 CSV 文件的形式看到 OCR 結(jié)果。檢測自定義 OCR 時,可能需要更改圖像的大小。為此,請調(diào)整 locate_asset.py 文件中的 basewidth 參數(shù)。
資源
通過本文,我希望你能夠全面了解光學(xué)字符識別中涉及的各個步驟,并在閱讀本文的同時實現(xiàn)自己的 OCR 程序。我鼓勵你在不同的圖像集上嘗試這種方法,并為你的應(yīng)用程序使用不同的檢測器,看看什么樣的方法最有效。
via:https://medium.com/saarthi-ai/how-to-build-your-own-ocr-a5bb91b622ba
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。