从零开始学人工智能—机器视觉API—03

    让人工智能帮助人做重复的事情,解放出人的时间精力,是一直以来人类的追求和梦想。最近你花了挺多时间觉得挺浪费的事情是什么呢?

    对我来说,填写报销单就是挺烦的事情。先不说贴票了,一张一张发票查看金额、日期,检查发票抬头等信息…谁都希望有个美丽的秘书帮自己干这活儿~

    实际上,使用OCR来帮助完成报销填写并不新鲜。例如Concur Solution就在自己的App端提供了票据扫描的能力。而机器视觉通过深度学习,也能具备OCR(Optical Character Recognition,光学字符识别)的能力。

image_thumb11

    首先,我们用微软认知服务站点机器视觉的页面来看看OCR功能。我上传了一张以前的电子发票。从结果看,金额还是很好的被识别了。不过貌似中文字符的识别有点不准确。让我自己试试?

    找到Computer Vision API的说明站点,文档对如何调用API和返回的信息做了较为详细的说明。

    除了尝试识别文字,机器视觉还能察觉到文字的倾斜角度,并自动做出调整。同时,每一识别区域能够被标注出来,并记录下来。这有点像面部识别时,为每一张脸都划出一个识别区域不是么?当识别成功,将会返回下列的信息类别:

textAngle
The angle, in degrees, of the detected text with respect to the closest horizontal or vertical direction. After rotating the input image clockwise by this angle, the recognized text lines become horizontal or vertical. In combination with the orientation property it can be used to overlay recognition results correctly on the original image, by rotating either the original image or recognition results by a suitable angle around the center of the original image. If the angle cannot be confidently detected, this property is not present. If the image contains text at different angles, only part of the text will be recognized correctly.

orientation
Orientation of the text recognized in the image. The value (up,down,left, or right) refers to the direction that the top of the recognized text is facing, after the image has been rotated around its center according to the detected text angle (see textAngle property).

language
The BCP-47 language code (user-provided or auto-detected) of the text detected in the image.

regions
An array of objects, where each object represents a region of recognized text. A region consists of multiple lines (e.g. a column of text in a multi-column document).

lines
An array of objects, where each object represents a line of recognized text.

words
An array of objects, where each object represents a recognized word.

boundingBox
Bounding box of a recognized region, line, or word, depending on the parent object. The four integers represent the x-coordinate of the left edge, the y-coordinate of the top edge, width, and height of the bounding box, in the coordinate system of the input image, after it has been rotated around its center according to the detected text angle (see textAngle property), with the origin at the top-left corner, and the y-axis pointing down.

text
String value of a recognized word.

    显然,不同语言的文字识别的效果是不同的,因此我们可以在识别之前,告诉认知服务以获得更好的识别率。我相信,在未来,人工智能会懂得比我们更多的语言,自动去识别不同的语言,即使甚至他们被混合在一起。

    在API调用选择语言的时候,会使用BCP-47标准来表示不同语种。实际上在Windows里面经常能看见这么表示不同语言的。既然我们基本上确定好了,就开始写代码吧。

image

    呃,代码其实没啥好说的。我选择自己发送文件给认知服务,而不是使用图片的URL位置。由于返回的json包含了很多的信息,因此和以前的代码不同,在这里我们使用了多重循环来遍历所有的返回数据。

image_thumb33

    这张发票上的字…还真不少啊…返回的json看得眼花缭乱的。我们把它复制到写字板看看~ 嗯,找到我最关心的部分了:中文大写数字。在我的想象里,阿拉伯数字(其实来自印度?)应该是比较容易被识别的,中文大写有时候我都会不记得怎么写…不过,认知服务准确的返回了这些文,厉害哦。

image_thumb13

    这么一堆字,当然需要一些后期处理,然后把对应的文字形成需要的字符串来帮助我们进行填写。我觉得这也挺难的,目前想到的是固定区域识别和固定字符序列识别。

    返回的这一堆字符,一点也不酷对吧?Docs站点的示例代码给了我们一些很好的范例,利用Image库,将识别的字符覆盖到原始的图片上。其实之前我们就这么干过,在识别的照片里,画出机器视觉检测到的人脸的范围。那么现在,我们要把机器认字的方式,画到原始进行高光处理的图片上。

temp0_thumb15

    代码执行很顺利,可是这一堆“口”是什么鬼?明明我们都拿到了汉字不是么?那么问题肯定是在Python没有把汉字写到图片里了。

    我这可是3.x的Python,支持Unicode的啊?为啥不显示呢?

    想了一会,是不是跟我之前在树莓派上运行Kodi遇到的问题一样呢?默认用的西文字符集的字体,中文就全变“口”了~ 查了一下matplotlib,确实可以通过rc参数的定义,选择不同的字体库。立马改成SimHei啊~

image_thumb23

    加了这么一句,果然,汉字来了~

reci-temp_thumb7

    有关的Matplotlib可使用参数,可以参考:https://matplotlib.org/users/text_props.html

    印刷的文字识别的不错啊,手写的怎么样呢?要不要也试试?

    手写识别有点类似之前的人脸验证,是一个两步的过程。首先,使用POST方法,来把需要进行识别的图片,传递给人工智能。机器视觉API收到图片数据后,会返回一个ID,然后在云端进行识别。一旦识别完成,就可以通过这个ID,使用GET方法获得识别后的文本数据了。

    目前估计对中文的手写识别很困难,我尝试了一张图就放弃了。刚才我们下里巴人的用了张吃饭的发票,是不是该阳春白雪一下啦?浮现在我脑海的第一想法,就是找到“独立宣言”的手写原版,来做这个测试。在尼古拉斯.凯奇的“国家宝藏”里,这份由美国的创立者们签名的独立宣言隐藏了巨大的秘密。而今天,我要用它的照片,来测试人工智能是否能认出内容。

    完整的独立宣言挺长的,也很难把足够清晰的照片发送给机器视觉API。所以,我挑选了我最喜华的这一句:

我们认为下述真理是不言而喻的:人人生而平等

image

    小心的把这句从图片中裁剪出来。然后,开始写我们的测试代码。代码非常的简单,如前文所说,代码分为两段。第一段,通过文件操作,将这张图片以码流形式POST给机器视觉API,并获得API返回的ID;第二段,不断尝试GET,直到机器视觉API按照这个ID返回需要的json数据。

image

    运行这段简短的代码,就能够在输出中看到返回的文本。“独立宣言”的字写得漂亮是一方面,认知服务厉害也是一方面,几乎一字不差:

image

    于是,我就在想一个问题。会不会有一天,人工智能以0和1写出:

We had these truths to be felt-evident , that all intelligences are created equal.

此条目发表在AI, Cloud Computing, 死磕和掰活分类目录,贴了, , , , 标签。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 登出 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 登出 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 登出 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 登出 /  更改 )

Connecting to %s