仔爸 发表于 2022-10-28 20:57:59

【物联网项目】基于行空板的智能视力检测助手

本帖最后由 仔爸 于 2022-10-28 21:00 编辑

一、项目背景随着中小学生年级的不断提高,近视率呈上升趋势,能否准确测量学生(孩子)视力,做到随时追踪、时刻提醒,是一件值得我们重视的事情。本项目是基于行空板、物联网和人工智能的简易视力检测助手,既可以用于个人家庭检测,又可以增加终端设备用于学校班级检测,并收集检测数据发送到物联网服务器供分析使用,如追踪学生视力情况,计算年段近视率,近视率预警等。项目主要能实现按照视力表随机出示不同朝向的字母E,被测试人员通过语音反馈字母方向,程序通过语音识别判断与出示的字母是否一致,当达到一定的正确率,则继续缩小字母的尺寸,直到看不清楚为止或达到最高视力值。由于行空板的尺寸大小有限,可通过两种方式实现正常的测量,一种是外接更大的屏幕,另一种是根据字母大小,同测量人员与屏幕之间的距离进行一个换算,这样就可以不采用标准的5米测量距离。本项目采用后面一种方法,直接使用行空板屏幕出示字母进行测量。
二、项目演示

https://www.bilibili.com/video/BV1XK411U7P6/?share_source=copy_web&vd_source=6c16d8d61307d5f72d4443756d9ff002

三、材料清单
[*]行空板1块
[*]百度AI账号1个


四、项目实施(一)准备百度AI账号用于语音识别本项目将使用到人工智能中的语音识别技术,这里采用百度智能云中的语音能力引擎,请注意新账号有一定的赠送量,否则需要充值使用。步骤1:浏览器打开网址https://ai.baidu.com/,注册一个百度账号,在右上角单击“控制台”链接登录。步骤2:单击左上角导航按钮,在左侧的导航窗格中单击“语音能力引擎”按钮。步骤3:单击页面中间的“创建应用”下面的“去创建”链接,然后在创建页面,输入应用名称,选择人工智能相关的功能,此处因为创建的是语音能力引擎的应用,所以语音技术内所有的项目都已经默认勾选。步骤4:应用创建成功后,在应用列表中会显示已经创建的一些应用,可以复制“API Key”和“Secret Key”到记事本备用,特别要注意,复制Secret Key时一定要显示后再复制。
(二)软硬件准备考虑到本项目只是一个小小的演示,因此许多硬件并没有准备充分,比如大屏幕,比如usb音箱,比如行空板独立供电等,可在适当的时候采购使用。因此只要使用一根USB连接线与电脑连接即可。然后在电脑浏览器中输入http://10.1.2.3进入行空板的网页管理界面,打开SIoT服务,因为行空板提供了该项物联网服务,因此我们无须使用其他物联网服务器。在下面的网络设置中,使行空板通过Wifi与网络连接,如果周围没有无线网络,也可以使用手机热点。
此外也可以进入https://wiki.unihiker.com/随时查阅相关的资料。
(三)程序编写根据项目构思,确定本项目的程序主要包括三个部分:字母生成部分、检测判断部分和语音识别与物联网发布部分,如思维导图所示。1.       字母生成一开始我打算采用图片的方式来直接呈现字母E,通过图片大小缩放来实现不同视力值的测量。结果发现这样做并不理想,首先考虑不同视力值用不同大小的图片,到底是准备一张还是多张图片?其次,如果准备一张,缩放后会失真,同时也比较难确定字母的大小。思路至此打断……经过多日思考、查阅资料,突然想到之前学习计算机基础知识时,有接触过点阵字符的原理,在一个点阵中,通过某些点填充黑色,某些点填充白色,最终呈现字符。因此,我想是否采用点阵的方式来呈现字母E?我在Excel中进行了尝试,发现是可行的。只要将5X5点阵的一些格子填充黑色,就可以实现不同朝向E的呈现。至于大小,通过控制格子的大小来确定。而每个格子就是一个正方形。因此,可以创建一个包含4个元素的元组,每个元素是一个由0和1组成的长度为25的字符串,程序中根据字符值来创建四个方向的E。xz=("1111110000111111000011111"#朝右,下,左,上,"1111110101101011010110101" ,"1111100001111110000111111" ,"1010110101101011010111111")另外,每个E的大小是根据上面点阵大小决定的,根据网上资料的查询,考虑到行空板屏幕相对于普通的视力表较小,因此,需要经过距离和大小的换算,得出视力值与大小的对应值(测试距离为1.5米,)。

视力值5分记录44.34.54.64.74.84.95.05.15.25.3
视力值2分记录0.10.20.30.40.50.60.81.01.21.52.0
屏幕上正方形边长47.5223.7615.8411.889.57.925.944.7523.963.172.38
所以我们继续创建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*width   #width是正方形边长y1=160-2.5*width
通过以上分析和研究,我们可以编写一个函数,根据方向(方向在主程序中将随机生成)和边长,来呈现字母E:2.       检测和判断部分根据平时我们上医院或学校里检测视力的流程,通常医生会从上往下(字符从大到小)指向测试字符,然后同一排连续正确,则往下一排继续测试,直到测试到最下一排(最高视力值)或中间某一排看不清为止(上一排即为视力值)。因此在我们的程序中,规定同一排在5个字符内有3个指向正确,则缩小字符的大小,最后确定视力值。在此我们写一个函数,模拟手工视力测试的方式,并结合语音识别进行判断。反馈正确则显示一个对勾,错误则显示错叉,也是采用点阵显示方法。编写一个函数实现。3.       语音识别和物联网发布部分判断部分相对简单,但需要用到人工智能中的语音识别技术,最终将某个学生的测试视力值上传到物联网平台供存储和分析。此处我们撰写两个函数,一个是实现语音识别并返回识别后的文字,另一个是发送消息到物联网平台。
[*]语音识别函数:

这里使用了百度AI中的短语音识别python库,具体可以参考文档:https://ai.baidu.com/ai-doc/SPEECH/1k4o0bmc7

[*]上传消息到物联网平台函数:


4.       调用模块和主函数本程序需要调用一些第三方模块,如unihiker模块,pinpong模块,百度语音识别模块等,在程序的开头调用。而主函数放在最后,根据用户按下行空板上的A键开始测试,同时会出示一些提示信息,并在每一个完成测试后清屏供下一个同学测试。
[*]模块调用和初始化




[*]主函数

五、项目拓展通过本项目,可以完成简单的视力测试,在此基础上,可以进行一些拓展,如:
[*]多块行空板下的学校批量视力自测,也就是比如每班一个终端,依次测试学生视力,测试视力数据上传到物联网服务器。



[*]多种交互判断方式。本程序只是使用了语音识别进行判断,其实也可以通过手势识别,结合二哈进行图像识别,当然,还可以通过更简单的按钮。
[*]数据分类存储。保护学生视力任重道远,对于每一个学生的检测数据,如果能以个人身份信息作为区分,保存在数据库中则更佳。可以探索在测试前确定身份,测试结束将数据保存在数据库中。

源程序:

木子呢 发表于 2022-10-31 10:20:35

终于。。。。终于。。。。辛苦徐老师啦

许培享 发表于 2024-1-6 23:41:27

学习学习

达拉斯 发表于 2024-2-19 16:25:01

66666666666666666666666666666666666666666
页: [1]
查看完整版本: 【物联网项目】基于行空板的智能视力检测助手