蔡木生
(廣州軟件學院計算機系,廣州 510990)
隨著我國人口老齡化進程的加快[1],老人獨居、空巢等現象越來越普遍,他們的健康監護、情感交流等面臨著不少問題,不在其身邊的子女、親朋或健康監護機構等迫切需要采用信息化手段對老人的起居生活進行監測,而又不能給對方造成心理壓力、侵犯個人隱私。本文提出的居家老人運動行為監測系統就是這方面的嘗試,它通過智能手機傳感器獲取老人運動數據,再應用機器學習算法識別出其行為狀態并上傳到云端服務器中,親友等可通過網絡實時查看老人行為狀態,查詢某一時段的運動統計數據等。本文將介紹該系統的設計原理、總體框架、使用技術、主要模塊的功能實現等內容。
筆者根據前述要求,對于“如何利用智能手機傳感器采集人體運動行為數據?”“怎樣獲取數據并進行分析、處理?”“如何評價分類結果?”等問題進行研究,并得到相應結果,詳情請參見文獻[2]。現概述如下。
居家老人的運動行為主要包括步行、跑步、上樓、下樓、乘電梯上樓、乘電梯下樓和靜止等7種基本動作。由于手機放置在不同位置會對傳感器數據產生較大影響,再細分為:在上衣口袋(或腰包)、褲袋、手或臂包中三類。前4種運動行為與3 種手機放置位置進行組合得到12種類型,加上后3 類運動行為(可認為手機位置對它們無影響),共有15類。
上述運動行為的區分,主要通過運動強度、垂直方向運動兩方面指標差異來實現,即通過智能手機三軸加速度傳感器來獲得x、y、z三個方向的線性加速度以及合成加速度,其中:合成加速度表示運動強度,z方向加速度表示垂直方向上運動變化。文獻[2]以Android 手機為例,設計了APP 程序來收集15 類不同運動行為對應線性加速度傳感器、加速度傳感器及旋轉向量傳感器的數據,再進行適當運算后得到初始數據集。之所以選擇這三類傳感器,主要基于數據的坐標系因素影響和分類準確度高低考慮的。傳感器的采樣頻率設為100 Hz,即采樣間隔為0.01 秒,一次采樣的數據項有12 項,即采樣時間(1 項)、線性加速度acc 及合成加速度(4 項)、acc1 加速度(3 項)、acc2 加速度(3 項)和分類標簽(1項)。
從手機傳感器獲取的是時序數據,前后記錄有關聯,數據量巨大且易受噪聲影響,為此,通常采用滑動窗口技術來處理,即將數據集的記錄按一定規則排序,再依次劃分為一個個窗口,再以窗口為單位計算時域、頻域特征指標,時域特征有平均數、標準差、最大值、最小值等;頻域特征包括經傅里葉變換后得到的加速度幅度、頻率、均值等。經過上述方式加工處理后,數據大為減少,集中趨勢更加明顯,可提高分類準確度。文獻[2]以acc、acc1、acc2三類數據(10 項)為基礎,分別計算它們的均值、標準差指標,對acc、acc_z 兩個重要指標,還分別計算它們的最大值、最小值,再選取通過傅里葉變換得到直流分量、全部頻譜之和、主要頻譜指標(最多為16 項)等頻域特征,特征總數為60 個。當然,窗口大小、步長的確定有要求,通常窗口大小不少于采樣頻率2倍,為方便窗口中記錄進行傅里葉變換,窗口記錄數通常設置為2(kk為自然數)條,步長值通常為窗口大小的50%。
運動行為識別是典型的分類問題,可采用機器學習、深度學習算法來實現,評價算法優劣的主要指標有準確率、計算用時等。經測試,傳統機器學習中集成學習算法(如RandomForest[3]、XGBoost[4]、LightGBM[5]等)有不俗表現,準確度可達到95%以上,且用時少;深度學習算法(以Tensorfolow-GPU2.x為工具,采用Kerass構建全連接神經網絡)表現也不錯,準確率可達到94%左右,不足之處訓練時間較長,但在構建特征向量方面有獨特表現,可節省這方面的開銷。
該系統的工作流程包含數據的采集、傳輸、分析與處理,模型的建立、訓練、評價、應用以及分類結果的保存與發布等系列流程,可分為三個部分,即:手機傳感器數據采集與發送端、云端服務器、信息查看客戶端,如圖1所示。

圖1 運動監測系統的組成
三者的執行順序、功能不同,現說明如下:
主要功能是:通過老人隨身攜帶的智能手機,采集加速度傳感器等數據,并發送到云服務器,但訓練數據采集、分類數據采集兩者有一些差異:
(1)訓練數據采集包括智能手機的線性加速度傳感器、加速度傳感器的x、y、z三個方向數據及旋轉向量傳感器的矩陣數據,再進行適當運算,并加上分類標簽,形成初始數據集,以文件方式存儲在手機存儲卡中,之后傳輸到云端服務器,這是老人運動行為分類模型訓練的基礎性數據;
(2)老人運動數據的采集,通過模型和數據,可對運動行為進行分類。采集數據的內容與(1)類似,不同點是沒有運動分類標簽。為展示系統的強大功能及實用性,還可劃分為實時采集傳輸、采集后以文件方式存儲再批量傳輸兩種模式。
這是系統的核心部分,具備接收數據、處理數據、訓練模型、分類識別、保存結果、發布信息等功能,具體如下:
(1)接收手機端發送過來的數據,包含實時傳輸和以文件方式批量傳輸兩種模式;
(2)數據處理的基本方法,采用滑動窗口技術來處理時序數據,構建對分類結果有重要支撐作用的時域指標、頻域指標,即以窗口為單位,對其中的數據分別計算acc_x、acc_y、acc_z、acc、acc1_x、acc1_y、acc1_z、acc2_x、acc2_y、acc2_z項的均值、標準差指標,對acc、acc_z兩個重要指標,還要分別計算它們的最大值、最小值等時域指標,并選取各自通過傅里葉變換得到直流分量、全部頻譜之和、主要頻譜指標(取前16項)等頻域特征,特征總數達60個;
(3)根據步驟(2)所述方法,對同一測試者同一運動行為的大量連續數據采用滑動窗口技術進行計算,得到包含時域指標、頻域指標的新樣本,加上分類標簽,構建3個集成學習分類模型(即Random Forest、XGBoost、LightGBM)并進行訓練,再將模型參數以文件方式保存在云服務器中;
(4)對老人的運動行為數據按步驟(2)方法進行處理,利用步驟(3)訓練好的模型劃分類別,將結果保存到數據庫中。考慮到可能受通信質量影響,本系統具有實時分類識別、傳輸文件批量分類識別兩種模式;
(5)建立Web 服務器,實時發布老人運動狀態及某一時段內運動行為的統計信息,方便親友查詢。
老人的親友、健康監護機構等登錄系統后可通過網頁瀏覽器查看老人的運動行為狀態,包括:
(1)實時查看老人運動狀態;
(2)查詢某一時段內老人運動行為狀態、各類運動統計信息等。
系統首先要執行的操作是采集、發送、接收傳感器數據及運動標簽,再處理、建模并訓練,之后依據數據利用訓練好的模型對老人的運動行為進行分類識別,分為實時識別、文件存儲批量傳輸識別兩種模式,之所以這樣劃分是基于手機通信質量提出的,信號好,采用實時模式;反之則先將數據存儲在存儲卡,后續再批量傳輸、識別,兩種模式可根據實際需要在手機操作界面切換。兩種模式主要流程如圖2所示。

圖2 兩種工作模式的主要流程
服務器是系統的核心組成部分,其配置高低直接影響系統性能和響應速度,當然也要考慮成本問題。為滿足用戶隨時隨地上傳數據、實時查詢信息資料等要求,故選購云端服務器,而非本地服務器。本系統選購的是華為S6 彈性云服務器,主機規格為2核4 GB,帶寬為5 Mbit/s,硬盤為40 GB,包年使用費用近700元。
服務器安裝的軟件有:操作系統為Windows Server 2018 標準版;在數據處理和可視化、人工智能等方面,Python 有獨特優勢,故安裝Anaconda 3.5、Python 3.8、scikit-learn 0.20 等開發工具,數據庫為MySQL 5.1,Web 服務器則選擇Tomcat9.0。
訓練數據通過操作智能手機APP 來實現,因要求較高,先以文件方式存儲在存儲卡,再發送到服務器進行處理。現以Android 手機為例進行說明:
3.2.1 數據采集
訓練數據項有12 項:時間(精確到ms)、三類加速度數據(10 項)及分類標簽,其中:線性加速度acc1、加速度acc1 的x、y、z三個方向數據可直接得到,合成加速度需要根據公式(1)計算得到:
而acc2 則由acc1 與旋轉矩陣R_mat相乘得到,計算公式如(2)~(4)所示:
其中:i表示不同時點。
分類標簽則通過點擊APP 界面中的單選按鈕來對應,真實運動應與標識內容相一致,如圖3所示。

圖3 訓練數據采集操作界面
傳感器的采樣間隔為0.01 秒,每條記錄包含12 個數據項,用逗號分隔開,存放在csv 文件中,文件名以“labeled_”開頭、后面是提交的時間(精確到ms),容易區分。
3.2.2 手機端文件發送
需要與服務器約定、配合,這里選用Http協議中的HttpURLConnection 類來實現,傳輸文件的名稱不變,可批量傳輸。需注意兩點:①請求方式設為post,Content-Type 的值設“multipart/form-data”,并在其中約定好“分界符”;②文件傳送是費時操作,不允許直接在界面上執行,解決方法是以多線程方式在后臺執行;本系統采用繼承輕量級異步類AsyncTask、重寫doIn-Background()和onPreExecute()等方法來實現。
3.2.3 服務器端接收文件
由一個Servlet來實現,即在doPos(t)方法中接收手機端上傳的多個文件,可借助apache 的fileupload 組件來完成,文件的存放位置可根據后續模型訓練、分類識別的需要來定。
3.2.4 訓練數據的處理
主要內容已在前面提及,現說明兩點:
(1)滑動窗口大小的確定:根據奈奎斯特定理,采樣頻率不少于傳感器取樣頻率的2倍,步長通常為窗口大小50%,還應考慮后續實時輸出運動狀態的間隔,例如傳感器取樣頻率為100 Hz,則窗口記錄大小可取為256,步長值為128,即由256 條記錄(時長2.56 秒)生成一個新樣本,前后窗口的距離為128 條記錄(間隔為1.28秒);
(2)為方便計算,可將數據文件加載成Pandas中的DataFrame對象,通過調用mean()、std()、max()、min()等函數來計算時域指標;可引入scipy.fftpack 包進行傅里葉變換,得到直流分量、全部頻譜之和、主要頻譜等頻率指標。
經檢驗,傳統機器學習中集成學習算法的分類準確度可達95%以上,且用時少,故本系統的分類模型選用RandomForest、XGBoost、LightGBM 三類算法。操作流程是:先安裝好相關庫,再建立模型,之后進行訓練、測試。為方便后續直接使用已訓練好的模型,需要調用joblib.dump()方法以文件方式來保存模型,分類時先用joblib.load()加載模型,再進行分類識別,以提高工作效率。
本系統的一項重要功能是具備對老人運動行為進行實時識別功能,操作界面如圖4 所示。實時識別模式包含數據的發送、接收、處理、識別、保存等一系列操作,具有相當復雜度,前后環節需要密切配合才行,現介紹實現思路。

圖4 運動數據采集 操作界面
(1)手機端、服務器端的數據傳輸采用TCP協議來實現。
以Android 手機為例,數據發送程序是用Java 語言編寫的,而服務器端中數據處理、分類識別程序是用Python 語言編寫的,選用TCP協議可以跨越編程語言不同這一道“坎”。具體做法是:服務器端先創建socket,并綁定好IP和雙方約定端口,等待手機端請求;手機端以服務器端IP、約定端口為參數創建socket,發起連接;服務器響應之后,手機端連續發送運動數據,服務器端則持續接收數據、處理數據。
(2)服務器端中接收數據、處理數據程序的協調問題。
將它們寫成函數,以線程方式運行。有時接收到的數據記錄可能不完整,應舍去。存儲數據的中間容器是一個指定大小(如5120)的list對象(每條記錄包含11 個數據項),數據存入容器的位置、讀取容器中數據位置分別使用int 型變量“寫指針”“讀指針”來指示,當指針指向最后位置的下一個時,指針通過取模運算可復位到0(即第一個位置)。還設置了“寫入記錄總數”和“讀取記錄總數”兩個變量,用來標識已存入、處理的記錄總數。
可將存入數據線程、處理數據線程看作是數據容器的“生產者”和“消費者”,兩者之間存在著資源競賽問題:當存入數據速度太快時,會出現容器中數據未被讀取就被覆蓋的情況;如果處理數據速度太快,則會導致容器中可讀取數據的記錄數不及一個滑動窗口的大小要求,這兩種狀態都應避免,解決辦法是讓運行快的線程進行適當休眼(如0.05秒),如圖5所示。

圖5 接收數據、處理數據線程示圖
(3)分類操作并將結果存入數據庫。
為避免分類結果受隨機因素的影響,分類時分別利用已訓練好的RandomForest、XGBoost、LightGBM 模型進行判別,并用“投票法”來確定結果,服務器終端輸出分類結果如圖6所示(輸出結果不考慮手機的放置位置)。

圖6 服務器終端顯示的分類結果
可以看出:兩個狀態相隔約1.28 秒(步長值),輸出結果要比真實的運動行為滯后2 秒左右,這是采用滑動窗口技術無法避免的。兩種狀態切換時的中間過渡期容易錯分。
將分類結果存入數據庫中,數據處理程序、Web 服務器利用數據庫這一中介來傳遞數據;當數據庫中的類別數據有變化時,通過查詢操作能及時顯現出來,利用數據庫還可以進行統計分析。結果數據表信息如表1所示。

表1 tb_activities表的字段屬性
要讓親友等能夠實時查看、遠程查詢老人運動行為狀態等,可行做法是在云端服務器中安裝Tomcat 等Web 應用服務器,從數據庫中讀取相關記錄處理后再發布,用戶通過電腦、手機等登錄系統后即可隨時隨地查看。
本系統采用dao+pojo+servlet 技術來展示數據,dao 負責數據庫連接、操作等;pojo 包含實體類Activity 和StateCounter;包含4 個servlet 程序,分別實現接收數據文件、查詢某一時段內各時點運動行為狀態、統計某一時段內各種運動行為的時間長度、實時查看運動狀態等功能,項目結構如圖7 所示,系統主頁面如圖8 所示。圖9~圖11 為查詢、統計、實時查看示圖,其中:運動行為時長=該類運動行為記錄數×相鄰窗口間隔時長(如1.28 秒),實時查看功能則采用定時(間隔為1秒)來刷新瀏覽器,從數據庫中獲取最新數據來達成。

圖7 Web項目結構

圖8 運動信息查詢系統主頁面

圖9 某一時段各時點運動行為狀態查詢

圖10 某一時段內各類運動行為統計時長

圖11 某一時段運動行為狀態實時展示
從上不難看出,通過系統三個組成部分的分工協作,親友等能夠通過手機、電腦等實時查看、遠程查詢老人運動行為,實現對老人的起居生活進行監測的目標。
本文根據作者前期對“基于智能手機傳感器的人體行為識別技術”進行研究、實踐的成果,提出了老人運動行為監測系統的設計方案。這是一個具有實用性和中等復雜程度的應用系統,由老人手機端、云端服務器和客戶端三部分組成,實現了從數據的采集、發送、接收、處理,到模型的建立與訓練、分類識別及結果的保存與發布等一系列功能,涵蓋了移動應用開發、數據分析與處理、機器學習、數據庫、Web 應用開發等知識內容。開發難點主要有三個:①平臺、編程語言的多樣性問題;②數據傳輸的可靠性問題;③前后環節的協調性問題。開發過程中探索出選用跨語言、平臺的協議(如HTTP、TCP)、數據庫(如MySQL)及線程同步等方法來化解,取得較好效果。由于老人攜帶手機的習慣、時長因人而異,不能保證手機不離身,這客觀上會影響系統的使用,后續改進方法可考慮將手機變換為攜帶方便的手環等微小設備,確保數據采集、發送的時效性和穩定性。