点击蘑菇云创造 关注我们
基于行空板的
智能视力检测助手
壹 -
项目背景
随着中小学生年级的不断提高,近视率呈上升趋势,能否准确测量学生(孩子)视力,做到随时追踪、时刻提醒,是一件值得我们重视的事情。
贰 -
项目介绍
(一)主要功能
本项目是基于行空板、物联网和人工智能的简易视力检测助手,既可以用于个人家庭检测,又可以增加终端设备用于学校班级检测,并收集检测数据发送到物联网服务器供分析使用,如追踪学生视力情况,计算年段近视率,近视率预警等。
(二) 主要任务
项目所需完成的主要任务有:按照视力表随机出示不同朝向的字母E,被测试人员通过语音反馈字母方向,程序通过语音识别判断与出示的字母是否一致,当达到一定的正确率,则继续缩小字母的尺寸,直到看不清楚为止或达到最高视力值。
由于行空板的尺寸大小有限,可通过两种方式实现正常的测量,一种是外接更大的屏幕,另一种是根据字母大小,同测量人员与屏幕之间的距离进行一个换算,这样就可以不采用标准的5米测量距离。本项目采用后面一种方法,直接使用行空板屏幕出示字母进行测量。
(三)视频介绍
叁 -
材料清单
行空板 × 1,百度AI账号
肆 -
项目实施
(一) 准备百度AI账号用于语音识别
本项目将使用到人工智能中的语音识别技术,这里采用百度智能云中的语音能力引擎,请注意新账号有一定的赠送量,否则需要充值使用。
步骤1:浏览器打开网址 https://ai.baidu.com/,注册一个百度账号,在右上角单击“控制台”链接登录。
步骤2:单击左上角导航按钮,在左侧的导航窗格中单击“语音能力引擎”按钮。
步骤3:单击页面中间的“创建应用”下面的“去创建”链接,打开创建页面。
在创建页面输入应用名称,选择人工智能相关的功能,此处因为创建的是语音能力引擎的应用,所以语音技术内所有的项目都已经默认勾选。
步骤4:应用创建成功后,在应用列表中会显示已经创建的一些应用,可以复制“API Key”和“Secret Key”到记事本备用。
注意:复制Secret Key时一定要显示后再复制。
(二) 软硬件准备
本项目只要使用一根USB连接线与电脑连接即可。然后在电脑浏览器中输入http://10.1.2.3,进入行空板的网页管理界面,打开SIoT服务。因为行空板提供了该项物联网服务,因此我们无须使用其他物联网服务器。
注意:考虑到本项目只是一个小小的演示,因此这里并没有使用到很多硬件。感兴趣的可在此项目上进行拓展,增加其它硬件,比如大屏幕,比如usb音箱,行空板独立供电等。
在下面的网络设置中,使行空板通过Wifi与网络连接,如果周围没有无线网络,也可以使用手机热点。
注意:如需其他资料,可以进入https://wiki.unihiker.com/随时查阅。
(三) 程序编写
根据项目构思,确定本项目的程序主要包括三个部分:字母生成部分、检测判断部分和语音识别与物联网发布部分,如思维导图所示。
1. 字母生成
一开始我打算采用图片的方式来直接呈现字母E,通过图片大小缩放来实现不同视力值的测量。结果发现这样做并不理想,首先考虑不同视力值用不同大小的图片,到底是准备一张还是多张图片?其次,如果准备一张,缩放后会失真,同时也比较难确定字母的大小。思路至此打断……
经过多日思考、查阅资料,突然想到之前学习计算机基础知识时,有接触过点阵字符的原理,在一个点阵中,通过某些点填充黑色,某些点填充白色,最终呈现字符。因此,我想是否采用点阵的方式来呈现字母E?我在Excel中进行了尝试,发现是可行的。只要将5X5点阵的一些格子填充黑色,就可以实现不同朝向E的呈现。至于大小,通过控制格子的大小来确定。而每个格子就是一个正方形。
因此,可以创建一个包含4个元素的元组,每个元素是一个由0和1组成的长度为25的字符串,程序中根据字符值来创建四个方向的E。
#朝右,下,左,上xz=("1111110000111111000011111","1111110101101011010110101","1111100001111110000111111","1010110101101011010111111")
另外,每个E的大小是根据上面点阵大小决定的,根据网上资料的查询,考虑到行空板屏幕相对于普通的视力表较小,因此,需要经过距离和大小的换算,得出视力值与大小的对应值(测试距离为1.5米)。
所以我们继续创建2个元组,将上面两项值存入元组中备用。
注意:元组sl1是2分记录值,sl2是五分记录值,选择其中一种即可。
sl1=(0.1,0.2,0.3,0.4,0.5,0.6,0.8,1.0,1.2,1.5,2.0)sl2=(4,4.3,4.5,4.6,4.7,4.8,4.9,5.0,5.1,5.2,5.3)width1=(47.52,23.76,15.84,11.88,9.504,7.92,5.94,4.752,3.96,3.168,2.376)
另外,为了使产生的E字能始终显示在行空板屏幕的正中间,经过计算,得到正方形边长与屏幕尺寸之间的关系,从而确定最左上角正方形起始位置的坐标(x1,y1)是:
x1=120-2.5*widthy1=160-2.5*width
通过以上分析和研究,我们可以编写一个函数,根据方向(方向在主程序中将随机生成)和边长,来呈现字母E,如下图所示。
2. 检测和判断部分
根据平时我们上医院或学校里检测视力的流程,通常医生会从上往下(字符从大到小)指向测试字符,然后同一排连续正确,则往下一排继续测试,直到测试到最下一排(最高视力值)或中间某一排看不清为止(上一排即为视力值)。
因此在我们的程序中,规定同一排在5个字符内有3个指向正确,则缩小字符的大小,最后确定视力值。
在此我们写一个函数,模拟手工视力测试的方式,并结合语音识别进行判断。
反馈正确则显示一个对勾,错误则显示错叉,也是采用点阵显示方法。编写一个函数实现。
3. 语音识别和物联网发布部分
判断部分相对简单,但需要用到人工智能中的语音识别技术,最终将某个学生的测试视力值上传到物联网平台供存储和分析。
此处我们撰写两个函数,一个是实现语音识别并返回识别后的文字,另一个是发送消息到物联网平台。
具体代码如下图所示。
语音识别函数
上传消息到物联网平台函数
此处,在语音识别函数中使用了百度AI中的短语音识别python库。
具体可以参考文档:https://ai.baidu.com/aidoc/SPEECH/1k4o0bmc7
4. 调用模块和主函数
本程序需要调用一些第三方模块,如unihiker模块,pinpong模块,百度语音识别模块等,在程序的开头调用。而主函数放在最后,根据用户按下行空板上的A键开始测试,同时会出示一些提示信息,并在每一个完成测试后清屏供下一个同学测试。
模块调用和初始化
主函数
伍 -
项目拓展
通过本项目,可以完成简单的视力测试,在此基础上,可以进行一些拓展,如:
(一)多块行空板下的学校批量视力自测
比如每班一个终端,依次测试学生视力,测试视力数据上传到物联网服务器。
(二)多种交互判断方式。
本程序只是使用了语音识别进行判断,其实也可以通过手势识别,结合二哈进行图像识别,当然,还可以通过更简单的按钮。
(三)数据分类存储。
保护学生视力任重道远,对于每一个学生的检测数据,如果能以个人身份信息作为区分,保存在数据库中则更佳。可以探索在测试前确定身份,测试结束将数据保存在数据库中。
本文来源:DF创客社区
作者: 仔爸
更多案例查看
点击 “阅读原文” 了解更多!

