人工智能实战2019

项目 内容
课程 人工智能实战2019
作业要求 第4次作业
课程目标 学习人工智能基础知识
本次作业对我的帮助 了解MNIST数据集,学习实现算式识别的算法
参考文献 识别并计算简单手写数学表达式

背景


前期和中期项目中,我们实现了识别单个手写数字或字母、基于MNIST和字库的人工智能应用,并且在试验中表现良好。但一次只能识别一个手写数字或字母,具有很大的应用局限性。
对于生活中常见的手写数学表达式(形如((2+3) imes 5)),我们如何做到识别并计算?
在初期和中期的项目中,我们没有对笔迹图形做额外的处理,所以无法实现多个数字的识别,如下图。
VJspuD.png
为了应对多个数字输入的情况,很自然地想到:将多个数字分开,一个一个的让MNIST模型去识别。
之前的MNIST模型所用的训练数据集只有0-9,为了识别出基本数学运算符 - 加、减、乘、除和括号,我们需要扩充MNIST数据集。

字符分割


本应用接收的输入是用户当场写下的,不是通过静态图片导入的。这就意味着我们拥有笔画产生过程中的全部信息,比如笔画的先后顺序,笔画的重叠关系等。
我们做出如下假设:

  • 数字都是横向书写
  • 在水平面上的投影有重叠的笔画属于同一个数字
  • 对于不经意的重叠,设置重叠的容忍阈值为10%

笔画和水平方向上投影的关系示意如下图:
VJ2B3n.png

扩展MNIST数据集


1.准备数据

  • 深入理解MNIST数据
  • 确定卷积神经网络的数据输入格式

2.收集并格式化数据

  • 在网络上搜索已有的数据集
  • 自行开发小型应用以在触摸屏上搜集手写图片(形如团队中期项目)
  • 在已有的原始数据基础上,通过缩放、扭曲、添加噪点等方式来扩展数据集
  • 对于图片标记的处理

3.训练模型

  • 混合新旧数据

代码流程(详细代码分析见参考文献)


1.输入处理

  • 记录笔画的产生过程
  • 分割笔画
  • 为每个分组生成单一位图

2.批量处理

  • 借助于Visual Studio Tools for AI

3.计算表达式

  • 表达式求值有成熟的算法,借助已有组件即可

项目初版(识别结果展示)


VJ4Nfe.png

总结


在算式识别的项目中,我们综合应用了人工智能和传统技术手段。这使我们的应用具备了亮眼的功能,初步实现了现实规格的应用需求。
但是,对于:
1.更复杂的表达式

  • 二维结构(分数,指数,平方根,矩阵等)
  • 符号计算(保留无理数,小数与分数的转换)

2.更多的手写风格

  • 连笔、断笔、噪点、涂改等

3.更全面的计算功能

  • 输入校正
  • 历史结果存储

我们在生活中面对的手写信息,包含以上各种问题。我们需要传统的代数和符号计算,图像分割、聚类和目标检测等OpenCV式算法;也需要人工智能算法的落地化应用。
解决这些问题,需要我们将人工智能和传统的技术手段融合起来,真正的解决实际场景中的典型问题。

原文地址:https://www.cnblogs.com/wangshihong/p/10966411.html