Python項目實戰篇——常用驗證碼標註&識別(CNN神經網絡模型訓練/測試/部署)

2022-01-31 DotNet工控上位機編程

回復「書籍」即可獲贈Python從入門到進階共10本電子書

    大家好,我是Snowball。一、前言

    今天給大家分享的實戰項目是常用驗證碼標註&識別,前面三篇文章講解了文章的創作靈感、需求分析和實現思路、數據採集/預處理/字符圖切割等知識、高效率數據標註等知識,分別是以下文章:

Python項目實戰篇——常用驗證碼標註和識別(需求分析和實現思路)

Python項目實戰篇——常用驗證碼標註&識別(數據採集/預處理/字符圖切割)

Python項目實戰篇——常用驗證碼標註&識別(前端+後端實現高效率數據標註)

這篇文章引入機器學習,給大家講解下基於該項目的CNN神經網絡模型訓練/測試/部署。

二、背景知識

    按照學習的好習慣,先搜索網上資源,再腦洞一下,先思考啥是神經網絡,啥是卷積,CNN神經網絡為啥能提取圖片特徵,這些問題筆者剛開始全部都遇到過,一臉蒙蔽有沒有。不要急,有問題有時候是好事,說明你知道自己那些不知道,等到自己了解和懂得多了,有些問題就迎刃而解。

    筆者剛開始在上面的OpenCV知識學習過程中,就嘗試用過傳統的SIFT算法進行提取圖片特徵可以進行圖片相似度匹配,但是效果都比較差,這裡面用的是多維向量特徵描述。而神經網絡在機器學習的領域為啥這麼牛皮,這裡面是有數學方面的理論支撐,也有現在計算力和數據量的支持,而卷積神經網絡專門用來處理圖片特徵提取。

    剛開始,筆者對這方面的理論知識了解甚少,於是充分利用搜索工具和網上資源,這裡分享一下自己學習過程中的文章連結和視頻連結,可以保證讀者看完基本可以加深對神經網絡訓練的實戰了解,可上手進行項目功能調整。好的,讓我們開始學習(卷)起來,以下就是所有內容的連結,沒有基礎的朋友可以補一補,有基礎的可以直接跳過:

**數學基礎**[微積分](https://www.bilibili.com/video/BV1Eb411u7Fw)
[線性代數](https://www.bilibili.com/video/BV1aW411Q7x1)
[概率論](https://www.bilibili.com/video/BV1ot411y7mU)
[計算機數學基礎](https://www.bilibili.com/video/BV1AB4y1K7kM)

**OpenCV**[OpenCV文章專欄](https://blog.csdn.net/yukinoai/category_9283880.html)
[OpenCV-Python視頻](https://www.bilibili.com/video/BV1tb4y1C7j7)

**神經網絡**[理解卷積意義](https://www.bilibili.com/video/BV1VV411478E)
[前饋神經網絡](https://www.bilibili.com/video/BV1Tt411s7fK)
[神經網絡學習理解](https://space.bilibili.com/504715181?spm_id_from=333.788.b_765f7570696e666f.1)

**Python框架使用**[Numpy中文教程](https://www.runoob.com/numpy/numpy-tutorial.html)
[PyTorch中文教程](https://pytorch.panchuang.net/SecondSection/neural_networks/)
[PyTorch視頻](https://www.bilibili.com/video/BV1t64y1t7V8)

    以上就是筆者這次項目開發幾個月來搜索的優質學習文章和視頻資源了,有基礎的朋友可以選擇性相關知識學習,沒有基礎而時間充裕的可以惡補基礎再動手實戰,所謂磨刀不誤砍柴工。想快速動手的小夥伴可以快速學習,把對應項目需要的知識點看明白即可。筆者建議的學習方式是確定自己的任務主線,然後邊學邊練邊思考,在項目實戰中學習總結是成長最快的方式。

    好的,在上面前置知識學習了解的差不多後,相信大家都已經知道CNN神經網絡的理論知識了,接下來我們動手進行CNN模型的實戰訓練過程。

在開始,確定模型訓練基本過程

準備訓練數據集、測試數據集、預測數據集

CNN模型編碼

模型訓練、測試

模型預測、部署


三、CNN神經網絡模型訓練

    1.準備數據

    通過實現思路第1-2步,可以得到相關圖片驗證碼字符數據,筆者這裡準備訓練集500多張(這裡得感謝我妹子花時間幫我在標註系統上手動標註的初始數據集~~),測試集30多張,預測5張。讀者在python項目拉取下來後,對應的文件夾下面已有全部數據,對應路徑如下:

src_img:訓練數據集

test_src_img:測試數據集

usage_src_img:預測數據集

在準備好圖片驗證碼數據後,本次案例需要先進行字符切割預處理(其他常用驗證碼需要讀者自己調整),對應文件image_split,以下是main方法代碼。

if __name__ == '__main__':    split_image_dir(SRC_IMG_DIR)        split_test_image()

執行字符切割後,對應的訓練集字母分類在letter_template目錄下,測試集字母分類在letter_test目錄下。

數據集類:net_data.py,下面是主要代碼。

labels = []for i in range(8):    labels.append(50 + i)for i in range(26):    labels.append(65 + i)
class VerCodeDataset(Dataset): def __init__(self, image_dir="./letter_template/"): l = os.listdir(image_dir) self.data = [] self.label = [] for d in l: fs = os.listdir("{}{}".format(image_dir, d)) for f in fs: fup = "{}{}/{}".format(image_dir, d, f) t = torch.from_numpy(io.imread(fup)).float() / 255 norl = transforms.Normalize(t.mean(), t.std()) self.data.append(norl(t.reshape(1, 40, 40))) self.label.append(labels.index(ord(d)))

數據集值製作描述可參考該文章連結:

[數據集製作參考文章](https://zhuanlan.zhihu.com/p/358671390)


2.CNN模型編碼

    本文驗證碼的識別與MNIST的識別相當類似,模型這塊採用簡單的前饋神經網絡,它接收輸入,讓輸入一個接著一個的通過一些層,最後給出輸出。下面是minst網絡結構圖:

[PyTorch 神經網絡 - PyTorch官方教程中文版](https://link.zhihu.com/?target=http%3A//pytorch.panchuang.net/SecondSection/neural_networks/)

一個典型的神經網絡訓練過程包括以下幾點:

1.定義一個包含可訓練參數的神經網絡

2.迭代整個輸入

3.通過神經網絡處理輸入

4.計算損失(loss)

5.反向傳播梯度到神經網絡的參數

6.更新網絡的參數,典型的用一個簡單的更新方法:weight = weight - learning_rate *gradient

定義神經網絡(net_train.py):

class Net(nn.Module):    def __init__(self, dropout=0.1):        super(Net, self).__init__()        self.dropout = nn.Dropout(dropout)                 self.conv1 = nn.Conv2d(1, 10, 5)                self.conv2 = nn.Conv2d(10, 25, 5)                        self.fc1 = nn.Linear(1 * 25 * 7 * 7, 120)                self.fc2 = nn.Linear(120, 84)                self.fc3 = nn.Linear(84, 34)
def forward(self, x): x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) x = self.dropout(x) x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2)) x = self.dropout(x) x = x.view(-1, self.num_flat_features(x)) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x
def num_flat_features(self, x): size = x.size()[1:] num_features = 1 for s in size: num_features *= s return num_features

下方代碼中:

self.fc1 = nn.Linear(1 * 25 * 7 * 7, 120)

全連接層第一個參數的大小:

[40,40]經過[5,5]卷積核->[35,35]

[35,35]經過[2,2]池化->[18,18]

[18,18]經過[5,5]卷積核->[13,13]

[13,13]經過[2,2]池化->[7,7]

上層卷積層一共25個卷積核,因此這裡的大小為1(通道數)*25*7*7= 1225,至於後面全連接的84可以隨便改,和下層全連接層保持一致即可。

以上就是模型定義的代碼了,讀者有興趣的也可以自行用其他模型訓練。


四、CNN神經網絡模型測試

    net_train.py文件提供的訓練代碼支持GPU訓練,在沒有NVDIA顯卡和安裝pytorch對應版本的CUDA庫,默認是使用CPU訓練,筆者對二種訓練方式都進行了嘗試,下面是訓練對比情況:

數據量:2286張 40*40 單通道字符圖片batch_size: 50epoch: 200
設備 時間GTX 1070TI 25sAMD R7 4750U PRO 4min

    總結,數據量大,有條件上GTX顯卡就用顯卡訓練,訓練效率高出CPU數量級

[cuda安裝文章連結](https://www.cnblogs.com/yang520ming/p/10677110.html)

    這裡是cuda安裝注意事項:

1.更新nvida顯卡驅動程序,然後看cuda版本2.找pytorch對應cuda的版本安裝

train方法代碼如下:

def train_gpu():    use_cuda = torch.cuda.is_available()    if(use_cuda):        print("use gpu cuda")    else:        print("use cpu")
device = torch.device("cuda:0" if use_cuda else "cpu") net = Net() net.to(device) opt = optim.SGD(net.parameters(), lr=0.01) epoch = 200 batch_size = 50 trainloader = data.trainloader(batch_size) st = datetime.datetime.now() loss = 0
for e in range(epoch): for step, d in enumerate(trainloader): data_cuda = d["data"].to(device) label_cuda = d["label"].to(device) opt.zero_grad() out = net(data_cuda) lf = nn.CrossEntropyLoss() loss = lf(out, label_cuda) loss.backward() opt.step()
if (e % 50 == 0 or step == 1): print("e : {} , step : {}, loss : {}".format(e, step, loss))
print("loss : {}".format(loss)) print("cost time:",datetime.datetime.now() - st) saveModel(net, opt)

描述見上面代碼注釋,對概念理解有問題建議可以再看下這個up主的視頻,筆者覺得講得非常不錯:

[神經網絡學習理解](https://space.bilibili.com/504715181?spm_id_from=333.788.b_765f7570696e666f.1)

下面給出訓練、測試過程中的效果圖:

GPU模型-訓練集訓練:

CPU模型-訓練集訓練

    可以看到迭代200次,花費4分鐘的訓練,模型趨於擬合效果,次數越往後梯度下降越慢。其實在迭代100次之後就接近穩定來回振蕩,損失值減少越慢,最後的損失值為0.0016,擬合效果還不錯,如果增加訓練數據量、迭代次數、優化部分字符串的切割,可以讓模型效果更好,讀者可自行實踐。

CPU模型-測試集測試

代碼見net_test.py

    可以看到152個字符,97%的準確率,部分字符切割問題會導致準確率下降,不過問題不大,基本達到個人項目可用程度,Nice~~


五、CNN神經網絡模型預測和部署

    經過1,2,3步循環過程後,可以用一個相對擬合穩定的模型進行預測集預測,因為過擬合的問題,可能有些模型在測試集表現較好,在測試時效果就不太好,這裡需要對訓練數據,模型參數進行排

CPU模型-預測集測試

代碼見net_usage.py

    上圖可以看到,5張驗證碼的字符全部預測正確。

CPU模型-部署:

使用python的web框架Flask API,編寫圖片驗證碼識別POST接口,傳入文件路徑,啟動web應用,以下是通過本機文件路徑識別接口代碼,詳細代碼見net_flask.py

@app.route('/recognize/path', methods=['POST'])def recognize_path():    filePathList = request.json['filePathList']    code = CODE_SUCCESS    msg = MSG_SUCCESS    data = []    for filePath in filePathList:        if not os.path.exists(filePath):            # code = CODE_FAIL            # msg = "文件不存在"            print("文件不存在:", filePath)            data.append("")            continue        else:            labels = usage_model.usage(filePath)            data.append(''.join(labels))    result = {'code': code, "msg": msg, "data": data}    return jsonify(result)

模型-Flask Web App啟動效果:

Postman接口測試效果:

Web頁面批量請求-預測:

    好的,以上就是筆者圖片驗證碼識別案例中的卷積神經網絡模型訓練、測試、部署的全部內容了,總的來說,從結果看模型預測效果還是非常不錯的,首先利用標註系統進行人工標註初始數據集、下載數據集,然後再進行數據集的準備,接著進行模型的編碼、訓練和測試,然後利用訓練出來的模型進行數據預測,通過人工判斷修正再把加入到訓練集中,從而低時間成本、高效率增加訓練數據量。


六、總結

    大家好,我是Snowball。這幾篇文章,整個過程下來,讀者就會熟悉到CNN神經網絡在圖片特徵提取的魅力之處,其原理還是利用概率論、機器學習知識,在多層CNN模型下,通過多層感知機的激活函數、隨機梯度下降法、損失函數、反向傳播等機制進行複雜非線性模型參數的調節,使得訓練處理的模型概率分布儘可能接近人腦中標註數據的概率模型。

    當然,讀者看到這裡覺得這裡面還有很多疑問和問題,請不要氣餒,整個機器學習、神經網絡的知識體系是非常龐大的,從數學理論到計算機算法,再到工程框架,細節一步步被隱藏,請保持好奇心和思考,持續了解和學習,未來可能等知識積累到一定程度,那麼很多問題就會明白和理解。說的東西有點多了,哈哈,總之還是,資訊時代合理利用網際網路上的資源。

    接下來講述最後一部分,下一篇文章奉上。就是所有項目模塊的部署部分,這部分內容不會太難,如果讀者不感興趣可以跳過,可以利用筆者部署到線上的系統進行體驗,伺服器帶寬有限,有資源的讀者可以自己部署一套:線上效果體驗地址

    小夥伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。

------------------- End -------------------

往期精彩文章推薦:

歡迎大家點讚,留言,轉發,轉載,感謝大家的相伴與支持

想加入Python學習群請在後臺回復【入群

萬水千山總是情,點個【在看】行不行

/今日留言主題/

隨便說一兩句吧~~

相關焦點

  • python生成驗證碼→處理驗證碼→建立CNN模型訓練→測試模型準確率→識別驗證碼
    ()四、測試CNN模型的準確率訓練完模型後,就需要對其進行測試,測算出準確率,來評估模型的好壞。、字號、字體顏色等不一樣的驗證碼,識別率恐怕就不那麼樂觀了,那就需要基於那種驗證碼重新訓練神經網絡模型了。
  • 基於 CNN 的驗證碼破解實戰
    ,在工程實踐中為了將數據採集、模擬登錄等一系列操作行為自動化處理就需要處理好驗證碼的識別工作,已有的工作中基於機器學習和深度學習都有很多的工作開展出來,效果也都不錯,今天本文的主要內容就是基於卷積神經網絡CNN模型來構建驗證碼圖片識別模型。
  • 現在開始:用你的Mac訓練和部署一個圖片分類模型
    比如我們訓練模型用的樣本是貓啊狗啊,那模型能學到的認識的就是貓啊狗啊, 如果用的訓練樣本是按鈕啊搜索框啊,那模型能學到的認識的就是這個按鈕啊搜索框啊。如果想了解用機器學習是怎麼解決實際問題的,可以看這篇:如何使用深度學習識別UI界面組件?
  • CNN系列-神經網絡模型結構設計的演變和理解
    思路一:加深加寬想提升網絡精度,最樸素的方法就是加深加寬網絡,提升模型複雜度來增強擬合能力。但會存在兩個問題:一是容易過擬合,測試集不準;二是梯度容易不穩定,模型難訓練。所以早期的alexnet、inception、resnet研究各種方法在模型加寬加深的防止模型過擬合和梯度不穩定等。思路二:網絡優化如果不加寬加深,則需要進一步優化現有網絡的性能。那該怎麼優化呢?
  • 獨家實踐 | 使用最新發布的 AllenNLP 訓練一個詞性標註模型
    在本教程中,我會帶領大家使用AllenNLP構建一個詞性標註模型,從搭建網絡到訓練以及評估,整個流程都非常簡單,由此也看出 AllenNLP 是非常實用的 NLP 工具包。本期內容:使用 AllenNLP 訓練一個詞性標註模型評估模型使用模型進行詞性預測下期預告附錄一:筆者在安裝 AllenNLP 時遇到的坑
  • 目標檢測模型從訓練到部署!
    上篇我們講到如何部署一個基礎CNN分類模型來識別數字,本篇更進一步,將帶你訓練一個手勢檢測器,並將其部署到嵌入式設備上。;大概二十分鐘後,模型就訓練好了,點擊Download下載訓練的模型。模型訓練好的Python代碼還需要微調,這裡筆者已經調試好公布在託管的倉庫裡,大家可以直接拷貝到內存卡,或者串口連接使用。下面介紹如何將訓練的模型部署到最終的硬體設備中。
  • 自製人臉數據,利用keras庫訓練人臉識別模型
    最終,大腦利用一種我們目前尚未知曉的機制建立了一個成熟、可靠的聲音分類模型,於是孩子們學會了說話。機器學習也是如此,要想識別出這張人臉屬於誰,我們同樣需要大量的本人和其他人的人臉數據,然後將這些數據輸入Tensorflow這樣的深度學習(深度學習指的是深度神經網絡學習,乃機器學習分支之一)框架,利用深度學習框架建立屬於我們自己的人臉分類模型。
  • 學習用 Keras 搭建 CNN RNN 等常用神經網絡
    , 用他來組件一個神經網絡更加快速, 幾條語句就搞定了.今天來對比學習一下用 Keras 搭建下面幾個常用神經網絡:回歸RNN回歸分類CNN分類RNN分類自編碼分類它們的步驟差不多是一樣的:[導入模塊並創建數據][建立模型][定義優化器][激活模型][訓練模型]
  • 本周優秀開源項目分享:基於yolov3的輕量級人臉檢測、增值稅發票OCR識別 等8大項目
    它是對先前版本Detectron的完全重寫,它源自maskrcnn-benchmark。可用作庫來支持基於它的不同項目。我們將以這種方式開源更多的研究項目。訓練得更快。通常會根據對ImageNet分類任務進行預訓練的骨幹模型進行初始化。提供以下主幹模型:R-50.pkl:MSRA原始ResNet-50模型的轉換副本。R-101.pkl:MSRA原始ResNet-101模型的轉換副本。
  • 基於孿生神經網絡的人臉識別(1)——人臉檢測
    此示例代碼來源github,以此代碼為基礎,重新訓練人臉檢測模型,增加孿生神經網絡部分,所有展示部分代碼不用於ARM移植,僅作為開發主機的模型訓練、測試、評估。最終訓練的模型和業務邏輯需要在晶晨官方的NSDK下轉換,並使用C/C++重新實現。
  • 自動化腳本無法處理驗證碼?Python圖片識別庫Tesseract實戰
    在Ui測試的時候,有時我們會遇到」元素以圖片的形式展示內容」(最經典的案例使驗證碼).這時傳統的文檔解析方案就失效了.但是,Python中你可以輕易的使用ocr(光學字符識別)技術.對圖片元素中的文字進行提取.從而解決技術難題.具體需要以下3步:①安裝Tesseract-ocr服務②安裝pytesseract-python驅動庫③識別圖片①Tesseract是一款由Google贊助的開源OCR。
  • 加速深度學習在線部署,TensorRT安裝及使用教程
    但在部署推理時,為了降低成本,往往使用單個GPU機器甚至嵌入式平臺(比如 NVIDIA Jetson)進行部署,部署端也要有與訓練時相同的深度學習環境,如caffe,TensorFlow等。由於訓練的網絡模型可能會很大(比如,inception,resnet等),參數很多,而且部署端的機器性能存在差異,就會導致推理速度慢,延遲高。
  • Python人臉微笑識別2-----Ubuntu16.04基於Tensorflow卷積神經網絡模型訓練
    上次博客,我們在Ubuntu16.04上進行dlib模型訓練進行人臉微笑識別檢測。二、Python代碼實現Tensorflow神經網絡模型訓練1、創建模型訓練train.py文件1)、創建訓練模型文件cd ~/lenovo/Smile-Pythontouch train.py2、Tensorflow神經網絡模型訓練1)、導入需要的庫import kerasimport os
  • 基於yolo5工地安全帽和禁入危險區域識別系統,附數據集
    就業班學習視頻,從入門到實戰項目2019最新《PyTorch自然語言處理》英、中文版PDF+源碼《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼PyTorch
  • Python 實現 BP 神經網絡
    多層前向神經網絡由三部分組成:輸出層、隱藏層、輸出層,每層由單元組成;輸入層由訓練集的實例特徵向量傳入,經過連接結點的權重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個數是任意的,輸入層只有一層,輸出層也只有一層;除去輸入層之外,隱藏層和輸出層的層數和為n,則該神經網絡稱為n層神經網絡,如下圖為2層的神經網絡;一層中加權求和,根據非線性方程進行轉化輸出
  • 經典神經網絡 | fast rcnn目標檢測算法詳解
    先要fine tuning一個預訓練的網絡,然後針對每個類別都訓練一個SVM分類器,最後還要用regressors對bounding-box進行回歸,另外region proposal也要單獨用selective search的方式獲得,步驟比較繁瑣。
  • TensorFlow自動識別驗證碼(二)
    0X000 前言在 使用tensorflow自動識別驗證碼(一) 這篇文章中,對使用tensorflow自動識別驗證碼的過程做了簡單的了解和編寫
  • 樹莓派不用吃灰了,部署個智能識別模型玩玩
    本項目以ssd_mobilenet_v1_voc算法為例,詳細介紹了從準備數據集、到模型訓練,並將模型部署到樹莓派的全過程。
  • C++實現yolov5的OpenVINO部署
    [GiantPandaCV導語] 本文介紹了一種使用c++實現的,使用OpenVINO部署yolov5的方法。此方法在2020年9月結束的極市開發者榜單中取得後廚老鼠識別賽題第四名。2020年12月,注意到yolov5有了許多變化,對部署流程重新進行了測試,並進行了整理。希望能給需要的朋友一些參考,節省一些踩坑的時間。模型訓練1.
  • 人工智慧|深度學習-圖片數據標註
    若想要用深度學習神經網絡做物體檢測,則,在網絡模型的訓練階段往往需要大量的訓練數據,即標註數據,因此誕生了MNIST數據集(手寫數字:60000個訓練樣本|10000個測試樣本×28*28Pixels)、ImageNet數據集(1400多萬張圖片|2萬多類別)、COCO數據集(300000+張照片|80多類別)、PASCAL VOC