Tesseract:识别知乎网站登录验证码
機器視覺
從?Google?的無人駕駛汽車到可以識別假鈔的自動售賣機,機器視覺一直都是一個應用廣?泛且具有深遠的影響和雄偉的愿景的領域。
我們將重點介紹機器視覺的一個分支:文字識別,介紹如何用一些?Python庫來識別和使用在線圖片中的文字。
我們可以很輕松的閱讀圖片里的文字,但是機器閱讀這些圖片就會非常困難,利用這種人類用戶可以正常讀取但是大多數機器人都沒法讀取的圖片,驗證碼?(CAPTCHA)就出現了。驗證碼讀取的難易程度也大不相同,有些驗證碼比其他的更加難讀。
將圖像翻譯成文字一般被稱為光學文字識別(Optical?Character?Recognition,?OCR)。可以實現OCR的底層庫并不多,目前很多庫都是使用共同的幾個底層?OCR?庫,或者是在上面?進行定制。
?
ORC庫概述
在讀取和處理圖像、圖像相關的機器學習以及創建圖像等任務中,Python?一直都是非常出色的語言。雖然有很多庫可以進行圖像處理,但在這里我們只重點介紹:Tesseract
?
Tesseract
Tesseract?是一個?OCR?庫,目前由?Google?贊助(Google?也是一家以?OCR?和機器學習技術聞名于世的公司)。Tesseract?是目前公認最優秀、最精確的開源?OCR?系統。?除了極高的精確度,Tesseract?也具有很高的靈活性。它可以通過訓練識別出任何字體,也可以識別出任何?Unicode?字符。
安裝Tesseract
Windows?系統
下載可執行安裝文件https://code.google.com/p/tesseract-ocr/downloads/list安裝。
Linux?系統
可以通過?apt-get?安裝:?$sudo?apt-get?tesseract-ocr
Mac?OS?X系統
用?Homebrew(http://brew.sh/)等第三方庫可以很方便地安裝?brew?install?tesseract
要使用?Tesseract?的功能,比如后面的示例中訓練程序識別字母,要先在系統中設置一?個新的環境變量?$TESSDATA_PREFIX,讓?Tesseract?知道訓練的數據文件存儲在哪里,然后搞一份tessdata數據文件,放到Tesseract目錄下。
在大多數?Linux?系統和?Mac?OS?X?系統上,你可以這么設置:
?$export?TESSDATA_PREFIX=/usr/local/share/Tesseract
在?Windows?系統上也類似,你可以通過下面這行命令設置環境變量:
?#setx?TESSDATA_PREFIX?C:\Program?Files\Tesseract?OCR\Tesseract
安裝pytesseract
Tesseract?是一個?Python?的命令行工具,不是通過?import?語句導入的庫。安裝之后,要用?tesseract?命令在?Python?的外面運行,但我們可以通過?pip?安裝支持Python?版本的?Tesseract庫:
pip?install?pytesseract
?
Tesseract處理給規范的文字
你要處理的大多數文字都是比較干凈、格式規范的。格式規范的文字通常可以滿足一些需求,不過究竟什么是“格式混亂”,什么算“格式規范”,確實因人而異。?通常,格式規范的文字
具有以下特點:
?
- 使用一個標準字體(不包含手寫體、草書,或者十分“花哨的”字體)???雖然被復印或拍照,字體還是很清晰,沒有多余的痕跡或污點
- 排列整齊,沒有歪歪斜斜的字
- 沒有超出圖片范圍,也沒有殘缺不全,或緊緊貼在圖片的邊緣
- 文字的一些格式問題在圖片預處理時可以進行解決。例如,可以把圖片轉換成灰度圖,調?整亮度和對比度,還可以根據需要進行裁剪和旋轉(詳情請關注圖像與信號處理),但是,這些做法在進行更具擴展性的?訓練時會遇到一些限制。
?
格式規范文字的理想示例
?
?
代碼實現
import pytesseract from PIL import Imageimage = Image.open('test.jpg') text = pytesseract.image_to_string(image) print text?
運行結果:
This is some text, written in Arial, that will be read by Tesseract. Here are some symbols: !@#$%"&*()?
?
Tesseract對模糊圖片進行閾值過濾和降噪處理
?
很多時候我們在網上會看到這樣的圖片:
Tesseract?不能完整處理這個圖片,主要是因為圖片背景色是漸變的,最終結果是這樣:
?
隨著背景色從左到右不斷加深,文字變得越來越難以識別,Tesseract?識別出的?每一行的最后幾個字符都是錯的。
遇到這類問題,可以先用?Python?腳本對圖片進行清理。利用?Pillow?庫,我們可以創建一個?閾值過濾器來去掉漸變的背景色,只把文字留下來,從而讓圖片更加清晰,便于?Tesseract?讀取:
?
代碼實現
from PIL import Image import subprocessdef cleanFile(filePath, newFilePath): image = Image.open(filePath)# 對圖片進行閾值過濾,然后保存image = image.point(lambda x: 0 if x<143 else 255) image.save(newFilePath)# 調用系統的tesseract命令對圖片進行OCR識別 subprocess.call(["tesseract", newFilePath, "output"])# 打開文件讀取結果file = open("output.txt", 'r') print(file.read()) file.close()cleanFile("text2.jpg", "text2clean.png")?
運行結果:
通過一個閾值對前面的“模糊”圖片進行過濾的結果
除了一些標點符號不太清晰或丟失了,大部分文字都被讀出來了。Tesseract?給出了最好的?結果:
對知乎網驗證碼進行處理:
許多流行的內容管理系統即使加了驗證碼模塊,其眾所周知的注冊頁面也經常會遭到網絡?機器人的垃圾注冊。
那么,這些網絡機器人究,竟是怎么做的呢?既然我們已經,可以成功地識別出保存在電腦上?的驗證碼了,那么如何才能實現一個全能的網絡機器人呢?
大多數網站生成的驗證碼圖片都具有以下屬性。
?
- 它們是服務器端的程序動態生成的圖片。驗證碼圖片的?src?屬性可能和普通圖片不太一?樣,比如?<img?src="WebForm.aspx?id=8AP85CQKE9TJ">,但是可以和其他圖片一樣進行?下載和處理。
- 圖片的答案存儲在服務器端的數據庫里。
- 很多驗證碼都有時間限制,如果你太長時間沒解決就會失效。
- 常用的處理方法就是,首先把驗證碼圖片下載到硬盤里,清理干凈,然后用?Tesseract?處理?圖片,最后返回符合網站要求的識別結果。
?
值得注意的是,有兩種異常情況會導致這個程序運行失敗。第一種情況是,如果?Tesseract?從驗證碼圖片中識別的結果不是四個字符(因為訓練樣本中驗證碼的所有有效答案都必須?是四個字符),結果不會被提交,程序失敗。第二種情況是雖然識別的結果是四個字符,?被提交到了表單,但是服務器對結果不認可,程序仍然失敗。
在實際運行過程中,第一種?情況發生的可能性大約為?50%,發生時程序不會向表單提交,程序直接結束并提示驗證碼?識別錯誤。第二種異常情況發生的概率約為?20%,四個字符都對的概率約是?30%(每個字?母的識別正確率大約是?80%,如果是五個字符都識別,正確的總概率是?32.8%)。
總結
以上是生活随笔為你收集整理的Tesseract:识别知乎网站登录验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用mybatis的intercepto
- 下一篇: 数据分析的六大黄金法则