如何识别高级的验证码的技术总结第4/4页

 更新时间:2008年06月26日 22:24:13   作者:  
这个问题,本身是人工智能,计算机视觉,模式识别领域的一个难题。作为破解者来说,是出于劣势地位。要做的很好,是很难得。总体来说,我走的是比较学院派的线路,能真正的破解难度比较高的验证码,不同于网上很多不太入流的破解方法。

五、高级验证码的破解分析

  时间关系,我简单介绍如何利用图像处理和模式识别技术,自动识别比较高级的验证码。

  (以风头正劲的Google为例)


按此在新窗口打开图片

1)至少从目前的AI的发展程度看,没有简单的做法能自动处理各种不同的验证码,即使能力很强,那么系统自然也十分复杂强大。所以,要想在很简单的算法实现比较高级的验证码破解,必须分析不同验证码算法的特点:

  作为一般的图像处理和计算机视觉,会考虑色彩,纹理,形状等直接的特征,同时也考虑直方图,灰度等统计特征,还考虑FFT,Wavelet等各种变换后的特征。但最终目标都是Dimension Reduction(降维)然后利于识别,不仅仅是速度的考虑。从图像的角度看,很多系统都考虑转换为灰度级甚者黑白图片。

  Google的图片可以看出,颜色变化是虚晃一枪,不存在任何处理难度。难度是字体变形和字符粘连。

  如果能成功的分割字符,那么后期识别无论是用SVM等分类算法,还是分析笔顺比划走向来硬识别,都相对好做。

  2)图像处理和粘连分割

  代码中的part1目录主要完成图像预处理和粘连字符分割

  001:将图像从jpg等格式转换为位图便于处理

  002:采用Fix/Adaptive的Threshold门限算法,将图片Bin-Value二值化。(可用003算法)

  003:采用OSTU分水岭算法,将图片Bin-Value二值化。(更通用,大部分时候效果更好)

  005:获取ROI感兴趣的区域。

  006:Edge Trace边缘跟踪。

  007:Edge Detection边界检测。

  008:Thin细化去骨架。

  009:做了一些Tidy整理。(这个一般要根据特定的Captcha算法调整)

  010:做切割,注意图片中红色的交叉点。

  011:将边缘检测和骨干交叉点监测的图像合并。(合并过程可以做分析: 比如X坐标偏移门限分析,交叉点区域纹理分析,线条走势分析,等等各种方法,找出更可能的切分点和分离后部件的组合管理。)


按此在新窗口打开图片

注:在这里,我们可以看到,基本的部件(字母是分割开了,但可以造成统一字母的被切割成多个Component。 一种做法是:利用先验知识,做分割; 另外一种做法是,和第二部分的识别结合起来。 比如按照从左至右,尝试增加component来识别,如果不能识别而且component的总宽度,总面积还比较小,继续增加。 当然不排除拒识的可能性。)

  3)字符部件组合和识别。

  part2的代码展示了切割后的字母组合,和基于svm的字符识别的训练和识别过程。

  Detection.cpp中展示了ImageSpam检测过程中的一些字符分割和组合,layout的分析和利用的简单技术。 而Google的验证码的识别,完全可以不用到,仅做参考。

  SVM及使用:

  本质上,SVM是一个分类器,原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方式来组合成一个多类分类的分类器。 天生通过核函数的使用支持高维数据的分类。从几何意义上讲,就是找到最能表示类别特征的那些向量(支持向量SV),然后找到一条线,能最大化分类的Margin。

  libSVM是一个不错的实现。

  训练间断和识别阶段的数据整理和归一化是一样的。这里的简单做法是:

  首先:

      #define SVM_MAX +0.999 
  #define SVM_MIN +0.001 


  其次:

  扫描黑白待识别字幕图片的每个像素,如果为0(黑色,是字母上的像素),那么svm中该位置就SVM_MAX,反之则反。

  最后:

  训练阶段,在svm的input的前面,为该类打上标记,即是那一个字母。

  识别阶段,当然这个类别标记是SVM分类出来。

  注意:

  如果是SVM菜鸟,最好找一个在SVM外边做了包装的工具,比如样本选择,交叉验证,核函数选择这些,让程序自动选择和分析。

六、对验证码设计的一些建议

  1.在噪音等类型的使用上,尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏人(噪音)长得和好人(字母)一样。

  2.特别好的验证码的设计,要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的分割和手写体(通过印刷体做特别的变形也可以)。 而不要一味的去加一些看起来比较复杂的噪音或者其他的花哨的东西。即使你做的足够复杂,但如果人也难识别,显然别人认为你是没事找抽型的。

  3. 从专业的机器视觉的角度说,验证码的设计,一定要让破解者在识别阶段,反复在低阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准确率。

  七、郑重申明

  1.这个问题,本身是人工智能,计算机视觉,模式识别领域的一个难题。作为破解者来说,是出于劣势地位。要做的很好,是很难得。总体来说,我走的是比较学院派的线路,能真正的破解难度比较高的验证码,不同于网上很多不太入流的破解方法。我能做的只有利用有限的知识,抛砖引玉而已。很多OCR的技术,特别是离线手写体中文等文字识别的技术,个人了解有限的很,都不敢在这里乱写。
五、高级验证码的破解分析

  时间关系,我简单介绍如何利用图像处理和模式识别技术,自动识别比较高级的验证码。

  (以风头正劲的Google为例)


按此在新窗口打开图片

1)至少从目前的AI的发展程度看,没有简单的做法能自动处理各种不同的验证码,即使能力很强,那么系统自然也十分复杂强大。所以,要想在很简单的算法实现比较高级的验证码破解,必须分析不同验证码算法的特点:

  作为一般的图像处理和计算机视觉,会考虑色彩,纹理,形状等直接的特征,同时也考虑直方图,灰度等统计特征,还考虑FFT,Wavelet等各种变换后的特征。但最终目标都是Dimension Reduction(降维)然后利于识别,不仅仅是速度的考虑。从图像的角度看,很多系统都考虑转换为灰度级甚者黑白图片。

  Google的图片可以看出,颜色变化是虚晃一枪,不存在任何处理难度。难度是字体变形和字符粘连。

  如果能成功的分割字符,那么后期识别无论是用SVM等分类算法,还是分析笔顺比划走向来硬识别,都相对好做。

  2)图像处理和粘连分割

  代码中的part1目录主要完成图像预处理和粘连字符分割

  001:将图像从jpg等格式转换为位图便于处理

  002:采用Fix/Adaptive的Threshold门限算法,将图片Bin-Value二值化。(可用003算法)

  003:采用OSTU分水岭算法,将图片Bin-Value二值化。(更通用,大部分时候效果更好)

  005:获取ROI感兴趣的区域。

  006:Edge Trace边缘跟踪。

  007:Edge Detection边界检测。

  008:Thin细化去骨架。

  009:做了一些Tidy整理。(这个一般要根据特定的Captcha算法调整)

  010:做切割,注意图片中红色的交叉点。

  011:将边缘检测和骨干交叉点监测的图像合并。(合并过程可以做分析: 比如X坐标偏移门限分析,交叉点区域纹理分析,线条走势分析,等等各种方法,找出更可能的切分点和分离后部件的组合管理。)


按此在新窗口打开图片

注:在这里,我们可以看到,基本的部件(字母是分割开了,但可以造成统一字母的被切割成多个Component。 一种做法是:利用先验知识,做分割; 另外一种做法是,和第二部分的识别结合起来。 比如按照从左至右,尝试增加component来识别,如果不能识别而且component的总宽度,总面积还比较小,继续增加。 当然不排除拒识的可能性。)

  3)字符部件组合和识别。

  part2的代码展示了切割后的字母组合,和基于svm的字符识别的训练和识别过程。

  Detection.cpp中展示了ImageSpam检测过程中的一些字符分割和组合,layout的分析和利用的简单技术。 而Google的验证码的识别,完全可以不用到,仅做参考。

  SVM及使用:

  本质上,SVM是一个分类器,原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方式来组合成一个多类分类的分类器。 天生通过核函数的使用支持高维数据的分类。从几何意义上讲,就是找到最能表示类别特征的那些向量(支持向量SV),然后找到一条线,能最大化分类的Margin。

  libSVM是一个不错的实现。

  训练间断和识别阶段的数据整理和归一化是一样的。这里的简单做法是:

  首先:

      #define SVM_MAX +0.999 
  #define SVM_MIN +0.001 


  其次:

  扫描黑白待识别字幕图片的每个像素,如果为0(黑色,是字母上的像素),那么svm中该位置就SVM_MAX,反之则反。

  最后:

  训练阶段,在svm的input的前面,为该类打上标记,即是那一个字母。

  识别阶段,当然这个类别标记是SVM分类出来。

  注意:

  如果是SVM菜鸟,最好找一个在SVM外边做了包装的工具,比如样本选择,交叉验证,核函数选择这些,让程序自动选择和分析。

六、对验证码设计的一些建议

  1.在噪音等类型的使用上,尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏人(噪音)长得和好人(字母)一样。

  2.特别好的验证码的设计,要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的分割和手写体(通过印刷体做特别的变形也可以)。 而不要一味的去加一些看起来比较复杂的噪音或者其他的花哨的东西。即使你做的足够复杂,但如果人也难识别,显然别人认为你是没事找抽型的。

  3. 从专业的机器视觉的角度说,验证码的设计,一定要让破解者在识别阶段,反复在低阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准确率。

  七、郑重申明

  1.这个问题,本身是人工智能,计算机视觉,模式识别领域的一个难题。作为破解者来说,是出于劣势地位。要做的很好,是很难得。总体来说,我走的是比较学院派的线路,能真正的破解难度比较高的验证码,不同于网上很多不太入流的破解方法。我能做的只有利用有限的知识,抛砖引玉而已。很多OCR的技术,特别是离线手写体中文等文字识别的技术,个人了解有限的很,都不敢在这里乱写。

相关文章

最新评论