小学生学习数学,四则运算是比较重要的内容,需要做大量的练习,一次要做几十甚至上百道题,经常每天都要做,俗称刷题;对老师和家长来说,判卷也是一个比较费事的工作。如果我们可以通过摄像头直接拍摄学生刷题的卷子,识别卷子上的题目和学生答案,并判断答案是否正确,这种自动判卷神器,可以大大减轻老师和家长判卷的压力。
本次项目以两个运算数的加减乘除的四则运算为例,后续可以将这个功能扩展到多个运算数并且带括号的运算,以及小数、分数的运算,乘方的运算等。对于学生手写数字的识别率,也可以作为书写是否规范的一个评价,对学生提出建议,督促学生书写尽量规范。
本项目采用如下硬件平台:
在LattePanda上,通过摄像头采集数学刷题图像或者采用保存好的数学刷题图像,输入到部署在NCS2上的训练好的优化后的网络系统,识别数学题目,自动计算数学题目结果,识别学生答案,并判断学生答案是否正确,给出判断结果。可以将错题高亮显示标出,存成新的判卷图片,并将结果在显示器上输出,或者通过声音给出结果(答对多少道题或者多少分)。
刷题试卷如下图所示:
这张卷子有100道题目,涵盖百以内的加减法运算,有打印的数字、计算符号、等于号和学生手写的结果,还有班级姓名等。
软件流程图如下:
输入刷题试卷的图像后,我们要对图像按照每个题目分块,然后再对每个分块内的数字、计算符号、“=”,以及手写答案进行识别,然后组合成算式,计算结果,与手写答案做对比,然后进行下一题目分块,直到试卷结尾。
以第一道题为例,我们要识别并分解题目:“53+17=”,其中,“53” 和 “17” 是参与运算的数字,“+” 是运算符,“=” 是等号;我们需要识别单个的数字 “5” 和 “3”,然后根据运算符的间隔,将单个数字组合成相应的运算数字“53”,识别出运算符和参与运算的数字后,我们自动计算此题目的结果“70”,同时识别学生的手写结果”70”,并判断学生计算结果是否正确。
以此类推,对所有题目进行类似操作,就可以知道该学生一共作对了多少题目,得到多少分,通过显示器或者音箱将结果输出。
实现过程:
- 采集并标图像数据,借用mnist数据集作为手写体的数据集,该数据集有手写的单个数字的数据;我们还需要通过LattePanda的摄像头采集一定数量的运算符和 “=” 的图像,并做标注;
- 创建深度学习网络,可以采用已有深度学习网络,做迁移学习;比较几种深度学习网络,考虑速度和准确率,选取一种比较合适的结构,保证其识别准确率在96%以上。
- 用标注好的数据训练网络,达到一定的精度要求;保存模型为ONNX格式;
- 将训练好的网络模型,引入到OpenVINO 环境,采用mo.py对模型进行优化,并采用benchmark_app.py对其性能进行评估;
- 部署到LattePanda和Intel计算棒NCS2上,对实时采集图像或者保存图像,进行推理,识别数学题目,自动计算数学题目结果,识别学生答案,并判断学生答案是否正确,给出判断结果,通过语音合成技术,将学生的答题情况,得分播报出来;根据得分情况,对学生进行鼓励。
结果显示: