APP下载

基于Android的视力测试仪设计

2021-06-28姚远高永培

电子测试 2021年6期
关键词:测试仪人脸识别人脸

姚远,高永培

(华中师范大学物理科学与技术学院,湖北武汉,430079)

0 引言

近年来中小学生由于课内外用眼过度、用眼不卫生,我国儿童青少年近视率居高不下[1],特别是随着智能手机、平板电脑及电视的普及,新冠疫情下在线学习的大力开展,青少年近视问题越发严重,近视防控迫在眉睫。视力保护首先要测试视力,目前常用的视力检测方法有视力表检测法和验光法。1990年我国将标准对数视力表确定为我国视力检查的法定视力表;验光法是检查光线入射眼球后的聚集情况,以正眼状态为标准,测出受检眼与正视眼间的聚集差异程度,可以初步测出眼球变形情况[2]。目前的视力检测方法存在许多限制,首先验光法只能在医院或眼睛配制中心等具有验光设备的地点进行,花销大且耗费时间;视力表检测法通常需要别人的协助完成,效率较低,且人眼和视力表的距离难以把控,导致测试结果有一定的误差。其次目前的视力检测方法对历史测试数据不能进行网络化保存和管理,无法形成视力变化趋势图,用户无法实时长期直观地了解自己的视力变化情况,因此开展新型视力测试仪的研制具有重要意义和应用价值。

1 视力测试仪架构

基于Android的视力测试仪主要包括测试端APP、手机端APP和云端三部分。测试端由Android平板、USB摄像头和超声波测距模块组成,其中USB摄像头负责采集实时人脸图像,超声波测距模块负责测量测试仪和用户之间的距离;手机端APP是供用户个人测试使用,在连接平板热点后,实现测试距离、字符方向等信息的同步;云端负责存储用户账号信息以及视力测试结果,系统架构如图1所示。

图1 视力测试仪架构

2 基于DLib的人脸识别

人脸识别技术广泛运用于社会生活的身份验证、视频监控、人机交互等不同领域[3]。为保障视力测试数据的有效和可溯,测试仪采用人脸识别技术对用户进行身份认证。人脸识别包含三个关键步骤:人脸检测、特征提取和特征比对,本文使用Opencv+Dlib来实现人脸识别,Opencv是一个图像处理和计算机视觉的开源库,主要负责图片的加载和灰度化等预处理操作;Dlib是一个包含机器学习算法的开源工具包,承担主要的人脸识别工作。

人脸检测是在一帧图像中确定是否存在人脸,如果存在则给出人脸的个数、大小、位置等信息[4]。Opencv和Dlib自身都带有人脸的分类器,我们可以使用它们方便快速地实现人脸检测,也可以自己收集数据集训练自己的分类器。Opencv的人脸分类器是使用经典的基于Harr特征的AdaBoost人脸检测算法来训练的,它的核心思想是首先由扩展的Harr特征生成一系列的弱分类器,然后将这些弱分类器组合成一个强分类器,最后再通过级联的方式将多个强分类器连接起来。Dlib的人脸检测器是使用基于HOG特征和svm的线性分类器进行训练得到,HOG特征是一种局部特征描述符,通过计算和统计局部区域上的梯度方向直方图得到图像的特征信息,svm(支持向量机)是一种寻求最优分类线的机器学习方法。笔者对Opencv和Dlib自带的人脸分类器进行了测试,Dlib人脸识别的速度比Opencv稍快,且效果较Opencv好,因此使用Dlib进行人脸的检测。

人脸特征提取是在一张人脸中提取表征面部信息的特征点。Dlib中有68个人脸关键点的库存文件,截取到人脸区域后,使用此模型提取目标人脸的68个特征点,之后Dlib会将68个特征点处理为51个特征点进行人脸对齐,其中对齐 函 数 get_face_chip_details(shape,size,padding)中有两个关键参数:size指定对齐后的人脸大小,padding指定人脸对齐区域的比例,其值越高对齐后的人脸区域越收敛,本文分别设置为160和0.25。

完成人脸特征点的提取和人脸对齐后,接下来进行特征点的比对来找出最匹配的图像。ResNet是一种卷积神经网络,它引入了残差网络结构,解决了传统CNN随着网络层数加深出现的梯度爆炸问题,使网络的深度可以不断增加,从而提高模型的精准度[5]。本文使用ResNet34神经网络算法将特征点转变为128维向量,然后计算与数据库中样本人脸的128维向量之间的欧式距离,计算公式为:

式中x1i,x2i是N维欧式空间的两点。欧式距离越小,两张人脸的相似度越高,当小于设定的阈值时,认为是同一张人脸,本文设定为0.5。

本文使用C++语言实现上述算法,然后使用Android ndk工具将C++代码编译成动态库,将动态库引入到Androird工程中供其调用。

3 超声波测距

视力测试需要测量人眼到字符的相对距离,超声波测距实现简单、精度较高,是目前常用的测距方式之一[6],原理为:发射器向某一方向发射频率在40KHz的超声波,发射出去的超声波在介质中传播,当遇到障碍物时返回,接收器接收返回的超声波,通过测得超声波往返时间t,再根据超声波在介质中的传播速率c就可以计算出彼此之间的距离,计算公式为:

超声波测距模块由stm32单片机和HC-SR04超声波模块组成,HC-SR04有四个引脚:Vcc、Gnd、Trig、Echo,分别与单片机的Vcc、Gnd、两个IO口相连,工作原理为:首先单片机给HC-SR04的Trig口一个10us以上的高电平,HCSR04自动向前方发送8个40KHz的方波,然后自动检测是否有信号返回;如果有信号返回,HC-SR04的Echo口会向单片机输出一个高电平,高电平的持续时间即为超声波的往返时间,单片机根据式(2)计算距离,通过串口将结果传输到Andorid平板的串口。

4 视力测试仪设计与测试

测试端的硬件配置为:①Android平板:RK PX30,CPU主频 1.3GHz,Android 8.0系 统,4路 TTL 3.3V电平串口,2路USB 口;②USB摄像头:CAM5031-V5,分辨率为1280*720;③超声波模块:HC-SR04;④单片机:stm32f103RBT6。

测试端和手机端APP的开发平台为Android Studio,软件环境为JDK 1.8,Android SDK 8.0和Android ndk-r16。

4.1 测试端app设计

测试端app主界面分为四个功能区域:姓名和距离显示区、人脸识别区、注册和历史记录以及测试字符显示区,如图2所示。人脸识别区首先显示预览的图像,如果有人脸则框出人脸,再跟数据库存储的特征信息进行比对,如果比对成功,则在右上角显示匹配的人像,并显示姓名;如果比对失败,说明人脸还未注册,则在下面的注册区输入姓名进行注册。

图2 测试端App界面

4.2 手机端App设计

手机端App的功能模块包括用户注册、登录模块、视力测试模块以及用户信息模块。注册和登录模块负责用户账号的注册和登录;视力测试模块供用户视力测试使用;用户信息模块负责显示用户账号信息、修改密码和查询视力测试记录。由于本系统需要展现视力的变化情况,故采用折线图的方式。登录界面、视力测试界面和历史记录界面如图3所示。

图3 手机端App界面

在视力测试界面中,用户根据显示的距离调整到3m的测试位置,在上面选择自己所看到的测试字符的方向。由于标准对数视力表制定的视力值的范围为4.0-5.3,选取中间值4.7对应的字符作为平板初始显示的字符。一个视力值对应的字符会显示四次,方向随机,用户在手机上选择看到的方向。如果选对3次或以上,认为用户视力至少达到了此值,则将视力值提高一个水平,直到用户选对的次数少于3次,测试结束;如果选对少于3次,则将视力值降低一个水平,直到用户选对的次数在3次或以上,测试结束。

4.3 手机端APP和测试端APP的通信

测试过程中需要实现手机端APP和测试端APP的距离和测试字符等信息的同步,本文通过平板的热点实现两者之间的通信。测试前手机连接上平板的热点,手机APP通过WifiManager类的getConnectionInfo()方法和getDhcpInfo()方法分别获得本机和平板的IP地址,然后使用Socket套接字进行连接,连接成功后通过Socket类的getInputStream()和getOutputStream()获得输入流和输出流后新建线程进行数据传输。

4.4 云端设计实现

云端作为系统的后台,使用阿里云服务器,采用SSM(Spring+Spring MVC+Mybatis)设计模式,项目部署在Tomcat服务器上。SSM开发模式将系统划分为表示层、业务层和数据持久层[7],逻辑清晰,开发和维护方便,是目前企业中常用的开发模式。表示层负责接收APP发送的请求和向APP返回响应;业务层负责进行相应的业务逻辑处理;数据持久层负责和mysql数据库进行交互,对视力测试数据进行持久化操作。APP和云端的数据交互通过get/post网络请求实现,APP中使用java.net包中的HttpURLConnection类向服务器发送请求,数据以json格式进行封装,使用fastjson库封装和解析。

4.5 测试数据存储

每次视力测试的结果都应该保存起来,方便人们掌握视力的变化情况。Andorid系统常用的数据存储方式有Share Preferences存储、文件存储、SQLite数据库存储和网络存储等[8]。在开发过程中,要根据实际应用程序的特点合理地选择存储方式。考虑到本系统需要对历史记录频繁地进行插入和查询操作,因此选择SqLite3数据库将视力测试结果存储到本地,并通过网络传输发送至云端进行存储。测试记录表tb_records如表1所示。

表1 tb_records

uname varchar NOT NULL 姓名time date NOT NULL 时间result float NOT NULL 测试结果

4.6 测试

用户在手机上安装测试app后再连接上测试android平板的热点进行通信,人脸识别的距离大概为0.5米,视力测试的测试距离为3m,根据对数视力表的标准等比例调节测试字符大小,测试的主要流程如图4所示。

图4 视力测试流程图

本文选取了6名测试者进行系统的测试,均正确识别出了测试人员,人脸识别平均耗时1.3s,平均总用时35s,测试结果表明,系统使用方便,运行稳定,与传统的视力测试相比,节省了人力、时间等资源。

5 结论

本文设计了一种基于Android平台的视力测试仪,介绍了人脸识别和超声波测距的实现方法、App的设计以及视力测试的流程,借助该系统用户可以个人自主完成身份认证、视力测试以及测试结果的追朔。系统使用方便、界面友好,未来可应用到家庭、学校及医院,实时跟踪视力变化,对推动视力保护有一定的积极意义。

猜你喜欢

测试仪人脸识别人脸
SDL Atlas推出第二代HydroPro耐静水压测试仪
使用快速水洗色牢度测试仪检测超细纤维脱落
人脸识别 等
有特点的人脸
揭开人脸识别的神秘面纱
便携式转辙机转换力测试仪
三国漫——人脸解锁
基于VB与ATEQ测试仪串行通信
基于类独立核稀疏表示的鲁棒人脸识别
马面部与人脸相似度惊人