python如何实现人脸识别?

%title插图%num

python如何实现人脸识别?

翻出我曾经写的一篇文章来介绍这个问题。

为大家带来一篇 初步使用Keras深度学习破解验证码 的文章。 当然我们这里识别的是普通验证码,是Laravel常用的验证码库

Captcha for Laravel 5

如下图,又5个数字字母所组成的验证码。我用PHP一共生成了5万个验证码。后面也会提供给大家

导入所需的库

这里我们还是使用Keras,底层使用Tensorflow做为底层库。

本次使用的模型是简单的卷积神经网络模型,后面也会使用更加复杂的模型

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。它包括卷积层(alternating convolutional layer)和池层(pooling layer)。

一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数。卷积神经网络中的每一个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减小了特征分辨率。

配置参数

加载数据

训练模型的时候,我们可以选择两种方式来生成我们的训练数据,一种是直接全部载入内存,然后开始训练,一种是定义一个数据生成器,然后利用 fit_generator 分批加载数据来训练。

因为样本是5万张,但是只有200多M,可以一次性载入内存。

最后会生成pickle文件。python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

如果使用我保存好的pickle文件,可以不用执行下列步骤

加载数据,读取pickle文件

创建模型

开始训练模型

训练完成,进行验证

改进

对于这种按顺序的文字验证码,还有一种更好方法可以使用,那就是循环神经网络来识别序列。 我会在后面继续介绍如何用循环神经网络构建模型。

代码地址:https://github.com/szpnygo/keras-cnn-captcha

Pickle地址:https://pan.baidu.com/s/1i4JiZOT