基於 CNN 的驗證碼破解實戰專案
作者:沂水寒城,CSDN部落格專家,個人研究方向:機器學習、深度學習、NLP、CV
Blog: http://yishuihancheng.blog.csdn.net
在我們的實際生活中有很多的場景需要輸入驗證碼,在工程實踐中為了將資料採集、模擬登入等一系列操作行為自動化處理就需要處理好驗證碼的識別工作,已有的工作中基於機器學習和深度學習都有很多的工作開展出來,效果也都不錯,今天本文的主要內容就是基於卷積神經網路CNN模型來構建驗證碼圖片識別模型。
整體流程示意圖如下圖所示:
其中,主要的工作分為三個部分:資料採集、資料預處理和模型構建與測試。上述是之前一個實際完成的專案流程示意圖,本文主要是實踐基於CNN來構建識別模型,對於資料採集和預處理部分不作為講解的內容,感興趣可以親身實踐一下,都是影像處理領域內的比較基礎的內容。
經過處理後我們將原始的驗證碼圖片均進行了基本的去噪、二值化以及歸一化等處理得到了可用於模型直接訓練使用的特徵向量資料,原始的驗證碼影像資料如下所示:
處理後生成的特徵向量檔案如下所示:
上圖中,每一行表示一個字元子圖,每一列表示字元子圖的一維資料,向量的維數就是經過歸一化處理後的字元子圖【寬x高】的值,即:將二維的矩陣資料轉化為了一維的向量資料,這一步不是必須的,只是我這裡採用了這種處理方式。
生成得到原始驗證碼圖片資料的特徵向量後就可以搭建訓練模型了,具體的程式碼實現如下所示:
keys = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','N','P','Q','R','S','T','U','V','X','Y','Z']
def trainModel(feature='data.csv',batch_size=128,nepochs=50,ES=False,n_classes=31,model_path='vcModel.h5'):
'''
模型訓練
'''
df = pd.read_csv(feature)
vals = range(31)
label_dict = dict(zip(keys, vals))
x_data = df[['v'+str(i+1) for i in range(320)]]
y_data = pd.DataFrame({'label':df['label']})
y_data['class'] = y_data['label'].apply(lambda x: label_dict[x])
#資料集劃分
X_train, X_test, Y_train, Y_test = train_test_split(x_data, y_data['class'], test_size=0.3, random_state=42)
x_train = np.array(X_train).reshape((1167, 20, 16, 1))
x_test = np.array(X_test).reshape((501, 20, 16, 1))
# label編碼處理
y_train = np_utils.to_categorical(Y_train, n_classes)
y_val = np_utils.to_categorical(Y_test, n_classes)
input_shape = x_train[0].shape
#CNN模型搭建開始 【可以根據自己的實際情況進行增刪和調整】
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=input_shape, padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
model.add(Dropout(0.4))
model.add(Conv2D(64, kernel_size=(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
model.add(Dropout(0.4))
model.add(Conv2D(128, kernel_size=(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dense(n_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
plot_model(model, to_file='vcModel.png', show_shapes=True)
if ES:
callbacks = [EarlyStopping(monitor='val_acc', patience=10, verbose=1)] #提前終止策略
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=nepochs, \
verbose=1, validation_data=(x_test, y_val), callbacks=callbacks)
else:
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=nepochs, verbose=1, validation_data=(x_test, y_val))
model.save(model_path)
#模型準確度、損失函式曲線繪製
plt.clf()
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['train','test'], loc='upper left')
plt.savefig('train_validation_acc.png')
plt.clf()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig('train_validation_loss.png')
if __name__=='__main__':
trainModel(feature='data.csv',batch_size=128,nepochs=100,ES=False,n_classes=31,model_path='vcModel.h5')
預設設定了100次的迭代,不開啟提前終止策略,訓練完成後截圖如下所示:
訓練完成後就得到了離線的識別模型檔案,可重複載入使用,我們在訓練結束後繪製了模型的準確度和損失值對比曲線,如下所示:
從準確度和損失值對比曲線綜合來看可以發現:模型在20次迭代計算後就趨近於平穩,之後保持一個比較穩定的狀態。
之後對模型的識別能力進行測試分析,測試程式碼實現如下:
def predict(pic_path,pdir='test_verifycode/chars/',saveDir='test_verifycode/predict/'):
'''
預測識別
'''
pic_list = os.listdir(pdir)
if pic_list:
for File in pic_list:
os.remove(pdir+ File)
splitImage(pic_path)
pic_list = os.listdir(pdir)
if pic_list:
for File in pic_list:
remove_edge_picture(pdir+ File)
for File in os.listdir(pdir):
resplit(pdir+ File)
for File in os.listdir(pdir):
picConvert(pdir, File)
pic_list = sorted(os.listdir(pdir), key=lambda x: x[0])
table = np.array([loadImage(pdir, File) for File in pic_list]).reshape(-1,20,16,1)
cnn = load_model('vcModel.h5')
y_pred = cnn.predict(table)
predictions = np.argmax(y_pred, axis=1)
keys = range(31)
vals = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z']
label_dict = dict(zip(keys, vals))
predict_label=''.join([label_dict[pred] for pred in predictions])
moveFile(pdir,saveDir+predict_label+'/')
return predict_label
def mainFunc(picDir='VerifyCode/'):
'''
主模組
'''
count=0
pic_list=os.listdir(picDir)
total=len(pic_list)
for one_pic in pic_list:
true_label=one_pic.split('.')[0].strip()
one_pic_path=picDir+one_pic
predict_label=predict(one_pic_path)
print('True Label: {0}, Predict Label: {1}.'.format(true_label,predict_label))
if true_label==predict_label:
count+=1
print('Accuracy: ',count/total)
測試結果截圖如下所示:
使用了200張的驗證碼測試集來測試模型的識別能力,最終的準確度為87%,感覺還是不錯的,畢竟我只使用了不到2000的訓練資料來訓練CNN模型。
如果有資料集需求的可以聯絡我,或者是去隨機生成一些驗證碼資料集也是可以的,一個簡單的驗證碼資料集生成流程如下所示:
到這裡本文的工作就結束了,很高興在自己溫習回顧知識的同時能寫下點分享的東西出來,如果說您覺得我的內容還可以或者是對您有所啟發、幫助,還希望得到您的鼓勵支援,謝謝!
喜歡文章,點個在看
相關文章
- 基於YOLO實現滑塊驗證碼破解YOLO
- 基於 TrueLicense 的專案證書驗證
- django專案基於鉤子驗證的註冊功能Django
- 2.CNN圖片多標籤分類(基於TensorFlow實現驗證碼識別OCR)CNN
- flask專案1實戰:2.2 flask框架下使用圖片驗證碼Flask框架
- 極驗驗證碼破解與研究
- 基於webpack4.x專案實戰Web
- 基於gRPC、API閘道器和身份驗證的Go微服務原始碼專案RPCAPIGo微服務原始碼
- 簡單的數字驗證碼破解
- 基於Node.js實現行為驗證碼Node.js
- Go專案實戰之驗證碼的生成和使用(易擴充套件方式)【goshop開源專案 | 20220516更新】Go套件
- node實現基於token的身份驗證
- 使用 Turing 破解滑塊驗證碼
- 頂象驗證碼破解與研究
- 使用node+puppeteer破解驗證碼
- Spring Security 6.3基於JWT身份驗證與授權開源專案SpringJWT
- 基於Nuxt.js實現滑動拼圖驗證碼UXJS
- 探索Django驗證碼功能的實現 - DjangoStarter專案模板裡的封裝Django封裝
- 實現基於JWT的Token登入驗證功能JWT
- Laravel 專案實現郵箱驗證功能Laravel
- 一個非常好的行為驗證碼專案!
- 專案實戰(連載):基於Angular2+Mongodb+Node技術實AngularMongoDB
- 爬蟲進階教程:極驗(GEETEST)驗證碼破解教程爬蟲
- 【驗證碼逆向專欄】某多多驗證碼逆向分析
- 親身驗證切實可行的python專案部署方案Python
- 基於 SAP BTP 平臺的 AI 專案經驗分享AI
- 使用F#破解滑塊驗證碼的完整流程
- 優效學院 基於微服務的秒殺專案實戰 Spring Boot 2.0基礎微服務Spring Boot
- 驗證碼安全基礎
- 基於驗證碼URL負載請求形成DDos負載
- 基於Groovy的規則指令碼引擎實戰指令碼
- 基於webpack4.x專案實戰2 - 配置一次,多個專案執行Web
- 面試缺乏實戰專案經驗?2020版uni-app專案實戰教程分享來襲面試APP
- Go語言專案實戰:基於開源資料的成語查詢Go
- 基於Ethereum & IPFS的去中心化Ebay區塊鏈專案開發實戰中心化區塊鏈
- vue專案中使用token的身份驗證的簡單實踐Vue
- easy-captcha實現驗證碼驗證APT
- 實戰專案-基於K8s平臺進行wordpress建站K8S