导读:12306为什么要设置那么复杂的验证码机制呢?就是因为OCR 。作者:莫凡
今天聊OCR 。
OCR是人工智能、机器学习特别是深度学习,在图像识别方向最为重要的应用之一 。OCR全称Optical Chararcter Recogition,中文翻译为光学字符识别,通常简写为OCR 。
来源:华章科技
文章插图
如果之前没有接触过OCR,光看名字上又光学又识别的,容易产生“听起好像很高端很复杂”的距离感,但实际上,计算机科学的每一项技术都是为了机器具备多一项技能,而OCR要机器具备的,是一项对于我们人来说属于最最基本的技能——“看图识字” 。
我们可能对这个能力习以为常了,以至于不会觉得这算是一项能力,但仔细想一想就知道,看图识字虽然最最基本,不过同样也最最基础,很多工作都需要首先具备看图识字这项技能才能开展 。同样的道理,OCR现在也已经是我们日常生活中应用最为广泛的智能技术之一 。
如果一时没想起来,不妨从咱们中国人都很熟悉的春运说起 。12306大家应该都知道,是订火车票的官方网站,2015年12306出了一个轰动全国的“大新闻”,12306改变“验证码机制”了 。买火车票之前,用户先得要做几道颇为棘手的智力题,譬如要求在几张图片中找出某位名人,据说有些用户因为知识面比较窄最后选择放弃了购买火车票 。
这事大家都知道,不过有没有想过一个最基本的问题:12306为什么要改变验证码机制呢?
就是因为OCR 。
文章插图
▲网友恶搞的12306验证码
验证码之所以叫验证“码”,是因为最开始验证码大都是一串保存在图片里的四位数字 。验证码的作用自然是区别真人和机器,听起来很厉害,其实原理异常简单:机器擅长处理结构化数据,而对于图像、文本和音频这些生活中很常见但属于非结构化的数据,对机器来说,用传统的算法处理难度非常大 。
为什么呢?不妨想象一个最最传统的验证码,白底黑字,上面一共四个阿拉伯数字,我们人自然看一眼就知道是哪四个数字 。但是在机器看起来,这张图片是由一个挨一个的像素数值构成的数据矩阵,这就产生一个问题,我们人看起来是“空白”的地方,在机器看起来同样也存在着数字,并没有什么不同,自然无法区分到底上面写了什么 。
OCR的研究人员当然也没有偷懒,努力尝试了很多办法,有一种思路是提取图片特征,也研究出两种传统的提取方法,分别是基于结构形态的特征提取,和基于几何分布的特征提取,也取得一些成果 。
但总的来说,要求机器准确识别图片中的数字仍然很困难,只要图片中存在一点点杂质干扰,识别的正确率就大幅度下降,这就是为什么后来验证码都会选择采用一些随机线条,对于OCR来说,这都是低成本高收益的防破解手段 。但对人来说却轻而易举,只需要看一眼就能识别 。
正是因为人和机器在处理非结构化数据存在能力鸿沟,在验证码这里,就是人和机器在识别图片中字符上的能力存在显著差异,因此,只要简单使用验证码,就能相当准确地辨别正在输入的究竟是人还是机器 。
那为什么12306在2015年就非得换了很好用的验证码机制呢?是因为就在2012年,发生了一件轰动整个研究界的事件,这个事件影响深远,推动OCR技术发生飞跃,从此机器也能很轻易就准确识别图片上的数字了 。
OCR并不是新出现的概念,起步非常早 。根据《深度实践OCR:基于深度学习的文字识别》一书介绍,早在1929年,德国科学家就已经提出了OCR的想法,后续又有一些科学家加入进行这方面研究,不过,直到计算机出现以后,想法才慢慢落地 。
相比之下,中国对OCR的研究起步稍晚,起步于70年代,算起来也有近50年的历史了 。
但是,虽然早就开始了对OCR的研究,科学家们也从各个方面贡献了很多颇有益处的奇思妙想,为后续研究奠定了坚实基础,但总的来说,OCR技术的应用发展迟缓,直到前些年仍然处于学术研究的领域 。不过,每一项科研领域的僵局都最终会被一项划时代的技术打破,打破OCR领域僵局的就是鼎鼎大名的深度学习技术 。
文章插图
2012年发生了什么事呢?发生了这么一件事,基于深度学习的卷积网络模型AlexNet,在ImageNet图像分类比赛中拔得头筹 。拔得头筹这事本身不算什么,毕竟只要有比赛就一定会有人拔得头筹,问题是在以往的比赛,不同模型之间的差距很小,第一名都是“险胜”,第二名都是“惜败” 。
推荐阅读
- php获取远程页面html状态码的方法
- 2022年北京行程码带星号的可以下高速吗,为什么行程卡突然带星号了
- 账号密码记在哪里安全 账号与密码管理
- 智能手机|扬州姑娘上海一游的手机找到了 怕红码随机附证明:网友点赞暖心正能量
- 30段极简Python代码:这些小技巧你都Get了么
- 计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别
- 10行PHP代码快速获取小程序openid
- 刷票在淘宝怎么买 12306官网抢票神器
- 60行C代码实现一个shell
- 阿里P7架构师浅析:如何优化Java程序设计、编码提高性能