[驗證碼識別技術]字符驗證碼殺手--CNN

字符驗證碼殺手--CNN

1 abstract 

目前隨着深度學習,愈來愈蓬勃的發展,在圖像識別和語音識別中也表現出了強大的生產力。對於普通的深度學習愛好者來講,一上來就去跑那邊公開的大型數據庫,好比ImageNet或者CoCo,能夠會以爲這個屠龍之技離生活好遙遠。那麼本文就是但願將此技術運用到一些普通用戶平常就能感知的場景上,讓普通用戶切實可以體會到深度學習工具的非凡能力。程序員

關鍵字:深度學習,驗證碼,破解,識別,CNN算法

2 驗證碼概述

不少普通程序員在入門爬蟲的時候,基本上都會遇到的環節---「驗證碼」。就是這個東西使得不少程序的自動化工做止步,讓人懊惱不已。關於驗證碼的功能,之前提到過(todo),本文再也不贅述,只用一句話來歸納下:驗證是一種防止程序自動化的一個措施,其最多見的表現形式就是看圖識別字符。數據庫

驗證碼技術就是一種反自動化技術。本文所解決的問題則是,使用深度學習技術來實現「全自動化的識別驗證碼」(這聽起來有那麼點人工智能的味道了)。編程

由於如今新的形式的驗證產品不少,光從外界的展示形式上就有:安全

  1. 完整滑動解鎖式
  2. 隨機滑動拼圖式
  3. 隨機點選漢字式
  4. 圖片分類選擇式
  5. 其它

可是本文是以學習爲目標,並不指向任何一種驗證形式,而是指向傳統的字符型驗證碼。由淺入深來對驗證碼進行一些科普。下圖就是網絡上的各色各樣的字符型驗證碼,敬請你們賞析:網絡

  

3 驗證碼場景

首先說明本文的觀點:隨着深度學習技術在圖像處理技術上愈來愈強大的表現,這些傳統的純依靠簡單圖片的碼式驗證已經沒有任何的安全性可言session

可是這些不安全的驗證碼卻即便是在今天寫這篇文章的時候,還存在於互聯網的各個角落,存在於大互聯網公司,基於像銀行,證券和保險等等這些金融領域。app

這些主要的應用場景包括:註冊,登陸,找回密碼,搶購下單,評論,投票等等。若是這個地方不安全的話,也就是說可以經過程序作自動化,那麼網絡上的資源就會所有被自動化程序搶奪過去,或者說直接落入少數會作自動化的人的手中。爲何呢?由於普通計算機程序的計算能力是人的幾萬甚至幾百萬倍。框架

若是還不能理解,我說一個簡單的例子吧,若是你本身去註冊你的賬號密碼須要3分鐘完成,可是經過程序能夠一秒鐘註冊300個帳號。講到這個地方,若是你還不理解,那麼你想象在去年的時候互聯網金融行業很是火爆時,每註冊一個帳號就有20塊錢能夠拿。也就是說比較厲害的人能夠經過這個程序,一秒鐘賺6000塊錢。機器學習

若是你還不能理解這個東西的話,再舉一些和你們平常生活中很是相關度高的一個場景:

  1. 網上春節購買火車票。春節的時候你們會買火車票吧?你是否是發現你守在電腦面前無論怎麼用心,無論怎麼努力,結果發現放出火車票的時候,那些票一掃而光?而後發現身邊好多人都沒買到票,可是網上黃牛那兒卻票源充足,可是很差意思,得加價。
  2. 網上手機新品發佈秒殺。國內大廠手機新品發佈時,網上瞬間秒光,本身買不到,可是黃牛那兒也有,得加錢。
  3. 網上開盤選房子。你要買房子,網上開盤選房,雖然你已經作好了不看戶型,有房就搶的準備,可是開盤瞬間,你就發現網絡被擠爆,而後等線上網頁緩過來時,房子已經完了。可是身邊加錢找專業人員代搶的人卻搶到了房子,爲何?
  4. 網上拍汽車牌照。在國內某些大城市裏面對於汽車牌照的發放量的把控是是很是嚴格的。每次在網上拍牌照的那天,不少人都會請假一天,而後在一個網絡環境很是好的網吧裏面等待來處理這個事情,可是發現仍是搶不過別人付費請的專業團隊的那些人。固然搶不過有一方面是本身業務不熟悉的緣由,還有一方面就是:可能你在拿一個小鏟子的辛苦的小打小鬧的,別人直接操縱在一個大型挖掘機上戰場了。生產力是徹底不同的。

相似的事情特別特別多。這個產業就叫作「薅羊毛」,顧名思義就是聚沙成塔,有很小的成本把一點點的小的利益彙集起來就會變成一個比較可觀的利益。

4 應用舉例

4.1 互聯網大廠

4.1.1 美橙互聯

https://www.cndns.com/members/signin.aspx

 

4.1.2 中國互聯網絡信息中心

http://www.cnnic.net.cn/

 

4.1.3 百度

https://wappass.baidu.com/

 

4.1.4 阿里支付寶

 https://omeo.alipay.com/service/checkcode?sessionID=a2a5fc056b8e3ef8b32758835333d673&t=0.3144848125469759

  

4.1.5 網易郵箱

http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi&regPage=163

 

4.1.6 58同城

https://passport.58.com/validcode/get?vcodekey=d5S2Tk7dofqN30VwIN6WTwvOHP6AkyvC&time=1466065243496

 

4.2 互聯網金融

4.2.1 平安保險

https://www.pingan.com.cn/pinganone/pa/index.screen?sid_source=toagw

 

 

4.2.2 宜信

https://www.creditease.cn/a/user/loadRegisterUserPage

 

4.2.3 大地保險

http://www.95590.cn/ebiz/loginSkin.jsp?loginBackUrl=http://www.95590.cn/

 

5 圖像識別

下面是字符驗證碼兩種比較極端的表現形式:

   

簡單類型的特色:

  1. 背景和前景能夠很容易徹底分離
  2. 字符的取值範圍僅爲[0,9]這樣的最小有限域
  3. 生成圖片的字符爲單一字體
  4. 多位字符串能夠經過簡單算法進行完美切割

複雜類型的特色:

  1. 背景有隨機干擾點或者干擾線條
  2. 字符範圍爲全部數字,字母,甚至漢字集
  3. 生成的圖片的字體多樣化
  4. 多位字符在圖片上的位置出現重合,沒法完美切割

在上一部份內容中舉的如今線上應用的例子,基本上屬於比較複雜的類型,可是因爲它的設計理念仍然停留在圖像學上,因此對於如今的CNN來講,是徹底沒有技術上的問題,畢竟不少深度學習框架的入門教程就是對手寫數字數據庫MNIST進行識別。它們有的區別只是前期準備工做的工做量的不一樣,這裏所說的前期準備工做就是指:帶標記的數據的準備工做。所謂的「帶標記的數據」是指,須要人預先告訴計算機什麼樣的圖片對應着是什麼樣的字符串,由於本問題中所用的CNN方法是屬於有監督學習的範圍,須要有個場外的「老師」進行指導。

關於上面兩種極端的字符驗證碼的識別的技術方法,請移步文章末尾連接。

裏面有兩個例子,並附上了完整的源碼:

  1. 使用傳統機器學習SVM對簡單驗證碼識別
  2. 使用CNN對多位字符驗證端到端的識別

固然後面的那種CNN的方法是對於解決此類問題是屬於核武器級別的,CNN模式的優勢缺點都很明顯:

-       優勢:通用性強,換一個模式後,能夠不用修改代碼就能夠直接訓練出新的模型。

-       缺點:須要大量的帶標註的數據,特別是端到端的複雜一點的,可能須要幾萬帶標記的先驗數據集。

在CNN的文章中給出的demo,由於只是作效果演示,裏面的數據集的生成是直接用的第三方標準庫無限生成的。若是是在具體的場景去使用,則須要準備大量的帶標記數據,像本文提到的困難的字符驗證,若是要達到90%以上的正確識別率,估計須要5萬帶標記數據。下圖是生成的部分先驗數據集:

對於不一樣的多字符驗證碼,根據其難易程度分類,能夠有一些不一樣的處理方式,有「蠻力型」的通用識別方法,也有「特事特辦」的特別識別方法。

5.1 通用識別方法

所謂的通用識別方法就是:流程化做業,基本不太須要在編程上思考太多。

通用步驟以下:

  1. 下載必定數量的目標驗證碼圖片。根據驗證圖片的複雜程度而定,有的須要幾百張,有的須要幾萬張。
  2. 已經事先準備好一套標準的CNN圖像分類的項目模板,須要事先作好的功課。
  3. 對項目模板進行簡單的參數調整,以適配當前問題的圖片尺寸。
  4. 將圖像輸入CNN,將輸出的結果和先驗標記的類型作偏差對比
  5. 不斷迭代生成模型

這實際上是一個深度學習對分類問題處理的標準化流程。有不明白的地方,請補充一點相關的知識:

https://www.tensorflow.org/get_started/mnist/beginners

https://www.tensorflow.org/get_started/mnist/pros

由Google公司主推的深度學習框架tensorflow的入門文檔裏面就介紹了分別用矩陣迴歸和CNN神經網絡對手寫數字識別的方法。

固然,關於如何獲取帶標記的數據,目前也有比較便宜的獲取渠道,直接在網上搜索「打碼平臺」,提供這「人工智能」領域的「人工」服務的廠家也很多,並且是明碼標價:

對於字符型驗證碼,基本上是幾分錢一張標記圖吧。

5.2 特別識別方法

雖然上面的通用型方法能夠百試不爽,可是每次來一個新的問題,你都要準備大量的帶標記數據,這個未免也太繁瑣了,並且像一些簡單的字符驗證碼的問題,其實倒沒有必要去大動干戈。那麼這個時候就須要一些小的技巧了。

這裏所說的特別識別方法,仍然是基於深度學習這種通用方法來作的,只是咱們能夠將一些複雜問題進行適當的簡化,這個思想有點相似於「降維」處理的意思。

由於深度學習具備這樣的神奇效果:理論上對絕大多數的線性或者非線性問題都能實現很是好的擬合

可是對於越複雜的問題,對數據的需求量越大。這個現狀是沒法避免的,可是咱們卻可以作一些人爲的自動化工做,以達成此目標。

好比像這些驗證:

  

無論它們色彩有多麼的變化,無論背後加些啥亂七八糟的干擾點或者線,可是有一個事實他們沒法迴避,就是:他們的字符之間都是很是好分割的。也就是說,像這些類型的驗證碼,能夠很容易將一個原本要斷定N位字符串的問題簡化爲「斷定1位字符,而後將N個這樣的圖片再組合起來」。這樣網絡的複雜度能夠大大的簡化,訓練所須要的樣數量,還有訓練的時長都會大量減小

若是驗證碼圖片能夠從N維「降維」到1維了,這個字符的字體若是是單一的,好比下面這些驗證:

 

那麼問題就更簡單了:只須要爲每一個字符分類準備一張圖片便可。也不是說若是你的驗證碼範圍是[0,9],則只須要從下載的圖片集中對0~9這幾個數字每一個標記一張便可,而後就是使用一些普通的數據加強技術:貼圖,綻開,上下自由截取,隨機噪點等等,能夠生成無限多的數據集了,固然這些所有是由程序自動化完成。

好的圖像預處理也很重要,所謂好的圖像預處理,就是指可以將圖像裏面的主體特徵變得更加明顯,例如:

好的圖像預處理會使識別問題難度直線降低,好比上面左圖若是用CNN估計可能要1萬樣本,而右邊的那個通過預處理後,估計只須要1千樣本就OK了。

 

關於如何作數據加強,在後續的文章中會進行具體介紹。

6 文末小結

若是對本話題有興趣請持續關注本系列文章。

若是還想進一步討論相應的技術,請加入QQ羣:592109504

手機QQ掃描二維碼https://mp.weixin.qq.com/s/7RCtZH0ljuF5Ti6jgQxyww

驗證識別合輯技術文章:https://zhuanlan.zhihu.com/p/30871712

後續會有更多幹貨文章,敬請期待。。。 

 

 

個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan 

相關文章
相關標籤/搜索