目前隨着深度學習,愈來愈蓬勃的發展,在圖像識別和語音識別中也表現出了強大的生產力。對於普通的深度學習愛好者來講,一上來就去跑那邊公開的大型數據庫,好比ImageNet或者CoCo,能夠會以爲這個屠龍之技離生活好遙遠。那麼本文就是但願將此技術運用到一些普通用戶平常就能感知的場景上,讓普通用戶切實可以體會到深度學習工具的非凡能力。程序員
關鍵字:深度學習,驗證碼,破解,識別,CNN算法
不少普通程序員在入門爬蟲的時候,基本上都會遇到的環節---「驗證碼」。就是這個東西使得不少程序的自動化工做止步,讓人懊惱不已。關於驗證碼的功能,之前提到過(todo),本文再也不贅述,只用一句話來歸納下:驗證是一種防止程序自動化的一個措施,其最多見的表現形式就是看圖識別字符。數據庫
驗證碼技術就是一種反自動化技術。本文所解決的問題則是,使用深度學習技術來實現「全自動化的識別驗證碼」(這聽起來有那麼點人工智能的味道了)。編程
由於如今新的形式的驗證產品不少,光從外界的展示形式上就有:安全
可是本文是以學習爲目標,並不指向任何一種驗證形式,而是指向傳統的字符型驗證碼。由淺入深來對驗證碼進行一些科普。下圖就是網絡上的各色各樣的字符型驗證碼,敬請你們賞析:網絡
首先說明本文的觀點:隨着深度學習技術在圖像處理技術上愈來愈強大的表現,這些傳統的純依靠簡單圖片的碼式驗證已經沒有任何的安全性可言。session
可是這些不安全的驗證碼卻即便是在今天寫這篇文章的時候,還存在於互聯網的各個角落,存在於大互聯網公司,基於像銀行,證券和保險等等這些金融領域。app
這些主要的應用場景包括:註冊,登陸,找回密碼,搶購下單,評論,投票等等。若是這個地方不安全的話,也就是說可以經過程序作自動化,那麼網絡上的資源就會所有被自動化程序搶奪過去,或者說直接落入少數會作自動化的人的手中。爲何呢?由於普通計算機程序的計算能力是人的幾萬甚至幾百萬倍。框架
若是還不能理解,我說一個簡單的例子吧,若是你本身去註冊你的賬號密碼須要3分鐘完成,可是經過程序能夠一秒鐘註冊300個帳號。講到這個地方,若是你還不理解,那麼你想象在去年的時候互聯網金融行業很是火爆時,每註冊一個帳號就有20塊錢能夠拿。也就是說比較厲害的人能夠經過這個程序,一秒鐘賺6000塊錢。機器學習
若是你還不能理解這個東西的話,再舉一些和你們平常生活中很是相關度高的一個場景:
相似的事情特別特別多。這個產業就叫作「薅羊毛」,顧名思義就是聚沙成塔,有很小的成本把一點點的小的利益彙集起來就會變成一個比較可觀的利益。
https://www.cndns.com/members/signin.aspx
http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi®Page=163
https://passport.58.com/validcode/get?vcodekey=d5S2Tk7dofqN30VwIN6WTwvOHP6AkyvC&time=1466065243496
https://www.pingan.com.cn/pinganone/pa/index.screen?sid_source=toagw
https://www.creditease.cn/a/user/loadRegisterUserPage
http://www.95590.cn/ebiz/loginSkin.jsp?loginBackUrl=http://www.95590.cn/
下面是字符驗證碼兩種比較極端的表現形式:
簡單類型的特色:
複雜類型的特色:
在上一部份內容中舉的如今線上應用的例子,基本上屬於比較複雜的類型,可是因爲它的設計理念仍然停留在圖像學上,因此對於如今的CNN來講,是徹底沒有技術上的問題,畢竟不少深度學習框架的入門教程就是對手寫數字數據庫MNIST進行識別。它們有的區別只是前期準備工做的工做量的不一樣,這裏所說的前期準備工做就是指:帶標記的數據的準備工做。所謂的「帶標記的數據」是指,須要人預先告訴計算機什麼樣的圖片對應着是什麼樣的字符串,由於本問題中所用的CNN方法是屬於有監督學習的範圍,須要有個場外的「老師」進行指導。
關於上面兩種極端的字符驗證碼的識別的技術方法,請移步文章末尾連接。
裏面有兩個例子,並附上了完整的源碼:
固然後面的那種CNN的方法是對於解決此類問題是屬於核武器級別的,CNN模式的優勢缺點都很明顯:
- 優勢:通用性強,換一個模式後,能夠不用修改代碼就能夠直接訓練出新的模型。
- 缺點:須要大量的帶標註的數據,特別是端到端的複雜一點的,可能須要幾萬帶標記的先驗數據集。
在CNN的文章中給出的demo,由於只是作效果演示,裏面的數據集的生成是直接用的第三方標準庫無限生成的。若是是在具體的場景去使用,則須要準備大量的帶標記數據,像本文提到的困難的字符驗證,若是要達到90%以上的正確識別率,估計須要5萬帶標記數據。下圖是生成的部分先驗數據集:
對於不一樣的多字符驗證碼,根據其難易程度分類,能夠有一些不一樣的處理方式,有「蠻力型」的通用識別方法,也有「特事特辦」的特別識別方法。
所謂的通用識別方法就是:流程化做業,基本不太須要在編程上思考太多。
通用步驟以下:
這實際上是一個深度學習對分類問題處理的標準化流程。有不明白的地方,請補充一點相關的知識:
https://www.tensorflow.org/get_started/mnist/beginners
https://www.tensorflow.org/get_started/mnist/pros
由Google公司主推的深度學習框架tensorflow的入門文檔裏面就介紹了分別用矩陣迴歸和CNN神經網絡對手寫數字識別的方法。
固然,關於如何獲取帶標記的數據,目前也有比較便宜的獲取渠道,直接在網上搜索「打碼平臺」,提供這「人工智能」領域的「人工」服務的廠家也很多,並且是明碼標價:
對於字符型驗證碼,基本上是幾分錢一張標記圖吧。
雖然上面的通用型方法能夠百試不爽,可是每次來一個新的問題,你都要準備大量的帶標記數據,這個未免也太繁瑣了,並且像一些簡單的字符驗證碼的問題,其實倒沒有必要去大動干戈。那麼這個時候就須要一些小的技巧了。
這裏所說的特別識別方法,仍然是基於深度學習這種通用方法來作的,只是咱們能夠將一些複雜問題進行適當的簡化,這個思想有點相似於「降維」處理的意思。
由於深度學習具備這樣的神奇效果:理論上對絕大多數的線性或者非線性問題都能實現很是好的擬合。
可是對於越複雜的問題,對數據的需求量越大。這個現狀是沒法避免的,可是咱們卻可以作一些人爲的自動化工做,以達成此目標。
好比像這些驗證:
無論它們色彩有多麼的變化,無論背後加些啥亂七八糟的干擾點或者線,可是有一個事實他們沒法迴避,就是:他們的字符之間都是很是好分割的。也就是說,像這些類型的驗證碼,能夠很容易將一個原本要斷定N位字符串的問題簡化爲「斷定1位字符,而後將N個這樣的圖片再組合起來」。這樣網絡的複雜度能夠大大的簡化,訓練所須要的樣數量,還有訓練的時長都會大量減小。
若是驗證碼圖片能夠從N維「降維」到1維了,這個字符的字體若是是單一的,好比下面這些驗證:
那麼問題就更簡單了:只須要爲每一個字符分類準備一張圖片便可。也不是說若是你的驗證碼範圍是[0,9],則只須要從下載的圖片集中對0~9這幾個數字每一個標記一張便可,而後就是使用一些普通的數據加強技術:貼圖,綻開,上下自由截取,隨機噪點等等,能夠生成無限多的數據集了,固然這些所有是由程序自動化完成。
好的圖像預處理也很重要,所謂好的圖像預處理,就是指可以將圖像裏面的主體特徵變得更加明顯,例如:
好的圖像預處理會使識別問題難度直線降低,好比上面左圖若是用CNN估計可能要1萬樣本,而右邊的那個通過預處理後,估計只須要1千樣本就OK了。
關於如何作數據加強,在後續的文章中會進行具體介紹。
若是對本話題有興趣請持續關注本系列文章。
若是還想進一步討論相應的技術,請加入QQ羣:592109504
手機QQ掃描二維碼:https://mp.weixin.qq.com/s/7RCtZH0ljuF5Ti6jgQxyww
驗證識別合輯技術文章:https://zhuanlan.zhihu.com/p/30871712
後續會有更多幹貨文章,敬請期待。。。
個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan