实战七:手把手教你用TensorFlow进行验证码识别(上)

github下载地址

目录

  • 准备模型开发环境
  • 生成验证码数据集
  • 输入与输出数据处理
  • 模型结构设计
  • 模型损失函数设计
  • 模型训练过程分析
  • 模型部署与效果演示

一、准备模型开发环境

1.第三方依赖包

pip install Pillow captcha pydot flask

2.Pillow(PUL Fork)

PIL(Python Imaging Library)为Python解释器添加了图像处理功能。但是,在2009年发布1.17版本之后,社区便停止更新和维护。

Pillow是由Alex Clark及社区贡献者一起开发和维护的一款分叉自PIL的图像工具库。至今,社区依然非常活跃,Pillow仍在快速迭代。

Pillow提供广泛的文件格式支持,高效的内部表示和相当强大的图像处理功能。核心图像库旨在快速访问以几种基本像素格式存储的数据,它应该为一般的图像处理工具提供坚实的基础。

3.catpcha

Catpcha是一个生成图像和音频验证码的开源工具库

from captcha.image import ImageCaptcha
from captcha.audio import AudioCaptchaimage = ImageCaptcha(fonts=["/path/A.ttf","/path/B.ttf")
data = image.generate("1234")
image.write("1234","out.png")audio = AudioCaptcha(voicedir="/path/voices")
data = audio.generate("1234")
audio.write("1234","out.wav")

4.pydot

pydot是用纯Python实现的GraphViz接口,支持使用GraphViz解析和存储DOT语言(graph description language).其主要依赖pyparsingGraphViz这两个工具库

pyparsing:仅用于加载DOT文件,在pydot安装期间自动安装。

Graphviz:将图形渲染为PDF,PNG,SVG等格式文件,需独立安装。

5.flask

flask是一个基于Werkzeug和jinja2开发的Python Web应用程序框架,遵从BSD开源协议。它以一种简约的方式实现了框架核心,又保留了扩展性。

from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():return "Hello,World!"

二、生成验证码数据集

1.验证码(catpcha)简介

全自动区分计算机和人类对的公开图灵测试,俗称验证码,是一种区分用户是计算机或人的公共全自动程序。在captcha测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答captcha的问题,所以回答出问题的用户就可以被认为是人类。

一种常用的captcha测试是让用户输入一个扭曲变形的图片上所显示的文字或数字,扭曲变形式为了避免被光学字符识别(OCR)之类的计算机程序自动识别出图片上的数字而失去效果。由于这个测试是由计算机来考人类,而不是标准图灵测试中那样由人类来考计算机,人们有时称captcha是一种反向图灵测试

2.验证码的演进

3.验证码的生成

a.引入第三方包

from captcha.image import ImageCaptchaimport random
import numpy as npimport tensorflow.gfile as gfile
import matplotlib.pyplot as plt
import PIL.Image as Image

b.定义常量和字符集

NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
LOWERCASE = ['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']
UPPERCASE = ['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']CAPTCHA_CHARSET = NUMBER   # 验证码字符集
CAPTCHA_LEN = 4            # 验证码长度
CAPTCHA_HEIGHT = 60        # 验证码高度
CAPTCHA_WIDTH = 160        # 验证码宽度TRAIN_DATASET_SIZE = 5000  # 验证码数据集大小
TEST_DATASET_SIZE = 1000   # 验证码测试集大小
TRAIN_DATA_DIR = "./train-data/" # 验证码数据集目录
TEST_DATA_DIR = "./test-data/"   # 验证码测试集目录

c.生成随机字符的方法

def gen_random_text(charset=CAPTCHA_CHARSET,length=CAPTCHA_LEN):text = [random.choice(charset) for _ in range(length)]return "".join(text)

d.创建并保存验证码数据集的方法

def create_captcha_dataset(size=100,data_dir="./data/",height=60,width=160,image_format=".png"):# 如果保存验证码图像,先清空data_dir目录if gfile.Exists(data_dir):gfile.DeleteRecursively(data_dir)gfile.MakeDirs(data_dir)# 创建ImageCaptcha实例captchacaptcha = ImageCaptcha(width=width,height=height)for _ in range(size):# 生成随机的验证码字符text = gen_random_text(CAPTCHA_CHARSET,CAPTCHA_LEN)captcha.write(text,data_dir + text + image_format)return None

e.创建并保存训练集及测试集

# 创建并保存训练集
create_captcha_dataset(TRAIN_DATASET_SIZE,TRAIN_DATA_DIR)# 创建并保存测试集
create_captcha_dataset(TEST_DATASET_SIZE,TEST_DATA_DIR)

f.生成并返回验证码数据集的方法

def gen_captcha_dataset(size=100,height=60,width=160,image_font=".png"):# 创建ImageCaptcha实例captchacaptcha = ImageCaptcha(width=width,height=height)# 创建图像和文本数组images,texts = [None]*size,[None]*sizefor i in range(size):# 生成随机的验证码字符texts[i] = gen_random_text(CAPTCHA_CHARSET,CAPTCHA_LEN)# 使用PIL.Image.open() 识别新生成的验证码图像# 然后,将图像转换为形如(CAPTCHA_WIDTH,CAPTCHA_HEIGHT,3)的numpy数组images[i] = np.array(Image.open(captcha.generate(texts[i])))return images,texts

g.生成100张验证码图像和字符

# 生成并返回图像和标签
images,texts = gen_captcha_dataset()
# 展示
plt.figure()
for i in range(20):plt.subplot(5,4,i+1) # 绘制前20个验证码,以5行4列子图形式展示plt.tight_layout()   # 自动适配子图尺寸plt.imshow(images[i])plt.title("Label:{}".format(texts[i])) # 设置标签为子图标题plt.xticks([])       # 删除x轴标记plt.yticks([])       # 删除y轴标记
plt.show()

三、输入与输出数据处理

1.输入数据处理

2.输出数据处理

3.数据处理

a.引入第三方包

from PIL import Image
from keras import backend as Kimport random
import globimport numpy as np
import tensorflow.gfile as gfile
import matplotlib.pyplot as plt

b.定义超参数和字符集

NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
LOWERCASE = ['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']
UPPERCASE = ['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']CAPTCHA_CHARSET = NUMBER   # 验证码字符集
CAPTCHA_LEN = 4            # 验证码长度
CAPTCHA_HEIGHT = 60        # 验证码高度
CAPTCHA_WIDTH = 160        # 验证码宽度TRAIN_DATA_DIR = '.\\train-data\\' # 验证码数据集目录

c.读取训练集前100张图片,并通过文件名解析验证码(标签)

image = []
text = []
count = 0
for filename in glob.glob(TRAIN_DATA_DIR + "*.png"):image.append(np.array(Image.open(filename)))text.append(filename.lstrip(TRAIN_DATA_DIR).rstrip(".png"))count +=  1if count >= 100:break

d.数据可视化

plt.figure()
for i in range(20):plt.subplot(5,4,i+1) # 绘制前20个验证码,以5行4列子图形式展示plt.tight_layout()   # 自动适配子图尺寸plt.imshow(image[i])plt.title("Label:{}".format(text[i])) # 设置标签为子图标题plt.xticks([])       # 删除x轴标记plt.yticks([])       # 删除y轴标记
plt.show()

image = np.array(image,dtype=np.float32)
print(image.shape,type(image))
(100, 60, 160, 3) <class 'numpy.ndarray'>

e.将RGB验证码图像转成灰度图

# 定义转灰度图函数
def rgb2gray(img):# 这里利用公式来转换 Y' = 0.299 R + 0.587 G + 0.114 B return np.dot(img[...,:3],[0.299,0.587,0.114])# 转换
image = rgb2gray(image)
# 输出维度
print(image.shape)
(100, 60, 160)
# 查看图形
plt.figure()
for i in range(20):plt.subplot(5,4,i+1)  # 绘制前20个验证码,以5行4列子图形式展示plt.tight_layout()    # 自动适配子图尺寸plt.imshow(image[i],cmap="Greys")plt.title("Label:{}".format(text[i])) # 设置标签为子图标题plt.xticks([])        # 删除x轴标记plt.yticks([])        # 删除y轴标记
plt.show()

f.数据规范化

image = image / 255
image[0]
array([[0.96912157, 0.96912157, 0.96912157, ..., 0.96912157, 0.96912157,0.96912157],[0.96912157, 0.96912157, 0.96912157, ..., 0.96912157, 0.96912157,0.96912157],[0.96912157, 0.96912157, 0.96912157, ..., 0.96912157, 0.96912157,0.96912157],...,[0.96912157, 0.96912157, 0.96912157, ..., 0.96912157, 0.96912157,0.96912157],[0.96912157, 0.96912157, 0.96912157, ..., 0.96912157, 0.96912157,0.96912157],[0.96912157, 0.96912157, 0.96912157, ..., 0.96912157, 0.96912157,0.96912157]])

g.适配Keras图像数据格式

# 先查看一下数据的维度
print(image.shape,type(image))
(100, 60, 160) <class 'numpy.ndarray'>
# 定义适配函数
def fit_keras_channels(batch,rows=CAPTCHA_HEIGHT,cols=CAPTCHA_WIDTH):if K.image_data_format() == "channels_first":batch = batch.reshape(batch.shape[0],1,rows,cols)input_shape = (1,rows,cols)else:batch = batch.reshape(batch.shape[0],rows,cols,1)input_shape = (rows,cols,1)return batch,input_shape
# 再重新查看一下数据的维度
image,input_shape = fit_keras_channels(image)
print(image.shape,type(image))
print(input_shape)
(100, 60, 160, 1) <class 'numpy.ndarray'>
(60, 160, 1)

h.对验证按中每个字符进行one-hot编码

# 查看一下text中的数据
print(text[:10])
print(len(text[0]))
print(len(text))
['0002', '0004', '0007', '0009', '0011', '0012', '0014', '0015', '0017', '0018']
4
100
# 定义one-hot编码函数
# CAPTCHA_CHARSET = NUMBER   # 验证码字符集
# CAPTCHA_LEN = 4            # 验证码长度
def text2vec(text,length=CAPTCHA_LEN,charset=CAPTCHA_CHARSET):text_len = len(text)# 验证码长度校验if text_len != length:raise ValueError("Error:length of captcha should be{},but got {}".format(length,text_len))# 生成一个形如(CAPTCHA_LEN*CAPTCHA_CHARSET)的一维向量# 例如,4个纯数字的验证码生成形如(4*10,)的一维向量vec = np.zeros(length*len(charset))for i in range(length):# One-hot编码验证码中的每个数字# 每个字符的热码 = 索引 +偏移量vec[charset.index(text[i]) + i*len(charset)] = 1return vec
text = list(text)
vec = [None]*len(text)for i in range(len(vec)):vec[i] = text2vec(text[i])
print(text[0])
print(vec[0])
0002
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]

实战七:手把手教你用TensorFlow进行验证码识别(上)相关推荐

  1. 实战六:手把手教你用TensorFlow进行手写数字识别

    手把手教你用TensorFlow进行手写数字识别 github下载地址 目录 手写体数字MNIST数据集介绍 MNIST Softmax网络介绍 实战MNIST Softmax网络 MNIST CNN ...

  2. python流程控制-实战案例手把手教你Python流程控制技巧

    原标题:实战案例手把手教你Python流程控制技巧 作者:PianoOrRock 来源: http://blog.csdn.net/pianoorrock/article/details/711315 ...

  3. 手把手教你用 TensorFlow 实现文本分类(下)

    手把手教你用 TensorFlow 实现文本分类(下) 本文作者:AI研习社 2017-05-29 13:36 导语:文本分类全流程解析. 雷锋网(公众号:雷锋网)按:本文作者张庆恒,原文载于作者个人 ...

  4. python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...

    linux下Appium+Python移动应用自动化测试实战-3.手把手教你定位元素编写测试用例 前言 有很多童鞋环境搭建好了却没有进行下一步,是因为缺少step by step的资料. 互联网上ap ...

  5. YoloV5实战:手把手教物体检测

    摘要:​YOLOv5并不是一个单独的模型,而是一个模型家族,包括了YOLOv5s.YOLOv5m.YOLO... 本文分享自华为云社区<YoloV5实战:手把手教物体检测--YoloV5> ...

  6. 报名 | NVIDIA线下交流会:手把手教你搭建TensorFlow Caffe深度学习服务器

    7月21日(周六)下午14:30,量子位与NVIDIA英伟达开发者社区联合举办线下交流会,拥有丰富一线开发经验的NVIDIA开发者社区经理Ken He,将手把手教你搭建TensorFlow & ...

  7. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  8. 手把手教你使用TensorFlow训练出自己的模型

    手把手教你使用TensorFlow训练出自己的模型 一.前言 搭建TensorFlow开发环境一直是初学者头疼的问题,为了帮忙初学者快速使用TensorFlow框架训练出自己的模型,作者开发了一款基于 ...

  9. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...

最新文章

  1. java 泛型反射_Java使用反射来获取泛型信息示例
  2. mysql创建删除触发器的时候_mysql触发器简介及如何创建和删除触发器
  3. Windows Server 2016 服务器总是有暴力破解密码导致的审核失败
  4. 网站首页head区代码规范
  5. 图解使用PowerTool对Windows内核做初步研究探索
  6. 记一次WiFi芯片W600上串口只能回显的问题
  7. SSM三大框架整合Springfox(Swagger2)详细解决方案
  8. C语言再学习 -- C 预处理器
  9. java 限制日期格式_Java日期格式
  10. 不安装cudnn可不可以_关于CUDA和cuDNN的安装
  11. 明天14点直播间见!5位业内大咖带您解锁数据库内核技术与行业应用
  12. java实现订单物品计算佣金,java三角形、NextDay、佣金问题代码
  13. 如何在iOS地图上高效的显示大量数据
  14. 种草电商怎么做,我助你从0到1搭建种草商城
  15. 你知道 DNS,那我猜你一定不知道 HTTPDNS
  16. 如何快速写出Json Schema,校验Json Schema
  17. 程序、任务、进程和线程的联系与区别
  18. 中国服务器审计系统,汉邦服务器监控与审计系统
  19. CSS制作大风车动画及花朵
  20. Selenium: either the element is no longer attached to the DOM, it is not in the curren

热门文章

  1. FCPX插件:56种高动态HDR视频调色预设HDR Look Effects
  2. 西克推出LBR/LFR长距离非接触物位/液位传感器
  3. 多台树莓派配置自组织网络,batman-adv开源项目具体配置过程
  4. 基于python的国内外研究现状怎么写_如何写国内外研究现状
  5. django 连接oracle的坑和解决方法
  6. 手把手教你使用Django如何连接Mysql
  7. 爬取小猪网的短租房信息
  8. DNF 鬼剑士技能设置
  9. iphone6s计算机驱动,教你iphone6s连接电脑出现驱动问题怎么办及iOS9.0.2 App Store打不开问题的解决方法...
  10. dnf服务器炸团门票怎么找回,dnf补票小技巧 再也不怕掉线炸团制裁