• 第5章 验证码识别


            验证码CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)是全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机还是人的公共全自动程序。设计的初衷是防止恶意破解密码、刷票、论坛灌水,实际上用验证码是现在很多网站通行的方式。验证码的基本假设是,由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。攻防是相生相伴的,针对验证码出现了大量的破解技术。

            常见的数字型验证码变种多样,比如某招聘网站验证码,字母周围有噪点,字体扭曲。某电商网站验证码,不同样式,字母阴影,字母粘连,背景色干扰。某社交网站,主体干扰线,背景色干扰,背景字母干扰,字体扭曲,字母粘连。

            本章主要以MNIST数据集为例介绍识别数字型验证码,介绍验证码识别使用的特征提取方法,包括一维向量、二维向量、使用的模型以及对应的验证结果,包括K近邻、支持向量机和深度学习。

    5.1 数据集

           验证码识别使用的数据集为MNIST数据集,MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片。该数据集也包含每一张图片对应的标签,告诉我们这个是数字几。数据集包含60000个图片训练数据集和10000个图片测试数据集。每一个MNIST数据单元由两部分组成:一张包含手写数字的图片和一个对应的标签。每一张图片包含28*28个像素点,可以把这个数组展开成一个一维向量,长度是28*28=784。

            文件读取方式为:

    1. import pickle
    2. import gzip
    3. def load_data():
    4. with gzip.open('./mnist.pkl.gz') as fp:
    5. training_data, valid_data, test_data = pickle.load(fp)
    6. return training_data, valid_data, test_data

    5.2 特征提取

    1.一维向量

            这也是MNIST默认的特征提供方式,将28*28的图片转换成了长度为784的一维向量:

    1. import tflearn.datasets.mnist as mnist
    2. X, Y, testX, testY = mnist.load_data(one_hot=True)

    2.二维向量

            为了适应特定模型,需要将原本的一维向量转换回原有的28*28的二维向量,具体方法使用数组的reshape函数即可:

    1. import tflearn.datasets.mnist as mnist
    2. X, Y, testX, testY = mnist.load_data(one_hot=True)
    3. X = X.reshape([-1, 28, 28, 1])
    4. testX = testX.reshape([-1, 28, 28, 1])

    5.3 模型训练与验证

    5.3.1 K近邻算法  

            使用K近邻算法,特征提取使用一维向量。

    (1)读取MNIST数据集数据。

    (2)按照文件划分为训练集和测试集。

    (3)使用K近邻算法在训练集上训练,获得模型数据。

    (4)使用模型数据在测试集上进行预测。

    (5)验证K近邻算法,特征提取方式使用一维向量,其中邻居数量n_neighbors设置为15。

    5.3.2 支持向量机算法

    5.3.3 深度学习算法之MLP

    5.3.4 深度学习算法之CNN

  • 相关阅读:
    分库分表系列: 到底该怎么拆分?
    强化学习总结2 动态规划
    深入理解Spark Streaming流量控制及反压机制
    C++从入门到精通 第十四章(STL容器)【上】
    Rasa对话机器人之HelpDesk (五)
    如何优雅部署OpenStack私有云II--异常处理记录
    不容易解的题9.26
    JADE盲分离算法仿真
    Linux内存管理(一):管理机制简述
    竞赛题-6237. 不同的平均值数目
  • 原文地址:https://blog.csdn.net/lieslyang/article/details/127130121