TensorFlow 验证码识别

• 准备模型开发环境

第三方依赖包

Pillow (PIL Fork)

PIL(Python Imaging Library) 为 Python 解释器添加了图像处理功能。但是,在 2009 年发布

1.1.7 版本后,社区便停止更新和维护。

Pillow 是由 Alex Clark 及社区贡献者 一起开发和维护的一款分叉自 PIL 的图像工具库。

至今,社区依然非常活跃,Pillow 仍在快速迭代。

Pillow提供广泛的文件格式支持,高效的内部表示和相当强大的图像处理功能。

核心图像库旨在快速访问以几种基本像素格式存储的数据, 它应该为一般的图像处理工

具提供坚实的基础。

captcha

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

from captcha.image importImageCaptchafrom captcha.audio importAudioCaptcha

image= ImageCaptcha(fonts=[‘/path/A.ttf‘, ‘/path/B.ttf’])

data = image.generate(‘1234’)

image.write(‘1234‘, ‘out.png’)

audio = AudioCaptcha(voicedir=‘/path/to/voices’)

data = audio.generate(‘1234’)

audio.write(‘1234‘, ‘out.wav’)

pydot

pydot 是用纯 Python 实现的 GraphViz 接口,支持使用 GraphViz 解析和存储 DOT语言

(graph description language)。其主要依赖 pyparsing 和 GraphViz 这两个工具库。

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

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

flask

flask 是一个基于 Werkzeug 和 jinja2 开发的 Python Web 应用程序框架,遵从 BSD 开源协

议。它以一种简约的方式实现了框架核心,又保留了扩展性。

• 生成验证码数据集

验证码(CAPTCHA)简介

全自动区分计算机和人类的公开图灵测试(英语:Completely Automated Public Turing test

to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是

计算机或人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一

个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。

由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

一种常用的CAPTCHA测试是让用户输入一个扭曲变形的图片上所显示的文字或数字,扭

曲变形是为了避免被光学字符识别(OCR, Optical Character Recognition)之类的计算机程

序自动识别出图片上的文数字而失去效果。由于这个测试是由计算机来考人类,而不是

标准图灵测试中那样由人类来考计算机,人们有时称CAPTCHA是一种反向图灵测试。

验证码(CAPTCHA)破解

一些曾经或者正在使用中的验证码系统已被破解。

这包括Yahoo验证码的一个早期版本 EZ-Gimpy,PayPal使用的验证码,LiveJournal、

phpBB使用的验证码,很多金融机构(主要是银行)使用的网银验证码以及很多其他网站

使用的验证码。

俄罗斯的一个黑客组织使用一个自动识别软件在2006年破解了Yahoo的CAPTCHA。准确

率大概是15%,但是攻击者可以每天尝试10万次,相对来说成本很低。而在2008年,

Google的CAPTCHA也被俄罗斯黑客所破解。攻击者使用两台不同的计算机来调整破解进

程,可能是用第二台计算机学习第一台对CAPTCHA的破解,或者是对成效进行监视。

验证码(CAPTCHA)演进

验证码(CAPTCHA)生成

使用 Pillow(PIL Fork) 和 captcha 库生成验证码图像:

PIL.Image.open(fp, mode=‘r’) - 打开和识别输入的图像(文件)

captcha.image.ImageCaptcha(width, height,) – 创建 ImageCaptcha 实例

captcha.image.ImageCaptcha.write(‘1234’, ‘out.png’) – 生成验证码并保存

captcha.image.ImageCaptcha.generate(‘1234’) – 生成验证码图像

代码实现:

创建验证码数据集

引入第三方包from captcha.image importImageCaptchaimportrandomimportnumpy as npimporttensorflow.gfile as gfileimportmatplotlib.pyplot as pltimportPIL.Image as Image

定义常量和字符集

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 = 1000TRAIN_DATA_DIR= ‘./train-data/‘ #验证码数据集目录

TEST_DATA_DIR = ‘./test-data/‘生成随机字符的方法def gen_random_text(charset=CAPTCHA_CHARSET, length=CAPTCHA_LEN):

text= [random.choice(charset) for _ inrange(length)]return ‘‘.join(text)

创建并保存验证码数据集的方法def create_captcha_dataset(size=100,

data_dir=‘./data/‘,

height=60,

width=160,

image_format=‘.png‘):#如果保存验证码图像,先清空 data_dir 目录

ifgfile.Exists(data_dir):

gfile.DeleteRecursively(data_dir)

gfile.MakeDirs(data_dir)#创建 ImageCaptcha 实例 captcha

captcha = ImageCaptcha(width=width, height=height)for _ inrange(size):#生成随机的验证码字符

text =gen_random_text(CAPTCHA_CHARSET, CAPTCHA_LEN)

captcha.write(text, data_dir+ text +image_format)returnNone

创建并保存训练集

create_captcha_dataset(TRAIN_DATASET_SIZE, TRAIN_DATA_DIR)

创建并保存测试集

create_captcha_dataset(TEST_DATASET_SIZE, TEST_DATA_DIR)

生成并返回验证码数据集的方法def gen_captcha_dataset(size=100,

height=60,

width=160,

image_format=‘.png‘):#创建 ImageCaptcha 实例 captcha

captcha = ImageCaptcha(width=width, height=height)#创建图像和文本数组

images, texts = [None]*size, [None]*sizefor i inrange(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])))returnimages, texts

生成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()

• 输入与输出数据处理

输入数据处理

图像处理:RGB图 -> 灰度图 -> 规范化数据

输入数据处理

适配 Keras 图像数据格式:“channels_frist” 或 “channels_last”

输出数据处理

One-hot 编码:验证码转向量

解码:模型输出向量转验证码

• 模型结构设计

分类问题

图像分类模型 AlexNet

使用卷积进行特征提取

图像分类模型 VGG-16

验证码识别模型结构

验证码识别模型实现

• 模型损失函数设计

交叉熵(Cross-Entropy, CE)

我们使用交叉熵作为该模型的损失函数。

虽然 Categorical / Binary CE 是更常用的损失函数,不过他们都是 CE 的变体。

CE 定义如下:

对于二分类问题 (C‘=2) ,CE 定义如下:

Categorical CE Loss(Softmax Loss)

常用于输出为 One-hot 向量的多类别分类(Multi-Class Classification)模型。

Binary CE Loss(Sigmoid CE Loss)

与 Softmax Loss 不同,Binary CE Loss 对于每个向量分量(class)都是独立

的,这意味着每个向量分量计算的损失不受其他分量的影响。

因此,它常被用于多标签分类(Multi-label classification)模型。

• 模型训练过程分析

模型训练过程

学习率(Learning rate)

学习率与损失值变化(模型收敛速度)直接相关。

何时加大学习率

• 训练初期,损失值一直没什么波动

何时减小学习率

• 训练初期,损失值直接爆炸或者 NAN

• 损失值先开始速降,后平稳多时

• 训练后期,损失值反复上下波动

优化器介绍:SGD(Stochastic Gradient Descent)

优化器介绍:SGD-M(Momentum)

SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量(Momentum),加速 SGD

在正确方向的下降并抑制震荡。

优化器介绍:Adagrad – RMSprop – Adam

优化器对比:鞍点

优化器对比: 验证码识别模型

• 模型部署与效果演示

数据-模型-服务流水线

使用 Flask 快速搭建 验证码识别服务

使用 Flask 启动 验证码识别服务

访问 验证码识别服务

python tensorflow验证码识别_TensorFlow 验证码识别相关推荐

  1. 使用Python+Tensorflow的CNN技术快速识别验证码

    北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                        ...

  2. python tensorflow pytorch 深度学习 车牌识别

    车牌识别相关资料收集整理 1.License Plate Detection with RetinaFace 链接:https://github.com/zeusees/License-Plate-D ...

  3. tensorflow+python flask进行手写识别_Tensorflow训练识别手写数字0-9

    1.安装环境 这个比较简单, 1.1 安装cnetos7 这个版本中直接代有python2.7.5版本,(下载ISO安装包安装即可我用的是vmware12.5) 1.2 安装 tensorflow 安 ...

  4. 个人笔记本上win10+yolov3+python+tensorflow+keras训练自己的识别模型

    本文是在前人的很多基础上自己整理所得,借鉴的资料见文末链接,感谢各位大神的无私分享. 对于yolo小白,参阅博文学习:keras-yolov3目标检测详解--适合新手, (环境配置.用官方权重识别自己 ...

  5. python3 tensorflow 人脸识别_tensorflow人脸识别(自己的数据集)

    可以在云盘下载打包文件包括API,数据 把原有的文件夹下面的object_detection删掉,这里面的(__init____.py)文件百度云盘上传不了,全都没成功,所以在把文件下来之后objec ...

  6. 车牌识别系统三:python+tensorflow实现车牌字符的识别

    字符识别 在前面两篇博客中分别介绍了车牌定位以及字符分割的代码实现,那么在这篇文章中,我主要想介绍一下车牌识别系统的最后一个模块:字符识别.字符识别可以说是整个系统的核心部分了,这一部分可以有很多中实 ...

  7. python tensorflow教程推荐_TensorFlow教程和文章推荐大全 -DZone AI

    在本文中,您将找到有关TensorFlow的所有文章集,TensorFlow 是  "用于机器学习的端到端开源平台".我们为刚开始使用基础知识的初学者提供了文章和教程,并且为真正想 ...

  8. python tensorflow 智能家居_TensorFlow平台下的视频目标跟踪深度学习模型设计

    4.3 深度学习模型设计实现 实验开始阶段需要链接相关函数库, 程序中采用如下的语句: import TensorFlow as tf import cv - import TensorFlow as ...

  9. 基于Tensorflow和CNN实现验证码图片识别

    卷积神经网络自从被提出开始,就受到人们的广泛欢迎,它在图像识别.语音识别.自然语言处理任务中扮演着重要的角色,在此基础上衍生出的网络模型更是层出不穷.进行验证码识别时,使用传统的Tesseract O ...

最新文章

  1. 使用注解 @requires 给 SAP CAP CDS 模型添加权限控制
  2. dict取值_Python基础数据类型「list、tuple、dict」
  3. C++总结笔记(二)——指针
  4. si9000阻抗匹配计算_如何在设计之初计算出两层PCB板差分线的阻抗,线宽,间距...
  5. null索引表键值_MySQL 的B+树索引
  6. Vue3学习之第一节:初识setup
  7. 使用Xcode、Android Studio将项目链接到Git
  8. Struts2 result type(结果类型)
  9. 天闻角川超人气IP「画猫·雅宋」数字藏品限量开售!
  10. 刷机-3.71M33升级到3.71M33-3的方法
  11. 学iOS开发需要什么样的基础?
  12. Unity3d程序必备的几种设计模式
  13. win10+uefi模式下装引导器之/boot,/efi的区别
  14. CSR Audio Sink Application User Guide
  15. XSS安全漏洞修复解决方案
  16. 关于群论在量子力学中的应用
  17. 北京移动宽带光猫 GM219-S 路由功能分离内置路由器改接外置路由器
  18. 顺序表的建立和基本操作
  19. RetinaNet——《Focal Loss for Dense Object Detection》论文翻译
  20. mysql pga_PGA的监控与调整

热门文章

  1. 6.0 px30 sd卡移植的问题解决
  2. 标签移除属性--removeAttribute与removeAttributeNode方法
  3. 什么是web服务_什么是Web服务?
  4. 科目三考试档位与速度匹配总结、及考试操作技巧
  5. Hibernate对象的三种状态(瞬时态,持久态,游离态)
  6. datareader(Datareader对象的什么方法用于从查询结果中读取行)
  7. IDF实验室之牛刀小试啥?
  8. php导出超过10万行数据到excel
  9. python找水仙花数_python寻找水仙花数
  10. 个人通讯录管理系统C语言版(含源代码和报告)