使用Tensorflow实现口算检查器(1):模型选择

2019-07-02 14:54:45 浏览数 (1)

周末在家帮娃检查口算作业,发现一个非常有意思的应用:拿手机对着作业拍照,立马就能知道有没有做错的题目。如果做错了,还会标记出来,并给出正确答案。

出于一名软件工程师的职业病,看了这个应用,忍不住琢磨其实现,初步判断这是一款采用了人工智能的应用。想着自己也在学习人工智能技术,就拿这个练练手,算是对这段时间学习到的深度学习知识的一个总结。具体形式上,准备做成微信小程序,业务逻辑在服务器端完成。

按照惯例,我还是会将实现过程详细的记录下来,并将源码放在github上,敬请关注。原计划写一写生成对抗网络(GAN)的,因为有了这样一个小目标,只能先暂时放一放。

定下这个小目标之后,这周都在收集相关的资料。

OCR

首先来说一说OCR(Optical Character Recognition,光学字符识别)。OCR是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。

OCR技术在印刷、打印行业应用广泛,可以快速的将纸质资料转换为电子资料。OCR能识别文字字符,当然识别数字也不在话下,而且OCR技术已经得到多年的发展,非常成熟。在项目开发中,也有成熟的开源方案可供选择,这其中的佼佼者是Tesseract。

Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。Tesseract目前已作为开源项目发布在Google Project。

Tesseract在使用上也非常简单,借助于pytesseract python包,在python中使用如下寥寥几行代码就可以实现一个图片中字符的识别。

代码语言:javascript复制
import pytesseractfrom PIL import Imageimage = Image.open('./test_images/image3.jpg')
text = pytesseract.image_to_string(image)
print(text)

对如下图片进行识别:

结果如下:

代码语言:javascript复制
WHWM$Efifi5—5: 28-6= 38-8:
27-4: 25—4: 29—2:
25—3: 24—4: 49—4=
22—1: 47—5: 26-6=42—1: 41—1: 44—3:38-5= 46-6= 49-6=
34-3= 48-5= 28-4=
36-4= 39-4= 27-2=
48-6= 28-2= 46-5=
35-4= 26-5= 48-3=
27-3: 47-6: 38-4:
39-3= 33-2= 36-4=mmz¥sm “mm" ‘x
31

上述结果是没有做任何配置和调教的情况下作出的,所以没有识别出中文,另外也存在一定的错误,这都可以通过代码进行矫正。

看起来似乎问题可以很快得到解决,将识别出的文本进行分割,然后转化为算式进行运算就可以求值。但这种方案的最大问题在于,我们没有得到算式的坐标。这样如果检查出错误后,无法明确标识错误的位置,无法满足需求。

目标检测(Object detection)

因为之前也稍微了解过深度学习中的目标检测,所以自然就想到借助目标检测技术来实现。目标检测(Object Detection)是人工智能最基础的应用,不论是我们常见的人脸识别,还是高大上的自动驾驶,都离不开目标检测。要从一幅复杂的画面中识别出物体或人物,需要复杂的算法,想想就觉得深奥,不过好在有TensorFlow这样的框架,具有强大的目标检测API,让没有机器学习背景的人也可以快速构建和部署功能强大的图像识别软件。

我在前面写过关于目标检测的系列文章《使用TensorFlow一步步进行目标检测》,详细的过程这里就不重复,简单总结一下,大体的过程如下:

  1. 选择模型 github上有TensorFlow模型集合,可以通过简单的命令获得这些预训练的模型: git clone https://github.com/tensorflow/models.git 在research目录,里面有一个object_detection子目录,这里面有我们所需的目标检测模型。object_detections目录下的内容相当多,有数据集、模型文件、测试代码、示例等等,模型文件位于models子目录下:

因为在本项目中,需要识别的场景比较单一,需要识别的目标也不复杂,所以我就选择了在移动终端上能很好工作的ssd_mobilenet_v1_coco模型。

  1. 准备数据 训练需要标注的图片数据,标注不仅包含类别,还需要包含目标在图像中的坐标。图片标注之后,还需要转换为TensorFlow所能接受的TFRecord格式。通常我们借助脚本来实现,在后续的文章中会详细说明,这里先不展开。
  2. 训练 有了自己的数据,就可以利用迁移学习原理,在现有的ssd_mobilenet_v1_coco模型上训练出我们自己的模型。
  3. 识别数字和运算符号 使用训练出的模型,进行数字和运算符号识别,识别结果包括类别以及在图像中的坐标。

有了识别出的数字和运算符号以及其坐标,我们就可以进行一系列的判断,确定运算式及其位置,这部分的逻辑也有一定的复杂度,但是相比之前的目标检测,还是简单不少。

在搜索资料的过程中,我在github上发现一个开源项目:https://github.com/stevenobadja/math_object_detection 。该项目也是识别图像中的运算式,并计算出结果,有很多可以借鉴的地方,我会在项目中尽可能多的复用该项目的数据集、脚本。

在下一篇文章中,我将聊一聊如何使用目标检测来识别手写数字。

参考
  1. 使用TensorFlow一步步进行目标检测(1)
  2. 使用TensorFlow一步步进行目标检测(2)
  3. 使用TensorFlow一步步进行目标检测(3)
  4. 使用TensorFlow一步步进行目标检测(4)
  5. 使用TensorFlow一步步进行目标检测(5)
  6. https://github.com/stevenobadja/math_object_detection

0 人点赞