本教程翻譯自PyImageSearch英文原文

今天的博客文章是安裝和使用Tesseract library 進(jìn)行OCR識別的兩章系列中的第一部分。
OCR可以自動對手寫或者印刷字體進(jìn)行類型轉(zhuǎn)化為機(jī)器編碼文本字符串,供我們存取和操作。
本系列第一部分將專注于在你的機(jī)器上安裝和配置Tesseract,其次是利用tesseract命令實現(xiàn)對輸入圖片的OCR應(yīng)用。
下一章我們將講述如何通過Python綁定Tesseract庫去實現(xiàn)調(diào)用Tesseract方法。
安裝 Tesseract
Tesseract,最初是由Hewlett Packard在1980年代開發(fā)的,在2005年開源。2006年以后Google開始贊助這個項目。
Tesseract可以處理很多自然語音,英語、葡萄牙語系、意第緒語等。截止到2015年為止支持超過100種書面語言,并且可以通過訓(xùn)練學(xué)習(xí)輕松掌握其他語言。
最初Tesseract是用C語言寫的,在1998年改用C++。Tesseract是無GUI交互的,可以通過命令后被執(zhí)行。但是有一些其他軟件提供GUI對Tesseract進(jìn)行了封裝。
更多Tesseract的介紹可以訪問GitHub或者Wikipedia article。
這篇文章分三部分:
- 安裝Tesseract
- 驗證Tesseract是否正確
- 對輸入圖片進(jìn)行OCR識別
學(xué)習(xí)完這篇文章你將學(xué)會使用Tesseract處理你的圖片。
步驟1: 安裝Tesseract
如果要使用Tesseract庫,首先需要安裝它到你的機(jī)器上。
針對macOS用戶,我們使用Homebrew 去安裝Tesseract:
$ brew install tesseract

如果使用Ubuntu系統(tǒng),使用apt-get 安裝Tesseract。
$ sudo apt-get install tesseract-ocr

對Windows,請參考 Tesseract documentation PyImageSearch不支持或者不推薦使用Windows去開發(fā)。
步驟2: 驗證Tesseract是否安裝成功
執(zhí)行如下命令,可以驗證Tesseract是否安裝成功:
$ tesseract -v
tesseract 3.05.00
leptonica-1.74.1
libjpeg 8d : libpng 1.6.29 : libtiff 4.0.7 : zlib 1.2.8

如果你看到Tesseract的版本和其依賴的庫的版本列表,證明你已經(jīng)安裝成功。
如果你安裝失?。?/p>
-bash: tesseract: command not found
如果看到以上結(jié)果,證明你的機(jī)器沒有安裝Tesseract。請返回到步驟1重寫開始?;蛘吣阈枰履愕腜ATH環(huán)境。
步驟 3: 使用Tesseract對圖片OCR識別
我們將使用干凈的預(yù)處理過的圖片,以便獲取更好的識別結(jié)果。
當(dāng)使用Tesseract時,我建議:
- 盡可能使用高分辨率和高DPI的圖片。
- 應(yīng)用閾值處理從背景中分割文本。
- 確保前景色和背景色可以清晰的分開。(例如:沒有像素化或字符變形)
- 應(yīng)用text skew correction處理輸入圖片確保文字合理的對其。
如果因為如上問題導(dǎo)致的識別偏差,我們將在后續(xù)的章節(jié)中介紹如何處理。
現(xiàn)在,讓我們來實現(xiàn)對圖片的OCR識別吧:

只需要在terminal中使用如下命令即可:
$ tesseract tesseract_inputs/example_01.png stdout
Warning in pixReadMemPng: work-around: writing to a temp file
Testing Tesseract OCR
識別正確! Tesseract 非常正確的識別出, “Testing Tesseract OCR”, 并且在terminal中打印出來。
下面,我們試試另外的圖片:

在Terminal中輸入下面的命令,注意輸入文字名的改變:
$ tesseract tesseract_inputs/example_02.png stdout
Warning in pixReadMemPng: work-around: writing to a temp file
PyImageSearch

成功!Tesseract正確識別出圖片包含的文本“PyImageSearch”。
下面,讓我們嘗試去識別數(shù)字。

這個示例使用命令行只識別數(shù)字:
$ tesseract tesseract_inputs/example_03.png stdout digits
Warning in pixReadMemPng: work-around: writing to a temp file
650 3428
又一次,Tesseract成功識別出我們要識別的字符串(這個例子使純數(shù)字)。
在上面的三個示例中,Tesseract都能成功的識別出我們的圖片。你可以會以為Tesseract可以識別你所有的情況。
但是,我們將要在下個段落列出,Tesseract使用的局限性。
Tesseract的局限性
幾周之前,我正在做的工作是通過OCR識別信用卡上面的16為數(shù)字。
我非常容易的通過python代碼定位四組四位數(shù)的每一組。
以下是4位數(shù)字ROI(region of interest)的示例:

但是,當(dāng)我嘗試使用Tesseract去識別以下圖片的時候,結(jié)果并不理想:

$ tesseract tesseract_inputs/example_04.png stdout digits
Warning in pixReadMemPng: work-around: writing to a temp file
5513
這里看到Tesseract的識別結(jié)果是 5513,但是圖片顯示的數(shù)字是5678。
不幸的是,這是Tesseract限制的最好的一個例子。當(dāng)我們將前景文本和背景區(qū)分開后,文本的像素化特性使Tesseract混淆了。換個說法應(yīng)該使Tesseract并沒有對信用卡的字體進(jìn)行學(xué)習(xí)訓(xùn)練。
Tesseract最適合在構(gòu)建掃描圖像,預(yù)處理圖像的文檔處理管道時,需要應(yīng)用光學(xué)字符識別的情況。
我們應(yīng)該了解Tesseract并不是一個OCR識別的現(xiàn)成的解決方案,不能應(yīng)用所有的圖片。
為了實現(xiàn)這個目標(biāo),我們將需要應(yīng)用特征提取,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)。
一個非常好的學(xué)習(xí)特征提取和機(jī)器學(xué)習(xí)去構(gòu)建手寫字體識別系統(tǒng)的列子可以在我的書中找到。 Practical Python and OpenCV.
本章摘要
今天我們在學(xué)習(xí)Tesseract進(jìn)行OCR識別的教程的第一部分,學(xué)習(xí)到了如何在計算機(jī)上安裝和配置Tesseract。并且我們使用tesseract庫去識別一些圖片示例。
但是,我們發(fā)現(xiàn)除非我們的圖片非常清晰的分離的前景和背景才能被Tesseract很好的識別出結(jié)果。在有"噪點"的圖片情況,我們需要獲取更好的,更精確的訓(xùn)練模型去適應(yīng)這種特別的情況。
對于具有高分辨率輸入的情況,其中前景文本被干凈地從背景中分割的圖片,Tesseract 是最適合的。
下周我們將要學(xué)習(xí)通過Python代碼,更多的與Tesseract交互,請繼續(xù)關(guān)注。