验证码识别初探——图形验证码为主

 

目录

一.需求

二.验证码起源

三.验证码分类

纯文本验证码

图形验证码

Gif动画验证码

手机短信验证码

手机语音验证码

视频验证码

扫描二维码关注公众号,回复: 3857590 查看本文章

手势验证码

四.简单验证码识别流程和一些算法

五.基本案例

案例1:字体固定,大小固定,位置固定的验证码

案例2:字体固定,大小固定,位置不固定的验证码

案例3:背景点缀干扰,字母颜色不同

案例4:划线干扰

实现方法调整:用SVM的方法

六.另外一些高级验证码方案

案例1:不连续点组成的字符

案例2:手写体

案例3:背景色块和矩形

案例4:字母有粗细和噪音

案例5:利用图像处理和模式识别技术

案例6:取自自然场景图

案例7:探讨12306等

七.总结:建议

八.个人郑重申明

九.参考资料


 

一.需求

最近有个项目有个需求要多次登录某网站抓取信息。现在市面上验证码识别api很多,费用相对来说也比较便宜,一般也够用了, 针对这个项目,适当了解下验证码识别这块,这里只是做一些技术上和思路上的探讨。如果实际使用一般还是会去使用比较稳定的api,除非是某些网站需要长时间使用或者是识别量巨大,费用成本过高才会考虑自己去实现。

二.验证码起源

验证码这个词最早是在2002年由卡内基梅隆大学的路易斯·冯·安、Manuel Blum、Nicholas J.Hopper以及IBM的John Langford所提出。

验证码概念:全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)

验证码的主要目的是强制人机交互来抵御机器自动化攻击的。

验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助。

三.验证码分类

纯文本验证码

如:1+1=?

•本论坛的域名是?

•今天是星期几?

•复杂点的数学运算

这种验证码并不符合验证码的定义,因为只有自动生成的问题才能用做验证码,这种文字验证码都是从题库里选择出来的,数量有限。破解方式也很简单,多刷新几次,建立题库和对应的答案,用正则从网页里抓取问题,寻找匹配的答案后破解。也有些用随机生成的数学公式,比如 随机数 [+-*/]随机运算符 随机数=?,比较简单。
这种验证码也不是一无是处,对于很多见到表单就来一发的spam bot来说,实在没必要单独为了一个网站下那么大功夫。对于铁了心要在你的网站大量灌水的人,这种验证码和没有一样。


图形验证码

简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。计算机涉及到的几何图形处理一般有2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正。对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等。在破解验证码中需要用到的知识一般是 像素,线,面等基本2维图形元素的处理和色差分析。
这个是本篇文章重点分析验证码。

常见工具:
支持向量机(SVM):支持向量机SVM是一个机器学习领域里常用到的分类器,可以对图形进行边界区分,不过需要的背景知识太高深。数据映射到高维空间,然后寻找能够分割的超平面。

OpenCV:一个很常用的计算机图像处理和机器视觉库,一般用于人脸识别,跟踪移动物体等等

图像处理软件(Photoshop,Gimp…)

Image Library:图形处理库很多语言都有

Gif动画验证码

主流验证码通过提供静态的图片,比较容易被ocr软件识别,有的网站提供GIF动态的验证码图片, 使得识别器不容易辨识哪一个图层是真正的验证码图片,可以提供清晰的图片的同时,可以更有效得防止识别器的识别,据统计,动画gif验证码的防垃圾注入可以达到100%,是一个非常有效的验证码创新模式。同时gif动画效果可以有多达百种,也可以增加网站页面的美观效果。

手机短信验证码

手机验证码是通过发送验证码到手机,大型网站尤其是购物网站,都提供有手机短信验证码功能,可以比较准确和安全地保证购物的安全性,验证用户的正确性,是最有效的验证码系统。某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商的服务器,服务器发送随机数字或字母到手机中,由接入商的服务器统一做验证码的验证。

手机语音验证码

您是否遇到过您的网站用户或会员经常因为各种原因收不到网站的验证码,或新用户注册收不到短信没有耐心就直接放弃了您的网站,或因为验证码的问题体验不佳流失掉老客户和潜在新客户呢?
现在,语音验证码的出现把这些问题一下统统解决了,您再也不用为验证码的问题而烦恼了。只要用户的手机或座机能正常接听电话,就一定能收到语音验证码,验证码实现自动语音播报,同时短信也能同时发送到用户手机,实现双保险确保万无一失。语音验证码如果有拨通失败的,系统还能自动重播,确保不漏掉任何一个,从根本上解决您的网站用户收不到验证码的问题。


视频验证码

视频验证码是验证码中的新秀,视频验证码中随机数字、字母和中文组合而成的验证码动态嵌入到MP4,flv等格式的视频中,增大了破解难度。验证码视频动态变换,随机响应,可以有效防范字典攻击、穷举攻击等攻击行为。视频中的验证码字母、数字组合,字体的形状、大小,速度的快慢,显示效果和轨迹的动态变换,增加了恶意抓屏破解的难度。其安全度远高于普通的验证码,而且这种验证码形式使用户不会感到枯燥,由于其提高了机器识别的难度从而可以降低用户识别的难度,使得用户更容易辨认。


手势验证码

手势验证码(VAPTCHA)是基于人工智能和大数据的新一代人机验证解决方案,具备极高的安全性和1秒即过的卓越用户体验。

四.简单验证码识别流程和一些算法

流程图:

1.图像采集

通过网络抓取需要识别的验证码图片并保存,这个获取样本数据的过程

如:

2.预处理去噪,二值化

检测是正确的图像格式,转换到合适的格式,压缩,剪切出ROI,去除噪音,灰度化,转换色彩空间等这些。

二值化:就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变成2进制点阵。如:最后只剩下验证码部分黑色,其他都是白色。如图:

具体思路:对于大部分彩色验证码,通过判断色差和像素分布都能准确的把文字和背景分离出来,通过PS等工具把图片打开,用RGB探针对文字和背景图的颜色分别测试,在测试多张图片后,很容易可以发现文字和背景图的RGB差距总是大于一个固定的阈值,即使每次图片的文字和背景颜色都会变化

油漆桶算法:可以方便的计算出任意色块的面积,对于没有粘连字符或者粘连但是字符每个颜色不一样的验证码来说,去除干扰色块的效果很好,你只需要大概计算一下最小的和最大的字符平均占多少像素,然后把这段区间之外像素数的色块排除掉即可。

一种通用的去除文字图像中干扰线的算法
https://wenku.baidu.com/view/63bac64f2b160b4e767fcfed.html

3.分割和旋转

边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地方。可能通过一个固定的门限值来判断,也可能是自适应的。门限可能是图像全局的,也可能是局部的。不能说那个就一定好,不过大部分时候,自适应的局部的门限可能要好点。被分析的,可能是颜色,也可能是灰度图像的灰度。

字符分割算法:破解验证码的重点和难点就在于能否成功分割字符,这一点也是机器视觉里的一道难题,对物件的识别能力。对于颜色相同又完全粘连的字符,比如google的验证码,目前是没法做到5%以上的识别率的。不过google的验证码基本上人类也只有30%的识别率;对于字符之间完全没有粘连的验证码,分割起来是非常的容易,用最基本的扫描线法就可以分割,比如从最左侧开始从上到下(y=0-–|||||y=n)扫描,如果没有遇到任何文字的像素,就则往右一个像素然后再扫描,如果遇到有文字像素存在,就记录当前横坐标,继续向右扫,突然没有文字像素的时候,就说明到了两个字符直接的空白部分,重复这个步骤再横向扫描就能找到每个字符最边缘4个像素的位置,然后可以用PIL内建的crop功能把单独的字符抠出来。

对于有少许粘连但是只是在字符边角的地方重叠几个像素的验证码,可以用垂直像素直方图的统计方法分割。如下图

图上半部分是垂直像素直方图的一种直观展示,假如图片宽度为100像素,则把图片切割为100个1像素的竖线,下面的红色部分为当前x坐标上所有黑色像素的总和。这么一来可以很容易的通过直方图的波峰波谷把4个字母分割开。图片的下半部分是扫描线分隔法,因为干扰线和字符旋转的存在,只有M和5直接才出现了连续的空白部分。
除了垂直像素直方图,还可以从不同的角度进行斜线方向的像素数投影,这种方式对于每次全体字符都随机向一个角度旋转的验证码效果很好。对于每次字符大小和数量都一样的验证码还可以用平均分割法,也就是直接先把中间的文字部分整体切出来,然后按宽度平均分成几份,这种方式对字符粘连比较多用其他方式不好分割的验证码很有用.

对于同一个字符,尽可能让每次识别前的样本都一致,以提高识别率。而验证码设计者则会用随机旋转,随机扭曲还有随机字体大小的方式防止字符被简单方法识别。还原随机旋转的字符一般采用的是旋转卡壳算法
对一张图片左右各旋转30度的范围(具体看验证码情况),每次1度,旋转后用扫描线法判断字符的宽度,对于标准的长方形字体,在完全垂直的时候肯定是宽度最窄的。嗯?纳尼?上面的图是中间的最窄?好像的确是这样,不过只要每次旋转后的结果都一样,对于识别率不会有影响。


骨架细化:腐蚀算法;原理有点像剥洋葱,从最外层沿着最外面的一层像素一圈一圈的去掉,直到里面只剩下一层像素为止。腐蚀算法里面需要用到另一个算法,叫做凸包算法,用来找一堆像素点里面最外围的一层。最后就是把字符变成统一大小,一般而言是把全部字符都缩到和验证码里出现过的最小的字符一个大小。

4.训练

通过各种模式识别,机器学习算法,来挑选和训练合适数量的训练集。不是训练的样本越多越好。过学习,泛化能力差的问题可能在这里出现。这一步不是必须的,有些识别算法是不需要训练的。

可以训练tesseract ocr来识别了,样本数量多的话,识别率也是很高的。不过在这里还是要讲一下,如何自己来实现识别过程。

样本现在应该已经是一个矩阵的形式了,有像素的地方是1,背景是0,先肉眼识别一下,然后把这个矩阵转换为字符串,建立一个键值对,标明这串字符串是什么字符。之后就只需要多搜集几个同样字符的不同字符串变形,这就是制作模板的过程。
 

5.识别

输入待识别的处理后的图片,转换成分类器需要的输入格式,然后通过输出的类和置信度,来判断大概可能是哪个字母。识别本质上就是分类。

最简单的方法:汉明距离,但是如果字符有少许扭曲的话,识别率会低的离谱。对比近似字符串用的最多一般是 编辑距离算法(Levenshtein Distance)。两种算法的差别在于,对同样两个字符串对比10010101和10101010,汉明距离是6,但是编辑距离是2。
最后一种最NB的识别算法,就是神经网络,神经网络是一种模拟动物神经元工作模式的算法,神经网络有多种不同的结构,但是基本架构分为输入层,隐含层和输出层,输入和输出均为二进制。

对于验证码识别来说,输入和输出节点不宜过多,因为多了很慢……所以如果样本矩阵为20×20 400个像素的话,需要对应的也要有400个输入节点,因此我们需要对整个矩阵提取特征值,比如先横向每两个数字XOR一下,然后再竖向每两个数字XOR。


Python有很多封装好的神经网络库,你所需要的只是把特征值输入神经网络,再告诉他你给他的是什么(字符),这样多喂几次之后,也就是训练的过程,随着训练的进行,神经网络的内部结构会改变,逐渐向正确的答案靠拢。神经网络的优势是,对于扭曲的字符识别成功率非常高。另外神经网络在信息安全中还可以起到很多其他作用,比如识别恶意代码等等。

五.基本案例

案例1:字体固定,大小固定,位置固定的验证码

按照上面的识别流程:

1.预处理去噪:这种直接根据亮度设个阈值处理就可以了。

2.分割和旋转:这个验证码居然是固定位置的,分割相当简单,直接截取相应位置就可以了

3.训练:直接拿几张图片,包含0-9,每个数字一个样本就可以了,将文件名对应相应的数字

4.识别:因为是固定大小,固定位置,识别也很简单。直接拿分割的图片跟这个十个图片一个像素一个像素的比,相同的点最多的就是结果。比如如果跟5.jpg最相似,那么识别的结果就是5。

下面的识别结果达到100%

具体代码:https://github.com/isee15/captcha-ocr/blob/master/src/cn/z/Ocr1.java

案例2:字体固定,大小固定,位置不固定的验证码

1.预处理去噪:直接不需要。

2.分割和旋转:先纵向扫描,很容易分成四部分,再对每一部分横向扫描,得到4张图片。

类似这样的4个文件,把分割的结果对应存成0.jpg,8.jpg,2.jpg,3.jpg 就可以了

3.训练

4.识别

因为固定大小,识别跟 案例1 里面一样,像素比较就可以了。

具体代码:https://github.com/isee15/captcha-ocr/blob/master/src/cn/z/Ocr2.java

案例3:背景点缀干扰,字母颜色不同

1.预处理去噪:可以注意到每个验证码数字或字母都是同一颜色,所以把验证码平均分成5份;计算每个区域的颜色分布,除了白色之外,颜色值最多的就是验证码的颜色;因此很容易将背景去掉


2.分割和旋转:先纵向扫描,很容易分成四部分,再对每一部分横向扫描,得到4张图片。


3.训练


4.识别

识别跟 案例1 里面一样,像素比较就可以了。
具体代码:https://github.com/isee15/captcha-ocr/blob/master/src/cn/z/Ocr3.java

案例4:划线干扰

1.预处理去噪:放大看,我们会发现干扰线是纯黑色的,因此去干扰线的方法就有了。对点color[i][j],如果color[i+1][j],color[i-1][j],color[i][j+1],color[i][j-1]都是纯黑或者纯白色的,就认为color[i][j]是干扰,将color[i][j]置为白色。


2.分割和旋转:剩下就简单了


3.训练


4.识别

识别跟 案例1 里面一样,像素比较就可以了。
具体代码:https://github.com/isee15/captcha-ocr/blob/master/src/cn/z/Ocr4.java

实现方法调整:用SVM的方法

关于SVM方法,自行去查询资料。

前面的步骤还是一样的,去干扰,分割。

把训练的图片缩放成16*16的大小。把每张图片转换成libsvm的data格式
label indexi:valuei
2 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:1 15:1 16:0 17:0 18:0 19:0 20:1 21:1 。。。。
3 1:0 2:0 3:0 4:0 5:1 6:0 7:0 8:0 9:0 10:0 11:0 12:1 13:0 14:0 15:0 16:0 17:0 18:1 19:1 20:1 21:1 。。。。
前面的label就是对应的图片的数字,indexi表示第i个像素,valuei表示第i个像素的值,像素为黑是valuei为1,白则为0(更合理的方法好像是黑为0.999,白为0.001)
将转换之后的数据存到data.txt里面
然后调用libsvm的svmtrain data.txt.
这样会得到data.txt.model
svm_type c_svc
kernel_type rbf
gamma 0.00390625
nr_class 7
total_sv 187
rho -0.030305073403358983 -0.06465012487258254 -0.013473850514953143 -0.2057364574548591 0.2585742203962866 -0.022815082566896124 -0.05173711373002207 0.02684272876633484 -0.08990192422316207 0.49014282977244295 -0.007697833034227977 0.12210859964254706 -0.011622244796025883 0.29303019765332594 0.07690393951197239 -0.06284951942287494 0.4075315521524534 -0.024304015205013997 0.273659082567747 0.09997688395282468 -0.3551440654987311
label 2 3 4 5 7 8 9
nr_sv 27 32 20 26 19 39 24
SV
1.0 0.0 1.0 0.09512009049662619 1.0 1.0 1:0.0 2:0.0 3:0.0 4:0.0 5:0.0 6:0.0 7:0.0 8:0.0 9:0.0 10:0.0 11:0.0 12:0.0 13:0.0 14:1.0 15:1.0 16:0.0 17:0.0 18:0.0 19:0.0 20:1.0 21:1.0 22:1.0 23:0.0 24:0.0 25:0.0 26:0.0 27:0.0 28:1.0 29:1.0 30:1.0 31:1.0 32:1.0 33:0.0 34:0.0 35:1.0 36:1.0 37:1.0 38:1.0 39:0.0 40:0.0 41:0.0 42:0.0 43:1.0 44:1.0 45:1.0 46:1.0 47:1.0 48:0.0 49:0.0 50:0.0 51:1.0 52:1.0 53:1.0 54:1.0。。。。。。

得到model之后,把要识别的图片同样弄成libsvm的格式,存成predict.txt
label indexi:valuei
0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:1 15:1 16:0 17:0 18:0 19:0 20:1 21:1 。。。。
因为要识别的图片还不知道是哪个数字,所以其中label可以填成任何数
然后用svmpredict predict.txt data.txt.model output.txt
这样识别结果就在output.txt里面了。

六.另外一些高级验证码方案

案例1:不连续点组成的字符

设计:不连续的点组成的字符,而且有一定程度的倾斜。

实现方案和分析:

1.通过纵横的直方图投影,可以找到字幕区域
2.通过Hough变换,适当的参数,可以找到近似的横线,可以做倾斜矫正
3.字符串的倾斜式面内的,没有太多的破解难度
4.字母宽度一定,大小一定

案例2:手写体

设计:使用手写体

实现方案和分析:

1.检测切割阶段没有任何技术含量,属于设计的比较丑的
2.只有数字,而且手写体变化不大
3.表面看起来对识别阶段有难度,仔细分析,发现几乎不用任何高级的训练识别算法,就固定的招某些像素点是否有色彩就够了

案例3:背景色块和矩形

设计:背景颜色块 和 矩形

实现方案和分析:

1.背景色是单一色块,有形状,通过Region-Growth区域增长来很容易把背景给去掉
2.前景色是标准的线条,色彩单一
3.字母无粘连
4.都是印刷体

案例4:字母有粗细和噪音

设计:使用个随机噪音,而且作为前景;字母位置粗细都有变化

实现方案和分析:
1.通过在X轴的直方图投影,能准确分割字幕
2.然后在Y周作直方图投影,能准确定位高度
3.识别阶段,都是印刷体,比较简单

案例5:利用图像处理和模式识别技术

分析不同验证码算法的特点:

作为一般的图像处理和计算机视觉,会考虑色彩,纹理,形状等直接的特征,同时也考虑直方图,灰度等统计特征,还考虑FFT,Wavelet等各种变换后的特征。但最终目标都是Dimension Reduction(降维)然后利于识别,不仅仅是速度的考虑。从图像的角度看,很多系统都考虑转换为灰度级甚者黑白图片。图片可以看出,颜色变化是虚晃一枪,不存在任何处理难度。难度是字体变形和字符粘连。如果能成功的分割字符,那么后期识别无论是用SVM等分类算法,还是分析笔顺比划走向来硬识别,都相对好做。

图像处理和粘连分割:

处理过程:

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:将边缘检测和骨干交叉点监测的图像合并。

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

代码:http://old.sebug.net/paper/pst_WebZine/pst_WebZine_0x02/html/pstzine_09_01.txt

字符部件组合和识别
    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外边做了包装的工具,比如样本选择,交叉验证,核函
数选择这些,让程序自动选择和分析。
代码:通过ReginGrowth来提取单个单个的字符,然后开始识别。

http://old.sebug.net/paper/pst_WebZine/pst_WebZine_0x02/html/pstzine_09_02.txt

案例6:取自自然场景图

谷歌的街景路牌:

谷歌验证码出现街景问题的概率高达40%,出现汽车或者道路的概率为30%。

只需要做出一个路牌定位器,然后通过无限刷新验证码,就可以只验证路牌类的问题,从而无视其余复杂的自然场景。采用fast-rcnn算法,仅需要500张粗糙标注的样本,30分钟训练便有了上图的定位效果。

案例7:探讨12306等

12306验证码,要解决这款验证码,本质上是一个分类问题.

将下图中的问题部分200*30的区域截取处理,利用某开放的OCR接口去识别,会有80%的识别准确率。这个成功率并不乐观,因此我们自己做了一个问题识别器。假如将全部OCR结果直接投入Alex-net中,会存在大量的错误数据,得到的分类器成功率将低于10%,效果很差。但是依据概率清洗,统计完OCR识别结果的图片,把出现频率高的认为是一个标签,就会发现在5万张图片中,平均每个问题的出现率为1%。去除出现频率特别低的样本数据后(比如口哨偶尔会识别成口肖,出现频率低则去除该样本),重新训练识别成功率则高达99%,扭曲的问题文本形同虚设。


12306验证码基础版本会出现的问题如下:
['日历', '薯条', '口哨', '蜥蜴', '蒸笼', '护腕', '印章', '蜜蜂', '文具盒', '绿豆', '菠萝', '铃铛', '剪纸', '耳塞', '手掌印', '锣', '仪表盘', '红枣', '金字塔', '电线', '老虎', '', '辣椒酱', '挂钟', '双面胶', '啤酒', '蜡烛', '雨靴', '毛线', '茶几', '茶盅', '档案袋', '盘子', '狮子', '订书机', '篮球', '国结', '开瓶器', '打字机', '热水袋', '海鸥', '电子秤', '排风机', '风铃', '棉棒', '鞭炮', '龙舟', '电饭煲', '锅铲', '珊瑚', '蚂蚁', '红豆', '海苔', '钟表', '卷尺', '冰箱', '苍蝇拍', '烛台', '药片', '调色板', '创可贴', '沙包', '话梅', '本子', '安全帽', '海报', '刺绣', '牌坊', '网球拍', '路灯', '航母', '高压锅', '黑板', '拖把', '锦旗', '公交卡', '红酒', '跑步机', '樱桃', '沙拉', '漏斗']

图像的分类:

方法仍然是把标记好的图片投入VGG-16层的模型中,初期得到的识别结果较差,因为标记数据并不会完全正确,事实上现在的通用模型已经十分完善,训练的结果非常依赖数据清洗的效果。然而,有没有得到高精度区分标记正确与否的样本集的办法呢?答案在于网站。绝大多数网站,都会在登录页面存在验证码,而用户常识登录时,会首先校验验证码是否正确,其次是账号密码,因此就是自己生产一堆随机账号密码,去撞登录网页,发现验证码校验通过了,但是账号密码错误,就可以有效筛选出正确的标记数据。


同样的思路,如果我用现在已经达到95%的识别模型去重复这个样本标记的行为,将得到的就会是远比现在5W样本集多的多的样本量,可预期将得到的准确率会更高,当然会有同学说,那样你的模型将局限在这类问题下,而不能成功适应他新的图像,一旦更新不就失效了吗?是的,但是解决实际问题的时候,一些小tips就能解决这样问题。


问:如何应对验证码图片的更新迭代?
答:只识别模型能识别的验证码,在高并发刷新下即使只能识别5%的问题,实际应用也是100%。
问:如何让模型自己学习没遇到过的图像?
答:将非模型可识别的问题和图片标记为 _  交付人工打码,将打码结果重新训练模型。
问:上面的问题有没有高级点的解决办法?
答:撞验证码库,新出现的问题随机性标注,8个格子随机撞约有2%的成功率,学会一个新物体也只需要500张样本,撞10W次即可。
问:能不能别这么流氓?
答:不能,因为面对实际问题与巨大利润,坏人就是这么流氓。

七.总结:建议

其实大部分网站的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能的基本概念。也有设计的比较好的,比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证码虽然难,但算不上好。(最恶心的要数12306,直接是反人类的验证码)

1.在噪音等类型的使用上,尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏人(噪音)长得和好人(字母)一样。
    
2.特别好的验证码的设计,要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的分割和手写体(通过印刷体做特别的变形也可以)。 而不要一味的去加一些看起来比较复杂的噪音或者其他的花哨的东西。即使你做的足够复杂,但如果人也难识别,显然别人认为你是没事找抽型的。
    
3. 从专业的机器视觉的角度说,验证码的设计,一定要让破解者在识别阶段,反复在低阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准确率。

4. 基于逻辑语义的VTT(Visual Turing Test)验证码
VTT验证码需要用户根据题目,选出图中一个或者多个答案物体,通过点击、拖动、连接等方式选中区域提交给后台判断。在保证体验依旧简单无需输入的基础上,实现了良好的对抗效果。VTT的图片由后台3D渲染随机产生,保证图片不会重复,语义也可以根据题目中的图片中的物件属性组合产生,多种多样的变化可以有效阻挡恶意。

5.滑块和点击:一键的点击,通过无数只有真人具备的特征才能通过这道验证。

现在行业细分后,专业化的事情更多的人来处理,提供验证码服务有很多好的公司,专业做验证码服务的,效果比自己做的好很多,价格不贵,建议还是直接购买服务。

八.个人郑重申明

希望不要把这种技术用于非法用途。

文中部分代码实现详见:github地址 https://github.com/isee15/captcha-ocr

http://libcaca.zoy.org/wiki/PWNtcha  这里PWNtcha项目 验证码资料

九.参考资料

https://baike.baidu.com/item/%E9%AA%8C%E8%AF%81%E7%A0%81/31701?fr=aladdin

https://www.cnblogs.com/nayitian/p/3282862.html

https://blog.csdn.net/problc/article/details/5794460

http://old.sebug.net/paper/pst_WebZine/pst_WebZine_0x02/html/PSTZine_0x02_0x09.html

原地址:http://drops.wooyun.org/tips/141 已打不开,现用下面地址

https://mp.weixin.qq.com/s?__biz=MzAwNDc0MTUxMw==&mid=2649639721&idx=1&sn=9d9016fa693725b378dfea6f65663130&chksm=833dabcfb44a22d9dde1bc700f43641d811ca7e052e12d09227347f2b7d74a71d75127ad241f#rd%E4%BD%9C%E8%80%85%EF%BC%9A%E7%BD%97%E4%B9%89%E7%9A%84%E5%A4%8F%E5%A4%A9%E9%93%BE%E6%8E%A5%EF%BC%9Ahttps://www.jianshu.com/p/5e6d46382027%E4%BE%86%E6%BA%90%EF%BC%9A%E7%AE%80%E4%B9%A6%E7%AE%80%E4%B9%A6%E8%91%97%E4%BD%9C%E6%9D%83%E5%BD%92%E4%BD%9C%E8%80%85%E6%89%80%E6%9C%89%EF%BC%8C%E4%BB%BB%E4%BD%95%E5%BD%A2%E5%BC%8F%E7%9A%84%E8%BD%AC%E8%BD%BD%E9%83%BD%E8%AF%B7%E8%81%94%E7%B3%BB%E4%BD%9C%E8%80%85%E8%8E%B7%E5%BE%97%E6%8E%88%E6%9D%83%E5%B9%B6%E6%B3%A8%E6%98%8E%E5%87%BA%E5%A4%84%E3%80%82

https://github.com/fengzhizi715/NetDiscovery 结合爬虫,识别验证码成为组件

猜你喜欢

转载自blog.csdn.net/lsblsb/article/details/83386666