一次簡單的驗證碼識別以及思考

Tony沈哲發表於2018-02-15

驗證碼

驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分使用者是計算機還是人的公共全自動程式。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊使用者用特定程式暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。這個問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答CAPTCHA的問題,所以回答出問題的使用者就可以被認為是人類。

驗證碼通常用於網站的登入,以區分是否是人類的行為還是機器的行為。啟用驗證碼是反爬蟲、反黑客的常用手段之一。然而,隨著技術的不斷進步,特別是machine learning的發展,普通的驗證碼識別也不是很複雜的事情。

識別驗證碼的架構

在搭建識別驗證碼服務之前需要完成兩件事情。 1)使用現有的爬蟲採集好圖片驗證碼,並標註好這些圖片。這裡,我使用自己開發的圖片爬蟲程式PicCrawler。所謂標註,就是用肉眼去正確地識別出圖片中的數字和字母,然後用這些數字和字母作為圖片的名字。

2)使用tensorflow來訓練這些驗證碼生成模型,每一批的驗證碼至少幾千起。這樣,訓練好的模型可以通過tensorflow的api來載入。

做完這些事情之後,需要考慮使用怎樣的方式整合到現有的框架中。

  • 最初的架構

    最初的架構.png
    最初考慮使用OpenCV來載入模型,因為OpenCV有Java的API。然後Vert.x跟OpenCV進行互動。在這個架構中有線上的模型和離線的模型,線上的模型是生產環境中使用的模型。每次訓練好的離線模型可以替換線上的模型。但是OpenCV載入模型時遇到了問題,於是嘗試另一種辦法。

  • 後來的嘗試

    後來的嘗試.png

用tensorflow java api替換OpenCV來載入模型,這種方式也遇到了問題,不得不使用最後的方式。

  • 最終的架構
    最終的架構.png

使用python的web框架flask以及tensorflow python api來載入模型。在這個架構中,需要Vert.x呼叫flask暴露的介面,最後將識別的結果返回。

目標驗證碼.jpeg

驗證碼識別的演示.jpeg

最終,介面返回的資料跟圖片中驗證碼的內容一致。算是完成了一次驗證碼的識別。

思考

目前,只能識別1、2種驗證碼,未來會將多種驗證碼進行打標籤,然後訓練到一個模型中。

驗證碼的功能打算整合到爬蟲框架NetDiscovery中,成為它的一個元件。由於爬蟲框架是開源的,所以大家都可以免費使用這個模組。

驗證碼模組的架構,也爭取使用熟悉的Java來替換python。

相關文章