訓練自己的驗證碼識別器

2021-02-08 上下博客

首先查看keras中的sequential-api:fit 函數

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

x: 訓練數據的 Numpy 數組。 如果模型中的輸入層被命名,你也可以傳遞一個字典,將輸入層名稱映射到 Numpy 數組。 如果從本地框架張量饋送(例如 TensorFlow 數據張量)數據,x 可以是 None(默認)。

y: 目標(標籤)數據的 Numpy 數組。 如果模型中的輸出層被命名,你也可以傳遞一個字典,將輸出層名稱映射到 Numpy 數組。 如果從本地框架張量饋送(例如 TensorFlow 數據張量)數據,y 可以是 None(默認)。

batch_size: 整數或 None。每次梯度更新的樣本數。如果未指定,默認為 32。

epochs: 整數。訓練模型迭代輪次。一個輪次是在整個 x 或 y 上的一輪迭代。請注意,與 initial_epoch 一起,epochs 被理解為 「最終輪次」。模型並不是訓練了 epochs 輪,而是到第 epochs 輪停止訓練。

verbose: 0, 1 或 2。日誌顯示模式。 0 = 安靜模式, 1 = 進度條, 2 = 每輪一行。

callbacks: 一系列的 keras.callbacks.Callback 實例。一系列可以在訓練時使用的回調函數。詳見 callbacks。

validation_split: 在 0 和 1 之間浮動。用作驗證集的訓練數據的比例。模型將分出一部分不會被訓練的驗證數據,並將在每一輪結束時評估這些驗證數據的誤差和任何其他模型指標。驗證數據是清洗之前 x 和y 數據的最後一部分樣本中。

validation_data: 元組 (x_val,y_val) 或元組 (x_val,y_val,val_sample_weights),用來評估損失,以及在每輪結束時的任何模型度量指標。模型將不會在這個數據上進行訓練。這個參數會覆蓋 validation_split。

shuffle: 布爾值(是否在每輪迭代之前混洗數據)或者 字符串 (batch)。batch 是處理 HDF5 數據限制的特殊選項,它對一個 batch 內部的數據進行混洗。當 steps_per_epoch 非 None 時,這個參數無效。

class_weight: 可選的字典,用來映射類索引(整數)到權重(浮點)值,用於加權損失函數(僅在訓練期間)。這可能有助於告訴模型 「更多關注」來自代表性不足的類的樣本。

sample_weight: 訓練樣本的可選 Numpy 權重數組,用於對損失函數進行加權(僅在訓練期間)。您可以傳遞與輸入樣本長度相同的平坦(1D)Numpy 數組(權重和樣本之間的 1:1 映射),或者在時序數據的情況下,可以傳遞尺寸為 (samples, sequence_length) 的 2D 數組,以對每個樣本的每個時間步施加不同的權重。在這種情況下,你應該確保在 compile() 中指定 sample_weight_mode="temporal"。

initial_epoch: 開始訓練的輪次(有助於恢復之前的訓練)。

steps_per_epoch: 在聲明一個輪次完成並開始下一個輪次之前的總步數(樣品批次)。使用 TensorFlow 數據張量等輸入張量進行訓練時,默認值 None 等於數據集中樣本的數量除以 batch 的大小,如果無法確定,則為 1。

validation_steps: 只有在指定了 steps_per_epoch時才有用。停止前要驗證的總步數(批次樣本)。

說明:以固定數量的輪次(數據集上的迭代)訓練模型。

這裡函數是Keras裡的Sequential順序模型,所以本文也是使用的順序模型來進行訓練的。

from keras.models import Sequential

上述代碼是導入模型,順序模型是一種多層網絡進行疊加的,所以我們需要創建多個網絡層:輸入層,卷積,池化,全連接等。

輸入層層:Input

卷積層層:conv2d

激活函數:Activation(relu) 

池化層:MaxPooling2D

Flatten層:flatten (將多維張量轉為一維的張量,卷積層到全連接層的一個過渡層) 

防止過擬合:Dropout

全連接層:Dense

大致我們需要上述幾個函數構建我們的網絡,關於一些概念或者原理的東西,大家可以自行Google,下面是構建網絡的代碼。

inputs = Input(shape = input_shape, name = "inputs")conv1 = Conv2D(32, (3, 3), name = "conv1")(inputs)relu1 = Activation('relu', name="relu1")(conv1)conv2 = Conv2D(32, (3, 3), name = "conv2")(relu1)relu2 = Activation('relu', name="relu2")(conv2)pool2 = MaxPooling2D(pool_size=(2,2), padding='same', name="pool2")(relu2)conv3 = Conv2D(64, (3, 3), name = "conv3")(pool2)relu3 = Activation('relu', name="relu3")(conv3)pool3 = MaxPooling2D(pool_size=(2,2), padding='same', name="pool3")(relu3)x = Flatten()(pool3)x = Dropout(0.25)(x)x = [Dense(len(NUMBER), activation='softmax', name='fc%d'%(i+1))(x) for i in range(4)]outs = Concatenate()(x)

有了網絡模型以後還需要編譯一下才能使用。

model = Model(inputs=inputs, outputs=outs)model.compile(optimizer="優化器", loss="損失函數", metrics=['accuracy'])

編譯函數第一個參數是優化器,有如下幾個可供選擇:

SGD 

RMSprop 

Adam 

Adadelta 

Adagrad 

Adamax 

Nadam 

Ftrl

第二個參數是損失函數,這裡不列出了直接使用binary_crossentropy(交叉熵損失)

tf.keras.losses.BinaryCrossentropy(    from_logits=False, label_smoothing=0, reduction="auto", name="binary_crossentropy")

第三個參數是推薦參數,默認就好。

有了模型以後還要有數據,數據的格式有兩種

channels_last(以三維為例):(高度, 寬度, 通道)

channels_first(以三維為例):(通道, 高度, 寬度)

這裡通道代表的就是我們的數據集,不過要進行改變成1維。因為我們通道會定義為1。

    if K.image_data_format() == 'channels_first':        input_shape = (1, width, height)    else:        input_shape = (width, height, 1)

然後我們要將圖片導入並且轉一維。取一維的總長度,緯度是1,寬度,高度,然後重置圖片,這裡使用的是NumPy。

np.reshape(np.shape[0], 1, width, height)

這樣我們就有了圖片組,和Keras對應的數據格式(這時候是空的)。還記得網絡層裡的第一層嗎?

inputs = Input(shape = input_shape, name = "inputs")

這裡的input_shape就是我們剛才創建的空的Keras圖片格式。這裡為什麼傳入空的,是因為這裡只是當做佔位符,可以理解為初始化了一個類,但是我們並沒有開始執行這個類。

下面就是使用Fit函數進行訓練了,訓練前我們可以使用

進行模型的查看,fit函數訓練寫法

history = model.fit("訓練圖片數據",                    "訓練圖片標籤",                    batch_size="訓練一輪使用的樣本數量",                    epochs="訓練多少輪",                    verbose=2,                    validation_data=("測試圖片數據", "測試圖片標籤"),                    shuffle=True                    )

模型輸出

Model: "model_1"__________________________________________________________________________________________________Layer (type)                    Output Shape         Param #     Connected to                     ==================================================================================================inputs (InputLayer)             (None, 37, 100, 1)   0                                            __________________________________________________________________________________________________conv1 (Conv2D)                  (None, 35, 98, 32)   320         inputs[0][0]                     __________________________________________________________________________________________________relu1 (Activation)              (None, 35, 98, 32)   0           conv1[0][0]                      __________________________________________________________________________________________________conv2 (Conv2D)                  (None, 33, 96, 32)   9248        relu1[0][0]                      __________________________________________________________________________________________________relu2 (Activation)              (None, 33, 96, 32)   0           conv2[0][0]                      __________________________________________________________________________________________________pool2 (MaxPooling2D)            (None, 17, 48, 32)   0           relu2[0][0]                      __________________________________________________________________________________________________conv3 (Conv2D)                  (None, 15, 46, 64)   18496       pool2[0][0]                      __________________________________________________________________________________________________relu3 (Activation)              (None, 15, 46, 64)   0           conv3[0][0]                      __________________________________________________________________________________________________pool3 (MaxPooling2D)            (None, 8, 23, 64)    0           relu3[0][0]                      __________________________________________________________________________________________________flatten_1 (Flatten)             (None, 11776)        0           pool3[0][0]                      __________________________________________________________________________________________________dropout_1 (Dropout)             (None, 11776)        0           flatten_1[0][0]                  __________________________________________________________________________________________________fc1 (Dense)                     (None, 2)            23554       dropout_1[0][0]                  __________________________________________________________________________________________________fc2 (Dense)                     (None, 2)            23554       dropout_1[0][0]                  __________________________________________________________________________________________________fc3 (Dense)                     (None, 2)            23554       dropout_1[0][0]                  __________________________________________________________________________________________________fc4 (Dense)                     (None, 2)            23554       dropout_1[0][0]                  __________________________________________________________________________________________________concatenate_1 (Concatenate)     (None, 8)            0           fc1[0][0]                                                                                         fc2[0][0]                                                                                         fc3[0][0]                                                                                         fc4[0][0]                        ==================================================================================================Total params: 122,280Trainable params: 122,280Non-trainable params: 0

每一輪的訓練結果

Train on 5000 samples, validate on 1000 samplesEpoch 1/10 - 48s - loss: 0.6951 - accuracy: 0.5081 - val_loss: 0.6918 - val_accuracy: 0.5217Epoch 2/10 - 47s - loss: 0.6865 - accuracy: 0.5583 - val_loss: 0.6696 - val_accuracy: 0.6655Epoch 3/10 - 52s - loss: 0.6014 - accuracy: 0.6966 - val_loss: 0.5228 - val_accuracy: 0.7720Epoch 4/10 - 42s - loss: 0.4662 - accuracy: 0.7880 - val_loss: 0.4102 - val_accuracy: 0.8217Epoch 5/10 - 41s - loss: 0.3911 - accuracy: 0.8293 - val_loss: 0.3460 - val_accuracy: 0.8558Epoch 6/10 - 41s - loss: 0.3280 - accuracy: 0.8625 - val_loss: 0.2909 - val_accuracy: 0.8835Epoch 7/10 - 41s - loss: 0.2785 - accuracy: 0.8886 - val_loss: 0.2580 - val_accuracy: 0.8947Epoch 8/10 - 37s - loss: 0.2477 - accuracy: 0.9034 - val_loss: 0.2297 - val_accuracy: 0.9143Epoch 9/10 - 44s - loss: 0.2293 - accuracy: 0.9099 - val_loss: 0.2136 - val_accuracy: 0.9200Epoch 10/10 - 48s - loss: 0.2167 - accuracy: 0.9155 - val_loss: 0.2115 - val_accuracy: 0.9185

loss:訓練數據的損失(每輪減少) 

accuracy:訓練數據的精準度(每輪增加) 

val_loss:驗證數據的損失(每輪減少) 

val_accuracy:驗證數據的精準度(每輪增加)

這裡在第十輪發現驗證數據有點開始過擬合了,還是訓練數據少。所以直接使用第九輪的模型。

上述代碼是保存模型

model = load_model(MODEL_PATH)

上述代碼是載入模型,當我們訓練好以後模型保存到本地。下次可以直接載入模型進行識別。

model = load_model(MODEL_PATH)for filename in glob.glob(TESTPATH+'*.png'):    image = np.array(Image.open(filename))    pname = model.predict(image)    str_code=filename.lstrip(TESTPATH).rstrip('.png')    str_code_list = str_code.split("-")    name = str_code_list[1]    if(name==toText(pname)):            ok=ok+1    else:            err=err+1print("\033[1;32;43merr:"+str(err)+",ok:"+str(ok)+"\033[0m")

上述代碼是識別代碼

Jmeter使用方法可以參照:Jmeter 驗證碼自動識別登錄

相關焦點

  • python生成驗證碼→處理驗證碼→建立CNN模型訓練→測試模型準確率→識別驗證碼
    前言本文使用了pillow庫來生成自己想要的驗證碼,直接運行pip install pillow即可完成安裝使用pytorch來建立和訓練模型,本文使用的pytorchcuda8.0版本的1.0.0,可以在官網https://pytorch.org/上選擇適合自己電腦的版本使用opencv來對驗證碼進行處理,直接運行pip install opencv-python即可安裝一
  • Python項目實戰篇——常用驗證碼標註&識別(CNN神經網絡模型訓練/測試/部署)
    一、前言    今天給大家分享的實戰項目是常用驗證碼標註&識別,前面三篇文章講解了文章的創作靈感、需求分析和實現思路、數據採集/預處理/字符圖切割等知識、高效率數據標註等知識,分別是以下文章:Python項目實戰篇——常用驗證碼標註和識別(需求分析和實現思路)Python項目實戰篇——常用驗證碼標註&識別(數據採集/預處理/字符圖切割)
  • 最新驗證碼識別模擬登陸B站
    下面用兩種方法進行驗證碼的獲取,然後提交給「超級鷹」進行識別,接收到漢字的坐標後,處理數據,然後用動作鏈進行點擊操作,最後定位點擊確認,登陸成功。)bro.get('https://passport.bilibili.com/login')# 定位用戶名,密碼輸入框username = bro.find_element_by_id('login-username')password = bro.find_element_by_id('login-passwd')sleep(1)#
  • TensorFlow自動識別驗證碼(二)
    0X000 前言在 使用tensorflow自動識別驗證碼(一) 這篇文章中,對使用tensorflow自動識別驗證碼的過程做了簡單的了解和編寫
  • 這些驗證碼不再安全
    此類識別方法就是流程化作業,基本不太需要在編程上思考太多。識別步驟如下:下載一定數量的目標驗證碼圖片,數量根據驗證圖片的複雜程度而定準備好一套標準的CNN圖像分類的項目模板,並做好相關的功課對項目模板進行簡單的參數調整,以適配當前問題的圖片尺寸將圖像輸入CNN,對輸出的結果和先驗標記的類型做誤差對比
  • 基於 CNN 的驗證碼破解實戰
    ,在工程實踐中為了將數據採集、模擬登錄等一系列操作行為自動化處理就需要處理好驗證碼的識別工作,已有的工作中基於機器學習和深度學習都有很多的工作開展出來,效果也都不錯,今天本文的主要內容就是基於卷積神經網絡CNN模型來構建驗證碼圖片識別模型。
  • 用 KNN 實現驗證碼識別,又 Get 到一招
    作者 | 李秋鍵編輯 | Carol題圖 | 視覺中國出品| CSDN(ID:CSDNnews)驗證碼使我們生活中最為常見的防治爬蟲和機器人登錄攻擊的手段,一般的驗證碼主要由數字和字母組成,故我們可以設想:我們是否可以根據文本識別訓練模型進行識別驗證碼呢?
  • 自動化腳本無法處理驗證碼?Python圖片識別庫Tesseract實戰
    在Ui測試的時候,有時我們會遇到」元素以圖片的形式展示內容」(最經典的案例使驗證碼).這時傳統的文檔解析方案就失效了.但是,Python中你可以輕易的使用ocr(光學字符識別)技術.對圖片元素中的文字進行提取.從而解決技術難題.具體需要以下3步:①安裝Tesseract-ocr服務②安裝pytesseract-python驅動庫③識別圖片①Tesseract是一款由Google贊助的開源OCR。
  • Tesseract-OCR-v5.0中文識別,訓練自定義字庫,提高圖片的識別效果
    4,可見第3步的識別效果不是很好,想到通過訓練自定義字庫,提高圖片的識別效果(0)下載安裝jTessBoxEditor,https://sourceforge.net/projects/vietocr/files
  • 滑動驗證碼攻防對抗
    廠滑動驗證碼漏洞挖掘一、背景介紹  在業務安全領域,滑動驗證碼已經是國內繼,傳統字符型驗證碼之後的標配。風控策略有:限制註冊登錄頻率、惡意IP識別、驗證碼等。【惡意/正常行為】——【風控策略】——【業務場景】,風控在其中扮演者中間人的角色,無論是一個正常用戶的行為還是群控設備的惡意行為,風控一方面會使用策略進行過濾行為,另一方面會將惡意/正常行為會被記錄到日誌中,進而在後臺展示。④至此,信息收集完畢,我們整理一下思路。
  • 總結幾種常見 驗證碼的解決方案,非常有用!
    於是鹹魚總結了目前遇到過的的驗證碼類型以及總結出來的相關處理方式和大家聊一聊。現在市面上的驗證碼的類型大致有下面幾種類型。一、圖形驗證碼比較常見的英文數字組合成的圖形驗證碼,常常輔以各類幹擾線和扭曲圖片中的內容達到提高混淆難度的目的,並且通過加長圖片中的文字長度提升識別成本。
  • 利用 tesseract 解析簡單數字驗證碼圖片
    陳鍵冬,Python中文社區專欄作者GitHub:https://github.com/chenjiandongxtesseract 是一個 OCR(Optical Character Recognition,光學字符識別
  • SVM機器學習算法和OpenCV實現貓咪圖片識別器
    本課程使用HOG+SVM算法和OpenCV實現一個圖片分類器,通過自己訓練分類器,達到可以判斷任意圖片是否是貓咪的效果。一、課程介紹1. 內容簡介SVM(支持向量機)是一種常用的機器學習分類算法。本課程使用HOG+SVM算法和OpenCV實現一個圖片分類器,通過自己訓練分類器,達到可以判斷任意圖片是否是貓咪的效果。
  • opencv 人臉識別 (二)訓練和識別
    機器視覺」,回復「資料」獲取獲取機器視覺教程,行業報告等資源,百度盤群組分享連結更新時間:2016-10-25,失效請在文末留言,不要在後臺留言來自:http://blog.csdn.net/abcjennifer/article/details/20446077上一篇中我們對訓練數據做了一些預處理
  • 語音識別系統的分類、基本構成與常用訓練方法 | Machine Speech
    語音識別系統的模型通常由聲學模型和語言模型兩部分組成,分別對應於語音到音節概率的計算和音節到字概率的計算。一個連續語音識別系統大致可分為五個部分:預處理模塊、聲學特徵提取,聲學模型訓練,語言模型訓練和解碼器。
  • SpringBoot項目 qq郵箱驗證碼註冊和登錄
    1.1、思路註冊:通過輸入的郵箱發送驗證碼,檢驗前端傳來的驗證碼是否和後臺生成的一致,若一致,將數據寫入資料庫,完成註冊;登錄:通過輸入的郵箱查詢密碼,然後比較密碼是否一致,一致就是登錄成功。gt;</dependencies>2.3、application.properties配置文件application.properties配置文件#郵箱配置#平臺地址,這裡用的是qq郵箱,使用其他郵箱請更換spring.mail.host = smtp.qq.com#改成自己的郵箱
  • 基於HOG+SVM的目標檢測與識別
    SVM是一個高維度的分類器,全稱支持向量機,是一種結構化風險較低的分類器,也是目前研究領域較為熱門的分類器。我們關注的焦點不是如何實現他們,而是如何在開發中正確有效的使用他們。從總體上,可以將方案分為四大部分,一是分類器的訓練;二是目標疑似區提取,即檢測部分;三是使用分類器進行虛警踢除,即識別部分;四是聚類定位。
  • 【人臉識別終結者】多倫多大學反人臉識別,身份欺騙成功率達99.5%
    現在,人臉識別的剋星——「反人臉識別」問世了。多倫多大學Parham Aarabi教授和研究生Avishek Bose的團隊開發了一種算法,可以動態地破壞人臉識別系統。他們的解決方案利用了一種叫做對抗訓練(adversarial training)的深度學習技術,這種技術讓兩種人工智慧算法相互對抗。
  • Halcon OCR--字符識別(CNN卷積神經網絡)
    18.1 OCR字符識別       使用HALCON提供的一種預訓練字體讀取圖中的數字。注意,還可以訓練自己的系統字體。通過改變和扭曲字符的字體,可以增加每個類的不同訓練樣本的數量,從而提高檢測率。為此,可以使用HDevelop的OCR Assistant的訓練文件工具箱。