姚遠,高永培
(華中師范大學物理科學與技術學院,湖北武漢,430079)
近年來中小學生由于課內外用眼過度、用眼不衛生,我國兒童青少年近視率居高不下[1],特別是隨著智能手機、平板電腦及電視的普及,新冠疫情下在線學習的大力開展,青少年近視問題越發嚴重,近視防控迫在眉睫。視力保護首先要測試視力,目前常用的視力檢測方法有視力表檢測法和驗光法。1990年我國將標準對數視力表確定為我國視力檢查的法定視力表;驗光法是檢查光線入射眼球后的聚集情況,以正眼狀態為標準,測出受檢眼與正視眼間的聚集差異程度,可以初步測出眼球變形情況[2]。目前的視力檢測方法存在許多限制,首先驗光法只能在醫院或眼睛配制中心等具有驗光設備的地點進行,花銷大且耗費時間;視力表檢測法通常需要別人的協助完成,效率較低,且人眼和視力表的距離難以把控,導致測試結果有一定的誤差。其次目前的視力檢測方法對歷史測試數據不能進行網絡化保存和管理,無法形成視力變化趨勢圖,用戶無法實時長期直觀地了解自己的視力變化情況,因此開展新型視力測試儀的研制具有重要意義和應用價值。
基于Android的視力測試儀主要包括測試端APP、手機端APP和云端三部分。測試端由Android平板、USB攝像頭和超聲波測距模塊組成,其中USB攝像頭負責采集實時人臉圖像,超聲波測距模塊負責測量測試儀和用戶之間的距離;手機端APP是供用戶個人測試使用,在連接平板熱點后,實現測試距離、字符方向等信息的同步;云端負責存儲用戶賬號信息以及視力測試結果,系統架構如圖1所示。

圖1 視力測試儀架構
人臉識別技術廣泛運用于社會生活的身份驗證、視頻監控、人機交互等不同領域[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工程中供其調用。
視力測試需要測量人眼到字符的相對距離,超聲波測距實現簡單、精度較高,是目前常用的測距方式之一[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平板的串口。
測試端的硬件配置為:①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。
測試端app主界面分為四個功能區域:姓名和距離顯示區、人臉識別區、注冊和歷史記錄以及測試字符顯示區,如圖2所示。人臉識別區首先顯示預覽的圖像,如果有人臉則框出人臉,再跟數據庫存儲的特征信息進行比對,如果比對成功,則在右上角顯示匹配的人像,并顯示姓名;如果比對失敗,說明人臉還未注冊,則在下面的注冊區輸入姓名進行注冊。

圖2 測試端App界面
手機端App的功能模塊包括用戶注冊、登錄模塊、視力測試模塊以及用戶信息模塊。注冊和登錄模塊負責用戶賬號的注冊和登錄;視力測試模塊供用戶視力測試使用;用戶信息模塊負責顯示用戶賬號信息、修改密碼和查詢視力測試記錄。由于本系統需要展現視力的變化情況,故采用折線圖的方式。登錄界面、視力測試界面和歷史記錄界面如圖3所示。

圖3 手機端App界面
在視力測試界面中,用戶根據顯示的距離調整到3m的測試位置,在上面選擇自己所看到的測試字符的方向。由于標準對數視力表制定的視力值的范圍為4.0-5.3,選取中間值4.7對應的字符作為平板初始顯示的字符。一個視力值對應的字符會顯示四次,方向隨機,用戶在手機上選擇看到的方向。如果選對3次或以上,認為用戶視力至少達到了此值,則將視力值提高一個水平,直到用戶選對的次數少于3次,測試結束;如果選對少于3次,則將視力值降低一個水平,直到用戶選對的次數在3次或以上,測試結束。
測試過程中需要實現手機端APP和測試端APP的距離和測試字符等信息的同步,本文通過平板的熱點實現兩者之間的通信。測試前手機連接上平板的熱點,手機APP通過WifiManager類的getConnectionInfo()方法和getDhcpInfo()方法分別獲得本機和平板的IP地址,然后使用Socket套接字進行連接,連接成功后通過Socket類的getInputStream()和getOutputStream()獲得輸入流和輸出流后新建線程進行數據傳輸。
云端作為系統的后臺,使用阿里云服務器,采用SSM(Spring+Spring MVC+Mybatis)設計模式,項目部署在Tomcat服務器上。SSM開發模式將系統劃分為表示層、業務層和數據持久層[7],邏輯清晰,開發和維護方便,是目前企業中常用的開發模式。表示層負責接收APP發送的請求和向APP返回響應;業務層負責進行相應的業務邏輯處理;數據持久層負責和mysql數據庫進行交互,對視力測試數據進行持久化操作。APP和云端的數據交互通過get/post網絡請求實現,APP中使用java.net包中的HttpURLConnection類向服務器發送請求,數據以json格式進行封裝,使用fastjson庫封裝和解析。
每次視力測試的結果都應該保存起來,方便人們掌握視力的變化情況。Andorid系統常用的數據存儲方式有Share Preferences存儲、文件存儲、SQLite數據庫存儲和網絡存儲等[8]。在開發過程中,要根據實際應用程序的特點合理地選擇存儲方式??紤]到本系統需要對歷史記錄頻繁地進行插入和查詢操作,因此選擇SqLite3數據庫將視力測試結果存儲到本地,并通過網絡傳輸發送至云端進行存儲。測試記錄表tb_records如表1所示。

表1 tb_records

uname varchar NOT NULL 姓名time date NOT NULL 時間result float NOT NULL 測試結果
用戶在手機上安裝測試app后再連接上測試android平板的熱點進行通信,人臉識別的距離大概為0.5米,視力測試的測試距離為3m,根據對數視力表的標準等比例調節測試字符大小,測試的主要流程如圖4所示。

圖4 視力測試流程圖
本文選取了6名測試者進行系統的測試,均正確識別出了測試人員,人臉識別平均耗時1.3s,平均總用時35s,測試結果表明,系統使用方便,運行穩定,與傳統的視力測試相比,節省了人力、時間等資源。
本文設計了一種基于Android平臺的視力測試儀,介紹了人臉識別和超聲波測距的實現方法、App的設計以及視力測試的流程,借助該系統用戶可以個人自主完成身份認證、視力測試以及測試結果的追朔。系統使用方便、界面友好,未來可應用到家庭、學校及醫院,實時跟蹤視力變化,對推動視力保護有一定的積極意義。