验证码识别 ——知乎网友2

推荐Programming Computer Vision with Python, 这位作者用python重写很多基本的Computer Vision算法,书的final draft在首页,代码也在Github上边。类似于验证码识别的问题呢,大家可以直接refer Chapter 8 - Classifying Image Content, 里边不仅有对3种classification approaches的详细解释,而且还有比如手势识别,OCR识别等经典问题,更更重要的是,Github上直接有那些data set,意味着你可以自己做着玩,非常好的书,编码方面对我帮助很好。

哪些验证码不好识别?
个人以为大概2个方面

  • 图像的预处理

我们看下面大概知道通常第一步就是需要分割图像成几个小的图像,然后每个笑的图像尽可能的各自独立,这一步应该是比较麻烦的一步啦。

比如上图所示铁道部静态的验证码,这就是非常容易分割的啦。

再比如google的这个验证码,我们发现左边的个单词可能就算是人类也需要花些时间来识别,可是右边的这个continued我们一眼就可以看出来。据说,右边的这个词是google扫描书籍后的图像,然后因为很多图像计算机也不好识别,所以就通过这个方式来使用人力进行识别,通常只要右边的词写对啦,就算是正确的好像,而左边的经过扫描之后的词呢就会根据大部分人写出的答案来对其识别,so smart.

  • 训练样本

大家看到每个网站可能用的验证码都不太一样哈,所以为了提高准确率,训练样本(training samples)对了classifier的功效起着致命的作用。比如12306的验证码,我们可能就需要花一定的时间去label samples;然后对于腾讯一系列的验证码,可能又需要花些时间去label samples。而且通常来讲,样本越大,准确率会提高。这样带来的结果就是成本高!!

最后,那有没有办法用12306的训练样本来识别腾讯的验证码呢?毕竟他们都是验证码嘛。这样一来就可以节省时间啊,那就是成本的减少啊。学术界很早就想到了这样子的一个方向,叫做 Transfer Learning (or Domain Adaptations)。蛮有趣哒!
--------------------------------------------------------------------------------------------------------------------
2014-1-8
基本是Machine Learning中经典问题啦 - recognition,然后recognition又被应用在很多很多的方面,比如最基本的text classification, image classification,甚至是video classification。对于验证码的处理,基本是以下几步啦,其他问题的framework也基本如此,不一样的大概就是不同的方法去建立model,然后SVM也有很多变形。

  1. 验证码图像的预处理
  2. 建立模型
  3. 识别

接下来一个个的解释吧,亲!

验证码图像的预处理 
比如我们拿到以上“2907”这样子的图像,对吧,第一步需要做的就是分割使得每一个字符都很好的独立于各自的图像当中,所以,这样子之后呢,我们都会得到4张小的图像,这些图像分别表示为2,9,0,7,当然我们人眼很容易就知道这是什么,可是计算机不知道呀!

分割之后,在要做的就是图像方面的处理啦,大概是让数字变的更加明显一点,比如灰度方面的处理。

建立模型
这个应该是最为critical的部分,我尽量说清楚些。其实在recognize这个验证码之前,我们会收集很多类似的图像,并且人工进行标注。比如说哈,

这样子的数据被称之为 training data,接下来就是建立各种各样的模型吧。可能会用PCA,LDA...之类的方法对这些training data进行简化描述。接下来会有蛮多recognition approach,根据不一样的approach建立不同的模型。这里讲常用的两种。

1. K-Nearest-Neighbour 被称之为lazy learner,是因为其实不需要建立模型,用PCA,LDA..之类的方法对training data进行描述就好啦。待会讲详细的过程。

2.Support Vector Machine 应该是现在识别系统当最流行的方法啦,这个的的确确建立了个模型。如下图所示,我们会把training data投影到坐标系当中,然后找到一个hyperplane which best separates different samples。 之所以是hyperplane,数据的维度可能很高。SVM有很多变形,这里就不赘述啦。找到这个hyperplane之后,我们就可以进行识别啦。

识别

  • K-Nearest-Neighbour (KNN)

我们把需要识别的图像称之为test case, test case经过上边同样的处理之后呢,我们就从training data当中选出离这个test case最近的K的training samples。

比如上边的这个例子,K = 5, 然后对于 x_q 而言呢,最近的5个samples,其中3个是negative,2个是positive,当然我们就会认为x_q是negative的啦,基本就是按照majority vote来个x_q分类。具体到验证码的话,假如一个图像最近的5个training samples当中有4个是“5”,一个是“6”,那么计算机就直接认为这个图像指向的是“5”。

  • Support Vector Machine (SVM)

前边讲到说我们会找到一个hyperplane, 那么接下来需要做的就是计算test case到这一个hyperplane的距离,如果是 距离>0 (距离可以小于 0 哒,这个就看怎么定义方向啦) ,那么这个test case就会被label成positive,否则的话,那句只能是negative啦。具体到验证码,那就是个 multi-class SVM啦,因为会有 10 digits + 26 letters, 总共有36个class,那计算机机会建立好多个不一样的SVM,然后通过一些方法来对test case进行分类。

第一次认真回答这么technical的东西,希望有帮助!想知道更多的话,建议去coursera上听听课。喔,对啦,之前讲过这个framework可以被引申到很多应用哒,其中一个就是沸沸扬扬的面部识别呀,这个有一个当时上课做的project,有兴趣的同学看看呗。wihoho/FaceRecognition · GitHub

时间: 2024-10-06 20:38:20

验证码识别 ——知乎网友2的相关文章

验证码识别 ——知乎网友1

机器自动识别验证码的原理是怎么样的? 我自己写验证码识别模块的时候是这样的,当然不一定大家都这样写,肯定有更好的算法,我要识别的那个验证码是比较简单地那种,所以这样写就够了. 我用Windows的画图工具画了这个张图,用来举个例子: 这是一张分辨率为19*7的图片 1.遍历所有像素点(像PHP就是先getimagesize,获取i和j,然后用imagecolorat进行两重循环,就可以得到所有像素点的RGB值数据),然后二值化[比如判断RGB值小于#FFFFFF的(即非白色)时候标记为1,大于等

Python快速开发分布式搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://github.com/muchrooms/... 注意:此程序依赖以下模块包 Keras==2.0.1 Pillow==3.4.2 jupyter==1.0.0 matplotlib==1.5.3 numpy==1.12.1 scikit-learn==0.18.1 tensorflow==1.0.1 h5py==2.6.0 numpy-1.13.1+mkl 我们用豆瓣园来加速安以上依赖装如: pip install

验证码识别--type7

验证码识别--type7 一.干扰分析 有黑色边框,然后点干扰,线干扰 去边框 去点干扰 变成这样的结果,方便运算吗?也可以多种方式联合起来运算的.我相信在很多情况下,都可能会遇到类似的结果.我们人类能够识别这样的结果,是通过一个复杂的识别的过程,那么机器如何来识别?一定有一些方法套路在里面. 通过分析,还是在联通区域上面做文章,想办法做出了这样的效果 这个效果,相对来说,去除的更多了一点,比较明显的是干扰线被去除了,然后再做一次 blob分析,去除孤立的 blob 这里我采取的是contour

验证码识别--type5

每一种验证码都是由人设计出来.在设计过程中,可能由于多个方面的原因,造成了这样或那样的可以被利用的漏洞.验证码识别,首先需要解决的问题就是发现这些漏洞--然后利用漏洞解决问题. 这个图片看上去很复杂,有空心字符.有粘连.有干扰线,但是为什么人在识别的时候不会出错?是因为主要字符是不同颜色的.而且设计者为了防止如果随机的话出现相近的颜色造成不能被识别的结果,于是选用了6种相互之间区别都比较大的颜色——并且只有这6种颜色.这就是切入口. 另一个方面,关于具体颜色的处理,我还真是弱项.如果过滤出特点的

[blog]验证码识别--资料收集

证码识别--资料收集 一.验证码基础知识 验证码设计的目的就是区分“人”和“机器”,所以它在被设计的时候,主要的目的就是防止被采用就是自动识别出来.所以作为破解者来说,一开始就是处于劣势地位的.当然这使得验证码的破解变成了一项结合图像识别.模式识别的猜谜解题活动. 验证码的识别很难达到100%.因为在现实生活中,人也可能是识别错误的,所以当错误发生的时候,验证码识别系统会再提供一个新的验证码.如果单次识别有50%的识别成功率(也就是50%的失败率),那么连续三次的总体成功率就可以达到0.875(

验证码识别--type2

验证码识别--type2 终于来到了彩色图像,一定有一些特点 这里的干扰项是色彩不是很鲜艳的.灰色的线条,还有单独的干扰点,根据这些特性进行去除 直接ostu的话,有的效果好,有的效果不好 本来是准备通过RGB值直接来去除的,我相信一定也有某种很好的算法,能够直接过滤掉,但是效果不好,因为对于RGB的控制没有到一个灵活运用的程度,所以还是先赚域 ycbcr的话,应该不错 这个时候就发现 出现这种情况,是因为 自动的分割,有一些比背景深,有一些比背景浅了. 再看,本例基本符合平均分割的要求,所以进

C#.NET验证码智能识别学习笔记---01C#.NET验证码识别介绍

技术qq交流群:JavaDream:251572072 教程下载,在线交流:it.yunsit.cn 1.大家知道用asp.net做网站的话,验证码是存在于服务器端的session中的,服务器是知道 验证码的值真正是多少的.服务器可以识别人输入的到底对不对,因为服务器知道真正的 答案,因为验证码程序一般很难识别,所以服务器就可以一定程度上确认对方是人在操作 2.验证码就是为了区别到底是人在操作,还是机器在操作 ----------------------------------------- 3

关于验证码识别2

最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别.但写得多了,也总结出不少相同之处.今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少.好东东不能独享,现放出来供大家共同研究,请网友们妥善用之.        封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:            GrayByPixels(); //灰度处理            GetPi

关于验证码识别3

自从发表了用于验证码图片识别的类(C#代码)后,不断有网友下载这个类后,问如何用于一些特定的验证码.总结一下网友们的提问,很多都是不会从复杂背景中提到干净的字符图片来,这主要就是一个去噪问题,即除去图片上的背景.干扰点.干扰线等信息.这当中要用到很多图像学数学算法,首先声明,本人不是学图像学的,以下方法理论说得不对,敬请多批评指正.    1.如何设前景/背景的分界值    UnCodebase类中有一个GetPicValidByValue( int dgGrayValue) 函数,可以得到前景