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


字符驗證碼殺手--CNN

1 abstract 

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

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

2 驗證碼概述

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

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

因為現在新的形式的驗證產品很多,光從外界的展現形式上就有:

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

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

  

3 驗證碼場景

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

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

這些主要的應用場景包括:注冊,登錄,找回密碼,搶購下單,評論,投票等等。如果這個地方不安全的話,也就是說能夠通過程序做自動化,那么網絡上的資源就會全部被自動化程序搶奪過去,或者說直接落入少數會做自動化的人的手中。為什么呢?因為普通計算機程序的計算能力是人的幾萬甚至幾百萬倍。

如果還不能理解,我說一個簡單的例子吧,如果你自己去注冊你的帳號密碼需要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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM