在這一章里,重點(diǎn)介紹機(jī)器視覺的一個(gè)分支:文字識(shí)別,介紹如何用一些 Python 庫(kù)來(lái)識(shí)別和使用在線圖片中的文字。
當(dāng)你不想讓自己的文字被網(wǎng)絡(luò)機(jī)器人采集時(shí),把文字做成圖片放在網(wǎng)頁(yè)上是常用的辦法。
利用這種人類用戶可以正常讀取但是大多數(shù)機(jī)器人都沒法讀取的圖片,驗(yàn)證碼 (CAPTCHA) 就出現(xiàn)了。
將圖像翻譯成文字一般被稱為光學(xué)文字識(shí)別(Optical Character Recognition,OCR)??梢詫?shí)現(xiàn) OCR 的底層庫(kù)并不多,目前很多庫(kù)都是使用共同的幾個(gè)底層 OCR 庫(kù),或者是在上面進(jìn)行定制。
11.1 OCR 庫(kù)概述
在讀取和處理圖像、圖像相關(guān)的機(jī)器學(xué)習(xí)以及創(chuàng)建圖像等任務(wù)中,Python 一直都是非常出 色的語(yǔ)言。雖然有很多庫(kù)可以進(jìn)行圖像處理,但在這里我們只重點(diǎn)介紹兩個(gè)庫(kù): Pillow 和 Tesseract。
每個(gè)庫(kù)都可以從它們的網(wǎng)站上下載并安裝,或者用第三方管理器(像 pip)通過(guò) “pillow” 和
“pytesseract”進(jìn)行安裝 。
11.1.1 Pillow
Pillow 可以輕松地導(dǎo)入代碼,并通過(guò)大量的過(guò)濾、修飾甚至像素級(jí)的變換操作處理圖片。
我們可以用 Pillow 完成圖片的預(yù)處理,讓機(jī)器可以更方便地讀取圖片。除了這些簡(jiǎn)單的
事情之外,Pillow 還可以完成許多復(fù)雜的圖像處理工作。更多的信息,請(qǐng)查看 Pillow 文檔。
11.1.2 Tesseract
Tesseract 是一個(gè) OCR 庫(kù),目前由 Google 贊助。Tesseract 是目前公認(rèn)最優(yōu)秀、最精確的開源 OCR 系統(tǒng)。 除了極高的精確度,Tesseract 也具有很高的靈活性。它可以通過(guò)訓(xùn)練識(shí)別出任何字體(只要這些字體的風(fēng)格保持不變就可以),也可以識(shí)別出任何 Unicode 字符。
Tesseract 是一個(gè) Python 的命令行工具,不是通過(guò) import 語(yǔ)句導(dǎo)入的庫(kù)。安裝之后,要用 tesseract 命令在 Python 的外面運(yùn)行。
11.1.3 NumPy
NumPy 是一個(gè)非常強(qiáng)大的庫(kù),具有大量線性代數(shù)以及大規(guī)模科學(xué)計(jì)算的方法。因?yàn)?NumPy 可以用數(shù)學(xué)方法把圖片表示成巨大的像素?cái)?shù)組, 所以它可以流暢地配合 Tesseract 完成任務(wù)。
11.2 處理格式規(guī)范的文字
通常,格式規(guī)范的文字具有以下特點(diǎn):
? 使用一個(gè)標(biāo)準(zhǔn)字體(不包含手寫體、草書,或者十分“花哨的”字體)
? 雖然被復(fù)印或拍照,字體還是很清晰,沒有多余的痕跡或污點(diǎn)
? 排列整齊,沒有歪歪斜斜的字
? 沒有超出圖片范圍,也沒有殘缺不全,或緊緊貼在圖片的邊緣
文字的一些格式問(wèn)題在圖片預(yù)處理時(shí)可以進(jìn)行解決。例如,可以把圖片轉(zhuǎn)換成灰度圖,調(diào) 整亮度和對(duì)比度,還可以根據(jù)需要進(jìn)行裁剪和旋轉(zhuǎn)。
11.3 讀取驗(yàn)證碼與訓(xùn)練 Tesseract
Google 的 reCAPTCHA 難得令人發(fā)指,作為目前最具有安全意識(shí)的流行網(wǎng)站,Google 攔截了多達(dá) 25% 的準(zhǔn)備訪問(wèn)網(wǎng)站的正常人類用戶。
大多數(shù)其他的驗(yàn)證碼都是比較簡(jiǎn)單的。例如,流行的 PHP 內(nèi)容管理系統(tǒng) Drupal 有一個(gè)著名的驗(yàn)證碼模塊,可以生成不同難度的驗(yàn)證碼。
訓(xùn)練 Tesseract
要訓(xùn)練 Tesseract 識(shí)別一種文字,無(wú)論是晦澀難懂的字體還是驗(yàn)證碼,你都需要向 Tesseract 提供每個(gè)字符不同形式的樣本。
提示:建議使用驗(yàn)證碼的真實(shí)結(jié)果給每個(gè)樣本文件命名。這樣可以幫你一次性對(duì)大量的文件進(jìn)行快速檢查——你可以先把圖片調(diào)成縮略圖模式,然后通過(guò)文件名對(duì)比不同的圖片。這樣在后面的步驟中進(jìn)行訓(xùn)練效果的檢查也會(huì)很方便。
準(zhǔn)確地告訴 Tesseract 一張圖片中的每個(gè)字符是什么,以及每個(gè)字符的具體位置。
在線工具 Tesseract OCR Chopper,因?yàn)樗恍枰惭b,也沒有其他依賴,只要有瀏覽器就可以運(yùn)行,而且用法很簡(jiǎn)單:上傳圖片,如果要增加新矩形就單擊“add”按鈕,還可以根據(jù)需要調(diào)整矩形的尺寸,最后把新生成的矩形定位文件復(fù)制到一個(gè)新文件里就可以了。
如果你對(duì) Tesseract 的其他訓(xùn)練方法感興趣,甚至打算建立自己的驗(yàn)證碼訓(xùn)練文件庫(kù),或者想和全世界的 Tesseract 愛好者分享自己對(duì)一種新字體的識(shí)別成果,那么我推薦你仔細(xì)閱讀 Tesseract 的文檔。
11.4 獲取驗(yàn)證碼提交答案
大多數(shù)網(wǎng)站生成的驗(yàn)證碼圖片都具有以下屬性。
? 它們是服務(wù)器端的程序動(dòng)態(tài)生成的圖片。驗(yàn)證碼圖片的 src 屬性可能和普通圖片不太一 樣,比如 <img src="WebForm.aspx?id=8AP85CQKE9TJ">,但是可以和其他圖片一樣進(jìn)行下載和處理。
? 圖片的答案存儲(chǔ)在服務(wù)器端的數(shù)據(jù)庫(kù)里。
? 很多驗(yàn)證碼都有時(shí)間限制,如果你太長(zhǎng)時(shí)間沒解決就會(huì)失效。
常用的處理方法就是,首先把驗(yàn)證碼圖片下載到硬盤里,清理干凈,然后用 Tesseract 處理 圖片,最后返回符合網(wǎng)站要求的識(shí)別結(jié)果。