0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用TensorFlow 2識別驗證碼過程中踩過的坑

Tensorflowers ? 來源:TensorFlow ? 作者:TensorFlow ? 2020-10-22 16:47 ? 次閱讀

在學(xué)習(xí)了 CNN 之后,我一直想去做一個驗證碼識別。網(wǎng)上找了很多資料,雜七雜八的一大堆,但是好多是 tf1 寫的。我對 tf1 不太熟悉,于是自己開始了基于 TensorFlow 2 的摸索實踐。

摸索的過程異常艱難,一開始我直接用 captcha 生成了 10080 張驗證碼去識別,發(fā)現(xiàn) loss 一直停留在 2.3 左右,accuracy 一直是 0.1 左右,訓(xùn)練了 100 回合,也沒什么提升,電腦都快要跑廢了,咋辦呀?于是網(wǎng)上各種問大佬,找到機會就提問,其中一位大佬的回答讓我受到了啟發(fā),他說:你可以先識別 1 位,然后 2 位,3 位,最后 4 位,一步一步來……。

本文主要描述我在驗證碼識別過程中的一些摸索,整理出來以供大家參考:

第一回:搭建網(wǎng)絡(luò)結(jié)構(gòu)

首先我們需要搭建網(wǎng)絡(luò)結(jié)構(gòu),如下:

model=tf.keras.models.Sequential([ tf.keras.Input(shape=(H, W, C)), layers.Conv2D(32, 3, activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, 3, activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, 3, activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, 3, activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, 3, activation='relu'), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(1024, activation='relu'), layers.Dense(D * N_LABELS, activation='softmax'), layers.Reshape((D, N_LABELS)), ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics= ['accuracy']) callbacks=[ tf.keras.callbacks.TensorBoard(log_dir='logs'), tf.keras.callbacks.ModelCheckpoint(filepath=check_point_path, save_weights_only=True, save_best_only=True) ] history = model.fit(train_gen, steps_per_epoch=len(train_idx)//batch_size, epochs=100, callbacks=callbacks, validation_data=valid_gen, validation_steps=len(valid_idx)//valid_batch_size)

summary:

我的訓(xùn)練數(shù)據(jù)量:train count: 7408, valid count: 3176, test count: 4536

樣本圖:

訓(xùn)練結(jié)果:

Train for 231 steps, validate for 99 steps Epoch 1/100 1/231 […] - ETA: 4:18 - loss: 2.2984 - accuracy: 0.1328 231/231 [==============================] - 143s 618ms/step - loss: 2.3032 - accuracy: 0.0971 - val_loss: 2.3029 - val_accuracy: 0.0987 Epoch 2/100 230/231 [============================>.] - ETA: 0s - loss: 2.3026 - accuracy: 0.1014 231/231 [==============================] - 121s 525ms/step - loss: 2.3026 - accuracy: 0.1013 - val_loss: 2.3031 - val_accuracy: 0.0986 Epoch 3/100 230/231 [============================>.] - ETA: 0s - loss: 2.3026 - accuracy: 0.1029 231/231 [==============================] - 138s 597ms/step - loss: 2.3026 - accuracy: 0.1026 - val_loss: 2.3032 - val_accuracy: 0.0986 Epoch 4/100 230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1031 231/231 [==============================] - 124s 537ms/step - loss: 2.3025 - accuracy: 0.1031 - val_loss: 2.3032 - val_accuracy: 0.0987 Epoch 5/100 230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1040 231/231 [==============================] - 123s 532ms/step - loss: 2.3025 - accuracy: 0.1039 - val_loss: 2.3032 - val_accuracy: 0.0989 Epoch 6/100 230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1039 231/231 [==============================] - 118s 509ms/step - loss: 2.3025 - accuracy: 0.1038 - val_loss: 2.3033 - val_accuracy: 0.0988 … Epoch 20/100 230/231 [============================>.] - ETA: 0s - loss: 2.3025 - accuracy: 0.1038 231/231 [==============================] - 120s 521ms/step - loss: 2.3025 - accuracy: 0.1038 - val_loss: 2.3034 - val_accuracy: 0.0988 Epoch 21/100 190/231 [=======================>…] - ETA: 20s - loss: 2.3025 - accuracy: 0.1032

loss 一直沒有變化,accuracy 也很低,不知道出現(xiàn)了什么原因,困擾一兩個星期,都想要放棄了,太難了。但是我不死心,非要把它搞出來,4 位識別不出來,能不能先識別一位呢?好,那就開始搞,一位比較簡單,跟 Mnist 數(shù)據(jù)集很相似,在這我就不贅述了。

第二回:2 位彩色驗證碼訓(xùn)練

接著來識別 2 位的驗證碼。train count: 441, valid count: 189, test count: 270

樣本圖:

下面是我用 2 位驗證碼進(jìn)行訓(xùn)練的結(jié)果:

30 張圖片進(jìn)行測試,結(jié)果:

哎呦,有感覺了,有了起色了,但是出現(xiàn)了過擬合的現(xiàn)象,解決過擬合的方法主要有:

Get more training data

Reduce the capacity of the network

Add weight regularization

Add dropout

Data-augmentation

Batch normalization

第三回:增加彩色驗證碼數(shù)據(jù)集

于是我就增加了數(shù)據(jù)集。train count: 4410, valid count: 1890, test count: 2700

然后又出現(xiàn)了 loss 一直在 2.3,accuracy 在 0.09 左右,這是什么鬼呢?但是我還是不死心呀,繼續(xù)想辦法呀,既然彩色的有難度,我先識別黑白的樣本行不行呢,先試試吧。

第四回:2 位黑白驗證碼訓(xùn)練

網(wǎng)絡(luò)結(jié)構(gòu)依然采用上面的,input_shape(100,120,3)。

這是我用 2 位的黑白圖片的驗證碼進(jìn)行了訓(xùn)練,效果很好,收斂也很快。

訓(xùn)練第 50 回合時:

Epoch 50/50 26/27 [============>…] - ETA: 0s - loss: 0.0150 - accuracy: 0.9940 27/27 [==============] - 8s 289ms/step - loss: 0.0212 - accuracy: 0.9936 - val_loss: 0.2348 - val_accuracy: 0.9446

隨機選取了 30 張圖片進(jìn)行了測試,2 張識別錯了:

樣本圖:

看著這結(jié)果,我露出了潔白的大牙,信心大增呀,繼續(xù)搞,直接上 4 位驗證碼。

第五回:4 位黑白驗證碼訓(xùn)練

依然采用上面的網(wǎng)絡(luò)結(jié)構(gòu),這次使用的是 4 位黑白圖片的驗證碼。train count: 2469, valid count: 1059, test count: 1512

訓(xùn)練第 20 回合:

Epoch 20/20 76/77 [====>.] - ETA: 0s - loss: 0.0409 - accuracy: 0.9860 77/77 [======] - 33s 429ms/step - loss: 0.0408 - accuracy: 0.9861 - val_loss: 0.3283 - val_accuracy: 0.9221

隨機選取 30 張圖片進(jìn)行測試,8 張錯誤:

4 位驗證碼的樣本圖:

從結(jié)果來看,有點過擬合,沒關(guān)系,繼續(xù)加大數(shù)據(jù)集。

第六回:增加黑白驗證碼數(shù)據(jù)集

依舊采用上面的網(wǎng)絡(luò)結(jié)構(gòu),這次我增加了數(shù)據(jù)集 4939 張,依舊使用的是 4 位黑白的驗證碼,訓(xùn)練結(jié)果還是挺好的:train count: 4939, valid count: 2117, test count: 3024

第 20 回合:

Epoch 20/20 153/154 [==>.] - ETA: 0s - loss: 0.0327 - accuracy: 0.9898 154/154 [====] - 75s 488ms/step - loss: 0.0329 - accuracy: 0.9898 - val_loss: 0.1057 - val_accuracy: 0.9740

可以看出 訓(xùn)練集的準(zhǔn)確率 跟驗證集上很接近,隨機選取 30 張圖片進(jìn)行測試,6 張錯誤圖如下:

好了,搞了這么多,由此我覺得是噪點影響了深度學(xué)習(xí)的識別,maxpool 的時候連帶著噪點也采樣了,我們需要將噪點處理掉,再喂入神經(jīng)網(wǎng)絡(luò)。

第七回:預(yù)處理

在上面的推理中,我感覺是噪點影響了神經(jīng)網(wǎng)絡(luò)的識別,于是乎我在送入網(wǎng)絡(luò)之前進(jìn)行了去噪,二值化操作,訓(xùn)練如下:train count: 4939, valid count: 2117, test count: 3024

從圖中可以看出,模型收斂了,但有點過擬合,第 20 回合訓(xùn)練結(jié)果如下:

Epoch 20/20 153/154 [==>.] - ETA: 0s - loss: 0.0407 - accuracy: 0.9861 154/154 [===] - 69s 450ms/step - loss: 0.0408 - accuracy: 0.9860 - val_loss: 0.3227 - val_accuracy: 0.9244

隨機選取了 30 張圖片進(jìn)行了測試,8 張錯誤:

做到這里, 我對之前的推測有了猜疑:是噪點影響的嗎?我覺得不完全是。核心原因是我在嘗試的過程中對驗證碼進(jìn)行了處理,從 RGB 的驗證碼變成了單通道的黑白驗證碼,使得圖片的信息減少了,神經(jīng)網(wǎng)絡(luò)的計算量也大大減少了,網(wǎng)絡(luò)模型很快得到了收斂,loss 顯著減少,accuracy 在不斷提高。

整個過程是使用 CPU 進(jìn)行訓(xùn)練的,電腦配置是 Intel_Corei7-6700HQ_CPU@_2.60GHz,8G 內(nèi)存。如果大家的電腦配置高,用 GPU 進(jìn)行訓(xùn)練,我覺得即使不做預(yù)處理,效果也能出來。


責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cnn
    cnn
    +關(guān)注

    關(guān)注

    3

    文章

    349

    瀏覽量

    21970
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    327

    瀏覽量

    60413
  • 驗證碼
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    4607

原文標(biāo)題:經(jīng)驗總結(jié):使用 TensorFlow 2 識別驗證碼過程中踩過的坑

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    康謀分享 | 在基于場景的AD/ADAS驗證過程中,識別挑戰(zhàn)性場景!

    基于場景的驗證是AD/ADAS系統(tǒng)開發(fā)過程中的重要步驟,然而面對海量駕駛記錄數(shù)據(jù)時,如何實現(xiàn)自動且高效地識別、分類和提取駕駛記錄的挑戰(zhàn)性場景?本文康謀為您介紹IVEX軟件
    的頭像 發(fā)表于 08-28 10:16 ?874次閱讀
    康謀分享 | 在基于場景的AD/ADAS<b class='flag-5'>驗證</b><b class='flag-5'>過程中</b>,<b class='flag-5'>識別</b>挑戰(zhàn)性場景!

    M16連接器12芯采購如何避免

      德索工程師說道在M16連接器12芯的采購過程中,為了避免,確保采購的順利進(jìn)行以及產(chǎn)品的高質(zhì)量,我們可以從以下幾個方面進(jìn)行考慮和規(guī)劃:
    的頭像 發(fā)表于 06-07 17:46 ?695次閱讀
    M16連接器12芯采購如何避免<b class='flag-5'>踩</b><b class='flag-5'>坑</b>

    痛苦“電池電壓偵測電路”,含淚總結(jié)設(shè)計要點

    和大家分享這個電路的設(shè)計要點,以及當(dāng)時的設(shè)計失誤,幫助大家積累經(jīng)驗,以后不要這種。 設(shè)計要點一:設(shè)定分壓電阻的大小 這種便攜式掌上閱讀器,當(dāng)然是內(nèi)置鋰電池的:
    的頭像 發(fā)表于 04-07 14:31 ?1842次閱讀
    痛苦<b class='flag-5'>踩</b><b class='flag-5'>坑</b>“電池電壓偵測電路”,含淚總結(jié)設(shè)計要點

    基于TensorFlow和Keras的圖像識別

    TensorFlow和Keras最常見的用途之一是圖像識別/分類。通過本文,您將了解如何使用Keras達(dá)到這一目的。定義如果您不了解圖像識別的基本概念,將很難完全理解本文的內(nèi)容。因此在正文開始之前
    的頭像 發(fā)表于 01-13 08:27 ?664次閱讀
    基于<b class='flag-5'>TensorFlow</b>和Keras的圖像<b class='flag-5'>識別</b>

    驗證碼滲透最全總結(jié)

    簡單測試方法,就是看到一個登錄框,然后新建打開圖片鏈接,在圖片鏈接中就有機會看到兩個參數(shù)值,一個是 width,一個是 length。這兩個參數(shù)是計算圖片驗證碼的長寬,如果長寬過高就會過度消耗的是服務(wù)器的 CPU 資源。
    的頭像 發(fā)表于 01-05 11:33 ?570次閱讀
    <b class='flag-5'>驗證碼</b>滲透最全總結(jié)

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-Serverless賬戶驗證碼的問題

    在應(yīng)用/元服務(wù)早期使用過程中,-Serverless賬戶驗證碼的格式是[AGC][應(yīng)用/元服務(wù)名稱],如下圖。 但是,在最近,[應(yīng)用/元服務(wù)]名稱直接變成了【default】,用戶收到這種驗證碼后,心里存有疑慮的,這是哪里配置或
    發(fā)表于 12-27 15:55

    反相輸入放大器的,你沒有?

    反相輸入放大器的,你沒有?
    的頭像 發(fā)表于 12-06 15:35 ?470次閱讀
    反相輸入放大器的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b><b class='flag-5'>過</b>沒有?

    R128點屏筆記

    本文所整理的R128點屏筆記均是在參考以下應(yīng)用開發(fā)案例進(jìn)行屏幕適配時遇到的實際開發(fā)問題,涵蓋了屏幕花屏、屏幕白屏、LVGL顯示顏色錯誤等常見問題的解決方法。
    的頭像 發(fā)表于 12-03 10:17 ?994次閱讀
    R128點屏<b class='flag-5'>踩</b><b class='flag-5'>坑</b>筆記

    關(guān)于圖像傳感器圖像質(zhì)量的四大誤區(qū)!你幾個

    關(guān)于圖像傳感器圖像質(zhì)量的四大誤區(qū)!你幾個?
    的頭像 發(fā)表于 11-27 16:56 ?348次閱讀
    關(guān)于圖像傳感器圖像質(zhì)量的四大誤區(qū)!你<b class='flag-5'>踩</b><b class='flag-5'>過</b>幾個<b class='flag-5'>坑</b>?

    推挽電路的,你沒?

    推挽電路的,你沒?
    的頭像 發(fā)表于 11-24 16:25 ?959次閱讀
    推挽電路的<b class='flag-5'>坑</b>,你<b class='flag-5'>踩</b><b class='flag-5'>過</b>沒?

    SpringBoot分布式驗證碼登錄方案

    傳統(tǒng)的項目大都是基于session交互的,前后端都在一個項目里面,比如傳統(tǒng)的SSH項目或者一些JSP系統(tǒng),當(dāng)前端頁面觸發(fā)到獲取驗證碼請求,可以將驗證碼里面的信息存在上下文中,所以登錄的時候只需要 用戶名、密碼、驗證碼即可。
    的頭像 發(fā)表于 10-12 17:34 ?612次閱讀
    SpringBoot分布式<b class='flag-5'>驗證碼</b>登錄方案

    矩陣按鍵在識別過程中是否要進(jìn)行消抖處理?

    矩陣按鍵在識別過程中是否要進(jìn)行消抖處理
    發(fā)表于 10-11 06:30

    由Java改為 Kotlin過程中遇到的

    Kotlin 過程中遇到的和 Kotlin 的優(yōu)缺點。 環(huán)境和版本 Eclipse Oxygen JDK 8 Kotlin 1.3.0 Gradle 4.6 SpringCloud
    的頭像 發(fā)表于 09-30 16:51 ?708次閱讀
    由Java改為 Kotlin<b class='flag-5'>過程中</b>遇到的<b class='flag-5'>坑</b>

    搭建D1s RT-Smart開發(fā)環(huán)境筆記

    作為一個linux新手想要嘗試RT-Smart的開發(fā),但是網(wǎng)上教程前輩們的linux環(huán)境都是已經(jīng)相對完備的,因此像我這樣新手在搭建環(huán)境時常常缺這缺那的導(dǎo)致報錯,經(jīng)過一段時間的終于搞定了,因此和大家分享我遇到的和解決方法。
    的頭像 發(fā)表于 09-28 16:26 ?691次閱讀
    搭建D1s RT-Smart開發(fā)環(huán)境<b class='flag-5'>踩</b><b class='flag-5'>坑</b>筆記

    Java 驗證碼的使用

    今天我們講一下在 Java 驗證碼的使用。 驗證碼生成 本效果是利用easy-captcha工具包實現(xiàn),首先需要添加相關(guān)依賴到pom.xml,代碼如下: com .github.w
    的頭像 發(fā)表于 09-25 11:11 ?799次閱讀
    Java <b class='flag-5'>中</b><b class='flag-5'>驗證碼</b>的使用