基于KNN的验证码识别算法

写在前面

最近几天忙完考试看了一个关于机器学习的基础算法——k近邻算法,简称为KNN。KNN是数据挖掘领域的十大经典算法之一,优点是简单,精度高,对异常值不敏感,无数据输入假定;缺点是计算的复杂度高,空间复杂度高。笔者由于刚刚机器学习入门,因此先从简单的算法开始,手动实现了一下KNN算法,并且基于KNN做了一个网页验证码图片识别的demo出来。当然现实中做验证码识别大多都不用KNN来做,开销太大而且太慢,但是目前水平有限嘛,就先用KNN来做着。

数据集获取

由于对母校西南交通大学的教务系统怀有深深执念,因此数据集就采自西南交大的教务登录系统,写一个小爬虫从教务系统的登录界面采集1000张验证码图片。


图1

KNN核心算法编写

KNN是一种有监督学习方法,其核心思想非常简单,算法没有训练过程,当用户传入一个需要被分类的数据时,算法就会将该数据与数据集中的带标签数据进行对比,计算“距离”,并且根据与待分类数据距离的从小到大对数据集中的数据进行排序,最后根据用户传入的k值,选取前k个最接近待分类数据的数据的标签,则待分类数据的标签等于k个数据中出现次数最多的标签值。代码如下:

图2

在这里,距离的衡量使用的是欧氏距离,用户也可以使用其他的距离来作为数据之间距离的衡量指标。

数据预处理

算法在对图片进行分类之前首先要对数据进行预处理。由于原始的图片是RGB图片,转化成矩阵有三个维度不太好处理,因此首先要将图片转化成灰度图,这样其矩阵就是二维的。同时为了增加对比度,和最大限度地去除验证码图片中随机线条对分类器的干扰,笔者设定一个阈值,将大于这个阈值的矩阵数值置为255,小于这个阈值的的数值置为0。这个阈值的选定需要针对不同的验证码做多次实验,来找到一个最优的值。

其次我们观察验证码图片可以发现,每张验证码图片的顶部和左端都有条黑色的实线,这是数据集中的噪音,需要去掉,算法将把图片在顶端和左端都切掉一个像素的宽度。

接下来我们需要对验证码图片进行切分,将验证码中的字母从原始图片中“切”出来,笔者认为这才是整个算法中比较有难度的一节。观察从网络上获取到的验证码图片,我们可以发现字母在图片中的位置分布并不是固定的,因此不能采用定长分割这种方案。必须要针对不同的图片动态分割,并且对分割后的图片进行规整化操作,以使每张图片都达到一样的大小便于后期向量化处理。在图片分割这个问题上,笔者以图片的每一列为考察单位,因为毕竟是要纵向分割图片。笔者基于这样的一个假设,若一列上不包含验证码字母,则该列上大部分应该是白色(一则因为图片上有一写随机干扰线无法完全去除,二则因为上一步将图片二值化后图片本底就变为白色),若一列上包含字母则该列上有相当一部分像素点的值应该不是白色,问题的关键依然在于选定一个阈值,若某一列白色阈值的比例大于这个值则判定该列上没有字母可以作为备选分割线,若小于这个阈值则该列上包含有字母,不能作为分割的备选线,笔者通过实验得出该阈值取0.9较为合适。那么,该算法第一步就能够得到一系列备选的图片分割线,第二步就是从这些备选分割线中选出真正的分割线,笔者在这里的设定是让分割线之间的距离最小,即两个字母之间若存在分割线则选择最中间的那条。分类效果如下图所示:

图3

如上图所示,算法的切分效果还是不错的。

算法实现

到目前为止,笔者已经完成了图片的预处理和规整化。接下来只用将图片向量化并打上标签输入分类器就可以了。由于图片本身是一个二维矩阵,我们只用将二维转化成一维就行了,非常简单。接着,我们需要手动为每一个字母打上标签,效果如下图所示:

图4

如上图所示,切分后的字母图片的名称第一个字母即为该图片的标签。

算法测试

笔者选取一百张验证码图片对分类器进行测试,测试代码如下:

图5

最终测试结果表明该算法的错误率大约在0.2左右。

算法应用

笔者在该算法基础上由写了一个教务系统的登录程序,看能不能对学校的教务系统进行登录,代码如下:

图6

运行结果如下:

图7

如图所示,登录成功。

开源

https://github.com/yhswjtuILMARE/KNN-Identification-codes

2018年1月19日

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容