1. 程式人生 > >令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

實驗背景

驗證碼是反爬蟲的利器,傳統的方法需要字元切割,字元識別,但是對於字元重疊的,字元扭曲的情況,識別效果差。本實驗本著實驗精神,利用深度學習進行端對端的驗證碼識別。

學習Python中有不明白推薦加入交流群
                號:960410445
                群裡有志同道合的小夥伴,互幫互助,
                群裡有不錯的視訊學習教程和PDF!

 

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

實驗器材

● alexnet

● tensorflow

● captcha

實驗內容

資料集生成

驗證碼識別訓練資料集採用captcha python外掛來生成,驗證碼圖片生成的同時,標籤也生成了。

pip install captcha

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

ps: 同一個驗證碼生成訓練集存在樣式單一的問題,可以通過爬蟲的方式,下載不同樣式的驗證嗎,唯一的耗時的需要人工的進行標籤識別。所以說ImageNet資料集才顯得那麼重要。

本實驗生成數字和小寫字母的4個隨機的驗證碼,供20W張圖片(160*60)。

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

將資料集轉換成tfrecord檔案,這裡配合網路模型,4個輸出標籤對應4個驗證字元。

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

深度學習網路結構

本實驗利用alexnet(5個conv+3個全連線,輸入影象大小為224*224)來訓練驗證碼的識別器。直接採用slim裡的網路模型。

本實驗為了識別驗證碼中的4個字元,採用多目標標籤的方式,即一個輸入,有多個輸出標籤,實現中對alexnet的輸出和損失函式做了調整,在原來的第8個全連線一個輸出,改成4個輸出。如下:

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

損失函式為4個輸出的損失的均值

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

網路結構:

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

訓練

訓練超引數說明

epoch:200000學習率:0.0001

 

訓練過程中有一個比較奇特的現象,在9k次迭代之前,loss損失似乎徘徊不定(看不到要收斂的趨勢)和精確度也很低(只有8%不到)(差點失去信心了)。 在9k次迭代之後,loss損失慢慢降低,逐步收斂。訓練精確度也達到92%以上。訓練時間大概在30分鐘

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

識別結果

 

usage: test_one.py [-h] [--image_num IMAGE_NUM] [--image_dir IMAGE_DIR]
 [--tf_data_dir TF_DATA_DIR]
 [--check_point_dir CHECK_POINT_DIR] [--gpu GPU]
 [--learning_rate LEARNING_RATE] [--batch_size BATCH_SIZE]
 [--epoch_size EPOCH_SIZE] [--img_file IMG_FILE]
python test_one.py --img_file ./images/001y.jpg --batch_size 1
2018-12-13 23:10:00.440321: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX
2018-12-13 23:10:00.788711: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1392] Found device 0 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:02:00.0
totalMemory: 10.91GiB freeMemory: 10.45GiB
2018-12-13 23:10:00.788784: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1471] Adding visible gpu devices: 0
2018-12-13 23:10:01.133237: I tensorflow/core/common_runtime/gpu/gpu_device.cc:952] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-12-13 23:10:01.133304: I tensorflow/core/common_runtime/gpu/gpu_device.cc:958] 0 
2018-12-13 23:10:01.133333: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0: N 
2018-12-13 23:10:01.133780: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5586 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)
./checkpoint/crack_captcha.model-141300
predict: 0 0 1 y

 

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

令人感到過分,又跑出來教人用python破解驗證碼,還是可訓練模型

 

 

0和o 有時候識別的不是很好。人眼無法分清的模型有時候能分的清楚。

實驗結語

本實驗WedO創客實驗和大家一個訓練了一個識別驗證碼的模型,對於生成的同樣樣式的驗證碼識別效果還是不錯的。

目前還存在幾個問題:

  • 對於其他樣式的驗證碼識別效果不好,優化的思路:增加其他驗證碼的訓練資料(一種方法是利用爬蟲方式爬取各種不同的驗證碼,就是要耗費時間來人工標註)。目前來看,不同的驗證碼系統需要單獨訓練一個解碼器。
  • 驗證碼的字元個數,實驗中定為4個。要是其他長度的驗證碼無法使用。