1. 程式人生 > >[驗證碼識別技術]字元驗證碼殺手--CNN

[驗證碼識別技術]字元驗證碼殺手--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 美橙互聯

 

4.1.2 中國網際網路絡資訊中心

 

4.1.3 百度

 

4.1.4 阿里支付寶

  

4.1.5 網易郵箱

 

4.1.6 58同城

 

4.2 網際網路金融

4.2.1 平安保險

 

4.2.2 宜信

 

4.2.3 大地保險

 

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. 不斷迭代生成模型

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

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

當然,關於如何獲取帶標記的資料,目前也有比較便宜的獲取渠道,直接在網上搜索“打碼平臺”,提供這“人工智慧”領域的“人工”服務的廠家也不少,而且是明碼標價:

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

5.2 特別識別方法

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

這裡所說的特別識別方法,仍然是基於深度學習這種通用方法來做的,只是我們可以將一些複雜問題進行適當的簡化,這個思想有點類似於“降維”處理的意思。

因為深度學習具有這樣的神奇效果:理論上對絕大多數的線性或者非線性問題都能實現非常好的擬合

但是對於越複雜的問題,對資料的需求量越大。這個現狀是無法避免的,但是我們卻能夠做一些人為的自動化工作,以達成此目標。

比如像這些驗證:

  

不管它們色彩有多麼的變化,不管背後加些啥亂七八糟的干擾點或者線,但是有一個事實他們無法迴避,就是:他們的字元之間都是非常好分割的。也就是說,像這些型別的驗證碼,可以很容易將一個本來要判定N位字串的問題簡化為“判定1位字元,然後將N個這樣的圖片再組合起來”。這樣網路的複雜度可以大大的簡化,訓練所需要的樣數量,還有訓練的時長都會大量減少

如果驗證碼圖片可以從N維“降維”到1維了,這個字元的字型如果是單一的,比如下面這些驗證:

 

那麼問題就更簡單了:只需要為每個字元分類準備一張圖片即可。也不是說如果你的驗證碼範圍是[0,9],則只需要從下載的圖片集中對0~9這幾個數字每個標記一張即可,然後就是使用一些普通的資料增強技術:貼圖,綻放,上下自由擷取,隨機噪點等等,可以生成無限多的資料集了,當然這些全部是由程式自動化完成。

好的影象預處理也很重要,所謂好的影象預處理,就是指能夠將影象裡面的主體特徵變得更加明顯,例如:

好的影象預處理會使識別問題難度直線下降,比如上面左圖如果用CNN估計可能要1萬樣本,而右邊的那個經過預處理後,估計只需要1千樣本就OK了。

關於如何做資料增強,在後續的文章中會進行具體介紹。

6 文末小結

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

如果還想進一步討論相應的技術,請加入QQ群:592109504

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

我的部落格即將搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan 

相關推薦

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

字元驗證碼殺手--CNN 1 abstract  目前隨著深度學習,越來越蓬勃的發展,在影象識別和語音識別中也表現出了強大的生產力。對於普通的深度學習愛好者來說,一上來就去跑那邊公開的大型資料庫,比如ImageNet或者CoCo,可以會覺得這個屠龍之技離生活好遙遠。那麼本文就是希望將此技術運用到一些普通使

JAVA爬蟲---驗證識別技術(一)

        Python中有專門的影象處理技術比如說PIL,可以對驗證碼一類的圖片進行二值化處理,然後對圖片進行分割,進行畫素點比較得到圖片中的數字。這種方案對驗證碼的處理相對較少,運用相對普遍,很多驗證碼圖片可以通過這個方式得到識別,當然還需要一部分的降

圖形驗證識別技術

阻礙我們爬蟲的。有時候正是在登入或者請求一些資料時候的圖形驗證碼。因此這裡我們講解一種能將圖片翻譯成文字的技術。將圖片翻譯成文字一般被成力光學文字R別( optical Character Recognition),簡寫OCR。實現OCR的庫不是很多,特別是開源的 因為這塊存在一定的技術壁(需要大量

[驗證識別技術]-初級的滑動式驗證圖片識別

初級的滑動式驗證圖片識別方案 1 abstract 驗證碼作為一種自然人的機器人的判別工具,被廣泛的用於各種防止程式做自動化的場景中。傳統的字元型驗證安全性已經名存實亡的情況下,各種新型的驗證碼如雨後春筍般湧現。目前最常見的一種形式就是“滑動拼圖式” 關鍵字:驗證碼,圖靈測試,影象識別,python

網路資訊保安攻防學習平臺--指令碼關 11關 驗證識別 分值: 350 驗證識別 Tips:驗證依然是3位數 詳解

涉及到驗證碼和資料獲取,暴力破解是直觀選擇。可以百度,有好幾個部落格發了文章。本處提兩個操作方法的區別問題:urllib.request.urlretrieve('http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f2

Java OCR tesseract 圖像智能字符識別技術 Java代實現

fonts tab boolean redirect rhel exist easy clas print 接著上一篇OCR所說的。上一篇給大家介紹了tesseract 在命令行的簡單使用方法,當然了要繼承到我們的程序中,還是須要代碼實現的。以下給大家分享下java實現

人工智能識別|VIN識別技術

ali size 傳統 img 很好 情況下 強光 lan cal 技術引領時代發展。在人工智能技術日漸成熟的情況下,VIN碼/車架號碼的采集也不再是傳統的手工錄入 。譯圖智訊自主研發的VIN碼識別/車架號OCR識別技術,通過手機攝像頭“掃一掃”,就可以瞬間讀取並錄入車輛V

移動端vin識別技術識別速度有多快?

每輛車都有獨一無二的識別碼(vin),它們由一連串字母和數字組成。vin碼的歷史可以追溯到1954年,但直到1981年才實施國際通用的標準格式。從vin碼上可以看出車輛的產地和生產年份、引擎和變速器型號及其它有用資訊。 目前vin碼技術不僅僅可以識別vin碼,還能讓我們真正看清一輛車。vin碼識別系統,

VIN識別:讓VIN采集so easy!

http 升級 智能 移動手機 升級維護 存在 手工錄入 src 程序 近幾年汽車後市場呈噴井式發展,在過去的半年,汽車後市場規模已高達萬億級,產業前景廣闊,與此同時行業運營也受信息區域化、數據不統一的制約,讓企業面臨著效率低下、規模化運行困難的痛點。 在汽車配件市場中,

字元型圖片驗證,使用tensorflow實現卷積神經網路,進行驗證識別CNN

本專案使用卷積神經網路識別字符型圖片驗證碼,其基於 TensorFlow 框架。它封裝了非常通用的校驗、訓練、驗證、識別和呼叫 API,極大地減低了識別字符型驗證碼花費的時間和精力。  專案地址: https://github.com/nickliqian/cnn_captcha

圖片驗證識別教程技術原理分析

       面對技術這片大海,我們都是一個漁民,三天打魚,兩天結網。我是把過去自己所掌握的所有技術總結成一張網,若一個技術乾貨分享的東西離我的網還太遠,我就會放棄去了解。因為如果不能連結到這張網中,

基於慣性大水滴滴水演算法和支援向量機的粘連字元驗證識別

這幾天閒來無事,在等雅思成績出來的過程中,只能寫點東西來打發時間。剛好在上影象處理這門課,於是就想寫個驗證碼識別,普通的驗證碼識別難度太低,於是想要做粘連扭曲的驗證碼識別,如12306的驗證碼識別,此外,這個演算法同樣也可以適用於手寫體識別,反而我覺得手寫體比12306的驗

基於python語言的tensorflow的‘端到端’的字元驗證識別原始碼整理(github原始碼分享)

4   本文工作 解釋了原作者程式碼註釋中提到的關於sigmoid選型的困惑問題並應用到程式碼中 將原作者的程式碼進行模組工程化,成為整體專案,方便研究的同學直接進行模式套用 原作者程式碼中: def train_crack_captcha_cnn(): outp

基於Python使用SVM識別簡單的字元驗證的完整程式碼開源分享

關鍵字:Python,SVM,字元驗證碼,機器學習,驗證碼識別 1   概述 基於Python使用SVM識別簡單的驗證字串的完整程式碼開源分享。 因為目前有了更厲害的新技術來解決這類問題了,但是本文作為初級入門方法,還是具有一定的學習意義的,所以就將原始碼和相關的素材開源出來。 本文雖然已經不具備

字元型圖片驗證識別完整過程及Python實現

1111000111111000111111100001111100000011 1110111011110111011111011110111100110111 1001110011110111101011011010101101110111 110111111111011010111111010

字元驗證識別專案記錄

開發十年,就只剩下這套架構體系了! >>>   

Python爬蟲入門教程 58-100 python爬蟲高級技術驗證篇4-極驗證識別技術之一

per 按鈕 ext ctu () 插入圖片 必須 sts c4c 目錄 驗證碼類型 官網最新效果 找個用極驗證的網站 拼接驗證碼圖片 編

Python3.4 12306 2015年3月驗證識別

like target bottom edr ocr extra spl apple creat import ssl import json from PIL import Image import requests import re import urllib.r

驗證識別

code threshold 識別 div out style end gray .cn # -*- coding: utf-8 -*- import urllib.request, urllib.parse from PIL import Image from pyt

python之驗證識別 特征向量提取和余弦相似性比較

wow gif .get extra time ade upd orm log 0.目錄 1.參考2.沒事畫個流程圖3.完整代碼4.改進方向 1.參考 https://en.wikipedia.org/wiki/Cosine_similarity https://zh.wi