15分鐘破解網站驗證碼

概述

  不少開發者都討厭網站的驗證碼,特別是寫網絡爬蟲的程序員,而網站之因此設置驗證碼,是爲了防止機器人訪問網站,形成沒必要要的損失。如今好了,隨着機器學習技術的發展,機器識別驗證碼的問題比較好解決了。html

樣本採集工具

  這裏咱們採用wordpress的Really Simple CAPTCHA生成驗證碼的插件,之因此選擇這個插件,一個是它的安裝量很大,二個是由於它是開源的,咱們能夠利用它批量的生成驗證碼圖片。python

目標估計

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

依賴

  咱們要用到如下的工具和庫。算法

  • python3
  • opencv
  • keras
  • tensorflow

建立樣本集

  爲了達到目的,咱們首先要準備樣本集,樣本以下:
樣本網絡

使用Really Simple CAPTCHA插件的源碼,咱們很方便的批量生成10000個驗證碼圖片和對應的結果,待咱們生成完成後,大概以下:
樣本集機器學習

這地方你們能夠根據本身的實際狀況修改Really Simple CAPTCHA插件的源碼,來生成本身想要的樣本集。若是你覺着麻煩,也能夠下載我生成好的。wordpress

  目前爲止,咱們花了五分鐘。函數

如何訓練

  咱們如今有了樣本集了,咱們能夠直接那圖片和對應的結果直接進行神經網絡的訓練。
訓練
只要咱們的樣本夠多,最終也能達到咱們想要的效果。工具

  但咱們也能夠採用更好的訓練方法,這個訓練方法使用更少的樣本數據,可是結果要比直接訓練的方法好不少,我想你已經猜到了,這個方法就是把圖片中的四個字符切割開,造成四個樣本。這方法之因此可行,是由於全部的驗證碼圖片都是4個字符的。
split學習

  10000張圖片,一張一張手動用PS去切割,確定不現實,並且因爲圖片的橫向排列並非等間距的,字符間的距離大小不一致,手動切割確定不可能了。
split2

  其實咱們只要畫出一個矩形,保證矩形框裏只有字符就能夠,而後從圖片中切出這樣的一個矩形,就造成了一個單個字符的圖片樣本。幸運的是,這個操做opencv已經幫咱們實現了,opencv有個函數叫作findContours(),能夠按照一樣色值的區域裁剪咱們想要的矩形。

  • 首先準備一個圖片:

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


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

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

切割完的效果是:

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

好,咱們如今獲得了一個驗證碼圖片對應的4個字符的圖片,如今咱們把全部的樣本圖片都切割好,而後,把相同的字符對應的圖片放到一個文件夾,這麼作的目的是儘可能多的找出同一個字符的多種樣式。結果以下:

  到目前爲止,我花了10分鐘。

訓練模型

  由於咱們只是識別圖片對應的數字或者字母,因此咱們不須要特別複雜的神經網絡算法。識別字符比識別小貓小狗的簡單多了。
  我這地方使用卷積神經網絡,two convolutional layers and two fully-connected layers。

這地方對卷積神經網絡算法就不作詳細介紹,感興趣的同窗,能夠google學習一下。
  訓練完成後,咱們須要測試一下。15分鐘花完。

總結

整個過程看起來很簡單:

  • 從使用咱們上述提到的插件的wordpress網站上下載驗證碼圖片
  • 把圖片切割成包含單個字符的小圖片
  • 使用神經網絡算法訓練模型
  • 預測新的驗證碼圖片對應的字符

下面是個人測試:

代碼

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

轉載自個人博客捕蛇者說

相關文章
相關標籤/搜索