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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习)

發布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

基礎理論

一、生成驗證碼數據集

1、生成驗證碼訓練集

1-0、判斷文件夾是否為空

1-1、創建字符集(數字、大小寫英文字母)

1-2、隨機生成驗證碼(1000個,長度為4)

2、生成驗證碼測試集

代碼

二、獲取數據(訓練集、測試集)

1、獲取數據和標簽

1-1、獲取訓練集數據和標簽(路徑和標簽)

1-2、獲取測試集數據和標簽(路徑和標簽)

1-3、數據組合(圖像路徑和標簽)

2、打亂數據

3、處理每條數據

4、自定義重復周期和批次大小

5、處理每批數據

6、獲取一批次數據和標簽

三、創建神經網絡

1、創建50層殘差神經網絡

2、設置輸入層

3、平均池化(壓縮數據)

4、配置多個輸出層(多任務學習)

5、配置模型

6、編譯(多任務學習)

7、回調函數配置

8、訓練模型

總代碼


基礎理論

????????多任務學習(Multi-task Learning)是深度學習中很常用的一種模型訓練策略,意思其實也很簡單,就是同時訓練多個任務,給大家舉兩個例子大家就明白了。比如目標檢測項目中,我們既要知道1、目標所在的位置(也就是預測框坐標值),也要知道2、預測框內是什么物體預測框的坐標值是連續型數據,所以是一個回歸任務預測框的物體是一個具體的類別,所以是一個分類任務

?

????????不同的任務其實也可以共享卷積層。因為卷積層的作用主要是特征提取,先提取圖像的特征,然后再使用這些特征來預測人的年齡,表情,性別。用于特征提取的卷積層可以共享,不過不同的任務還需要有自己的 task layer,專門用于訓練特定任務

????????我們要識別的驗證碼有 4 個字符,我們可以給模型定義 4 個任務,每個任務負責識別 1 個字符。第一個任務識別第一個字符,第二個任務識別第二個字符,第三個任務識別第三個字符,第四個任務識別第四個字符。

一、生成驗證碼數據集

1、生成驗證碼訓練集

1-0、判斷文件夾是否為空

    if not os.listdir('D:\\Study\\AI\OpenCV\\draft.py\\captcha\\train'):Create_train_data()     # 生成驗證碼訓練集

1-1、創建字符集(數字、大小寫英文字母)

# 1、創建字符集(字符包含所有數字和所有大小寫英文字母,一共62(10+26+26)個)characters = string.digits + string.ascii_letters#            數字             英文字母(大小寫)

得到如下數據:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

1-2、隨機生成驗證碼(1000個,長度為4)

# 2、隨機產生驗證碼(共1000個,每個長度為4)for i in range(1000):verification_list = []

1、生成隨機字符:

# 2-1、開始生產隨機字符(4位)for j in range(4):c = random.choice(characters)   # 隨機選擇(從characters里面隨機抽取)verification_list.append(c)

2、實例化驗證碼生成器:

# 2-2、實例化驗證碼生成器image = ImageCaptcha(width=160, height=60)  # 寬:160,高:60

3、連接列表字符(轉字符串)

# 2-3、連接列表字符verification_list = ''.join(verification_list)

4、生成驗證碼

# 2-4、生成驗證碼image.write(verification_list, 'captcha/train/' + verification_list + '.jpg')

2、生成驗證碼測試集

過程同上,測試集數據不需要那么多,把1000張換成200張即可。

代碼

# 創建訓練集(驗證碼)
def Create_train_data():# 1、創建字符集(字符包含所有數字和所有大小寫英文字母,一共62(10+26+26)個)characters = string.digits + string.ascii_letters#            數字             英文字母(大小寫)# 2、隨機產生驗證碼(共1000個,每個長度為4)for i in range(1000):verification_list = []# 2-1、開始生產隨機字符(4位)for j in range(4):c = random.choice(characters)   # 隨機選擇(從characters里面隨機抽取)verification_list.append(c)# 2-2、實例化驗證碼生成器image = ImageCaptcha(width=160, height=60)  # 寬:160,高:60# 2-3、連接列表字符verification_list = ''.join(verification_list)# 2-4、生成驗證碼image.write(verification_list, 'captcha/train/' + verification_list + '.jpg')# 創建測試集(驗證碼)
def Create_test_data():# 1、創建字符集(字符包含所有數字和所有大小寫英文字母,一共62(10+26+26)個)characters = string.digits + string.ascii_letters#            數字             英文字母(大小寫)# 2、隨機產生驗證碼(共200個,每個長度為4)for i in range(200):verification_list = []# 2-1、開始生產隨機字符(4位)for j in range(4):c = random.choice(characters)   # 隨機選擇(從characters里面隨機抽取)verification_list.append(c)# 2-2、實例化驗證碼生成器image = ImageCaptcha(width=160, height=60)  # 寬:160,高:60# 2-3、連接列表字符verification_list = ''.join(verification_list)# 2-4、生成驗證碼image.write(verification_list, 'captcha/test/' + verification_list + '.jpg')

二、獲取數據(訓練集、測試集)

1、獲取數據和標簽

1-1、獲取訓練集數據和標簽(路徑和標簽)

# 1-1、獲取訓練集數據和標簽(路徑和標簽)train_data, train_target = get_filenames_and_classes("./captcha/train/")# 1000張圖片,長度4

獲取所有圖片路徑,標簽轉獨熱編碼 :

# 獲取所有驗證碼圖片路徑和標簽
def get_filenames_and_classes(dataset_dir):# 圖片路徑和標簽paths ,targets = [], []# 獲取每個圖片的路徑和標簽for filename in os.listdir(dataset_dir):# 1、獲取文件路徑path = os.path.join(dataset_dir, filename)
#                           路徑          文件名# 完成1:保存圖片路徑paths.append(path)# 2、獲取驗證碼標簽(取文件名的前 4 位,也就是驗證碼的標簽)target = filename[0:4]# 定義一個空label(獲取4*62的數組,用0填充)label = np.zeros((4, classes_num), dtype=np.uint8)# 3、標簽轉獨熱編碼for i, ch in enumerate(target):# i:索引 ch:字符# 標記(設置標簽):獨熱編碼 one-hot 格式label[i, characters.find(ch)] = 1#    數組索引 字符下標(字符ch在characters中的下標)# 完成2:保存獨熱編碼的標簽targets.append(label)# 返回圖片路徑和標簽return np.array(paths), np.array(targets)

?

1-2、獲取測試集數據和標簽(路徑和標簽)

# 1-2、獲取測試集數據和標簽(路徑和標簽)test_data, test_target = get_filenames_and_classes("./captcha/test/")   # 200張圖片,長度4

獲取數據函數同上。

1-3、數據組合(圖像路徑和標簽)

# 1-3、數據組合(圖像路徑和標簽)     (創建 dataset 對象,傳入圖片路徑和標簽)dataset_train = tf.data.Dataset.from_tensor_slices((train_data, train_target))dataset_test = tf.data.Dataset.from_tensor_slices((test_data, test_target))

2、打亂數據

# 2、打亂數據dataset_train = dataset_train.shuffle(buffer_size=100, reshuffle_each_iteration=True)  # map-可以自定義一個函數來處理每一條數據dataset_test = dataset_test.shuffle(buffer_size=20, reshuffle_each_iteration=True)#                                     數據緩沖器大小     隨機打亂(是/否)

3、處理每條數據

# 3、對每條數據進行處理(圖像地址->3通道圖像->歸一化)dataset_train = dataset_train.map(image_function)dataset_test = dataset_test.map(image_function)# map函數:可以自定義一個函數來處理每一條數據

4、自定義重復周期和批次大小

# 4、自定義重復周期和批次大小dataset_train = dataset_train.repeat(1)         # 數據重復生成 1 個周期dataset_test = dataset_test.repeat(1)           # 數據重復生成 1 個周期dataset_train = dataset_train.batch(64)         # 定義批次大小64dataset_test = dataset_test.batch(64)           # 定義批次大小64

5、處理每批數據

# 5、處理每批數據# 注意這個 map 和前面的 map 有所不同,第一個 map 在 batch 之前,所以是處理每一條數據# 這個 map 在 batch 之后,所以是處理每一個 batch 的數據dataset_train = dataset_train.map(label_function)dataset_test = dataset_test.map(label_function)

6、獲取一批次數據和標簽

# 獲取一批數據和標簽trainx, trainy = next(iter(dataset_train))testx, testy = next(iter(dataset_test))

?數據(歸一化后的):

標簽(獨熱編碼):

三、創建神經網絡

1、先配置好50層殘差神經網絡

2、(用已配置好的殘差神經網絡)配置輸入層

3、把配置好的輸入層池化

4、(用池化后的結果)配置多個輸出層(多任務學習)

5、(用輸入層的shape和輸出層)配置模型

# 三、構造神經網絡Create_Network()

1、創建50層殘差神經網絡

先配置好50層殘差神經網絡。?

# 1、構造resnet50神經網絡(50層殘差網絡)resnet50 = ResNet50(weights='imagenet', include_top=False, input_shape=(height, width, 3))  # 設置輸入# weights:權重(imagenet:加載預訓練權重)# include_top:是否保留頂層的全連接網絡# input_shape:指明輸入圖片的shape,僅當include_top=False有效

2、設置輸入層

用已配置好的殘差神經網絡配置輸入層。?

# 2、設置輸入層inputs = Input((height, width, 3))  # 設置輸入層大小x = resnet50(inputs)  # 使用 resnet50 進行特征提取

3、平均池化(壓縮數據)

平均池化,對輸入層的進行壓縮。

# 3、平均池化(壓縮數據)x = GlobalAvgPool2D()(x)

4、配置多個輸出層(多任務學習)

用池化后的結果配置多個輸出層(多任務學習)。?

多任務學習,把驗證碼識別的4個字符看成是4個不同的任務,每個任務負責識別1個字符。(4個任務,設置4個輸出層

# 4、配置輸出層(多任務學習)# 把驗證碼識別的4個字符看成是4個不同的任務,每個任務負責識別1個字符x0 = Dense(classes_num, activation='softmax', name='out0')(x)x1 = Dense(classes_num, activation='softmax', name='out1')(x)x2 = Dense(classes_num, activation='softmax', name='out2')(x)x3 = Dense(classes_num, activation='softmax', name='out3')(x)

5、配置模型

用輸入層的shape和輸出層配置模型。?

# 5、配置模型(輸入層、輸出層)model = Model(inputs, [x0, x1, x2, x3])

6、編譯(多任務學習)

損失函數、權重、優化器、監視等等設置。

# 6、編譯(多任務學習)(損失函數、權重、優化器、監視等等設置)# (4個任務我們可以定義4個loss)model.compile(loss={'out0': 'categorical_crossentropy','out1': 'categorical_crossentropy','out2': 'categorical_crossentropy','out3': 'categorical_crossentropy'},loss_weights={'out0': 1, 'out1': 1, 'out2': 1, 'out3': 1},optimizer=SGD(lr=0.01, momentum=0.9),metrics=['acc'])# loss:損失函數    loss_weights:權重    optimizer:優化器(lr:學習率;momentum:帶動量的梯度下降)# metrics:監視(acc)

7、回調函數配置

 # 7、回調函數(停止訓練、保存數據、保存模型、調整學習率)callbacks = [EarlyStopping(monitor='val_loss', patience=6, verbose=1),CSVLogger('Captcha_tfdata.csv'),ModelCheckpoint('Best_Captcha_tfdata.h5', monitor='val_loss', save_best_only=True),ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)]# monitor='val_loss':監控指標'val_loss'# EarlyStopping:讓模型停止(6個周期,val_loss沒有下降則訓練結束)# CSVLogger: 保存訓練數據# ModelCheckpoint:保存模型(保存所有訓練周期中val_loss最低的模型)# ReduceLROnPlateau 學習率調整,連續3個周期,val_loss沒有下降,則當前學習率乘以0.1

8、訓練模型

# 8、訓練模型model.fit(x=dataset_train, epochs=epochs, validation_data=dataset_test, callbacks=callbacks)

訓練效果:

第一次:

第12次:

????????雖說沒有完全訓練完,但是可以看到,第12次平均每個字符的正確率已經可以達到99%+了,效果挺好的。?

總代碼

# 驗證碼生成與識別
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'import tensorflow as tf
from tensorflow.keras.layers import Dense,GlobalAvgPool2D,Input
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.models import Model
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.callbacks import EarlyStopping,CSVLogger,ModelCheckpoint,ReduceLROnPlateau
import string
import numpy as np
import os
import random
from captcha.image import ImageCaptcha
from plot_model import plot_model# 字符包含所有數字和所有小寫英文字母,一共 62 個
characters = string.digits + string.ascii_letters
#            數字             字母# 類別數(62)
classes_num = len(characters)
# 周期數
epochs = 100# 圖片寬度
width = 160
# 圖片高度
height = 60# 創建訓練集(驗證碼)
def Create_train_data():# 1、創建字符集(字符包含所有數字和所有大小寫英文字母,一共62(10+26+26)個)characters = string.digits + string.ascii_letters#            數字             英文字母(大小寫)# 2、隨機產生驗證碼(共1000個,每個長度為4)for i in range(1000):verification_list = []# 2-1、開始生產隨機字符(4位)for j in range(4):c = random.choice(characters)   # 隨機選擇(從characters里面隨機抽取)verification_list.append(c)# 2-2、實例化驗證碼生成器image = ImageCaptcha(width=160, height=60)  # 寬:160,高:60# 2-3、連接列表字符verification_list = ''.join(verification_list)# 2-4、生成驗證碼image.write(verification_list, 'captcha/train/' + verification_list + '.jpg')# 創建測試集(驗證碼)
def Create_test_data():# 1、創建字符集(字符包含所有數字和所有大小寫英文字母,一共62(10+26+26)個)characters = string.digits + string.ascii_letters#            數字             英文字母(大小寫)# 2、隨機產生驗證碼(共200個,每個長度為4)for i in range(200):verification_list = []# 2-1、開始生產隨機字符(4位)for j in range(4):c = random.choice(characters)   # 隨機選擇(從characters里面隨機抽取)verification_list.append(c)# 2-2、實例化驗證碼生成器image = ImageCaptcha(width=160, height=60)  # 寬:160,高:60# 2-3、連接列表字符verification_list = ''.join(verification_list)# 2-4、生成驗證碼image.write(verification_list, 'captcha/test/' + verification_list + '.jpg')# 獲取所有驗證碼圖片路徑和標簽
def get_filenames_and_classes(dataset_dir):# 圖片路徑和標簽paths ,targets = [], []# 獲取每個圖片的路徑和標簽for filename in os.listdir(dataset_dir):# 1、獲取文件路徑path = os.path.join(dataset_dir, filename)
#                           路徑          文件名# 完成1:保存圖片路徑paths.append(path)# 2、獲取驗證碼標簽(取文件名的前 4 位,也就是驗證碼的標簽)target = filename[0:4]# 定義一個空label(獲取4*62的數組,用0填充)label = np.zeros((4, classes_num), dtype=np.uint8)# 3、標簽轉獨熱編碼for i, ch in enumerate(target):# i:索引 ch:字符# 標記(設置標簽):獨熱編碼 one-hot 格式label[i, characters.find(ch)] = 1#    數組索引 字符下標(字符ch在characters中的下標)# 完成2:保存獨熱編碼的標簽targets.append(label)# 返回圖片路徑和標簽return np.array(paths), np.array(targets)# 圖像處理函數
# 輸入:圖像路徑、標簽
# 輸出:圖像、標簽
def image_function(filenames, label):# 1、根據圖片路徑讀取圖片內容image = tf.io.read_file(filenames)# 2、解碼為jpeg格式、3通道(正規圖像)image = tf.image.decode_jpeg(image, channels=3)# 3、歸一化image = tf.cast(image, tf.float32) / 255.0# 返回圖片數據和標簽return image, label# 標簽處理函數
# 獲得每一個批次的圖片數據和標簽
def label_function(image, label):# transpose 改變數據的維度,比如原來的數據 shape 是(64,4,62)# 這里的 64 是批次大小,驗證碼長度為 4 有 4 個標簽,62 是 62 個不同的字符# tf.transpose(label,[1,0,2])計算后得到的 shape 為(4,64,62)# 原來的第 1 個維度變成了第 0 維度,原來的第 0 維度變成了 1 維度,第 2 維不變# (64,4,62)->(4,64,62)label = tf.transpose(label, [1, 0, 2])# 返回圖片內容和標簽,注意這里標簽的返回,我們的模型會定義 4 個任務,所以這里返回 4 個標簽# 每個標簽的 shape 為(64,62),64 是批次大小,62 是獨熱編碼格式的標簽return image, (label[0], label[1], label[2], label[3])# 獲取數據(訓練集、測試集)
def GetData():global dataset_train, dataset_test# 1、獲取數據和標簽# 1-1、獲取訓練集數據和標簽(路徑和標簽)train_data, train_target = get_filenames_and_classes("./captcha/train/")# 1000張圖片,長度4# 1-2、獲取測試集數據和標簽(路徑和標簽)test_data, test_target = get_filenames_and_classes("./captcha/test/")   # 200張圖片,長度4# 1-3、數據組合(圖像路徑和標簽)     (創建 dataset 對象,傳入圖片路徑和標簽)dataset_train = tf.data.Dataset.from_tensor_slices((train_data, train_target))dataset_test = tf.data.Dataset.from_tensor_slices((test_data, test_target))# 2、打亂數據dataset_train = dataset_train.shuffle(buffer_size=100, reshuffle_each_iteration=True)  # map-可以自定義一個函數來處理每一條數據dataset_test = dataset_test.shuffle(buffer_size=20, reshuffle_each_iteration=True)#                                     數據緩沖器大小     隨機打亂(是/否)# 3、對每條數據進行處理(圖像地址->3通道圖像->歸一化)dataset_train = dataset_train.map(image_function)dataset_test = dataset_test.map(image_function)# map函數:可以自定義一個函數來處理每一條數據# 4、自定義重復周期和批次大小dataset_train = dataset_train.repeat(1)         # 數據重復生成 1 個周期dataset_test = dataset_test.repeat(1)           # 數據重復生成 1 個周期dataset_train = dataset_train.batch(64)         # 定義批次大小64dataset_test = dataset_test.batch(64)           # 定義批次大小64# 5、處理每批數據# 注意這個 map 和前面的 map 有所不同,第一個 map 在 batch 之前,所以是處理每一條數據# 這個 map 在 batch 之后,所以是處理每一個 batch 的數據dataset_train = dataset_train.map(label_function)dataset_test = dataset_test.map(label_function)# 獲取一批次數據和標簽trainx, trainy = next(iter(dataset_train))testx, testy = next(iter(dataset_test))# print(trainx)# print(trainy)# print(testx)# print(testy)# 創建神經網絡
def Create_Network():# 1、構造resnet50神經網絡(50層殘差網絡)resnet50 = ResNet50(weights='imagenet', include_top=False, input_shape=(height, width, 3))  # 設置輸入# weights:權重(imagenet:加載預訓練權重)# include_top:是否保留頂層的全連接網絡# input_shape:指明輸入圖片的shape,僅當include_top=False有效# 2、設置輸入層inputs = Input((height, width, 3))  # 設置輸入層大小x = resnet50(inputs)  # 使用 resnet50 進行特征提取# 3、平均池化(壓縮數據)x = GlobalAvgPool2D()(x)# 4、配置輸出層(多任務學習)# 把驗證碼識別的4個字符看成是4個不同的任務,每個任務負責識別1個字符x0 = Dense(classes_num, activation='softmax', name='out0')(x)x1 = Dense(classes_num, activation='softmax', name='out1')(x)x2 = Dense(classes_num, activation='softmax', name='out2')(x)x3 = Dense(classes_num, activation='softmax', name='out3')(x)# 5、配置模型(輸入層、輸出層)model = Model(inputs, [x0, x1, x2, x3])# 6、編譯(多任務學習)(損失函數、權重、優化器、監視等等設置)# (4個任務我們可以定義4個loss)model.compile(loss={'out0': 'categorical_crossentropy','out1': 'categorical_crossentropy','out2': 'categorical_crossentropy','out3': 'categorical_crossentropy'},loss_weights={'out0': 1, 'out1': 1, 'out2': 1, 'out3': 1},optimizer=SGD(lr=0.01, momentum=0.9),metrics=['acc'])# loss:損失函數    loss_weights:權重    optimizer:優化器(lr:學習率;momentum:帶動量的梯度下降)# metrics:監視(acc)# 7、回調函數(停止訓練、保存數據、保存模型、調整學習率)callbacks = [EarlyStopping(monitor='val_loss', patience=6, verbose=1),CSVLogger('Captcha_tfdata.csv'),ModelCheckpoint('Best_Captcha_tfdata.h5', monitor='val_loss', save_best_only=True),ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)]# monitor='val_loss':監控指標'val_loss'# EarlyStopping:讓模型停止(6個周期,val_loss沒有下降則訓練結束)# CSVLogger: 保存訓練數據# ModelCheckpoint:保存模型(保存所有訓練周期中val_loss最低的模型)# ReduceLROnPlateau 學習率調整,連續3個周期,val_loss沒有下降,則當前學習率乘以0.1# 8、訓練模型model.fit(x=dataset_train, epochs=epochs, validation_data=dataset_test, callbacks=callbacks)if __name__ == '__main__':# 一、創建驗證碼數據集# 判斷訓練集文件夾是否為空if not os.listdir('D:\\Study\\AI\OpenCV\\draft.py\\captcha\\train'):Create_train_data()     # 生成驗證碼訓練集# 判斷測試集文件夾是否為空if not os.listdir('D:\\Study\\AI\OpenCV\\draft.py\\captcha\\test'):Create_test_data()      # 生成驗證碼測試集# 二、獲取數據GetData()# 三、構造神經網絡Create_Network()

總結

以上是生活随笔為你收集整理的深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。