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 ...