一次簡單的驗證碼識別以及思考
驗證碼
驗證碼(CAPTCHA)是「Completely Automated Public Turing test to tell Computers and Humans Apart」(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。這個問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認為是人類。
驗證碼通常用於網站的登錄,以區分是否是人類的行為還是機器的行為。啟用驗證碼是反爬蟲、反黑客的常用手段之一。然而,隨著技術的不斷進步,特別是machine learning的發展,普通的驗證碼識別也不是很複雜的事情。
識別驗證碼的架構
在搭建識別驗證碼服務之前需要完成兩件事情。1)使用現有的爬蟲採集好圖片驗證碼,並標註好這些圖片。這裡,我使用自己開發的圖片爬蟲程序PicCrawler(https://github.com/fengzhizi715/PicCrawler)。所謂標註,就是用肉眼去正確地識別出圖片中的數字和字母,然後用這些數字和字母作為圖片的名字。
2)使用tensorflow來訓練這些驗證碼生成模型,每一批的驗證碼至少幾千起。這樣,訓練好的模型可以通過tensorflow的api來載入。
做完這些事情之後,需要考慮使用怎樣的方式整合到現有的框架中。
最初考慮使用OpenCV來載入模型,因為OpenCV有Java的API。然後Vert.x跟OpenCV進行交互。在這個架構中有線上的模型和離線的模型,線上的模型是生產環境中使用的模型。每次訓練好的離線模型可以替換線上的模型。但是OpenCV載入模型時遇到了問題,於是嘗試另一種辦法。
用tensorflow java api替換OpenCV來載入模型,這種方式也遇到了問題,不得不使用最後的方式。
使用python的web框架flask以及tensorflow python api來載入模型。在這個架構中,需要Vert.x調用flask暴露的介面,最後將識別的結果返回。
最終,介面返回的數據跟圖片中驗證碼的內容一致。算是完成了一次驗證碼的識別。
思考
目前,只能識別1、2種驗證碼,未來會將多種驗證碼進行打標籤,然後訓練到一個模型中。
驗證碼的功能打算整合到爬蟲框架NetDiscovery(https://github.com/fengzhizi715/NetDiscovery)中,成為它的一個組件。由於爬蟲框架是開源的,所以大家都可以免費使用這個模塊。
驗證碼模塊的架構,也爭取使用熟悉的Java來替換python。
關注【Java與Android技術棧】


TAG:Java與Android技術棧 |