日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

黑科技教你一招如何解除 生活中烦人的验证码问题

發(fā)布時間:2025/4/5 90 豆豆
生活随笔 收集整理的這篇文章主要介紹了 黑科技教你一招如何解除 生活中烦人的验证码问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

驗證碼相信大家都遇到過,不勝其煩的一次次輸入錯誤是不是讓你一度崩潰過,今天就教大家如何用黑科技解決驗證碼的問題。

按照國際慣例,在這里先喂自己袋鹽,可視化(tableau)和畢業(yè)設計(matlab)的小伙伴,可訂閱以下博主精心整理的三個專欄。

tableau可視化數(shù)據(jù)分析高級教程

https://blog.csdn.net/wenyusuran/category_9596753.html

MATLAB深入理解高級教程(附源碼)

https://blog.csdn.net/wenyusuran/category_2239265.html

深度學習100例全系列詳細教程

https://blog.csdn.net/wenyusuran/category_9596890.html

在博主的資源中也有各種算法的應用實例源代碼,需要的小伙伴自取喲。

captcha

captcha 是用 python 寫的生成驗證碼的庫,它支持圖片驗證碼和語音驗證碼,我們使用的是它生成圖片驗證碼的功能。

首先我們設置我們的驗證碼格式為數(shù)字加大寫字母,生成一串驗證碼試試看:

數(shù)據(jù)生成器

訓練模型的時候,我們可以選擇兩種方式來生成我們的訓練數(shù)據(jù),一種是一次性生成幾萬張圖,然后開始訓練,一種是定義一個數(shù)據(jù)生成器,然后利用 fit_generator 函數(shù)來訓練。

第一種方式的好處是訓練的時候顯卡利用率高,如果你需要經(jīng)常調(diào)參,可以一次生成,多次使用;第二種方式的好處是你不需要生成大量數(shù)據(jù),訓練過程中可以利用 CPU 生成數(shù)據(jù),而且還有一個好處是你可以無限生成數(shù)據(jù)。

我們的數(shù)據(jù)格式如下:

X

X 的形狀是 (batch_size, height, width, 3),比如一批生成32個樣本,圖片寬度為170,高度為80,那么形狀就是 (32, 80, 170, 3),取第一張圖就是 X[0]。

y

y 的形狀是四個 (batch_size, n_class),如果轉(zhuǎn)換成 numpy 的格式,則是 (n_len, batch_size, n_class),比如一批生成32個樣本,驗證碼的字符有36種,長度是4位,那么它的形狀就是4個 (32, 36),也可以說是 (4, 32, 36),解碼函數(shù)在下個代碼塊。

上面就是一個可以無限生成數(shù)據(jù)的例子,我們將使用這個生成器來訓練我們的模型。

使用生成器

生成器的使用方法很簡單,只需要用 next 函數(shù)即可。下面是一個例子,生成32個數(shù)據(jù),然后顯示第一個數(shù)據(jù)。當然,在這里我們還對生成的 One-Hot 編碼后的數(shù)據(jù)進行了解碼,首先將它轉(zhuǎn)為 numpy 數(shù)組,然后取36個字符中最大的數(shù)字的位置,因為神經(jīng)網(wǎng)絡會輸出36個字符的概率,然后將概率最大的四個字符的編號轉(zhuǎn)換為字符串。

構(gòu)建深度卷積神經(jīng)網(wǎng)絡

模型結(jié)構(gòu)很簡單,特征提取部分使用的是兩個卷積,一個池化的結(jié)構(gòu),這個結(jié)構(gòu)是學的 VGG16 的結(jié)構(gòu)。之后我們將它 Flatten,然后添加 Dropout ,盡量避免過擬合問題,最后連接四個分類器,每個分類器是36個神經(jīng)元,輸出36個字符的概率。

模型可視化

得益于 Keras 自帶的可視化,我們可以使用幾句代碼來可視化模型的結(jié)構(gòu):

這里需要使用 pydot 這個庫,以及 graphviz 這個庫,在 macOS 系統(tǒng)上安裝方法如下:

brew install graphviz pip install pydot-ng

我們可以看到最后一層卷積層輸出的形狀是 (1, 6, 256),已經(jīng)不能再加卷積層了。

訓練模型

訓練模型反而是所有步驟里面最簡單的一個,直接使用 model.fit_generator 即可,這里的驗證集使用了同樣的生成器,由于數(shù)據(jù)是通過生成器隨機生成的,所以我們不用考慮數(shù)據(jù)是否會重復。注意,這段代碼在筆記本上可能要耗費一下午時間。如果你想讓模型預測得更準確,可以將 nb_epoch改為 10 或者 20,但它也將耗費成倍的時間。注意我們這里使用了一個小技巧,添加 nb_worker=2 參數(shù)讓 Keras 自動實現(xiàn)多進程生成數(shù)據(jù),擺脫 python 單線程效率低的缺點。如果不添加,耗時120秒,添加則只需80秒。

測試模型

當我們訓練完成以后,可以識別一個驗證碼試試看:

計算模型總體準確率

模型在訓練的時候只會顯示第幾個字符的準確率,為了統(tǒng)計模型的總體準確率,我們可以寫下面的函數(shù):

這里用到了一個庫叫做 tqdm,它是一個進度條的庫,為的是能夠?qū)崟r反饋進度。然后我們通過一些 numpy 計算去統(tǒng)計我們的準確率,這里計算規(guī)則是只要有一個錯,那么就不算它對。經(jīng)過計算,我們的模型的總體準確率在經(jīng)過五代訓練就可以達到 90%,繼續(xù)訓練還可以達到更高的準確率。

模型總結(jié)

模型的大小是16MB,在我的筆記本上跑1000張驗證碼需要用20秒,當然,顯卡會更快。對于驗證碼識別的問題來說,哪怕是10%的準確率也已經(jīng)稱得上破解,畢竟假設100%識別率破解要一個小時,那么10%的識別率也只用十個小時,還算等得起,而我們的識別率有90%,已經(jīng)可以稱得上完全破解了這類驗證碼。

改進

對于這種按順序書寫的文字,我們還有一種方法可以使用,那就是循環(huán)神經(jīng)網(wǎng)絡來識別序列。下面我們來了解一下如何使用循環(huán)神經(jīng)網(wǎng)絡來識別這類驗證碼。

CTC Loss

這個 loss 是一個特別神奇的 loss,它可以在只知道序列的順序,不知道具體位置的情況下,讓模型收斂。在這方面百度似乎做得很不錯,利用它來識別音頻信號。(warp-ctc)

那么在 Keras 里面,CTC Loss 已經(jīng)內(nèi)置了,我們直接定義這樣一個函數(shù),即可實現(xiàn) CTC Loss,由于我們使用的是循環(huán)神經(jīng)網(wǎng)絡,所以默認丟掉前面兩個輸出,因為它們通常無意義,且會影響模型的輸出。

  • y_pred 是模型的輸出,是按順序輸出的37個字符的概率,因為我們這里用到了循環(huán)神經(jīng)網(wǎng)絡,所以需要一個空白字符的概念;

  • labels 是驗證碼,是四個數(shù)字;

  • input_length 表示 y_pred 的長度,我們這里是15;

  • label_length 表示 labels 的長度,我們這里是4。

模型結(jié)構(gòu)

我們的模型結(jié)構(gòu)是這樣設計的,首先通過卷積神經(jīng)網(wǎng)絡去識別特征,然后經(jīng)過一個全連接降維,再按水平順序輸入到一種特殊的循環(huán)神經(jīng)網(wǎng)絡,叫 GRU,它具有一些特殊的性質(zhì),為什么用 GRU 而不用 LSTM 呢?總的來說就是它的效果比 LSTM 好,所以我們用它。

模型可視化

可視化的代碼同上,這里只貼圖。

可以看到模型比上一個模型復雜了許多,但實際上只是因為輸入比較多,所以它顯得很大。還有一個值得注意的地方,我們的圖片在輸入的時候是經(jīng)過了旋轉(zhuǎn)的,這是因為我們希望以水平方向輸入,而圖片在 numpy 里默認是這樣的形狀:(height, width, 3),因此我們使用了 transpose 函數(shù)將圖片轉(zhuǎn)為了(width, height, 3)的格式,然后經(jīng)過各種卷積和降維,變成了 (17, 32),這里的每個長度為32的向量都代表一個豎條的圖片的特征,從左到右,一共有17條。然后我們兵分兩路,一路從左到右輸入到 GRU,一路從右到左輸入到 GRU,然后將他們輸出的結(jié)果加起來。再兵分兩路,還是一路正方向,一路反方向,只不過第二次我們直接將它們的輸出連起來,然后經(jīng)過一個全連接,輸出每個字符的概率。

數(shù)據(jù)生成器

評估模型

我們會通過這個函數(shù)來評估我們的模型,和上面的評估標準一樣,只有全部正確,我們才算預測正確,中間有個坑,就是模型最開始訓練的時候,并不一定會輸出四個字符,所以我們?nèi)绻龅剿械淖址疾坏剿膫€的時候,就不計算了,相當于加0,遇到多于4個字符的時候,只取前四個。

評估回調(diào)

因為 Keras 沒有針對這種輸出計算準確率的選項,因此我們需要自定義一個回調(diào)函數(shù),它會在每一代訓練完成的時候計算模型的準確率。

訓練模型

由于 CTC Loss 收斂很慢,所以我們需要設置比較大的代數(shù),這里我們設置了100代,然后添加了一個早期停止的回調(diào)和我們上面定義的回調(diào),但是第一次訓練只訓練37代就停了,測試準確率才95%,我又在這個基礎上繼續(xù)訓練了一次,停在了25代,得到了98%的準確率,所以一共訓練了62代。

測試模型

這次隨機出來的驗證碼很厲害,是O0OP,不過更厲害的是模型認出來了。

有趣的問題

我又用之前的模型做了個測試,對于 O0O0 這樣喪心病狂的驗證碼,模型偶爾也能正確識別,這讓我非常驚訝,它是真的能識別 O 與 0 的差別呢,還是猜出來的呢?這很難說。

總結(jié)

模型的大小是4.7MB,在我的筆記本上跑1000張驗證碼需要用14秒,平均一秒識別71張,估計可以拼過網(wǎng)速。至于深度學習到底能不能識別雙胞胎,相信各位已經(jīng)有了答案。

喜歡博主的小伙伴,請一鍵三連喲。

總結(jié)

以上是生活随笔為你收集整理的黑科技教你一招如何解除 生活中烦人的验证码问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。