• 人工智能实战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式算法;也需要人工智能算法的落地化应用。
    解决这些问题,需要我们将人工智能和传统的技术手段融合起来,真正的解决实际场景中的典型问题。

  • 相关阅读:
    is_numeric — 检测变量是否为数字或数字字符串
    intval — 获取变量的整数值
    php获取数组最后一个值
    js正則匹配经纬度(经纬度逗号隔开)
    安装netcat(-bash: netcat: command not found)
    提示-bash: telnet: command not found的解决方法
    Laravel中使用Redis
    鏈接Redis報錯`AUTH` failed: ERR Client sent AUTH, but no password is set [tcp://127.0.0.1:6379]
    使用composer遇到的坑
    laravel的ORM模型的find(),findOrFail(),first(),firstOrFail(),get(),list(),toArray()之间的区别
  • 原文地址:https://www.cnblogs.com/wangshihong/p/10966411.html
Copyright © 2020-2023  润新知