暨南大学本科毕业设计(论文)

诚 信 声 明 我声明,所呈交的毕业论文是本人在老师指导下进行的研究工作 及取得的研究成果。据我查证,除了文中特别加以标注和致谢的地方 外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为 获得其他教育机构的学位或证书而使用过的材料。我承诺,论文中的 所有内容均真实、可信。

毕业论文作者签名:

签名日期:







暨南大学本科毕业设计(论文)

验证码识别方法的研究 [摘 要] 随着人工智能的发展和图灵测试的进步,针对验证码的识别得 到越来越多的关注和实践探索。该文针对验证码识别中抗干扰性差、识别 率低、特征难训练等难题,围绕字符分割和特征提取两方面展开研究,试 图结合不变矩、形状上下文理论和 K-NN、SVM 分类器来解决这些问题, 以提高识别率。在字符分割方面,该文提出一种基于改进的迷宫算法的轮 廓自适应的分割算法,解决了字符位置多变、字形扭曲旋转、轮廓重影等 问题,算法健壮性强、分割速度快,后者在粘连字符的分割中优势明显; 在特征提取方面,该文着重研究并实现了不变矩和形状上下文的最新理论。 其中,不变矩主要针对字符大小多变、位置随机的问题,而形状上下文则 有效解决了字符变形、扭曲,轮廓粗细不均等难题。在分类器训练方面, 该文分析了最近邻和 svm 向量机两种分类器。在实验环节,通过较大规模 的测试实例,该文所提出的算法对大多验证码的识别率能达到 80%以上, 变形手写字的识别率在 97%以上,识别率较高, 应用性较强。同时,在 VS2010 开发平台下利用 C#开发出一套识别软件,系统界面友好,操作简便,扩展 性良好。 [关键词]

验证码识别;手写体识别;形状上下文

暨南大学本科毕业设计(论文)

Research on CAPTCHAs Recognition Abstract : With the fast development of Artificial Intelligent and the improvement of Turing Test, people have done a lot of research in the recognition of distorted characters and made apparent progress in this field. In the paper, the poor performance in anti-noise, low recognition rate and difficult in feature extraction, are always the toughest issues in distorted character recognition. They have been partially solved by combining rotation invariant/shape context and K-NN/SVM in the steps of split and feature extraction of characters. In the split process, we improved an contour self-adaption algorithm based on Maze algorithm, which performs well in processing the characters which are rotating, distorted, randomly positioned and overlapped, except that, it is robust and fast; In the process of feature extraction, we made enough experiments using rotation invariant and shape context, which are the fashion theories. Among them, rotation invariant is good at random position and random size while the shape context does a good job in addressing distortion question, etc. In the process of recognition, we combined K-NN and SVM with the previous algorithms. At the same time, the paper concludes in which situation and on what degree of setting the parameters of “Bins” and “Theta Bins” the recognition rate could achieve the best. Through a large amount of tests, the paper evaluated the performance of maze algorithm and shape context in recognizing distorted characters and handwriting digits. The results on the recognition of distorted CAPTCHAs achieved a high rate above 80%, and the recognition rate of handwriting digits was nearly 97%. The recognition software has been implemented under .NET environment using C# language, which has good interface and expansibility. Keywords: CAPTCHAs Recognition; Handwriting recognition; Shape context

暨南大学本科毕业设计(论文)





1 绪论 ................................................................................................................... 1 1.1 文献综述.......................................................................................................................... 1 1.2 研究框架.......................................................................................................................... 1 1.3 术语说明.......................................................................................................................... 1

2 验证码的分类与生成 ....................................................................................... 2 2.1 分类依据的确立.............................................................................................................. 2 2.2 验证码的生成.................................................................................................................. 4 2.3 验证码的漏洞分析.......................................................................................................... 5

3 图像预处理 ....................................................................................................... 7 3.1 图片灰度化...................................................................................................................... 7 3.2 图片二值化...................................................................................................................... 7 3.3 图片去噪.......................................................................................................................... 8 3.3.1 中值滤波和均值滤波 ...................................................................................................................... 8 3.3.2 实验结果 .......................................................................................................................................... 9

3.4 细化................................................................................................................................ 10 3.5 倾斜矫正........................................................................................................................ 11 3.5.1 基线寻找方法 .................................................................................................................................11 3.5.2 基线矫正方法 .................................................................................................................................11

4 图像分割 ......................................................................................................... 12 4.1 投影分割........................................................................................................................ 12 4.2 迷宫分割........................................................................................................................ 12 4.2.1 算法思路来源 ................................................................................................................................ 12 4.2.2 分割线确定算法 ............................................................................................................................ 13

5 特征提取 ......................................................................................................... 15 5.1 常见特征提取方法........................................................................................................ 15 5.1.1 统计特征 ........................................................................................................................................ 15 5.1.2 结构特征 ........................................................................................................................................ 15

5.2 基于旋转不变的特征提取方法.................................................................................... 16 5.2.1 旋转不变的定义 ............................................................................................................................ 16 5.2.2 改进的提取过程 ............................................................................................................................ 17

暨南大学本科毕业设计(论文)

5.2.3 提取结果对比 ................................................................................................................................ 18

5.3 基于形状上下文特征提取法........................................................................................ 18 5.3.1 形状上下文原理 ............................................................................................................................ 18 5.3.2 形状上下文特征匹配 .................................................................................................................... 20

5.4 对形状上下文的 PCA 降维 .......................................................................................... 21 5.4.1 PCA 主成份分析原理 .................................................................................................................... 21 5.4.2 形状上文的 PCA 降维处理 .......................................................................................................... 21

6 分类器设计 ..................................................................................................... 23 6.1 1-NN 分类器 .................................................................................................................. 23 6.2 K-NN 分类器 ................................................................................................................. 23 6.3 SVM 分类器 ................................................................................................................... 24

7 实验结果与分析 ............................................................................................. 27 7.1 7.2 7.3 7.4

分割算法的性能分析.................................................................................................... 27 上下文特征参数训练.................................................................................................... 27 分类算法的性能分析.................................................................................................... 31 不同验证码识别结果统计............................................................................................ 32

8 识别器的设计和使用 ..................................................................................... 34 8.1 识别界面........................................................................................................................ 34 8.2 识别器的使用................................................................................................................ 34

结论 ..................................................................................................................... 38 致谢 ..................................................................................................................... 39 附录 A 迷宫分割算法的实现 ........................................................................... 40 参考文献 ............................................................................................................. 45

[验证码识别方法的研究]

1 绪论 1.1 文献综述 最早提出验证码思想的是卡内基梅隆大学的一个研究组,验证码作为一 种图灵测试的典型例子自提出之后得到了越来越多的关注。 针对验证码的识别吸引了众多研究者的兴趣。比较著名的如 Greg 教授 利用形状上下文对验证码进行特征提取[14];潘大夫等人提出一种基于外部 轮廓的数字验证码识别方法[7];文晓阳的高级验证码分类思想得到了研究者 的广泛认同[1,2];许明在其本科毕业论文中较系统地研究了验证码的识别与 反识别[3],对验证码的设计提供了很不错的思路;旷章辉亦在其毕业论文中 对复杂验证码进行了较为创新性的研究[8]。除此之外,另有李佐等人提出的 基于前端预测识别的粘连字符分割方法[18]、关新平提出的基于标记阈值的 分水岭分割新算法都对本文有借鉴作用[9]。 总而言之,多年以来,国内外不乏针对验证码识别的深入研究,众多研 究者不遗余力地将自己在人工智能、图像处理等各方面的知识背景投入到 验证码的识别研究中。 1.2 研究框架 本文以识别验证码为研究目标,旨在通过系统化的研究方案提出一套验 证码识别工具。主要的研究内容包括:验证码的生成原理、验证码图片的 预处理、图像去噪处理、特征训练、模式识别等。研究过程所采取的主要 算法在借鉴前人成果的基础上,提出了自己的一些创新性算法,比如在预 处理方面提出有效点去噪算法、在分割方面提出迷宫分割方法、在特征提 取方面提出结合形状上下文的 pca 降维特征等,并通过实验验证了算法的高 效性和健壮性。 1.3 术语说明 Captcha: 全自动区分计算机和人类的图灵测试 Pca: 主成份分析 统计特征: 针对字符像素点的一些统计数字 特征提取: 针对字符的统计特征、结构特征的计算 形状上下文:一种特殊的统计算法 K-NN: K 最近邻分类器

1

[验证码识别方法的研究]

2 验证码的分类与生成 2.1 分类依据的确立 按照验证码图片的复杂程度对验证码进行分类[1],这种分类法优点是快 速、方便,缺点是不利于进一步分析验证码识别的相关问题;根据验证码 阻碍自动识别程序攻击的程度将验证码分为四类[2],这种分类法稍有改进, 但无法更科学、有根据地提供分类依据,也无法为验证码的识别提供客观 指标参考。为此,本文提出根据验证码识别中较关键的一步“分割”的难 易程度对当前各种验证码进行分类。实验证明,好的分类方法对验证码的 识别提供了有利的辅助作用。分类依据规定如下: n

1)计算分割处像素总数 xs 占水平方向上平均像素数  xi 的比值,值越大,说 i 0

明字符粘连处越难以分割; 2)计算噪点等干扰像素 wnoise 占总像素数 wtotal 的比值,值越大字符越难以识 别; 3)计算分割线的平均倾斜度 S 

1 n ysi  ys 0 。  n i =0 xsi  xs 0

经实验统计分析,确定难度系数 H 如下所示: (1  r1 ) (N  S ) 2 1 n y  ys 0 wtotal , S   si n i xsi  xs 0

H  r1 

其中,   xs

n

x ,N  w i 0

i

noise

H 为总体难度系数, r1 为分割正确率,  为分割难度, N、S 分别为干扰度和 倾斜度。 依据上述分类依据,对网上 50 余种验证码进行分类,得到如下分类结果, 表 2-1 验证码分类结果

来源网站 4399 游戏 八目妖 酷狗 联想网盘 铁血网 维奇网 意林 支付宝

难 度 系 验证码分类示例 数 0.12 1 2 4 7

3

5

6 8

2

[验证码识别方法的研究]

21CN CCTV 摩尔庄园 趣盘 幸福婚嫁

0.31

7k7k 游戏社 0.67 区

9

10

11

12

13

14

15

16

17

188 财 富 邮 箱

18

CSDN Ebay NBA 中国 大众点评 当当网 京东商城 开心网 口碑网 世纪佳缘 手机之家 水木社区 迅雷 中关村在线

19

20

21

22

23

24

25

26

27

28

51com 0.78 Tom 免费邮 箱 精美壁纸 去哪儿 人人网 淘米网

29

31

30

32

33

3

[验证码识别方法的研究]

腾讯 QQ 淘宝网

0.92

35

36

2.2 验证码的生成 到目前为止,验证码已经更新换代了好多种,无论是国外的还是国内的 开发者都在验证码的生成领域不断有所创新,虽然新的一种验证码的产生 很快就会被攻破,但验证码的设计者往往乐此不疲。从网络上可以查知, 验证码无处不在,本文在本节着重对现有验证码的生成算法进行分类和探 讨,以此作为验证码识别的铺垫。并通过分析算法的漏洞从而提出可行的 识别途径。 实际上,往往不能对验证码进行具体的分类,验证码的生成算法也不能 简单进行分类,因为组成验证码的是一系列的算法,对这些算法的组合使 用便产生了各具特色的验证码,以下通过几个有据可查的验证码对生成算 法原理进行分析。如 BrainJar 早在 2004 年提出了一种验证码,如下图所示

图 2-2-1 BrainJar 验证码

BrainJar 验证码特点如下: 表 2-2 BrainJar 验证码特点

1 背景模糊与前景相融合 2 图像有噪点 3 字体旋转、倾斜,无扭曲 4 验证码长度为 6 5 字符无粘连 BrainJar 验证码生成算法分析: 1)创建一个新的 32 位位图图像; 2)从上面新建的图像中创建一个 Graphics 对象,Graphics 对象在创建后, 可用于绘制 线条和形状、呈现文本或显示与操作图像; 3)填充图像背景,如图 2-2-1 所示,验证码的背景模糊不清、混淆视觉; 4)设置字形; 5)以已经生成的图片高度为限制,使得字符大小能够包含在图片中; 6)设置文本格式,即对验证码在图片中的位置进行设置; 7)创建一个路径,并随即扭曲它,使得后来填充的验证码图片具有扭曲旋转 等效果; 8)将验证码填充到 6 中的路径中; 9)在验证码图片中填加噪点 4

[验证码识别方法的研究]

到此,验证码的生成过程大致描述完毕,下面五张图的对比可以更好的分 析其原理。

1

4

3

2

图 2-2-2 BrainJar 验证码生成过程

同样,美国的 Azamsharp 提出一种规范验证码,但加入一些随机的干扰线, 如下图所示:

图 2-2-3 Azamsharp 验证码

如前所述,加入干扰线的方法有很多种,虽然在这里 Azamsharp 的方法并 不十分高明,但也是一种启发,即恰当的加入线条可以增加验证码识别的 难度。为实验效果对比期间,将上述算法用于 BrainJar 验证码,如下所示, BrainJar 验证码又升级了一步。

1

2

3

4

5

图 2-2-4 BrainJar+Azamsharp 验证码生成过程 1 无背景;2 加背景;3 加扭曲;4 加噪点;5 加干扰线

在 2-2-4 第 5 张图中,验证码增加了干扰线的效果图,使得验证码看起来不 是很容易辨识了。

2.3 验证码的漏洞分析 在上述对两种典型验证码讨论的过程中,可以发现验证码的一些主要特 征,而这些特征都是由验证码的设计者为防止恶意识别程序的攻击而不断 创造出来的,但正如验证码的更新改造从未停止,验证码识别的工作也紧 随其后,针对验证码所设计的特征,本文总结各类验证码的漏洞,并对其 进行分析,此举旨在对验证码的设计和识别提出建设性意见[2]。 1)采用中文验证码的网站,往往纯粹面向中文用户,局限性较大,且比英文 验证码需要键入更多的字符串,因此影响客户感受; 2)有些验证码字形规整,且背景与验证码字符像素值有差距,如本文前面提 到的第一类验证码,这类验证码极易被分割出兴趣区域,且字符特征库 很容易被规范化,导致只需少量的样本数目即可得到所有验证码的模板, 5

[验证码识别方法的研究]

从而是识别非常容易; 3)稍微复杂点的验证码,加了干扰线和噪点,该类验证码采用循环去噪的过 程中时候,噪点和乱线都比较容易一次性去掉,如本文所述第二类及后 面几类; 4)更加复杂些的验证码,如 QQ,gmail 验证码,其扭曲变形对识别造成一 定困难,而其粘连倾斜则使得很难用简单的分割算法处理。但该类验证 码背景相对简单,字符特征容易提取,因此,在分割处理有突出效果的 前提下,识别该类验证码也将很容易。 综上所述,没有一种验证码是完美设计的,都有这种那种可以被利用的 漏洞,一旦漏洞被攻破,新的验证码又被设计出来,如此反复,不断进行 人机的博弈。

6

[验证码识别方法的研究]

3 图像预处理 验证码的预处理包括“图片读入”, “灰度化” ,“二值化”等几大步骤。 图片读入的时候,应使得程序能够处理各种格式的验证码,目前较为常见 的格式为 JPG,BMP,PNG 等,不同格式的图片存储方式不同,用 ultraedit 软件 打开时,可以看到文件头各不相同,但能找到明显的标志说明图片的种类。 另外,不同验证码往往位数不同,所谓验证码图片的位数,也是指其存储 方式,即在计算机中用几位(bit)来存储一个像素,常见的为 8 位、24 位及 32 位。

3.1 图片灰度化 验证码图片读入后,可以对其进行“灰度化”处理,该处理过程的目的 是将原本彩色的(带有颜色信息)的验证码图片,通过相应算法逐个处理 组成图片的基本元素—像素,得到三种原色加权后的像素值,使得彩色图 片变成只有黑白两种颜色的图片——灰度图。采用不同的灰度算法所得到 结果不同,常见的有以下两种: A 对三基色分量求平均值; Value  ( R  G  B) / 3  0.333 R  0.333 G  0.333 B

B 按照不同权值对三基色加权求和。 Value  0.11 R  0.59  G  0.3 B

采用权重法

采用平均法

图 3-17k 游戏网的验证码样本图片灰度化

由上可见,灰度可以将高位色的位图转换为 256 色。在两种灰度化方法当 中,对于不同验证码,其作用不同。而权重法,更符合人的视觉要求。对 于 7k 游戏网的验证码,可以看到权重法得到的验证码图片字符颜色与周围 环境相差较大,这是我们需要的。这样,灰度化后有早于后面的二值化。

3.2 图片二值化 图片灰度化之后,图片中的像素将会变成 0-255 的灰度值,即不再具有 颜色信息,为接下来的二值化做好了基础。 所谓验证码的二值化处理实质是通过一个灰度阈值而完成的,一个验证 7

[验证码识别方法的研究]

码图片的任意元素的灰度值大于规定的阈值时,则该元素为 1,而小于规定 的阈值时则该元素为 0。然而阈值的确定直接影响二值化图像的质量。当字 的灰度和背景的灰度发生变化时,其二值化阈值必须做相应改变。一个简 单的办法是采用背景中最白的像素的灰度的几分之一为阈值,这样容易把 字母 O 二值化为一个圆点。 阈值为 200 时的处理效果

阈值为 100 时的处理效果

最佳阈值(160)时的处理效果

图 3-2 7k 游戏网的验证码样本图片二值化效果

由上可知,阈值选择不同,二值化效果不同,只有在合适的阈值选择下, 才能得到较为理想的效果,而不恰当的阈值,如上图阈值为 200 和 100 时, 分别出现“过度再现颜色信息”,“颜色信息被遗漏”的情况,都是对接下 来的识别不利的,在验证码识别过程中,这种情况应当加以避免。

3.3 图片去噪 一般的验证码图片往往背景比较杂乱,或带有干扰线、或带有各种噪点, 因此在预处理验证码图片的时候,往往需要先进行“去噪”处理。目前常 见的去噪算法非常之多,最早如 Tukey 发明的一种非线性信号处理技术, 到现在有“中值滤波”法,“有效点去噪法”[3]。但大部分去噪算法局限性 较大,在实际应用中,只能针对某一类图像,实用性不强,较多停留在理 论阶段。本文在综合前人的基础上,通过改进算法并加入多重选择参数, 使得去噪算法适合大部分验证码。实验证明,算法去噪效果很好,对于无 论是干扰线、干扰点,还是颜色差别造成的背景模糊,都有较好的处理效 果。 3.3.1 中值滤波和均值滤波 信号中值(Medians)是按信号值大小顺序排列的中间值,长为 n 的一 维信号  xi  的中值用下式表示: Med { X 1 ,... X n }

对于二维图像信号 {X ij : i, j  N} 二维中值滤波器定义为 Yij  MedX ij  Med{X i r , j s : r, s  A}

其中 N 表示自然数集;A 为截取图像数据的窗口。 8

[验证码识别方法的研究]

窗 A 可以采用不同的形式,通常有线段窗、方形窗、圆形窗、十字窗和 圆环窗等。本文采用方形窗,操作过程中使它在图像的各点上移动,用窗 内像素灰度值的中值代替窗中心点处的像素灰度值,实现过程如下: 1)选择一个 (2n 1)  (2n  1) 的窗口(通常为 3  3 和 5  5 ) ,并用该窗口沿图像数 据进行行或列方向的移位滑动; 2)每次移动后,对窗内的各个像素灰度值进行排序; 3)用排序所得中值替代窗口内中心位置的原始像素灰度值。 对于 M  N 的图像,在不考虑图像边界滤波的情况下,图像数据需要 (M  2n)  ( N  2n) 次对窗口的像素值进行排序。 除了中值滤波法,本文亦采用了有效点去噪法,即对于任何一个像素, 计算以该点为中心的某一个半径区域内有效黑点的个数,当有效黑点数少 于规定值的时候,说明该点相对孤立地存在,因此很可能是噪点,加以去 除,在该算法中,可调控的变量为搜索区域半径 r ,另一个就是黑点有效数 Po int Count ,在软件实现过程中,本文也充分考虑了不同参数设置下,去噪效 果的不同,为使获得最佳去噪效果,本文后续部分将讨论如何通过软件设 置不同参数来进行去噪。如图 3.3.1,先介绍该算法原理图:

图 3-3-1 搜索算法示意图

如上图所示,当选择半径为 1 时候,搜索范围就是一个 3  3 的方框,若扫描 过程中遇到上图中情况:中间一个黑色的像素点,周围有 8 个区域与其相 连通。则遍历这相邻的 8 个区域,统计 8 个区域的白色像素点个数 Po int Count ,如果 Po int Count 阈值 ,则认为该像素点是孤立点,将其颜色 由现在的黑色变成白色。 3.3.2 实验结果 采用中值滤波法

可见,在某些情况下,中值滤波效果不是很好。 以下通过设置不同参数,说明这种去噪方法的效果 半径=1,阈值为 1 半径=1,阈值为 5 半径=2,阈值为 6 9

[验证码识别方法的研究]

最佳处理参数:半径=1,阈值为 6 图 3-3-2 处理结果

3.4 细化 细化是抽取轮廓骨轴的过程,即通过将二值化图像点阵逐层剥去轮廓边 缘上的点,变成笔画宽度只有一个像素的骨架图形。由于在二值化图像, 对轮廓特征起决定作用的是其基本骨架,粗细的不同改变了骨架本身所含 有的拓扑信息,且对特征提取有干扰作用,因此以细化后的基本骨架作为 修正图像,可以最大限度的保持原图像的轮廓结构特征,并且极大减少计 算量,提高效率[4] 。文字细化的基本要求: 1) 要保持原有笔画的连续性,不能由于细化造成笔画断开 2) 要细化为单线,即笔画宽度只有一个象素。 3) 细化后的骨架应尽量是原来笔画的中心线。 4) 要保持原有的拓扑、几何特征,特别是一些明显拐角不应被光滑掉。 细化的算法很多,大体分类如下: 1)按细化后图形的连续性分,有四邻连接算法,八邻连接算法和混合连接算 法。四邻接连指的是水平垂直四个方向上的连接,八邻连接则加上正反 45 度共八个方向。 2)按细化处理过程分,有串行、并行和串并行处理法。用 m  n (一般为 3  3 ) 窗口对某一象素进行检测时,如该点是可删点,立即删除,则为串行细 化处理,它的删除要影响到后续点的检测;如对边缘点全部检测完毕后, 再同时改变所有可删除点的值,则为并行细化处理;串、并行处理是两 者的混合。 3)按处理方式分,有单方向,双方向和四个方向细化法。愈是方向多的细化 处理方式,细化的速度愈快。 无论采用哪种算法,汉字点阵细化后都会对笔画结构产生不良影响。主 要影响有:交叉笔画畸变,转折处出现分叉,失去或增加短笔道,笔画合并。

10

[验证码识别方法的研究]

3.5 倾斜矫正 3.5.1 基线寻找方法

图 3-5-1 基线示意图[5]

如图 3-5-1 所示,水平密度柱状图的最高峰表示字符的突起的下端,而垂直 密度柱状图可以确定字符整体位置水平线。因此,寻找下基线的过程如下: 1)记录每条竖直扫描线最底端坐标,构成集合 B; 2)去除 B 集合中与中位数偏离较大的值,构成集合 C; 3)用插值拟合的方法通过 C 构造下基线。 3.5.2 基线矫正方法 根据 3.5.1 中确定的下基线,可以根据需要对字符进行整体倾斜。具体 方法为计算下基线与水平线的夹角,然后整体旋转相应角度,或分段旋转。 如下图所示:

图 3-5-2 整体矫正示意图 (a)表示原始的图像,(b)表示下基线的估计,(c)表示整体倾斜后的效果

11

[验证码识别方法的研究]

4 图像分割 对验证码预处理完之后,还需要对其进行分割处理,因为往往验证码图 片中的字符数量大于 1,所以要想识别其中的验证码,必须逐一提取出来, 分别进行处理。常见的分割算法有“垂直投影”法[6],“基于外部轮廓特征 分割”法[7], “分水岭”法[8]。另外,还有通过对扭曲倾斜的验证码进行“倾 斜矫正”后的分割[9],但该方法局限性较大,仅适用于验证码字符整体具有 相同倾斜度的情况。因此,往往不太适合处理验证码的识别问题。在本节 中,我们将重点讨论“投影分割”。 投影法是许多字符切分中采用的基本方法,它主要通过统计图像中每一 列(行)的黑像素个数得到垂直(水平)投影直方图。在直方图中字符区 域对应于波峰,字符间隙对应于波谷,以此为基础对字符进行切分。投影 法的优点是算法简单,容易实现,而且速度较快。一般来说,投影法的切 分路径为一条直线,比较适用于字符之间能够明显分开或者出现简单粘连 的情况,而对于严重粘连或交错的字符难以区分字符边界,往往得不到正 确的切分。这时候,投影特征只能作为一种补充手段。

4.1 投影分割 Y

0

X A

B

C

图 4-1 投影分割图

在做出投影之后,可以根据波谷进行分割,如图所示,A,B,C 即为三个 分割点。

4.2 迷宫分割 4.2.1 算法思路来源 通过外轮廓特征进行图片处理在图片识别领域比较热门,比如有根据两 个相邻字符之间形成的“椭圆”来进行分割的,还有根据字符笔段特征进 行分割的,本文提出的根据“轮廓走势”则是基于“边识别边分割”的思 路,抛弃以往算法中复杂的分析、比较和判断环节,由 ACM 中常见的“迷 12

[验证码识别方法的研究]

宫算法”]推演而来。下面将首先介绍“迷宫算法” ,然后定义“轮廓走势”。 (1) 迷宫算法 在迷宫中寻找出路的过程,实际上是一个搜索的过程:在任何时刻,处 于迷宫的任何位置,总让它按东、东南、南、西南、西、西北、北、东北 8 个方向顺序试探一下个位置;如果试探的方向可以通过,并且之前没有到 达过(这需要同步进行标记) ,则前进一步,在新位置上继续进行搜索;如 果 8 个方向都走不通或曾经到达过,就往后退一步,在原来位置上进行下 一个方向的试探。 每一步搜索都要判断是否到达迷宫“出口”,如果到达则停止搜索并退 出,如果没有到达就继续搜索。如果一直退回到出口,则说明该迷宫不存 在通路。 X

O

1

2

4 6

3 5

7

8

Y 图 4-2-1 轮廓走势图

(2) 轮廓走势的定义 验证码字符像所有其他字符一样,具有一些固定的轮廓特征,表现在外 轮廓上,其特征是有变化趋势的——“走势”,该“走势”将其与其他不同 字符区分开来,我们只需编写程序跟踪外轮廓的“走势” ,即可将不同字符 分割开。 (3) 基于轮廓走势分割算法的提出 “轮廓走势”分割是本文在实验基础上,基于“迷宫算法”推演出的一 种分割方法,其思想基于字符轮廓的整体性特征,如上图所示,字符 Q 的 轮廓如箭头 3 指示的那样, 在两个字符间进行“路径搜索”的时候,只需 模拟“左”字符的外轮廓“走势”,以“向下”优先顺序,采用“迷宫算法” 进行搜索,最终达到图像边界搜索停止。 4.2.2 分割线确定算法 算法思想如下: 1.定义最有搜索方向序列; 2.采用边识别边分割策略,寻找“最左上”分割切入点; 3.按搜索方向,递归向下沿字符外轮廓搜索可达路径,到下界为止; 13

[验证码识别方法的研究]

4.将上一步中的分割线以左的区域标记“已搜” ; 5.重复 2,3,4,直到分割完毕。 如图 4-2-2 所示,为分割效果图:

图 4-2-2 迷宫算法分割效果图

以上选取的分别是 51com,cctv,4399 游戏,当当网,去哪儿,7k7k 游戏 网站的验证码。通过实验可以发现,该分割程序适用于大部分验证码,在 上图所示的几种验证码中,该分割程序较好地将位置随机、相互粘连的字 符分割开来,且分割线只需三条,比其他分割法计算量明显减少。另外, 在沿外轮廓搜索的过程中,程序自动排除了许多干扰的因素,实现最优化 自上向下的分割,并自动将分割线保存,用于接下来的验证码识别。

14

[验证码识别方法的研究]

5 特征提取 5.1 常见特征提取方法 5.1.1 统计特征 统计模式识别分为以下几类: 1)模板匹配 模板匹配并不需要特征提取过程。字符的图像直接作为特征,与字典中 的模板相比,相似度最高的模板类即为识别结果。这种方法简单易行,可 以并行处理;但是一个模板只能识别同样大小、同种字体的字符,对于倾斜、 笔划变粗变细均无良好的适应能力。 2)利用变换特征的方法 对字符图像进行二进制变换(如 Walsh 变换、Hardama 变换)或更复杂的 变换(如 Karhunen-Loeve 变换、Fourier 变换、Cosine 变换、Slant 变换等), 变换后的特征的维数大大降低。但是这些变换不是旋转不变的,因此对于 倾斜变形的字符的识别会有较大的偏差。二进制变换的计算虽然简单,但 变换后的特征没有明显的物理意义。K-L 变换虽然从最小均方误差角度来 说是最佳的,但是运算量太大,难以实用。总之,变换特征的运算复杂度 较高[3,4]。 3)投影直方图法 利用字符图像在水平及垂直方向的投影作为特征。该方法对倾斜旋转非 常敏感,细分能力差。 4)几何矩特征 Hu 提出利用矩不变量作为特征的想法,引起了研究矩的热潮。研究人 员又确定了数十个移不变、比例不变的矩。我们都希望找到稳定可靠的、 对各种干扰适应能力很强的特征,在几何矩方面的研究正反应了这一愿望。 以上所涉及的几何矩均在线性变换下保持不变。但在实际环境中,很难保 证线性变换这一前提条件[4,5]。 5)spline 曲线近似与傅里叶描绘子 两种方法都是针对字符图像轮廓的。Spline 曲线近似是在轮廓上找到曲 率大的折点,利用 spline 曲线来近似相邻折点之间的轮廓线。而傅里叶描绘 子则是利用傅里叶函数模拟封闭的轮廓线,将傅里叶函数的各个系数作为 特征。前者对于旋转很敏感;后者对于轮廓线不封闭的字符图像不适用,因 此很难用于笔划断裂字符的识别[5]。 5.1.2 结构特征 结构模式识别又称结构方法或语言学方法。其基本思想是把一个模式描 15

[验证码识别方法的研究]

述为较简单的子模式的组合,子模式又可描述为更简单的子模式的组合, 最终得到一个树形的结构描述,在底层的最简单的子模式称为模式基元。 在句法方法中选取基元的问题相当于在决策理论方法中选取特征的问题。 通常要求所选的基元能对模式提供一个紧凑的反映其结构关系的描述,又 要易于用非句法方法加以抽取。显然,基元本身不应该含有重要的结构信 息。模式以一组基元和它们的组合关系来描述,称为模式描述语句,这相 当于在语言中,句子和短语用词组合,词用字符组合一样。基元组合成模 式的规则,由所谓语法来指定。一旦基元被鉴别,识别过程可通过句法分 析进行,即分析给定的模式语句是否符合指定的语法,满足某类语法的即 被分入该类[6]。 模式识别方法的选择取决于问题的性质。如果被识别的对象极为复杂, 而且包含丰富的结构信息,一般采用句法方法;被识别对象不很复杂或不含 明显的结构信息,一般采用决策理论方法。这两种方法不能截然分开。在 句法方法中,基元本身就是用决策理论方法抽取的。在应用中,将这两种 方法结合起来分别施加于不同的层次,常能收到较好的效果。字符是一种 特殊的模式其结构虽然比较复杂但具有相当严格的规律性换言之,字符图 形含有丰富的结构信息,可以设法提取含有这种信息的结构特征及其组字 规律,作为识别字符的依据,这就是结构模式识别。结构模式识别是早期 文字识别研究的主要方法。以汉字为例,其主要出发点是汉字的组成结构。 从汉字的构成上讲,汉字是由笔划(点横竖撇捺等)、偏旁部首构成的;还可 以认为汉字是由更小的结构基元构成的。由这些结构基元及其相互关系完 全可以精确地对汉字加以描述,就像一篇文章由单字、词、短语和句子按 语法规律组成一样。所以这种方法也叫句法模式识别。识别时,利用上述 结构信息及句法分析的方法进行识别,类似一个逻辑推理器。用这种方法 来描述文字字形结构在理论上是比较恰当的,其主要优点在于对字体变化 的适应性强,区分相似字能力强;但是,在实际应用中面临的主要问题是抗 干扰能力差,因为在实际得到的文本图像中存在着各种干扰,如倾斜、扭 曲、断裂、粘连、纸张上的污点、对比度差等。这些因直接影响到结构基 元的提取,假如结构基元不能准确地得到,则识别效果会受到很大影响[4]。

5.2 基于旋转不变的特征提取方法 5.2.1 旋转不变的定义 旋转不变思想是指“图像可被转换成时间序列,轮廓上的每个点到图片 质心的距离可在 x 轴上用横坐标表示出一个序列” [10]。轮廓上的每一个点的 特征都在序列上得到了体现,这使得图像特征得到很好的提取和保留。如 图 5-2-1 所示:

16

[验证码识别方法的研究]

图 5-2-1 不变矩原理示意图

本文在此思想的基础上,提出利用验证码字符“左右倾斜”的特征,使 用旋转不变的“圆周法”对验证码字符的特征进行提取,并通过“有效旋 转”减少计算量,循环求解最匹配特征。这需要先求得图像的质心,然后 求出边界与质心的距离。实际操作中,首相将分割好的字符,进行一定比 例的放大缩小,将其放在一个直径一定的圆中,使其内接圆,然后从圆心 向外做射线,射线间隔为  ,每条必然与圆周相交,则从相交点沿射线向圆 2 

心寻找相交点(即射线与字符轮廓的相交点) ,记录最近的一个点。将  个 记录按序存储,组成一个序列,记为 K  {k1 , k2 , k3 ,...kn } ,然后,改变序列初始 点,有 n 种情况,于是组成一个 n 阶矩阵,如下所示:  k1 k  2  k3   ...   kn

k2 k3 k4

... ... ...

... k1

... ...

     ...  kn 1   kn k1 k2

2

序列间进行匹配,时间复杂度是 n ,找出相似度最接近的序列。假设有 m 个 样本,则共产生 m 个最大相似度记录,然后比较得到最符合的字符。 5.2.2 改进的提取过程 根据不变矩的思想,本文将其算法改进并实现。同时,为了减少多余计 算,本文加入“有效旋转”这一概念,即在实际中,字符不可能左右倾斜 90 度以上,因而可以对矩阵规模减少一半。算法分为如下几步: 1.由第 3 节中分割结果取得字符区域并计算字符内接最小圆; 2.计算该圆的圆心 center; 3.从 center 以  的递增角度,向圆周边界做射线,求得累积相交的字符 区域像素数目以及最早相交点; 4.构造 n 阶矩阵; 5.重复 1-4 步骤,直到特征库足够; 6.模板匹配,求的 n 阶矩阵最小差值,得到匹配结果。 17

[验证码识别方法的研究]

图 5-2-2 不变矩特征提取示意图

如图 5-2-2 所示,在不变矩理论指导下,对图中字符进行特征提取的时候, 需要先确定字符的质心,在通过向事先拟定的圆周上做投影,分别计算指 定角度和步长上的像素个数,得到该字符的特征矩阵。 5.2.3 提取结果对比 如下图 5-2-3 所示是不变矩特征的示意图,其中单字符如第一行“5”是 指下面的矩阵是字符“5”的特征矩阵:

图 5-2-3-1 不变矩特征

通过不变矩算法提取的字符轮廓统计特征,实验中,通常保存在硬盘中 指定的文件中,从而减少再次运算的计算量。而相比之下,运用投影法提 取的特征仅是水平垂直像素投影值,如下图所示,对比可知,不变矩算法 对字符特征的全局性信息保存完整,信息量较充足。

图 5-2-3-2 投影特征

5.3 基于形状上下文特征提取法 5.3.1 形状上下文原理 普通的字符统计特征一般集中于字符的长宽、字形走势、像素分布,色 18

[验证码识别方法的研究]

彩信息等,形状上下文是首次结合字符的结构特征,对字符各个部分相对 于整体的位置信息进行统计,该方法由 S. Belongie、J.Malik 等人于 2000 年 提出,一经提出后,该理论即得到了图像识别领域的特别关注,国内外学 者纷纷将注意力集中在此方法的实践应用上,Berkeley 的 Greg Mori 用此方 法对 Gimpy 验证码进行识别,得到了较高的识别率,国内学者申家振等亦 对此方法有所探索,目前,形状上下文已经在足迹识别、车牌识别、验证 码识别中得到广泛应用。 在识别物体的时候,我们将每一个物体看作一个点的集合,而形状上下 文是该点集的一个有限集合。实际中,这个有限集合是从物体内外轮廓中 提取的一个样本点集,这可以通过边缘检测等手段获得相应点集。通过实 验可知,该样本集越大,物体的特征就提取的越完备,当然,没有必要完 全提取所有点,因为这样会造成冗余计算,即产生过匹配的现象。 对于待识别图像上所提取的点集中的任一点 pi ,我们需要做到是去找到 模版中与之最为匹配的点 qi ,以往的实验可以得知,如果点具有十分充分的 相对位置的特征描述,即如果该点与周围所有的点的关系都得知,那么在 不限制计算时间的情况下,我们完全可以找到这两个非常匹配的点。然而 在实际中,很明显,我们受到效率的影响,我们受到计算时间的限制,不 可能将每个点的所有信息列举出来再进行匹配计算。同时,过于详细的信 息会带来十分复杂的匹配关系,以致最终的计算可能无解[11]。 而作为形状上下文,对于每个点的描述采用如下公式: hi (k )  #{q  pi : (q  pi )  bin(k )}

在上式中, hi 直方图信息,即对于 pi ,将其四周划分为若干个 bin,统计每 个 bin 中的像素数目。这样,抽取的点集中,除了 pi 之外的其他点与 pi 的相 对位置关系得出。这个直方图信息 hi (k ) 即为 pi 的形状上下文信息。如下图 10 所示,bin 是在极坐标下进行设置的。

图 5-3-1 形状上下文示意图 19

[验证码识别方法的研究]

对于待匹配点 pi 以及模版中点 qi ,使用 Cij  C ( pi , qi ) 来计算不匹配度,即采用 如下公式: 2 1 K [hi (k )  h j (k )] Cij  C ( pi , qi )   2 k 1 hi (k )  h j (k )

其中, hi (k ) 和 h j (k ) 表示第 k 个 bin 中针对 pi 和 qi 规范化的直方图信息。 如上图 5-3-1 可知,(a)和(b)相对应的点具有相近的直方图:(d)和(e)。而(a) 中 所标识的点的直方图(f)与其具有较大差异,即点与点之间的不匹配度 Cij 较大。 5.3.2 形状上下文特征匹配 在求出两张图中点之间的不匹配度集合 Cij 之后,我们需要计算总体的不 匹配度:

H ( )   C ( pi , q i )

其中,  是一个排列组合。 由此而来,这变成了一个最优匹配的问题,采用 Hungarian 方法将在 [10,11] O( N 3 ) 时间复杂度内解决 。实际运用中,可以设置一个阈值,即最终能 得到多于一个的匹配结果。有利于进一步筛选。 经实验提取的特征如下图所示。与前面相同,数据格式为 {x : data} , x 表 示 字 符 , data 表 示 特 征 矩 阵 , 形 状 上 下 文 的 特 征 是 一 个 三 维 的 : data  P[n][bins][tbins] ,其中 n 表示对于字符 x 随机提取的样本点数,bins 表示 每个点为中心由近及远划分的区域数目, tbins 表示以每个点为起始点旋转 360 度的步长。

图 5-3-2 形状上下文特征

由图 5-3-2 可知,每个字符的形状上文特征十分庞大,远远超过前几章所讨 论的简单算法提取的特征,而且,该特征是一个高维的数据组合矩阵。然 而,在本文实验测试部分讨论的方法中,有效的避免了形状上下文这些不 利之处,并趋利避害,充分利用了它对字符特征的完备性描述,对变形字 符进行识别,得到了理想的效果。

20

[验证码识别方法的研究]

5.4 对形状上下文的 PCA 降维 5.4.1 PCA 主成份分析原理 在完成字符的多种特征抽取后,得到了一个高维的特征向量。由于在高 维的特征空间, 算法的时间复杂度和空间复杂度都大大增加, 而且参数估 计也变得困难,需要对特征进行降维处理。PCA 是一种通用的在特征空间 提高类别分辨能力的线性变换,它的优点是通过对可分性测度函数的优化, 在变换后的低维特征空间保留对分类能力最强的一组特征[12] 。因此本文选 择它作为特征选择和压缩的方法。 一个完整的 PCA 算法可描述为: 1)由训练样本 xi (i  1, 2,..., N ) 来计算空间的协方差矩阵 R ; R

1 N  ( xi  m)( xi  m)T N i 1

(1)

2)采用奇异值分解( SVD) 算法求 R 的特征向量 u s ( s  1, 2,..., p) 和特征值  ; 3)对特征值以降序排列( 1  2  ...  m )。按下式(2)确定子空间的维数 m , 并 以相应的基来构成空间 L' : m

 s 1 p

s

 s 1

 r1 ,

m r p 2

(2)

s

式(2)中: N 为数字和英文字符训练样本的总数; r1 , r2 均为小于 1 大于零的 正数; m 为使(2)成立的最小正整数; 4)根据 U  (u1 , u2 ,..., um ) 求空间 L 的投影矩阵: (3) P UT ' ' ' 向量 xi 可通过其在空间 L 的投影分量来重构, 即有 xi  Pxi 所得到的 xi' 即 为降维后的特征向量。 5.4.2 形状上文的 PCA 降维处理 如 5.2 中所述,形状上下文特征具有高维的显著特点,使得实际的计算 过程复杂、计算量大。为此,本文利用 pca 降维的优良特性,对形状上下文 的特征降维压缩进行了一点尝试,并通过实验对比降维前后对识别的影响。 在对形状上下文进行降维的过程中,面临的主要问题是:每个字符的像素 点数不同,导致维数不固定;字符变形复杂时候,样本选择是一个问题; 为此,在较好理解 pca 降维原理的基础上,本文采取了以下措施: 1) 随机点的选择将按照布局进行平均提取,并确保总数相同。如下图所示:

21

[验证码识别方法的研究]

中央 区 图 5-4-2 随机点选择策略

如图 5-4-2 所示,字符 A 被放置在一个网格中,其取点的策略为:以重 心为主,兼顾四周。一般而言重心处所获得的信息较多,但考虑到字符 重心区域过于单一,可以将重心向四周扩展一部分,即形成如图所示的 “中央区” 。 2) 变形复杂的字符,取样本的时候,仍然是首先采取大样本策略,其次, 根据形状上下文在二部图匹配中的匹配误差,筛选类间相似度最小的作 为样本。

22

[验证码识别方法的研究]

6 分类器设计 6.1 1-NN 分类器 设分类判别式 x (ji )  i (i  1, 2, c , j  1, 2, Ni ) 采取以下规则:对于待识别 c

字符特征向量 x ,分别计算它与 N   Ni 个已知类别的特征样本 x (j i ) 的距离,将 i 1

它判为距离最近的那个字符样本所属的类[14] 。即: di ( x )  min x  x (j i ) , i  1, 2,...c , i  1,2, , c j 1,2, , Ni

如果 d m ( x )  min di ( x ) ,则 x  m 。图示如下: i 1,2, , c

图 6-1 1-NN 分类示意

6.2 K-NN 分类器 c

对待识别字符特征向量 x ,分别计算它与 N   Ni 个已知类别的字符特征 i 1

向量样本 x 的距离,取 k 个最近邻样本,这 k 个样本中哪一类最多, 就判属哪 (i ) j

一类[8,15]。即,令 x 与 i 的距离: d i ( x )  ki , i  1, 2,

c

, c;  ki  k , i 1

如果 d m ( x )  max di (x ),则 x  m 。其中 k i 表示 k 个近邻元中属于 i 的样本个 i 1,2, ,c

数,图示如下:

23

[验证码识别方法的研究]

图 6-2 K-NN 分类示意

6.3 SVM 分类器 (1)二元向量机的设计 如下图 6-3(1)所示,支持向量机是相关监督下的学习方法,即可用于分 类也可用于识别。实验实际进行中亦综合利用 SVM 这两方面的优势。当在 支持向量机中输入样本的时候,SVM 可以将其划分到两个类别中。一个 SVM 训练算法运行过程中首先尝试建立一个决策模型,这个决策判断模型可以 对一个输入的待识别样本进行判断,判断属于那一个类别中[16]。

图 6-3-1 SVM 分类示意

最左边一图是两类待分的物体;中间一图是寻找到最优超平面 [16],最后一 图是根据找到的超平面选择分开的两类物体中的代表。 一个线性支持向量机由一组向量和权重集合组成,给定一个支持向量机 N 组向量和 z1 , z2 ,..., z N 和权重 w1 , w2 ,..., wN ,那么 SVM 的输出为: N

F ( x)   wi  zi , x   b i 1

上述 SVM 属于线性分类器,通过将 Kernel 核函数应用到超平面中,我们得 到 Kernel 向量机。在线性分类器中,我们需要把数据输入到一个高维空间 中,然后线性算法在此空间做非线性计算,而 kernel 向量机对匹配并不进 行计算,仅仅需要将所有的点积用 kernel 函数代替: k ( x, y)  ( x), ( y) 

其中,  表示一个非线性匹配函数。 通过这个 kernel 函数,算法只需在高维空间中进行而无需将输入数据显 式映射到改空间。这对我们的计算非常有用,因为有时候高维特征趋向无 限纬度以致无法计算。另一方面,原始的 SVM 包括了点积的计算,因此该 24

[验证码识别方法的研究]

kernel 函数可以直接使用[17]。 (2)多级向量机的设计 前面讨论的二元向量机在实际中并不能满足要求,因为识别过程中字符 类别往往不止两类,因此需要将上述二元向量机扩展为多级向量机[17,18]。假 设需要分类的类别为 A、B、C 三类,则为了使用二元向量机进行计算,我 们把三类的全排列找出来,如下图所示:

图 6-3-2 分类问题的二元转换

由上图可知,转换过程中出现了不必要计算及重复计算如 A  A , A  B ( B A) 。因此简化后的二元计算如图 6-3-3 所示:

图 6-3-3 简化的二元划分

因此,对于 n 级分类问题,我们只需要进行 (n 1)  n / 2 次二元向量机运算。 可以得知,对于上述 A、B、C 三类问题,我们需要进行 3 次二元划分,只 要多级分类问题实际就转换成了如下子问题:

这样,我们可以将一个分类问题化作一个投票的过程,每一个分类器可 以投出一票,比如第一个分类器投了 A 一票,剩下两个都投了 C 一票,那 么,如图所示:

25

[验证码识别方法的研究]

可得到如下投票结果:

图 6-3-4 向量机投票统计

即最终得到分类结果为 C。

26

[验证码识别方法的研究]

7 实验结果与分析 7.1 分割算法的性能分析 投影分割算法主要考虑对阈值的选择,由于字符轮廓相互重叠的情况 下,较低的阈值容易造成错分割。对于迷宫算法,则可控的参数为旋转步 长、放射步长等。 下表统计了两种分割算法对不同验证码的分割情况: 表 7-1-1 不同算法分割率比较

验证码

实验样本 数 400 450

投影法 (%) 100 41

迷宫法 (%) 100 90

增长率 (%) 0 120

200 95 98 3 500 74 94 27 500 33 91 175 300 85 95 12 通过上表可知,本文提出的迷宫算法在分割位置随机、字符变形、倾斜, 重叠类型的验证码方面具有十分明显的优势,传统的投影法只能分割垂直 投影无交叉的验证码,一旦遇到相互投影重叠的验证码,分割效率下降显 著。采用迷宫算法对上述验证码(涵盖了当前大多数类型的验证码) ,分割 效果图如下所示: 表 7-1-2 分割效果

7.2 上下文特征参数训练 由 4.1 节可知,形状上下文的特征需要在一个极坐标下进行计算,而对 任一点出发的极坐标选择多大的 bin 为统计单元是通过 Bins 和 ThetaBins 27

[验证码识别方法的研究]

两个参数决定的[9]。通常而言,有如下两种基本模式:

模式 1

模式 2 图 7-2-1 形状上下文两种基本特征模式

说明:模式 1 代表 Bins 数目较多而 ThetaBins 较少;模式 2 代表 ThetaBins 较多而 Bins 较少。算法中的统计单元即图中每一个扇形区域。 需要进行设置的参数及其默认值如下所示: 表 7-2-1 形状上下文特征主要训练参数

参数 用途 默认值 Source 20 指定样本点数量 Target 100 指定目标点数量 Bins 5(12) 极坐标下分割区域 ThetaBins 12(5) 极坐标下旋转步长 第一步:Source 与 Target 参数训练 该步中,Bins 与 ThetaBins 不变(模式 1:Bins:12;ThetaBins:5) ,改变 Source 和 Target 参数,即改变待识别字符与目标模版字符选取的特征点数。 每次测试的实例为 120 个,得到如下统计表: 表 7-2-2 Source 与 Target 组合测试

S T 10 20 30 40 50 60 80 mid 100 200 max 由上表可知,Bins

10

20

30

40

50

60

80

9 25 22 29 27 25 31 32 26 24 27 28 35 40 46 30 32 34 49 45 36 32 25 48 41 31 47 30 29 33 27 32 45 55 42 22 52 31 36 52 42 37 36 38 38 43 57 34 55 21 39 46 40 49 x x 与 ThetaBins 不变的情况下,S(即待识别字符特征点数 28

[验证码识别方法的研究]

Source)与 T(即模版字符特征点数 Target)在典型排列组合下取得了不同的识 别率。抽取每组组合中的最大值,与匹配时间权值(文中略)相乘。得到如下 较优组合: 表 7-2-3 模式 1 下的较优组合

组合 20-100 30-80 40-60 50-200 60-mid

识别数 52 48 49 57 55

识别率 0.43 0.40 0.41 0.47 0.45

第二步:模式转换 该步中,将模式一下的较优组合移植到模式二下重复试验。即参数 Bins=5,ThetaBins=12。同时将每次的测试实例增加到 200,得到如下统计 表: 表 7-2-4 模式 2 下识别率与耗时统计

组合 识别率 20-100 0.75 30-80 0.72 40-60 0.69 50-200 0.82 60-mid 0.73 50-100 0.75 将上表中耗时归一化后得到下图:

耗时(mins) 8 11 11 41 34 22

图 7-2-2 识别率、识别时间对比图

由上图表可知,模式 2 下识别率显著提高,不难得出,模式 2 对极坐标的 区域划分更有利于对特征点的本地信息概括和对本地信息的相关联特性表 达。对比耗时项,选择“20—100”组合继续进行实验,下一步的实验在模 式(模式 2)不变、组合(20—100)既定的情况,探讨不同 Bins 和 ThetaBins 对 识别率、识别时间的影响。 29

[验证码识别方法的研究]

第三步:Bins 与 ThetaBins 参数训练 该步中,针对模式 2 中 Bins:ThetaBins=5:12 的比例情况,分别对两个参 数做微调,并以模式 1 中的比例为界限。选取的组合以及测试情况如下: 表 7-2-4 Bins 与 ThetaBins 组合下识别率、识别时间统计

组合 识别率 耗时(mins) 9-12 0.79 13 7-12 0.72 11 3-12 0.76 6 5-6 0.66 5 5-8 0.58 6 5-10 0.74 8 5-14 0.74 11 5-16 0.73 11 通过将识别时间归一化并与识别率相互对比得到如图:

图 7-2-3 识别率、识别时间对比图

由上图可知,综合识别率与识别时间考虑,最优组合当属“3-12”,为确保 该步骤中微调的精度,本实验进一步以此最优组合为基点,进行了如下测 试: 表 7-2-5 微调测试

组合 识别率 耗时(mins) 3--12 0.76 6 3--14 0.73 8 3--16 0.77 8 3--18 0.76 9 4--12 0.7 8 通过上表观察可知,最优组合仍为 3-12 组合。到此,通过实验确定的参数 已经得出。 表 7-2-6 最优参数列表

参数 Source

用途 指定样本点数量

最优值 20 30

[验证码识别方法的研究]

Target Bins ThetaBins

指定目标点数量 极坐标下分割区域 极坐标下旋转步长

100 3 12

7.3 分类算法的性能分析 本文主要讨论的分类算法包括最近邻分类器和支持向量机分类器,从前 文的论述中可以得知,支持向量机将高维特征向低维过渡,实现了复杂模 型的区分,理论上具有较好的应用价值;最近邻分类器相对简单,但分类 效率不容小觑。通过本文的实验发现,两种分类器对如下字符分类识别时 各有优缺点。 (1)针对变形验证码的识别:

图 7-3-1 验证码测试示例

对于上述变形验证码,采用训练好的特征提取参数并运用最近邻分类器和 支持向量机分别进行实验,得到的识别情况如下表所示: 表 7-3-1 分类识别对比情况

分类器 识别率 误识情况 K-NN 76% E->BDU; k->NHRwx; S<>B F<>P; f<>t; y->F; t->EY A->Xk; x->kA; M->D; V->U b->hd SVM 80% G->U;Q->UdeG;q->uRG;R->KN K->dHhN;A->Kkx;T->fFY;W->bkNUw F->ipPty;t->Efs;e->bdG;c->GU X->AR;p->Du;L->E;w->khBN;H->wn h->km;D->b;Z->sb;B->DE;E->CU 由上表可知,SVM 在识别率上略有提高,但误识情况较为严重,如果一味以 识别率为标准的话,将会导致在识别率无显著提高的情况下,由于误识的 严重性而使得整个系统用户体验下降,因此本文建议针对变形验证码的识 31

[验证码识别方法的研究]

别采用最近邻分类器。 (2)针对手写体的识别

图 7-3-2

手写体测试示例

对于上述变形手写体,采用训练好的特征提取参数并运用最近邻分类器和 支持向量机分别进行实验,得到的识别情况如下表所示: 表 7-3-2 分类识别对比情况

分类器 识别率 识别时间(ms) K-NN 92% 170 SVM 97% 253 针对上述实验结果,在识别变形手写体方面,本文推荐使用 SVM 向量机作 为分类器。

7.4 不同验证码识别结果统计 表 7-4 识别率统计

序号 1

验证码来源 4399 游戏吧

2

验证码样例

样本数量 78*4

识别率 100%

维奇网

50*4

100%

3

CCTV

59*4

100%

4

21CN

100*4

93%

5

幸福婚嫁

50*4

98%

6

当当网

500*4

87%

7

7k7k 游戏网

100*4

84%

8

水木社区

128*4

86%

9

去哪儿

50*4

79%

32

[验证码识别方法的研究]

10

铁血网

300*4

97%

11

支付宝

50*4

100%

12

Kugo 音乐

300*4

97%

13

NBA 中国

100*5

97%

14

京东商城

500*5

95%

15

ebay

100*11

90%

16

188 财富邮

350*(2~5) 89%

17

手写体

1000

97%

33

[验证码识别方法的研究]

8 识别器的设计和使用 8.1 识别界面

图 8-1 用户界面

如图 8.1 所示,在验证码识别之初,需要先指定验证码的来源,以及验证码 模版的载入和其他先验值的设定。以上是验证码识别界面,包括“处理” 模块,即算法集合区域; “测试图片模块”,含有验证码和手写体两个部分; “识别结果模块”,显示识别结果的地方。

8.2 识别器的使用 1)路径设置及分类器载入 在使用识别器的时候首先需要设定分类器(包括变形验证码及手写体的 分类器)、本地图片库(防止无法进行网络连接时候,不能实时从互联网下 载图片)、网址设定(即选择从网站下载验证码图片)。如下图所示:

34

[验证码识别方法的研究]

图 8-2-1 初始设置图示

2)下载验证码 直接单击 Load,如果网络链接正确,可以从指定网站下载验证码并保存 在本地,同时显示在“图片显示”区,如下图所示:

图 8-2-2 下载验证码图示

3)预处理 从网上下载验证码图片后,通过预处理模块进行灰度化、去噪等处理, 将图片变成二值图片,如下图所示:

图 8-2-3 预处理图示

在上图中,通过鼠标指定 process Method 中的处理方法,然后单击下方“+” 将方法添加到 method list 中, 并可以通过左侧 parameter 栏目进行参数设置, 最后,单击“process” ,进行处理,如下图所示:

图 8-2-4 预处理结果

4)分割 35

[验证码识别方法的研究]

单击“分割模块”中的 split,默认选择 maze 算法,进行分割,如下图 所示:

图 8-2-5 分割后的图片

5)识别 单击“识别模块”中的 recognize,进行识别,如下图所示:

图 8-2-6 识别结果

6)在手写板上写字 用鼠标选定手写体模块后,在手写版上书写数字,如下所示:

图 8-2-7 手写体书写

7)识别手写体 单击“识别模块”中的 recognize,对手写体进行识别,如下图所示:

36

[验证码识别方法的研究]

图 8-2-8 手写体识别

其中,在分割模块中包含了手写体的粗细调整,即 split 按钮下方的滑动条, 可以对手写时的模拟笔进行粗细的调整,一般情况下,默认的状态是本文 作者已经调节好的最佳状态,无须再调整。 8)学习新的手写体 在手写板上有一个 study 按钮, 是当点击 recognize 识别结果错误的时候, 可以通过 study 将新的类型学习并保存,如下图所示:

图 8-2-9 手写体学习

37

[验证码识别方法的研究]

结论 本文以本科阶段参加的国家大学生创新型试验计划(简称“国创”)为 基础,对验证码的识别进行了更深入的研究。在国创中,本人制作了一套 系统的识别软件,能够针对一般验证码进行较好的识别,且扩展性强。在 毕业设计阶段,本人利用已有的研究基础,继续在验证码识别的关键环节, 比如特征统计方面,结合 pca 的原理,对原本复杂的高维特征进行了压缩, 实验证明改进后的算法对变形验证码识别效率高、识别速度快。另外,针 对不同类验证码,本文在预处理算法上做了一定扩展,增加了系统的通用 性;在最后的实验阶段,本文做了较为详实的统计对比。总体而言,通过 毕业设计阶段的研究,本人对验证码的识别研究又进了一步,为以后的科 研工作打下了较好基础。希望此文能为高级验证码的进一步研究提供微不 足道的参考。

38

[验证码识别方法的研究]

致谢 大学四年是一个人成长最快的一段时间,也是一个人的人生观、价值 观成型的最后阶段。衷心感谢在这四年里遇到的每一位恩师,感谢他们在 我最青春的岁月里给我人生的指导和关怀。 感谢我的导师陈双平,谢谢他从大一开始以来对我的帮助和指导。从 刚上大学开始,在陈老师的帮助下,我对自己的大学生活便进行了规划, 虽没有完全达到他的“要求” ,但是一路走来,我成长了很多,尤其重要的 是,我明确自己未来要走的路、而且坚信自己会达到所向往的高度,这种 自信是我最为骄傲的收获,是与陈老师的激励和支持完全分不开的。由衷 地感谢他。 同时感谢周密老师、李军老师、王博老师,他们对我的教导我谨记心 间,感谢他们对我真诚的关怀。 也要感谢武建华老师、潘冰老师、戴红老师、王勇杰老师、李艳辉老 师、孔锐老师、胡文芝老师、吴广庆老师等曾经教过我的老师,我喜欢他 们的大师风范犹如喜欢他们教过我的课程一样。 另外感谢 Texas Tech 大学的 Prof. Chen,谢谢他悉心的教诲和对我未来 方向的指导。 最后特别感谢我的父母, “鸦有反哺之义,羊有跪乳之恩” ,千言万语, 只希望我有朝一日能报答他们的养育之恩。

39

[验证码识别方法的研究]

附录A 迷宫分割算法的实现 部分核心代码:迷宫分割算法的实现 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using ImageUtil; using System.Drawing; using System.Drawing.Imaging; //using NetQer.Graying; namespace Valiantljk.Split { public class Split:IAlgo { private int Topleft_x;//定义最左坐标 private int Topleft_y; private item[] move = new item[4];//4 个方向 寻找路径 Stack[] s; //声明栈数组,用于保存分割路径 #region 定义坐标 /// /// //定义坐标 /// struct item { private int x_value; private int y_value; public int x { get { return x_value; } set { this.x_value = value; } } public int y { get { return y_value; } set { this.y_value = value; } } } #endregion #region 构造函数 /// /// 构造函数 /// public Split() { base.SupportedPixelFormat.Add(PixelFormat.Format8bppIndexed); // this.maxsize = 10000; this.Topleft_x = 0; this.Topleft_y = 0; //the down direction is prior this.move[0].x = 0; this.move[0].y = 1; //to the right direction this.move[1].x = 1; this.move[1].y = 0; //then the left direction this.move[2].x = -1; this.move[2].y = 0; //then the up direction this.move[3].x = 0; this.move[3].y = -1; } #endregion #region 取得最 topleft 的坐标值 40

[验证码识别方法的研究] /// /// //取得最 topleft 的坐标值 /// private void Find_Topleft_position(BitmapDataUtil bmpDataU, int w, int h) { int x, y, Total; int ok = 0; //Find the topleft_y position. for ( y = 0; y < h; y++) { for (x = 0; x < w; x++) { Total = bmpDataU.GetPixel(x, y)[0];//find the first black point ==0; if (Total == (byte)0) { Topleft_y = y - 1; ok=1; break; } } if (ok == 1) { ok = 0; break; } } //Find the topleft_x position. for ( x = 0; x < w; x++) { for (y = 0; y < h; y++) { Total = bmpDataU.GetPixel(x, y)[0]; if (Total == (byte)0) { Topleft_x = x; ok = 1; break; } } if (ok == 1) { ok = 0; break; } } } #endregion #region 定义栈中元素 /// /// //定义栈中元素 /// class datatype { private int x_value; private int y_value; private int d_value; public int x { get { return x_value; } set { this.x_value = value; } } public int y { 41

[验证码识别方法的研究] get { return y_value; } set { this.y_value = value; } } public int d { get { return d_value; } set { this.d_value = value; } } } #endregion #region 寻找可达路径 /// /// //寻找可达路径 /// /// /// private Stack path(Bitmap SrcBmp) { Bitmap bmpobj_maze = (Bitmap)SrcBmp.Clone(); // seqstack s = new seqstack() ;//保存路径; Stack s_ini = new Stack(); datatype temp = new datatype(); ; int x, y, d, i, j; temp.x = Topleft_x; temp.y = Topleft_y; temp.d = -1; //push_seqstack(s, temp); s_ini.Push(temp); using (BitmapDataUtil bmpDataU = new BitmapDataUtil(bmpobj_maze)) { while (s_ini.Count!=0) // while (empty_seqstack(s)!=1) { for (int fill_left = 0; fill_left < bmpobj_maze.Height; fill_left++) bmpDataU.SetPixel(Topleft_x - 1, fill_left, 0); temp = s_ini.Pop(); // pop_seqstack(s, temp); x = temp.x; y = temp.y; d = temp.d + 1; while (d < 4) { i = x + move[d].x; j = y + move[d].y; if (bmpDataU.GetPixel(i, j)[0] == (byte)255) { datatype temp_cao = new datatype(); temp_cao.x = x; temp_cao.y = y; temp_cao.d = d; s_ini.Push(temp_cao); //push_seqstack(s, temp);//find a possible route; x = i; y = j; bmpDataU.SetPixel(x,y,0); // maze[x][y] = -1; if (y == bmpobj_maze.Height-1) { datatype temp_cao_2 = new datatype(); temp_cao_2.x=x; temp_cao_2.y=y; s_ini.Push(temp_cao_2); return s_ini; } else d = 0; 42

[验证码识别方法的研究] } else { d++; } } } } return s_ini; } #endregion #region Computing 函数 /// /// Computing 函数 /// protected override Bitmap Computing(Bitmap Srcbmp) { s = new Stack[3]; int Bmp_width = Srcbmp.Width; int Bmp_height = Srcbmp.Height; Bitmap bmpobj = (Bitmap)Srcbmp.Clone(); Bitmap bmpobj_fantacy = (Bitmap)Srcbmp.Clone(); using (BitmapDataUtil bmpDataU = new BitmapDataUtil(bmpobj)) { for (int count = 0; count < 3;count++ ) { //Find the new Topleft position to gain a brandnew start. Find_Topleft_position(bmpDataU, Bmp_width, Bmp_height); s[count]= path(bmpobj); //将分割线以左的区域全部填白 foreach(datatype Data_gold in s[count]) { for (int x = 0; x <= Data_gold.x; x++) { for (int y = 0; y <= Data_gold.y; y++) { bmpDataU.SetPixel(x, y,(byte) 255); } } } } } return Draw_split_line(bmpobj_fantacy, s); } #endregion #region 画分割线 /// /// 画分割线 /// private Bitmap Draw_split_line(Bitmap bmpobj_fantacy,Stack [] s) { int width = bmpobj_fantacy.Width; int height = bmpobj_fantacy.Height; int x = 0; int y = 0; using (BitmapDataUtil bmpDataU = new BitmapDataUtil(bmpobj_fantacy)) { for (int count = 0; count < s.Length; count++) { foreach (datatype Data_gold in s[count]) { x = Data_gold.x; y = Data_gold.y; if(bmpDataU.GetPixel(x,y)[0]!=(byte)0)

43

[验证码识别方法的研究] bmpDataU.SetPixel(x, y, (byte)100); } for (int up_y = y; up_y >=0; up_y--) { bmpDataU.SetPixel(x, up_y, (byte)100); } } } return bmpobj_fantacy; } #endregion protected override bool checkParameter() { return true; } public override string ToString() { throw new Exception("The method or operation is not implemented."); } } }

44

[验证码识别方法的研究]

参考文献 [1] 文晓阳,高能,荆继武. 论坛验证码技术的安全性分析[C].全国计算机安 全学术交流会论文集. 张家界,中国,2007. [2] 文晓阳,高能,荆继武. 高效验证码识别技术与验证码分类思想[J].计算 机工程.2009,35(8) :186-188. [3] 许明. 验证码的识别与反识别. 南京理工大学本科生毕业论文. 2007 年 7 月:25-33 [4] 王正群. 手写体汉字识别研究. 南京理工大学博士论文. 2001. [5] Srihari S. N., Bozinovic R. M., A Multi-level Perception Approach to Reading Cursive Script, Artificial Intellignece 33:217-255, 1987. [6] 马婉婕. 车牌识别系统中字符分割的研究与实现[D].复旦大学,2009 . [7] 潘大夫,汪勃. 一种基于外部轮廓的数字验证码识别方法[J].微计算机信 息.2007,23(9) :256-258. [8] 关新平,黄娜,唐英干. 一种基于标记阈值的分水岭分割新算法[J]. 系统 工程与电子技术.2009,31(4):109-113. [9] 旷章辉. 上下文无关的粘连变形字符的识别. 中山大学本科生毕业论 文.2009 年 4 月:15-25 [10] Dragomir Yankov, Eamonn Keogh, Li Wei, Xiaopeng Xi. Fast Best-Match Shape Searching in Rotation Invarian Metric Spaces. Proceedings of the 7th SIAM International Conference on Data Mining (2007), Minneapolis, USA, 2007. Society for Industrial Mathematics, 2007:611-616. [11] S. Belongie, J. Malik, and J. Puzicha (April 2002). "Shape Matching and Object Recognition Using Shape Contexts". IEEE Transactions on Pattern Analysis and Machine Intelligence 24 (24): 509–521. [12] 姜铮铟,丁晓青. 基于 MQDF 的英文 OCR 多模板分类器[J]. 计算机工 程, 2005, 31(15): 56-58. [13] 李福颖.Visual C++图形图像处理与数据库篇[M].北京:中国电力出版 社,2003:15-44 [14] Binay Bhattacharya, Kaustav Mukherjee and Godfried T. Toussaint. Geometric decision rules for high dimensions. Proceedings of the 55th Session of the International Statistics Institute, Sydney, Australia, 5-12, 2005 (invited paper) [15] Belur V. Dasarathy, ed (1991). Nearest Neighbor (NN) Norms: NN Pattern Classification Techniques. ISBN 0-8186-8930-7 45

[验证码识别方法的研究]

[16] Corinna Cortes and V. Vapnik, "Support-Vector Networks", Machine Learning, 20, 1995. [17] Harris Drucker, Chris J.C. Burges, Linda Kaufman, Alex Smola and Vladimir Vapnik (1997). "Support Vector Regression Machines". Advances in Neural Information Processing Systems 9, NIPS 1996, 155-161, MIT Press. [18] 李佐,王姝华,蔡士杰. 一种基于前端预测识别的粘连字符分割方法[J]. 计算机研究与发展. 2001,38(11):1338-1343

46

lin-bs.pdf

Keywords: CAPTCHAs Recognition; Handwriting recognition; Shape. context. Page 3 of 51. lin-bs.pdf. lin-bs.pdf. Open. Extract. Open with. Sign In. Main menu.

1MB Sizes 10 Downloads 250 Views

Recommend Documents

No documents