驗證碼識別

2021-09-22 10:13:29 字數 4245 閱讀 3445

import tensorflow as tf

# 定義乙個初始化權重的函式

def weight_variables(shape):

w = tf.variable(tf.random_normal(shape=shape, mean=0.0, stddev=1.0))

return w

# 定義乙個初始化偏置的函式

def bias_variables(shape):

b = tf.variable(tf.constant(0.0, shape=shape))

return b

def read_and_decode():

"""讀取驗證碼資料api

:return: image_batch, label_batch

"""# 1、構建檔案佇列

file_queue = tf.train.string_input_producer([flags.captcha_dir])

# 2、構建閱讀器,讀取檔案內容,預設乙個樣本

reader = tf.tfrecordreader()

# 讀取內容

key, value = reader.read(file_queue)

# tfrecords格式example,需要解析

features = tf.parse_single_example(value, features=)

# 解碼內容,字串內容

# 1、先解析的特徵值

image = tf.decode_raw(features["image"], tf.uint8)

# 1、先解析的目標值

label = tf.decode_raw(features["label"], tf.uint8)

# print(image, label)

# 改變形狀

image_reshape = tf.reshape(image, [20, 80, 3])

label_reshape = tf.reshape(label, [4])

print(image_reshape, label_reshape)

# 進行批處理,每批次讀取的樣本數 100, 也就是每次訓練時候的樣本

image_batch, label_btach = tf.train.batch([image_reshape, label_reshape], batch_size=flags.batch_size, num_threads=1, capacity=flags.batch_size)

print(image_batch, label_btach)

return image_batch, label_btach

def fc_model(image):

"""進行**結果

:param image: 100特徵值[100, 20, 80, 3]

:return: y_predict**值[100, 4 * 26]

"""with tf.variable_scope("model"):

# 將資料形狀轉換成二維的形狀

image_reshape = tf.reshape(image, [-1, 20 * 80 * 3])

# 1、隨機初始化權重偏置

# matrix[100, 20 * 80 * 3] * [20 * 80 * 3, 4 * 26] + [104] = [100, 4 * 26]

weights = weight_variables([20 * 80 * 3, 4 * 26])

bias = bias_variables([4 * 26])

# 進行全連線層計算[100, 4 * 26]

y_predict = tf.matmul(tf.cast(image_reshape, tf.float32), weights) + bias

return y_predict

def predict_to_onehot(label):

"""將讀取檔案當中的目標值轉換成one-hot編碼

:param label: [100, 4] [[13, 25, 15, 15], [19, 23, 20, 16]......]

:return: one-hot

"""# 進行one_hot編碼轉換,提供給交叉熵損失計算,準確率計算[100, 4, 26]

label_onehot = tf.one_hot(label, depth=flags.letter_num, on_value=1.0, axis=2)

print(label_onehot)

return label_onehot

def captcharec():

"""驗證碼識別程式

:return:

"""# 1、讀取驗證碼的資料檔案 label_btch [100 ,4]

image_batch, label_batch = read_and_decode()

# 2、通過輸入特徵資料,建立模型,得出**結果

# 一層,全連線神經網路進行**

# matrix [100, 20 * 80 * 3] * [20 * 80 * 3, 4 * 26] + [104] = [100, 4 * 26]

y_predict = fc_model(image_batch)

# [100, 4 * 26]

print(y_predict)

# 3、先把目標值轉換成one-hot編碼 [100, 4, 26]

y_true = predict_to_onehot(label_batch)

# 4、softmax計算, 交叉熵損失計算

with tf.variable_scope("soft_cross"):

# 求平均交叉熵損失 ,y_true [100, 4, 26]--->[100, 4*26]

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(

labels=tf.reshape(y_true, [flags.batch_size, flags.label_num * flags.letter_num]),

logits=y_predict))

# 5、梯度下降優化損失

with tf.variable_scope("optimizer"):

train_op = tf.train.gradientdescentoptimizer(0.01).minimize(loss)

# 6、求出樣本的每批次**的準確率是多少 三維比較

with tf.variable_scope("acc"):

# 比較每個**值和目標值是否位置(4)一樣 y_predict [100, 4 * 26]---->[100, 4, 26]

equal_list = tf.equal(tf.argmax(y_true, 2), tf.argmax(tf.reshape(y_predict, [flags.batch_size, flags.label_num, flags.letter_num]), 2))

# equal_list 100個樣本 [1, 0, 1, 0, 1, 1,..........]

accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

# 定義乙個初始化變數的op

init_op = tf.global_variables_initializer()

# 開啟會話訓練

with tf.session() as sess:

sess.run(init_op)

# 定義執行緒協調器和開啟執行緒(有資料在檔案當中讀取提供給模型)

coord = tf.train.coordinator()

# 開啟執行緒去執行讀取檔案操作

threads = tf.train.start_queue_runners(sess, coord=coord)

# 訓練識別程式

for i in range(5000):

sess.run(train_op)

print("第%d批次的準確率為:%f" % (i, accuracy.eval()))

# **執行緒

coord.request_stop()

coord.join(threads)

return none

if __name__ == "__main__":

captcharec()

驗證碼 簡單驗證碼識別

這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...

驗證碼識別

驗證碼識別過程好比人大腦的乙個識別過程 首先,我們的眼睛接收,並將這張的資訊輸送給大腦 然後,我們的大腦接收到這個資訊以後,對這個資訊作出處理 最後,將中的有效資訊提取出來再將其和大腦中儲存的資訊進行對應對比,確定對比結果。模擬驗證碼識別,大腦接受的處理過程就相當於電腦對的預處理,大腦對進行對比和確...

CSDN驗證碼識別

獲取影象部分 private stream geturl ref string str private string getnumber 驗證碼識別部分 public class csdn public string readmap bitmap image private int readmap ...