計算機畢業設計 12306 基於機器視覺的驗證碼識別

Mondo 教育 更新 2024-03-08

今天,學長想給大家介紹乙個深度學習專案。

12306 基於機器視覺的驗證碼識別

專案分享與指導:

12306 的驗證碼是從 8 ** 中查詢請求的物件,如圖所示。

前輩統計了1000個樣本,發現12306的類別數量實際上只有80個類別,其類別和對應的統計資料如下。

從上面的統計資料可以看出,12306驗證碼的破解可以轉化為80個類別的分類問題。

資料集預覽

物件的分類可以簡單地分為三個部分:

網路建設; 資料讀取;

模型訓練。 但是,以上三個步驟中的每乙個都有一些超引數,如何設定這些超引數是有經驗的演算法工程師必須掌握的技能。 我們將在以下各節中詳細介紹每個步驟,並給出我自己的經驗和優化策略。

在構建分類網路時,可以使用前面文章中描述的經典網路結構,也可以自己構建。 構建自己的分類網路時,可以使用以下步驟:

對於堆疊卷積運算(CONV2D)和最大池化運算(Maxpooling2D),需要為第一層指定輸入影象的大小和通道數;

flatten() 用於將特徵圖擴充套件為特徵向量;

接下來是全連線層和啟用層,注意 softmax 啟用函式應用於多個分類。

在自己建立網路時,老年人有幾種經驗:

1、通道數為2n;

2 乘以 2 次 maxpooling 後通道數;

3、特徵圖最後一層的尺寸不宜過大或過小(7-20為好選擇);

4. 輸出層和 flatten() 層通常需要為過渡特徵新增至少乙個隱藏層;

5. 根據 flatten() 層中的節點數設計隱藏層節點的數量。

以下**是老年人建立的分類網路。

model_**= models.sequential()

model_**add(layers.conv2d(32, (3,3), padding='same', activation='relu', input_shape = (66,66,3)))

model_**add(layers.maxpooling2d((2,2)))

model_**add(layers.conv2d(64, (3,3), padding='same', activation='relu'))

model_**add(layers.maxpooling2d((2,2)))

model_**add(layers.conv2d(128, (3,3), padding='same', activation='relu'))

model_**add(layers.maxpooling2d((2,2)))

model_**add(layers.flatten())

model_**add(layers.dense(1024, activation='relu'))

model_**add(layers.dense(80, activation='softmax'))

在上面的**中,VGG16() 函式用於呼叫 KERAS 自帶的 VGG-16 網路,weights 引數指定網路是否使用遷移學習模型,值 none 表示隨機初始化,當值為 ImageNet 時,表示使用 ImageNet 資料集訓練的模型。

include top 引數指示是否使用以下輸出層,我們已確定僅使用表示層,因此該值為 false。 輸入形狀表示輸入的大小,由於 VGG-16 會縮減取樣 5 次,因此我們2242243使用其預設的輸入大小,因此輸入 ** 會在輸入前放大。

Keras 提供了多種讀取資料的方法,我們建議使用生成器。 在生成器中,Keras在訓練模型的同時,將下一批待訓練的資料預讀到記憶體中,這樣可以節省記憶體,方便大規模資料的訓練。 keras 生成器的初始化是 imagedatagenerator 類,它有一些內建的方法來增強資料。

在這個專案中,主體將不同的類別放在不同的目錄下,因此在讀取資料時使用 flow from directory() 函式,讀取訓練資料如下(驗證和測試相同):

train_data_gen = imagedatagenerator(rescale=1./255)

train_generator = train_data_gen.flow_from_directory(train_folder,

target_size=(66, 66),

batch_size=128,

class_mode='categorical')

我們幾乎已經確定這是乙個分類任務,因此類模式的值是分類的。

當我們訓練模型時,首先需要確定優化策略和損失函式,這裡我們選擇adagrad作為優化策略,損失函式選擇多分類交叉熵分類交叉熵。 由於我們使用生成器來讀取資料,因此我們將使用擬合生成器將資料饋送到模型,如下所示。

model_**compile(loss='categorical_crossentropy', optimizer=optimizers.adagrad(lr=0.01), metrics=['acc'])

history_**= model_**fit_generator(train_generator,

steps_per_epoch=128,

epochs=20,

validation_data=val_generator)

20 epoch 後,模型趨於收斂,損失值曲線和精度曲線如圖所示,測試集精度為 08275。從收斂情況可以分析出,模型在這一點上已經擬合,需要一些策略來解決這個問題。

輟學一直是解決過擬合的非常有效的策略。 使用dropout時,損失率的設定是一項技術活動,如果損失率太小,dropout就不能發揮其作用,如果損失率太大,模型將不容易收斂,甚至永遠是**。 在這裡,我新增的損失率為 025 人輟學。 收斂曲線和精度曲線如下圖所示,可以看出過擬合問題仍然存在,但略有降低,此時得到的測試集精度為083375

Keras 在呼叫 ImageDataGenerator 類時,根據其引數提供了資料增強策略,前輩們對資料擴充有幾點建議:

1.富集策略應基於對資料集的充分觀察和理解;

2、正確的富集策略可以增加樣本量,大大減少過擬合問題;

3、錯誤的擴充策略容易導致模型收斂性差,更嚴重的問題是訓練集和測試集的分布更加不一致,加劇了過擬合的問題。

4 開發人員經常需要根據自己的業務場景實施自己的擴充套件策略。

以下是我使用的一些資料增強策略。

train_data_gen_aug = imagedatagenerator(rescale=1./255,horizontal_flip = true, 

zoom_range = 0.1,width_shift_range= 0.1,height_shift_range=0.1,shear_range=0.1,rotation_range=5)

train_generator_aug = train_data_gen_aug.flow_from_directory(train_folder,

target_size=(66, 66),

batch_size=128,

class_mode='categorical')

其中 rescale=1255引數的作用是歸一化影象,這是幾乎所有影象問題的有用策略; horizontal flip = true,增加了水平翻轉,這適用於當前資料集,但OCR等方向的水平翻轉不可用; 其他策略(包括縮放、平移和旋轉)是常見的資料增強策略,在此不再贅述。

結合dropout,資料增強可以進一步緩解過擬合問題,其收斂曲線和精度曲線如圖4所示,測試集精度為084875。

除了構建我們自己的網路,我們還可以使用現成的網路預訓練模型進行遷移學習,可以使用的網路結構有:

xception

vgg16vgg19

resnet50

inceptionv3

inceptionresnetv2

mobilenet

densenet

nasnet

經典模型通常與遷移學習結合使用,即使用任務A(最常見的是imagenet)的訓練模型對當前任務的網路進行初始化,然後根據自己的資料進行微調。 這種方法往往適用於資料集相對較小的任務。 Keras允許使用者自定義哪些層可以微調,哪些層不需要在遷移學習期間進行微調可訓練。 KERAS使用遷移學習提供的模型往往很深,容易出現梯度消失或梯度**,因此建議新增乙個bn層。 最好的策略是選擇適合您任務的網路,並使用 ImageNet 資料集進行訓練。

以VGG-16為例,其使用遷移學習的**如下。 第一次執行此部分時,您需要乙個用於遷移學習的模型,因此速度會很慢,因此請耐心等待。

model_trans_vgg16 = models.sequential()

trans_vgg16 = vgg16(weights='imagenet', include_top=false, input_shape=(224,224,3))

model_trans_vgg16.add(trans_vgg16)

model_trans_vgg16.add(layers.flatten())

model_trans_vgg16.add(layers.dense(1024, activation='relu'))

model_trans_vgg16.add(layers.batchnormalization())

model_trans_vgg16.add(layers.dropout(0.25))

model_trans_vgg16.add(layers.dense(80, activation='softmax'))

model_trans_vgg16.summary()

其收斂曲線和精度曲線如圖5所示,測試集精度為0774375,這個時候遷移學習的效果還不如我們之前隨便搭建的網路。 遷移學習模型在這個問題上表現不佳有兩個原因:

VGG-16網路太深,容易在12306驗證碼等簡單驗證碼上過擬合;

由於 include top 的值為 false,因此網路的全連線層被隨機初始化,導致訓練開始時損失值較大,並使訓練後的表示層產生偏差。

為了防止表示層出現偏差,我們可以通過將 keras 中層的可訓練值設定為 false 來做到這一點。 結合前面描述的資料增強和丟棄,我們得到的收斂曲線和精度曲線如圖6所示,測試集的精度為091625。

我把12306**驗證碼破解變成了乙個經典的多分類問題,通過深度學習和一些技巧,將識別率提高到91625%。

訓練測試結果:

專案分享與指導:

相關問題答案

    小型計算機視覺是一項關鍵技術,它賦予機器洞察力

    隨著人工智慧和計算機視覺技術的飛速發展,小型計算機視覺已成為人們非常關注的領域。小型計算機視覺是指將計算機視覺技術應用於嵌入式裝置 移動裝置等小型平台,賦予機器洞察力和感知能力。本文將重點介紹小型計算機視覺的概念 關鍵技術和應用場景。.小型計算機視覺的概念。小型計算機視覺是指將計算機視覺技術應用於小...

    淺談數學在CV計算機視覺中的應用

    計算機視覺 CV 是人工智慧的乙個分支,研究計算機如何從數字影象或 中獲取資訊。數學在計算機視覺中發揮著重要作用,為影象處理 機器學習和深度學習等計算機視覺技術奠定了基礎。影象處理是計算機視覺的基礎,它對影象進行一系列操作,以增強影象質量,提取影象特徵,並為後續的分析和識別做準備。常用的影象處理技術...

    計算機視覺是一項革命性的技術,可以重塑人類的感知

    今天,我們來談談計算機視覺,也稱為CV 計算機視覺 CV是一種允許計算機 閱讀 和 理解 的技術。人類通過眼睛感知環境,CV允許計算機模仿人類的視覺系統,通過為計算機配備眼睛 攝像頭 和大腦 演算法 來感知環境,使其能夠識別和理解影象中的物體 人臉 文字 場景等。雖然CV技術已經比較成熟,在很多領域...

    探索計算機視覺的靈魂 十大演算法揭曉深度分析

    作為人工智慧的乙個重要分支,計算機視覺正在逐漸改變我們的生活方式和工作模式。在這個充滿挑戰和機遇的領域,許多演算法像璀璨的星星一樣閃耀,引導著計算機視覺技術的發展。在本文中,我們將深入探討計算機視覺中的十大演算法,並揭示它們在推動技術進步方面發揮的關鍵作用。.線性分類器 開啟計算機視覺的大門。線性分...

    計算機網路工程設計

    計算機網路工程設計是指根據使用者的需求,對網路工程進行規劃 設計 實施和維護的過程。此過程需要考慮計算機網路的所有方面,包括網路拓撲 網路安全 網路管理 網路協議等。在計算機網路工程設計中,首先要明確使用者的需求和目標。這些要求可能包括網路的速度 可靠性 安全性 可擴充套件性等。通過對使用者需求的深...