人工智能图像识别原理-高中函数图像的识别
我报名参加了金石计划挑战赛第一期——瓜分10万奖金池。 这是我的第三篇文章。 点击查看活动详情
1、好东西先到先得,谁适合看这篇文章?
本文作者在教育行业从事OCR识别工作。 教育领域的OCR比较复杂。 除了文字,还有图片、表格、公式等,即使是同一个公式,数学要求斜体,化学要求斜体,这是行业规范。
谁是这篇文章的读者? 读者是……最后谁来读,我不知道。 但是,我将以下人群作为这篇文章的读者,换句话说,我是为他们而写的。
1.1 公司领导:节约成本,沉淀技术
看到OCR属于人工智能的范畴,很多企业领导都心惊肉跳。 唉,我们公司的员工连正常的业务逻辑都写不好,交付的系统也是bug百出。
现在我需要使用OCR功能,怎么办? 买一个。 为什么不自己买呢? 那样的话,我也会组建一个人工智能团队。
这种情况确实需要详细分析。
了解到有一家公司的OCR识别需求很简单:只识别0到9,共10个数字。 而且数据源单一,保证透明背景和纯色线条书写。 这种待鉴定的样本是非常规范的。
其实你随便找什么图像识别的书,翻开第一章,几乎都是讲如何识别这类数字的。 这个例子已经有 20 多年了。 这在程序员中被称为Hello World级别的程序。 这是入门的第一课,并不难。
连谷歌都觉得,AI被侮辱太容易了。 因此,他们率先将入门示例从10个数字改为识别“船”、“汽车”、“青蛙”、“鸟”等10种物体。
但是公司还是以每年30万的价格购买了识别号码的OCR服务。
这就像购买一辆公共汽车并将其用作电动汽车。 一个人开着它在街上转。 维护成本高,利用率低。
因此,我觉得领导不需要了解技术细节,但需要对它的成熟度和行业地位有一个大概的了解。
本文将介绍做OCR的过程以及每一步需要的资源支持,让领导盘点资源,量入为出。
1.2 产品经理:了解流程并掌握流程
产品经理经常被开发人员欺负。 一方面,开发商的性格太耿直了。 另外,产品经理有时会在不知道实现过程的情况下提出要求:比如APP的主题颜色要随着手机壳的颜色而变化。
不过,我也见过开发出身的产品经理,不仅懂产品,还懂技术。
他时常把开发者惊呆了:为什么实现不了? 这里有数据,那里也有,做个关联,不要限制查询,太慢了!
开发商脸红了。 遇到新的需求,他们先百度一下,做完作业再找产品经理辩论。 最后开发者灰飞烟灭,百度不靠谱。 原来是有想法实现的!
所以,我觉得产品经理需要了解技术的实现过程,这样才能在关键节点,提出产品端更好的解决方案。
本文将介绍实现OCR所需要的几个步骤,以及每个步骤的重点是什么。 我认为产品经理需要关注它。
1.3 初级小白:答疑解惑,行业入门
有人觉得OCR很牛逼,那怎么办呢? 看不懂,求高人解释一下。 这是为对此感兴趣的寻求者准备的。
也有人非常喜欢图像识别,想自学,但往往被拒之门外。 这是一个充满热情和怨恨的技术小白。
网络上确实有很多大牛、博士、硕士,但是由于水平高,我们很难和他们对话。 我曾经被人鄙视过:一个傅立叶变换,一句话就能说清楚,你却写了千言万语,说了一大堆废话。
于是,我意识到“平等对话”很重要。 如果我想过上小康生活,那我就去找全球商业大亨请教,也未必有什么作用。 而是去楼下的五金店老板跟老板聊聊,得到一些好处。
现在,我想通了 OCR 识别。 同时,我也想起了自己曾经的迷茫和无助。 现在,可能还有很多以前的我,我要自救。
这篇文章会讲整个OCR的完整流程,以及遇到的难点和解决办法(思路和term关键词)。 如果你是程序员,我是专业版,里面有详细的代码解释。
在OCR行业,如果不能入门,转身就走。 一旦开始,就无法放下。
好了,序言写完了,也算是一个攻略吧。 如果您觉得本文适合您,可以继续阅读。
2.OCR识别全过程(科普版)
OCR是缩写,全称是Optical Character Recognition,中文是:Optical Character Recognition。
其本质是:将图像形状转化为文字字符。
先说说我是如何在教育行业应用OCR的。
信息化教学越来越普及,很多教材,比如试卷、试题,都不得不搬到信息化平台上。 那么,如果要将纸质试卷数字化,就要用到OCR识别技术。
这样的图片需要识别为结构化数据(图片、文字、公式、表格都可以独立提取)。 识别结果如下:
而且,识别结果还可以下载为word文档,方便老师校对和二次编辑:
这是OCR的典型应用。
此外,我们常见的各种证件识别、名片识别、车牌识别等也都涉及到OCR技术。
刚开始接触OCR的时候,做了一个小功能。 我把它用作学习总结和毕业测验。 效果如下:
上面的例子在github上是完全开源的。 这个例子基本涵盖了OCR的全过程。 下面我就以此为范本,讲讲OCR的整个过程。
OCR技术的实现大致可以分为图片预处理、字符切割、字符识别、布局还原、文本后处理五个步骤。
中间三步是核心,前两步是最难的。
2.1 预处理图像
我们买水果的时候,要先洗干净再吃。 运气不好的话,需要挖出虫眼和粗糙的外皮才能吃。 我们把吃水果之前的这些步骤称为CSG(fruit eating)的预处理。
在进行 OCR 之前,还需要对图像进行预处理。 因为,一般要识别的图片都是千奇百怪,来源也很复杂:有照片,有扫描,有截图。
比如拍照,有的是夏至那天中午在阳光直射下拍的; 如果没有预处理,OCR会非常困难,就像你面对的是刚从污水池里捞出来的大枣。
2.1.1 光影预处理
一般来说,我们定义白色为背景,黑色为字体。
但是,如果图片上有光影,就会出现模糊。 假设它是背景,它不是白色的。 假设它是文本,全是黑色,我无法识别任何字符。 这导致OCR经常出现人格分裂,也就是……不是……不是吗? 如果智能有问题,让我手动看一下,让我做一个预处理。 交给你的时候,保证白纸黑字,你就可以专心做事了。 OCR 非常感人。
2.1.2 倾斜预处理
理想情况下,文档图像应该是水平的,这样很容易切割方块字。
然而,在现实世界中,无论是人还是物,都很难给自己定位。
如果没有,那会很复杂。 治图和治人一样,需要分门别类(强行升华文章的文风)。
上面的倾向是最常见的,也是最容易对付的。 只需要几行代码就搞定了,后面会介绍。 基本原理是找到文字的最小面积矩形(关键字:minAreaRect),然后旋转矩形实现角度校正,见下面动态图。
但是,这种方法有时并不奏效,如下图。
我们现在框出一个矩形,完美!
我们再把矩形拉直,就完事了!
这种倾斜,无论你怎么放置矩形,都不行,因为矩形区域的文字又倾斜了!
这时候就需要用到另一种方法,叫做霍夫线变换(关键词:HoughLinesP。有时候搜索问题不知道要搜索什么,这里我提供关键词,解法可以直达灵魂)。
霍夫线变换就是在图上找一条直线,因为图中有几个点可以组成一条直线。 画出这些直线,你就会发现其中的奥秘,看下面的动态图。
对于多行的文本,每行中的单词应该在一条直线上。
从结果逆向过程,如果找到直线,则找到文本行。
当这些直线被拉直时,文档的更正就实现了。 请看下面的动画。
2.1.3 翘曲预处理
上面说的是平面的角度倾斜,这种情况多见于复印和扫描(纸张斜放)。
这个不严重,顶多跟方便面泡冷水一样,问题不大。
事实上,我们遇到的更多图像是照片。 拍照的时候问题比较多,会出现空间失真。 看下面的动态图(图片是动态的,如果不是,稍等一下,要不你遇到盗版作者了,正版作者是ITF boy)。
上图中,问题比较严重。 就像把方便面泡在煤油里,还得让别人吃。 这称为失真。
空间的扭曲体现在远近小的视觉上。
让我们更正下图。 这张照片应该是站在长城上拍的长廊。 它越远,它变得越小。
肯定可以改正的,就是步骤有点多。 但是,转换成代码,不会超过100行。 在下面的动态图中,我也列出了每个步骤中图像处理的方法。 一共9个步骤,每个步骤都可以用一篇文章来解释(我写这个,出个视频教程,给我点赞,鼓励我)。
以上2.1章节讲的都是最基本的预处理操作。
如果你的图片来源比较复杂,特别是包含各种场景的照片,或者还有从山野里捡来的野图,二手改装图。 那么,你的预处理工作会比较费力,难度也不大,但是会耗费人力、物力和时间。
如果是这样,你的图片来源很简单。 开头说了0到9位数字识别和购买OCR服务的例子。 他们公司用电子收款笔在电子网格上写数字。 电子网格统一,用笔统一,样品非常标准。 这样的话,就不需要预处理了,下一步就是直接切字了(我的天,这个过渡太丝滑了)。
2.2 切割字符
假设经过预处理后,我们的图片标准化了,如下图。
突然想到我们要做OCR字符识别(what are you are doing here)。
所以,我们要对人物进行切割,每一个字都给他……(咬牙切齿,表情凶狠)……挖出来。
为什么要把每个字符都删掉? 因为OCR最终识别的是单个字符(识别26,其实就是识别“2”和“6”)。
另外,每个字符都需要做标记,因为识别之后,还得还原。 识别结束后,结果是一堆“1”、“2”、“3”、“+”、“-”字符。 我们需要根据它们的相对位置将它们还原为“8-7=1”。 所以,我们就会知道哪道题做对了,做错了,然后给出批改结果。
2.2.1 分割的投影法
上帝说要有光,就有了光。 如果有朋友姓尚,可以给孩子取名尚有光。
有了光之后,当光投过来的时候,物体后面就会有影子。 有影子的地方就有实体,没有影子的地方就有虚无。
那个人说(不知道是哪个),你在说什么? 这是三岁的孩子都懂的常识。
是的,三岁的孩子都知道。 但是三十岁的孩子不一定会认为这个常识可以用来分割人物。
2.2.2 线切割
假设我们拿着一缕头发,横向收集像素,从左边插入,从右边推出。 把所有的黑点挤在一起,把黑色素堆积起来……好吧,黑色素在最右边。 就像下图一样。
至此,我们就可以清楚的知道哪些区域是有文字的线条,哪些区域是白纸。 这个价值两百零五的操作可以实现行的切分。
这一招是投影大法,三岁小孩都能看得懂。
2.2.3 切片列
行被水平切割,列被垂直切割。
请务必先切割行,然后再切割列。 在大多数情况下,线条是间隔开的,每条线都会有明确的边界。 但是column……如果整个文档投影出来,基本都会掉下来。
上面的投影不会删除单个字符。 因为一份文件的文字就像城墙一样,不能分割。
但是,与其对一行文本进行投影分析,还可以。 看下图,就很清楚了。
利用投影之间的间隙,我们可以将每个字符切开。
2.2.4 切字
有了分行分列的方法,相信切出字符应该不难了。 其实很简单,代码也不复杂。 都是数组分析。
那么切出来的字最后是这样的。
不是白纸黑字写的吗? 为什么都是黑白的?
其实,这是故意的。 目的是为了方便OCR识别。 我们都知道(也可能不知道)在RGB颜色值中,0代表黑色,255代表白色。
不管计算机的计算能力有多强大,一秒能进行多少亿次计算,它的底层还是二进制,也就是101010,你可以简单理解为它只知道数字。 你看字母A就是A,电脑没你厉害。 电脑偷偷在显示器上输出A的图案,然后偷偷记住这个物体是65。
所以,任何文字、图片、音频、视频,最后都要解析成数字,计算机才能工作。
扯这些有什么用? 你在逃避什么? 黑白颠倒的问题怎么办?
别担心,马上。 我们希望计算机能够识别图片上的文字,而不是背景。 因此,将背景设置为黑色,即0,将字符设置为白色,即255,将有助于计算机更专注于分析字符的踪迹。 因为 0 默认被忽略。
你看,说啊说,它谈到了人工智能的机器学习。 哈哈,又换场景了,太爽了。
2.3 识别字符
图片如何变成人物? 它也可以自己学习。
计算机在学习了一些样本之后,遇到了一些从未遇到过的同类型样本,并且能够正确识别出结果,很神奇。 我想了一个晚上,也没明白。
第二天,我带着孩子去了公园,公园门口有一对大狮子。 孩子指着狮子说,狗! 我说,哦,那不是狗,那是狮子,有点像狗。 走了没多久,公园里又出现了一座独角兽雕塑。 孩子指着它说,狮子! 我说,那不是狮子。 孩子说是狗。 我说它不是狗,它叫:麒麟。 我感觉孩子的大脑在反向修正信息,这就是有监督的学习。
当我给他看一张狗的照片时,我告诉她那是一只狗。
她根据自己的认知,找到了几个特征,建立了一个模型:长嘴+獠牙=狗。
虽然她只看到了图片,但出门遇到真狗,根据这个模型,她就知道了。
后来她遇到了狮子,她修改了模型:长嘴+毒牙+鬃毛≠狗=狮子。
后来再遇到麒麟的时候,这个公式就越来越复杂……决定项越来越多。
人工智能就是模拟人的神经元,建立神经网络,试图找出特征与结果之间的关系。 如果正确,给这个特征加分。 如果错了人工智能图像识别原理,就给这个特征减分。
认识数字也是。
比如在学习识别数字6时,它随机认为只要有圆圈特征就是数字6。
在验证其他样本时,发现这个随机特征是正确的(如果不正确,再尝试另一个特征)。 因此,它建立了一个模型:只要有圆的特征,就是6。
后来模型遇到了数字0,加入新样本后,人工智能发现0也有圆圈,但不是6,有可能是0。我得再找一个特征,所以加一个新的,然后tick是6,后来又遇到了9。 上面打勾的是6,后来遇到了字母b……反正电脑有足够的计算能力,可以在短时间内完成这些学习。 上面我搂着胳膊说的,其实就是在一张32*32像素的小图上,随便加了几十个特征来验证,一点都不难。
这就是字符识别的工作原理。 具体到代码上,也很简单,因为人工智能框架目前已经很成熟了。 虽然这是科普版,不是专业版,也不适合谈代码,但还是想贴一段代码给大家看看。 打破你的认知,人工智能的应用层很简单,别上当了。
例如,识别 10 种常见物体:飞机、自行车、鸟、猫、鹿、狗、青蛙、马、船、汽车。
它的核心代码只有……6行。
所以,OCR字符的识别从来都不是难事。 难点在两端,比如开头的预处理和下面介绍的后处理。
2.4 文本后处理
识别出的字符意义不大,只有有效连接才能有效。
一定要记住我上面说的那句话,默读3遍以上。
其实这句话没什么用,只是有助于缓解一下紧张的气氛而已!
对于类似的话,我认为是废话,因为没有指导意义,但也确实如此。
2.4.1 布局还原
可能有人觉得我接下来讲的会比较神经质,有点像作者急着去厕所。 这不是文风,这篇文章我都快吐了,真想赶快写完。 也许我应该开始一系列的话题。 比较喜欢讲系统的东西,不喜欢一次拿一个点,对别人没有什么深入的价值。
可能还有人觉得,还原布局并不难(是的,进入正题),我把所有的字符都拆开,记录坐标,把识别出来的字符画上去,不就还原了吗? !
没错,你没看错,如果把识别结果画出来,视觉上就还原了。
不过这还是属于单字符识别的步骤,只是结果可视化,是坐标还原,不是布局还原。
我们预期的拆分和恢复应该是这样的:
“10+2= 4-3= 5+6=11” 这些文本应该是数据结构中的一行。 而且,“10+2=”是数据结构上的一个基本单位。 因为,我们要对基本单位进行计算和修正。 这叫做恢复,但并不简单。
我有点震惊,因为当我打开脚本时没有人问我这些规则。
举个小例子,这个例子很小,假设你已经识别了2个字符,你现在有2个字符的数据:
请问,这两个字符在同一行吗?
不能用肉眼判断,必须要计算。
这需要您编写用于代码处理的算法。 如果你不擅长数学,这实际上可能是一个相当大的挑战。 从图片上看,你的眼睛可能会在几毫秒内认出它,但是计算机没有眼睛,只有大脑。 它只是等着你告诉它如何计算什么数据。
其实很容易处理(你说什么都有,你说很难),看两个词在Y轴上的重合度就可以了。 如果重叠达到一定比例,则可以认为两组数据在同一行。
其实人物关系有很多种情况。
根据不同的情况,我们可以做出不同的判断。
如上图所示,如果文本1的矩形区域和公式1的矩形区域在水平方向上按一定比例重叠,那么我们可以认为它们在同一行。 如果文本2的区域完全包含(100%重叠)在表1的区域中,那么我们可以认为文本2属于表1。同理,文本2和文本3在表1中的重叠率垂直方向可以作为它们是否位于同一列的指示符。
2.4.2 文本校正
OCR识别的最终目的是获得准确的、结构化的文本内容。
单字识别其实就是自己打,前后不商量。
比如遇到圆形的人物图片。 OCR识别难,是数字“0”吗? 汉字“〇”? 大写字母“O”? 小写字母“o”? 中文句号“.”? 或者“Q”忘了加尾巴....
一切都是对的,没有什么是对的。
所以,需要更正……更正。 这两个词是高频词,尤其是拼音打字中的jiaozheng,很容易出错。 其实很容易区分。 看上下文,如果我前后都提到了“手稿”,那更可能是“改正”。 如果只说“牙齿”、“视力”、“角度”等,那基本上应该是“正畸”。
OCR识别的最后一步也是如此。 如果不确定是数字“0”还是字母“o”,可以观察一下它旁边的字符。 下图值一千字。
单个字符识别错误不要紧,后期智能纠错可以结合上下文帮你纠正。 此步骤称为后处理。
我想OCR流程的介绍也差不多了。 这是摘要。
三、总结
事实上,我已经迫不及待地想睡觉了。 不过睡前还是想输出几个点。
3.1 OCR投资:自研VS调用第三方?
需要企业领导根据自身的业务需求和研发能力来确定。
通过上面的流程讲解,其实我们也了解到,做OCR并不难,在业界已经很成熟了。 如果你的业务需求很简单,也有一两个喜欢研究技术的程序员(从三年的经验来看),你其实可以投入几个人,试用几个月,看看效果。 就算不成功,如果对接第三方,起码也能达到专业水平。
那么,如果您的业务需求复杂多样,是否需要使用第三方服务呢? 不一定,要求太复杂,一般的第三方平台不一定能满足你的个性化需求。 我以前遇到过一个例子,也是在教育行业。 他们有一个场景,他们使用手写答案来填空题。 对于一般的手写识别,即使你写对了80%,它也会给你智能纠错并输出字符。 然而,教育行业并不好。 写错了就是错的,不更正。 比如武术中的“武”字,如果学生在右下角写“戈”多了一个斜杠,就不要输入“武”,而是输出一个不是的字,并记录图片学生的错字。 这一次,没有可以连接的平台。 其实自己开发也是可以的。 但是开发这些东西有什么用呢? 仅供您自己使用。
如果业务比较一般,第三方费用不是很高,可以考虑购买服务。 事实上,无论是个人生活还是企业经营,都需要考虑成本控制。 最终是金钱限制了一切。 所以,我说的或多或少都是废话。 那种老板说,我有钱却找不到人才,请联系我。
3.2 OCR 有什么意义?
我觉得是数据
如今,瓶颈不再是技术人工智能图像识别原理,数据量决定了识别率。 短期内,技术提升空间不大。 剩下的就是拼数据量了。
很多人认为人工智能不聪明,甚至是弱智。 其实一部分原因是训练数据太少了。 以智能问答为例。 很多人提出的问题,人工智能都不能很好地回答。 原因是你问的问题从来没有接触过。
就像我带孩子去公园的例子,我一直给她看狗的照片,突然问她什么是独角兽,她会从狗的回答中找到类似的回答。
我仍然以教育行业为例(我很熟悉)。 如果我们从鹿角版拿一本七年级的地理书,交给人工智能学习。 如果它学完了,你问它书本上的知识,它一定会答对的。 不过,要是问它七年级下卷,估计就上当了。 更何况,还有八品九品? 更何况,还有物理、化学、生物这门学科? 更何况,我们日常生活中的对话场景是不会出现在课本上的! 如果你想让它聪明,它有多少数据,谁有这些数据? !
OCR 也是如此。 In terms of recognition, there is a difference between characters written by adults and characters written by children. If you want to recognize accurately, the more samples you have, the more accurate you will be. There is no one else for the post-processing and correction. You can only know a lot if you see it a lot.
The author of this article is Nuggets@TFboy, private reprinting is prohibited, infringement must be investigated.