使用Tensorflow实现口算检查器(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中使用如下寥寥几行代码就可以实现一个图片中字符的识别。

import pytesseract
from PIL import Image

image = Image.open('./test_images/image3.jpg')
text = pytesseract.image_to_string(image)
print(text)
复制代码

对如下图片进行识别:

结果如下:

WHWM$Efifi%

 

35—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模型。

  2. 准备数据

    训练需要标注的图片数据,标注不仅包含类别,还需要包含目标在图像中的坐标。图片标注之后,还需要转换为TensorFlow所能接受的TFRecord格式。通常我们借助脚本来实现,在后续的文章中会详细说明,这里先不展开。

  3. 训练

    有了自己的数据,就可以利用迁移学习原理,在现有的ssd_mobilenet_v1_coco模型上训练出我们自己的模型。

  4. 识别数字和运算符号

    使用训练出的模型,进行数字和运算符号识别,识别结果包括类别以及在图像中的坐标。

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

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

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此为源码(python):开发用于小学生口算练习的小程序,适合python初学者参考。如有不足请多指正!之前上传的资料没看过评论,很多朋友遇到了问题没有及时发现沟通解决,这次末尾有联系方式,有问题的朋友可以联系交流。 详细信息如下: 一、附件为小学生口算练习小程序,为自家宝贝设计的,自用之余拿来大家分享使用,非常适合一、二、三年级的小朋友。 二、程序功能: 1、生成任意数以内的+-*/单一或混合运算的口算卡(excel文件,可打印),每张80道题。 2、任意数以内的+-*/单一或混合运算的练习(练习前选择条件),显示答题总数、正确与错误数、用时及平均时间。 3、表内乘法口算练习(同2可以显示答题信息)。 4、生成表内乘法口诀练习口算卡,格式同1。 5、生成几乘几以上的专项表内乘法口诀练习口算卡,格式同1。 6、表内除法口算练习(同2可以显示答题信息)。 7、每日口算打卡练习,每日出题80道,在程序中答题,显示答题总数、正确与错误数、用时及平均时间。并且会将每次答题信息记录至程序目录中的一个excel文件中,跟踪小朋友的口算情况。 三、程序为exe程序(一个exe文件和一个excel模板文件,要在一个文件夹就可以),下载后无需安装直接可以运行,并且有excel模板,如果生成的excel文件打印出线或打印不全的,可以自行调整一下模板excel文件的列宽和行高,切记:模板文件建议不要插入或删除行或列,以免错乱。 四、附件为压缩文件(使用7Z程序压缩的),可以用winrar、360、好压 等解压,如有问题可以QQ(1064386744)或邮箱、微信联系解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值