引
最近要倒騰一下文字識(shí)別,直接上手iOS的識(shí)別遇到了一些困難,于是決定先在Mac上做一做,會(huì)比較簡(jiǎn)單。
有一個(gè)經(jīng)常聽(tīng)到的詞匯叫做OCR,OCR是什么呢?Optical Character Recognition,光學(xué)字符識(shí)別,是圖片文字識(shí)別的官方學(xué)術(shù)名稱(chēng)。
要做這么一個(gè)聽(tīng)起來(lái)比較復(fù)雜的事情,如果有現(xiàn)成的開(kāi)源框架那是最好的,如果你大致了解一下,就會(huì)發(fā)現(xiàn)開(kāi)源界Tesseract是用的最多的,也是大多數(shù)接觸這個(gè)領(lǐng)域的人最開(kāi)始拿來(lái)練手的東西。簡(jiǎn)單介紹一下Tesseract的歷史,其最早由HP實(shí)驗(yàn)室在1985年研發(fā),10年后,也就是1995年已經(jīng)是業(yè)內(nèi)最準(zhǔn)確的識(shí)別引擎之一了,但是HP后來(lái)放棄了OCR業(yè)務(wù),不過(guò)好消息是后來(lái)HP決定反正不用,不如開(kāi)源出來(lái),所以2005年,又是10年后,Tesseract開(kāi)源了,并且委托Google進(jìn)行改進(jìn)、優(yōu)化的工作。
所以現(xiàn)在一說(shuō)Tesseract往往看到的都是說(shuō)Google的框架,其實(shí)還有這么一段歷史在其中。
準(zhǔn)備工作
要在Mac下用Tesseract,肯定要進(jìn)行安裝,安裝Tesseract之前,我們需要做一些準(zhǔn)備工作。
Xcode Command Line Tool
首先安裝Xcode Command Line Tool,Command Line Tool是Xcode中的一款工具,從App Store下載Xcode之后,默認(rèn)沒(méi)有安裝Command Line Tool,安裝之后就可以在終端命令行中運(yùn)行一些C程序。
安裝方法很簡(jiǎn)單,打開(kāi)終端輸入:xcode-select --install,會(huì)彈出確認(rèn)窗口:

直接點(diǎn)擊安裝就可以了,一段時(shí)間之后就安裝好了,有進(jìn)度條顯示,十幾分鐘吧。檢查是否安裝成功的方法是再次在終端輸入上述命令,會(huì)提示已經(jīng)安裝過(guò)了,或者在Xcode新建工程,選擇macOS下,會(huì)多出一個(gè)Command Line Tool:

MacPorts
平常我們安裝Mac上的軟件,常用的兩種方式是App Store和dmg,除此之外,還可以用MacPorts來(lái)安裝,它就像apt-get、yum一樣,可以通過(guò)命令行快速安裝一些軟件,很方便,類(lèi)似于我們通過(guò)命令行用cocoapods來(lái)安裝第三方開(kāi)發(fā)庫(kù)。
進(jìn)入MacPorts的官網(wǎng):http://www.macports.org/

下載安裝包后安裝它,可能會(huì)要求重啟mac。
我們主要用來(lái)安裝Tesseract,其他的用法大家可以自己慢慢發(fā)掘。
安裝Tesseract
準(zhǔn)備工作完畢后,就可以安裝Tesseract了。
打開(kāi)終端輸入:sudo port install tesseract
會(huì)要求輸入電腦密碼,mac終端中輸入密碼是看不到的,只管輸入就好。
然后等待它自個(gè)去安裝一大堆依賴(lài)和Tesseract。安裝完后可以檢查一下是否安裝成功,終端輸入tesseract后回車(chē),會(huì)出來(lái)一些信息和一些配置方式,或者輸入tesseract -v,會(huì)顯示安裝的Tesseract版本信息,目前(2017.6.1)MacPorts安裝的Tesseract版本是3.04.01,不過(guò)此時(shí)github上,包括cocoapods上最新的版本已經(jīng)是4.0了 。
這時(shí)候是不是可以跑Tesseract了呢?還不行,因?yàn)門(mén)esseract是一款OCR引擎,要識(shí)別文字,一定要有語(yǔ)言庫(kù),Tesseract能夠識(shí)別100多種語(yǔ)言,語(yǔ)言庫(kù)是比較大的,它不會(huì)一開(kāi)始就都幫你安裝了,需要你按需安裝,它甚至連英語(yǔ)語(yǔ)言包都沒(méi)有默認(rèn)安裝,但是運(yùn)行程序是必須要安裝好英語(yǔ)語(yǔ)言包的,注意,是運(yùn)行程序,不是識(shí)別英語(yǔ),我覺(jué)得這一點(diǎn)特別奇怪,如果你必須要那就直接默認(rèn)自帶啊...所以我們還要安裝語(yǔ)言包。
還是在終端,輸入命令:sudo port install tesseract-<語(yǔ)言包名>,MacPorts支持的語(yǔ)言包名可以在MacPorts tesseract page查看。
注意上面命令中的尖括號(hào)并不需要輸入,如果你在命令行中包括了尖括號(hào),會(huì)顯示:
-bash: syntax error near unexpected token `newline'
尖括號(hào)是命令行命令的一種習(xí)慣表示方法,表示這里要被替換掉。比如我們?cè)诰W(wǎng)頁(yè)中找到英語(yǔ)語(yǔ)言包的名稱(chēng):

那實(shí)際上我們需要輸入的命令是:sudo port install tesseract-eng
順便我們可以把中文語(yǔ)言包也給裝了,簡(jiǎn)體中文的名稱(chēng)是"chi_sim",所以命令是:sudo port install tesseract-chi_sim
至此,Tesseract安裝完畢,可以開(kāi)始體驗(yàn)神奇了。
使用Tesseract
使用Tesseract同樣是通過(guò)命令行的方式。先準(zhǔn)備一張圖片,然后通過(guò)命令行進(jìn)入該圖片存放的位置(用cd命令)。
Tesseract的命令格式為:
tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]
其中有幾個(gè)參數(shù):
imagename是你要識(shí)別的圖片的名字,不需要打引號(hào),直接輸入即可。
outputbase是輸出結(jié)果文件的名字,不需要文件類(lèi)型后綴,就是txt,這個(gè)參數(shù)就是txt的文件名。
lang是要用的語(yǔ)言代碼,默認(rèn)是英語(yǔ),如果你要識(shí)別中文,就寫(xiě) -l chi_sim,如果你要中英都識(shí)別,用 + 號(hào)把語(yǔ)言代碼連起來(lái):-l chi_sim+eng。
pagesegmode是用來(lái)識(shí)別的模式,之前輸入tesseract命令時(shí)應(yīng)該也看到了,包含這些模式:
- 0 = Orientation and script detection (OSD) only.
- 1 = Automatic page segmentation with OSD.
- 2 = Automatic page segmentation, but no OSD, or OCR
- 3 = Fully automatic page segmentation, but no OSD. (Default)
- 4 = Assume a single column of text of variable sizes.
- 5 = Assume a single uniform block of vertically aligned text.
- 6 = Assume a single uniform block of text.
- 7 = Treat the image as a single text line.
- 8 = Treat the image as a single word.
- 9 = Treat the image as a single word in a circle.
- 10 = Treat the image as a single character.
現(xiàn)在可以開(kāi)始演練了。
準(zhǔn)備一張英文圖片,比如:

放在下載目錄,命令行 cd Downloads 進(jìn)入下載目錄,然后輸入:
tesseract test.png out
識(shí)別完成后會(huì)在下載目錄多處一個(gè)out.txt的文件,里面包含識(shí)別出的文字:

英文還是比較準(zhǔn)的。
下面我們來(lái)識(shí)別中文,準(zhǔn)備一張中文圖片:

輸入:
tesseract test.png result -l chi_sim
也可以正確識(shí)別出來(lái)(識(shí)別后的文件為result.txt):

驚不驚喜,意不意外。但是,別看這里都識(shí)別出來(lái)了,其實(shí)中文識(shí)別率并不高,越簡(jiǎn)單、間隔越大、字體越大就識(shí)別的越好,如果是:

那么識(shí)別結(jié)果就崩了:

那怎么辦呢,折騰了一圈,結(jié)果識(shí)別出來(lái)是這個(gè)鬼樣子,機(jī)器就是厲害,懂這么多我不認(rèn)識(shí)的字。
Tesseract用來(lái)識(shí)別英語(yǔ)或者類(lèi)似的文字比較厲害,但是識(shí)別漢字這種象形文字就比較差了,不過(guò)還有得救,我們可以訓(xùn)練它,這就是Tesseract訓(xùn)練相關(guān)的知識(shí)了,之后再講。
結(jié)
通過(guò)這篇文章,即使一個(gè)純新手應(yīng)該也可以順利感受到文字識(shí)別的神奇了,但是要想效果更好,路還很長(zhǎng),共同學(xué)習(xí)吧。