人工智能实战2019 - 第4次作业(团队后期项目)- 就起这个名字吧
项目 | 内容 |
---|---|
课程 | 人工智能实战2019 |
作业要求 | 第4次作业 |
课程目标 | 学习人工智能基础知识 |
本次作业对我的帮助 | 了解MNIST数据集,学习实现算式识别的算法 |
参考文献 | 识别并计算简单手写数学表达式 |
背景
前期和中期项目中,我们实现了识别单个手写数字或字母、基于MNIST和字库的人工智能应用,并且在试验中表现良好。但一次只能识别一个手写数字或字母,具有很大的应用局限性。
对于生活中常见的手写数学表达式(形如\((2+3) \times 5\)),我们如何做到识别并计算?
在初期和中期的项目中,我们没有对笔迹图形做额外的处理,所以无法实现多个数字的识别,如下图。
为了应对多个数字输入的情况,很自然地想到:将多个数字分开,一个一个的让MNIST模型去识别。
之前的MNIST模型所用的训练数据集只有0-9,为了识别出基本数学运算符 - 加、减、乘、除和括号,我们需要扩充MNIST数据集。
字符分割
本应用接收的输入是用户当场写下的,不是通过静态图片导入的。这就意味着我们拥有笔画产生过程中的全部信息,比如笔画的先后顺序,笔画的重叠关系等。
我们做出如下假设:
- 数字都是横向书写
- 在水平面上的投影有重叠的笔画属于同一个数字
- 对于不经意的重叠,设置重叠的容忍阈值为10%
扩展MNIST数据集
1.准备数据
- 深入理解MNIST数据
- 确定卷积神经网络的数据输入格式
2.收集并格式化数据
- 在网络上搜索已有的数据集
- 自行开发小型应用以在触摸屏上搜集手写图片(形如团队中期项目)
- 在已有的原始数据基础上,通过缩放、扭曲、添加噪点等方式来扩展数据集
- 对于图片标记的处理
3.训练模型
- 混合新旧数据
代码流程(详细代码分析见参考文献)
1.输入处理
- 记录笔画的产生过程
- 分割笔画
- 为每个分组生成单一位图
2.批量处理
- 借助于Visual Studio Tools for AI
3.计算表达式
- 表达式求值有成熟的算法,借助已有组件即可
项目初版(识别结果展示)
总结
在算式识别的项目中,我们综合应用了人工智能和传统技术手段。这使我们的应用具备了亮眼的功能,初步实现了现实规格的应用需求。
但是,对于:
1.更复杂的表达式
- 二维结构(分数,指数,平方根,矩阵等)
- 符号计算(保留无理数,小数与分数的转换)
2.更多的手写风格
- 连笔、断笔、噪点、涂改等
3.更全面的计算功能
- 输入校正
- 历史结果存储
我们在生活中面对的手写信息,包含以上各种问题。我们需要传统的代数和符号计算,图像分割、聚类和目标检测等OpenCV式算法;也需要人工智能算法的落地化应用。
解决这些问题,需要我们将人工智能和传统的技术手段融合起来,真正的解决实际场景中的典型问题。