基于Python语言和支持向量机的字符验证码识别
2017-06-02杨雄
杨雄
摘要:验证码的主要目的是区分人类和计算机,用来防止自动化脚本程序对网站的一些恶意行为,目前绝大部分网站都利用验证码来阻止恶意脚本程序的入侵。本文以某高校教务系统的字符验证码作为研究对象,利用图像处理的方法,对验证码图像进行二值化、去离散噪声、字符分割、归一化、特征提取、训练和字符识别等过程实现了验证码识别,并使用Python语言实现。最后在分析识别结果的基础上,从验证码识别的角度提出生成更加安全验证码的一些建议。
关键词:支持向量机(SVM);验证码;Python语言
中图分类号:TP3 文献标识码:A 文章编号:1007-9416(2017)04-0072-03
1 引言
随着互联网的迅速发展和应用,网络为我们提供了越来越多的资源,也为我们的生活和工作提供了极大的便利,但同时也带来了大量的互联网安全问题,比如刷票、用户批量注册、密码暴力破解、社区恶意发帖等。
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写[1],是能够区分用户是人还是计算机的公共自动化程序,该程序提出的问题由计算机生成并评判,但必须只有人类才能回答。由于计算机无法解答验证码的问题,所以可以认为能够回答出问题的用户就是人类。目前大部分学校的教务系统都采用了字符图像验证码。
支持向量机(SVM)是在统计学习的 VC维理论和结构风险最小化(Structure Risk Minimization,SRM)原理基础上,发展起来的一种全新的机器学习算法[2]。该算法在解决小样本、非线性及高维模式识别中有许多特有的优势。支持向量机根据其求解问题的不同分为支持向量分类机和支持向量回归机两种类型。本文提出的验证码识别算法是基于C-SVC的支持向量分类机[3]。
但随着网络技术的发展,最初的字符图像验证码已经不能够完全保障网络的安全,为了评估这类验证码的安全性,需要从识别角度进行研究。因此,本文以某高校教务系统使用的验证码作为识别对象,提出一种基于SVM的验证码识别算法,使用Python的图像处理库和SVM机器学习库来实现验证码识别程序,根据识别率来评估网站的安全性,从而提出一些改进意见。
2 验证码预处理
为了防止计算机自动化脚本的攻击,字符图像验证码往往由服务器产生随机字符序列后再加入一些干扰因素使计算机难以识别。本文将要识别的验证码示例如图1所示。
可以看到,该类验证码加入的干扰因素主要是点线干扰噪声,其加大了图像识别的难度。因此,在进行验证码识别前,需要对验证码图像进行预处理,步骤包括二值化、去除离散噪声、字符分割和尺寸归一化。
2.1 二值化
图像的二值化处理就是将图像上的点的像素值设置为0或255,使图像的集合性质只与像素值为0或255的点的位置有关。将图像中所有小于阀值的像素被判定为属于字符区域,其像素值设为0, 而大于或等于阀值的像素被排除在字符区域以外,像素值设为255。对图像验证码进行二值化处理的关键是阈值的选择与确定。二值化处理[4]选取阈值方法很多,经过实验比较,本文采用全局固定阈值法[5]选取阈值,然后再对验证码图像进行二值化处理。
设原始灰度图像为f(x,y),二值化处理后的图像为g(x,y),则二值化过程可表示为:
式中f(x,y)是原始图像坐标为(x,y)的点的像素值,g(x,y)是二值化处理后的该点的像素值,0表示黑点,255表示白色。在实际的处理系统中,进行图像二值化处理的关键是要确定合适的阈值,使得字符与背景能够分享开来,而且结果图像必须具备良好的保形性,不能够丢掉原来有用的信息,不产生额外的空缺等。通过实验,采用固定阈值80能够得到较完美的效果。
使用Python语言实现的主要步骤包括:将RGB彩图转为灰度图和将灰度图,再按照设定阈值转化为二值图。
二值化后的验证码示例如图2所示,基本将背景噪声去除了。
2.2 去除离散噪声
经过二值化处理后,验证码图像还存在或多或少的离散噪声,尤其在字符周围。本文消除验证码字符周围离散噪声采用的是连通域去噪法:当发现一个像素值为0的点时,记为:A,统计点A周边九宫格里的像素值同样为0的像素点数量,记为:Sum(A),如果Sum(A)少于一个定值K,则认为此点为孤立点,将其排除在字符区域以外,将点A像素值设为255。经过实验,当K值取2时,能够去除绝大部分的离散噪声,得到较好的效果。
在具体处理时需要将所有的像素点按如下图分成三大类:顶点X、非顶点的边界点Y和内部点Z。如图3所示。
其中:X类点需要计算周边相邻的3个点,Y类点则需要计算周边相邻的5个点,而Z类点则计算周边相邻的8个点。
经过去除离散噪声操作的验证码图像如图4所示,已经去除了给绝大部分干扰噪声。
2.3 字符分割
字符图像验证码本质是由一系列的单个字符图片拼接而成。将去除离散噪声后的验证码图片放大到像素级别,可获取各个字符位置参数信息:整个图片大小是 40*10(单位为像素),单个字符大小为 7*10,字符间隔3个像素,左相距1个像素,右相距1个像素,字符上下相距0个像素,如图5所示。
这样就可以使用投影分割算法将验证码图像分割成只包含单个字符的图片,只需要定位每个字符在整个图片中所占据的像素区域,然后就可以根据像素位置进行分割,分割后的单个字符图片如图6所示。
2.4 尺寸归一化
本文所选择的研究对象进行字符分割后单个字符的尺寸已經统一为7*10的规格,所以不需要做额外处理。
3 基于支持向量机的验证码识别
支持向量机算法的关键是选取核函数的类型,主要有线性内核,多项式内核,径向基内核(RBF),sigmoid核。本文选定RBF核为SVM的核函数进行支持向量机分类识别:
本文提出的验证码识别算法实现使用的是Python的机器学习库libSVM ,libSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包[6],libSVM使用的一般步骤是:
(1)准备数据集,转化为 libSVM支持的数据格式;
(2)考虑选用核函数(本文使用RBF 核函数);
(3)采用交叉验证,选择最佳参数C与g;
(4)用得到的最佳参数C与g 对整个训练集进行训练得到SVM模型;
(5)利用得到的SVM模型进行预测[7]。
3.1 素材标记
因为机器开始时是不具备任何字符的观念,所以需要对机器学习的素材进行手工标识,告诉机器哪些图片的内容是1,哪些图片的内容是A,这个过程叫做 “素材标记”。本文所选择的研究对象,其字符包括0~9和A~Z,所以具体标记素材的方法是:为0~9和 A~Z分别建立目录,目录名称为相应数字或字母,人为判定单个字符图片内容,并将其拖到指定目录中,每个目录中大约存放100张左右的素材。
3.2 字符特征提取
字符分割后图片大小已经归一化,均为:宽7个像素,高10个像素,本文选择验证码单个字符所有点像素特征作为特征向量,因此定义出70个特征:70个像素点上面的像素值。当像素表示对象时(即其像素值为0),其特征值为1,否则其特征值为0,最后得到一组70维的特征。
3.3 生成特征和标识对应的训练数据集
将已经标记好的0~9和A~Z目录下的单个字符图片特征化,按照libSVM指定的格式生成一組带特征值和标记值的向量文件。生成的特征文件部分内容如图7所示。
每一行特征码代表一张图片,第一列就是该特征码所代表的字符,示例文件中66即表示字符‘B,其他列分别表示70组特征值,冒号前为索引号,冒号后为特征值。
3.4 训练特征标记数据生成SVM模型
使用Python的机器学习库libSVM,首先调用svm_read_problem函数,选择RBF 核函数,输入特征文件,然后调用svm_train函数进行训练,最后调用svm_save_model以文件形式保存SVM模型。
3.5 使用SVM模型预测新的未知验证码图片集
生成SVM模型后,需要使用训练集之外的全新的标记后的图片作为测试集来对模型进行测试。首先生成需要识别的字符验证码的特征码,将其全部标记为0,然后将生成的文件作为测试样本,接着调用函数svm_predict进行预测,最终返回识别结果。
4 实验结果分析
本文对指定高校教务系统的动态验证码形成持续不断地识别,将识别的结果作为名称保存此验证图片,主要步骤如下:
(1)通过http接口,获得验证码图片。
(2)对验证码图片进行二值化、去除离散噪声等预处理。
(3)使用SVM模型文件对分割后的4张单字符图片分别进行识别。
(4)将识别结果拼接。共识别了9000张图片,识别率能达到100%,部分识别效果如图8所示。
5 结语
通过实验数据可知,该高校的教务系统的验证码能够100%被识别出来,说明其验证码无法有效保障网络的安全,形同虚设。因为良好的验证码的前提就是要满足安全性,所以需要加强验证码环节的安全性,提出如下建议:
(1)验证码字符个数不固定,因为字符数目不确定性增加机器程序识别的难度;
(2)字符适当扭曲或字符位置不固定,这使验证字符串即无固定的开始位置,也无固定的字符间隔,增加了机器识别的难度[8];
(3)使用行为验证码,通过用户的操作行为来完成验证。
参考文献
[1]von Ahn L, Blum M, Hopper N, et al.The CAPTCHA project[EB/OL].
[2]Sun T,Neuro Y.Detail-preserving median based filters in image processing[J].Pattern Recognition Letters,1994,15(4):341-347.
[3]李卓,柴滨景,胡继东.支持向量机在油田系统建模中的应用[J].现代电子技术,2007,30(1):162-164.
[4]Gonzalez R C.数字图像处理[M].2版.北京:电子工业出版社,2007.
[5]王兴芬,李雪燕,张继松.基于支持向量机的网上银行验证码识别研究[J].计算机工程与应用,2012,48(29):73-77.
[6]Chang CC, Lin CJ. LIBSVM: a library for support vector machines[EB/OL].[2015-08].
[7]赵振书,孙建平,朱雯.SVM在汽轮机轴系系统状态监测中的应用[J].仪器仪表用户,2012, 19(4):41-43.
[8]叶振.一种新型图像验证码系统[J].数字技术与应用,2014(8):185-185.