# coding:utf-8
# -----------------------------------------------------------------------------
# Comments : 利用tensorflow2.0训练
# Developer : SWLIU
# Date : 2019-12-02
# -----------------------------------------------------------------------------
from captcha.image import ImageCaptcha
import random
from PIL import Image
import numpy as np
import tensorflow as tf
import cv2
# 定义二维码数据集范围
number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z']
ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
CHAR_SET = number + alphabet + ALPHABET
CHAR_SET_LEN = len(CHAR_SET)
# 定义CNN模型保存位置
SAVE_PATH = "keras_cnn/"
# 定义图片大小
IMAGE_HEIGHT = 60
IMAGE_WIDTH = 160
# 随机获取二维码
def random_captcha_text(char_set=None, captcha_size=4):
if char_set is None:
char_set = number + alphabet + ALPHABET
captcha_text = []
for i in range(captcha_size):
c = random.choice(char_set)
captcha_text.append(c)
return captcha_text
# 生产二维码邸的文本及图片
def gen_captcha_text_and_image(width=160, height=60, char_set=CHAR_SET):
image = ImageCaptcha(width=width, height=height)
captcha_text = random_captcha_text(char_set)
captcha_text = ''.join(captcha_text)
captcha = image.generate(captcha_text)
captcha_image = Image.open(captcha)
captcha_image = np.array(captcha_image)
return captcha_text, captcha_image
text, image = gen_captcha_text_and_image(char_set=CHAR_SET)
MAX_CAPTCHA = len(text)
print('CHAR_SET_LEN=', CHAR_SET_LEN, ' MAX_CAPTCHA=', MAX_CAPTCHA)
# 生产灰度图
def convert2gray(img):
if len(img.shape) > 2:
gray = np.mean(img, -1)
return gray
else:
return img
# 文本转向量
def text2vec(text):
vector = np.zeros([MAX_CAPTCHA, CHAR_SET_LEN])
for i, c in enumerate(text):
idx = CHAR_SET.index(c)
vector[i][idx] = 1.0
return vector
# 向量转文本
def vec2text(vec):
text = []
for i, c in enumerate(vec):
text.append(CHAR_SET[c])
return "".join(text)
def wrap_gen_captcha_text_and_image():
while True:
text, image = gen_captcha_text_and_image(char_set=CHAR_SET)
if image.shape == (60, 160, 3):
return text, image
# 生成batch_size
def get_next_batch(batch_size=128):
batch_x = np.zeros([batch_size, IMAGE_HEIGHT, IMAGE_WIDTH, 1])
batch_y = np.zeros([batch_size, MAX_CAPTCHA, CHAR_SET_LEN])
for i in range(batch_size):
text, image = wrap_gen_captcha_text_and_image()
image = tf.reshape(convert2gray(image), (IMAGE_HEIGHT, IMAGE_WIDTH, 1))
batch_x[i, :] = image
batch_y[i, :] = text2vec(text)
return batch_x, batch_y
# 定义验证码cnn
def crack_captcha_cnn():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3, 3)))
model.add(tf.keras.layers.PReLU())
model.add(tf.keras.layers.MaxPool2D((2, 2), strides=2))
model.add(tf.keras.layers.Conv2D(64, (5, 5)))
model.add(tf.keras.layers.PReLU())
model.add(tf.keras.layers.MaxPool2D((2, 2), strides=2))
model.add(tf.keras.layers.Conv2D(128, (5, 5)))
model.add(tf.keras.layers.PReLU())
model.add(tf.keras.layers.MaxPool2D((2, 2), strides=2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(MAX_CAPTCHA * CHAR_SET_LEN))
model.add(tf.keras.layers.Reshape([MAX_CAPTCHA, CHAR_SET_LEN]))
model.add(tf.keras.layers.Softmax())
return model
# 训练
def train():
try:
model = tf.keras.models.load_model(SAVE_PATH + 'model')
except Exception as e:
print('#######Exception', e)
model = crack_captcha_cnn()
model.compile(optimizer='Adam',
metrics=['accuracy'],
loss='categorical_crossentropy')
for times in range(200000):
batch_x, batch_y = get_next_batch(512)
print('times=', times, ' batch_x.shape=', batch_x.shape, ' batch_y.shape=', batch_y.shape)
model.fit(batch_x, batch_y, epochs=4)
print("y预测=\n", np.argmax(model.predict(batch_x), axis=2))
print("y实际=\n", np.argmax(batch_y, axis=2))
if 0 == times % 10:
print("save model at times=", times)
model.save(SAVE_PATH + 'model')
# 验证预测
def predict():
model = tf.keras.models.load_model(SAVE_PATH + 'model')
success = 0
count = 100
for _ in range(count):
data_x, data_y = get_next_batch(1)
prediction_value = model.predict(data_x)
data_y = vec2text(np.argmax(data_y, axis=2)[0])
prediction_value = vec2text(np.argmax(prediction_value, axis=2)[0])
if data_y.upper() == prediction_value.upper():
print("y预测=", prediction_value, "y实际=", data_y, "预测成功。")
success += 1
else:
print("y预测=", prediction_value, "y实际=", data_y, "预测失败。")
print("预测", count, "次", "成功率=", success / count)
pass
if __name__ == "__main__":
train()
#predict()
没有合适的资源?快使用搜索试试~ 我知道了~
tensorflow2.0 keras 图片识别
共2个文件
py:2个
2星 需积分: 50 40 下载量 7 浏览量
2019-12-03
14:02:55
上传
评论 1
收藏 4KB RAR 举报
温馨提示
tensorflow2.0 keras 图片识别 可视化终端 图片预处理 可上传图片,并对图片进行裁剪、预处理,给出识别结果,适合初学者共同交流学习饿
资源推荐
资源详情
资源评论
收起资源包目录
tf_code_rec.rar (2个子文件)
tensor2_captch_rec_frm.py 5KB
tensor2_captch_rec.py 5KB
共 2 条
- 1
资源评论
- 属于我自己的光2021-06-15和我想要的有点出入
- mr_liyonghong2021-03-08缺少文件,也缺少图像库
弈休丶
- 粉丝: 24
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功