15分鍾破解網站驗證碼


 

概述

 

很多開發者都討厭網站的驗證碼,特別是寫網絡爬蟲的程序員,而網站之所以設置驗證碼,是為了防止機器人訪問網站,造成不必要的損失。現在好了,隨着機器學習技術的發展,機器識別驗證碼的問題比較好解決了。

 

樣本采集工具

 

這里我們采用wordpress的Really Simple CAPTCHA生成驗證碼的插件,之所以選擇這個插件,一個是它的安裝量很大,二個是因為它是開源的,我們可以利用它批量的生成驗證碼圖片。

 

目標估計

 

我們通過demo網站得知,Really Simple CAPTCHA生成的是包含4個數字或者字母的圖片,通過閱讀源碼得知,這個插件還屏蔽了O和I這兩個比較容易混淆的字母,也就是說,還剩下32個字符,看來可以完成。   目前花費了兩分鍾。

 

依賴

 

我們要用到以下的工具和庫。

  • python3

  • opencv

  • keras

  • tensorflow

 

創建樣本集

 

為了達到目的,我們首先要准備樣本集,樣本如下: 

使用Really Simple CAPTCHA插件的源碼,我們很方便的批量生成10000個驗證碼圖片和對應的結果,待我們生成完成后,大概如下: 

這地方大家可以根據自己的實際情況修改Really Simple CAPTCHA插件的源碼,來生成自己想要的樣本集。如果你覺着麻煩,也可以下載我生成好的。

 

目前為止,我們花了五分鍾。

 

如何訓練

 

我們現在有了樣本集了,我們可以直接那圖片和對應的結果直接進行神經網絡的訓練。

 只要我們的樣本夠多,最終也能達到我們想要的效果。

 

但我們也可以采用更好的訓練方法,這個訓練方法使用更少的樣本數據,但是結果要比直接訓練的方法好很多,我想你已經猜到了,這個方法就是把圖片中的四個字符切割開,形成四個樣本。這方法之所以可行,是因為所有的驗證碼圖片都是4個字符的。 

10000張圖片,一張一張手動用PS去切割,肯定不現實,而且由於圖片的橫向排列並不是等間距的,字符間的距離大小不一致,手動切割肯定不可能了。

 

 

其實我們只要畫出一個矩形,保證矩形框里只有字符就可以,然后從圖片中切出這樣的一個矩形,就形成了一個單個字符的圖片樣本。幸運的是,這個操作opencv已經幫我們實現了,opencv有個函數叫做findContours(),可以按照同樣色值的區域裁剪我們想要的矩形。 - 首先准備一個圖片:

 

 

 - 轉換圖片為黑白色。這樣有字符的地方為黑色,空白為白色,便於opencv裁剪。 

-接下來我們用opencv的findContours函數切割圖片。 

 

接下來,我們就把圖片從左到右進行切割,並存儲切割后的圖片,以及圖片對應的字符。但是實際操作的過程中,我發現一個問題,就是有時候兩個字符靠的太近,導致opencv在切割的時候,把兩個字符切割刀一個圖片里了,比如: 

切割完的效果是:

 如果不解決這個問題,我們的樣本集就不准了,那訓練出來的模型也就不可能正確了。我的解決方法是,首先設置一個字符寬最大的像素,如果超過這個像素,則認為一個圖片中包含了兩個字符,然后我們選擇把這個圖片對半切割,分成兩個字符。例如:


 好,我們現在得到了一個驗證碼圖片對應的4個字符的圖片,現在我們把所有的樣本圖片都切割好,然后,把相同的字符對應的圖片放到一個文件夾,這么做的目的是盡量多的找出同一個字符的多種樣式。結果如下:

到目前為止,我花了10分鍾。

 

訓練模型

 

因為我們只是識別圖片對應的數字或者字母,所以我們不需要特別復雜的神經網絡算法。識別字符比識別小貓小狗的簡單多了。 

  

我這地方使用卷積神經網絡,two convolutional layers and two fully-connected layers。 

這地方對卷積神經網絡算法就不做詳細介紹,感興趣的同學,可以google學習一下。  

訓練完成后,我們需要測試一下。15分鍾花完。

 

總結

 

整個過程看起來很簡單: - 從使用我們上述提到的插件的wordpress網站上下載驗證碼圖片 - 把圖片切割成包含單個字符的小圖片 - 使用神經網絡算法訓練模型 - 預測新的驗證碼圖片對應的字符

 

下面是我的測試: 

 

 

代碼

https://pan.baidu.com/s/1o94k2k6

 你可以從這得到完整的代碼和示例圖片,你可以參照README來運行相關的程序。

 


免責聲明!

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



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