項目來源于我們的“實驗設計與統計基礎”課程的大作業。
主要實作目的是
用微信小程式實作至少四個HIIT動作的識别和計數。
話不多少,先
奉上視訊(視訊裡已經包括了
如何使用以及整個的實作過程,如果看完之後還想了解詳細内容可以繼續看下面的文字)
知乎視訊www.zhihu.com
----------------------------------------分割線------------------------------------------------
項目是從零開始的,也就是說預先我們沒有資料(
資料是自己用微信小程式進行采集的)。
本項目功能:用微信小程式實作HIIT動作(深蹲、開合跳、高擡腿、滑雪跳)的識别與計數,可将資料存儲進雲資料庫。
具體使用方法:- 進入小程式。點選“姿态識别”,進入“個人資訊填寫”頁面,測試者可以填寫姓名、年齡、身高、體重、測試環境等資訊,以便于更好地在資料庫中進行記錄。
- 資訊填寫完畢後,進入“姿态識别”界面。
- 點選“開始識别”按鈕後,開始進行姿态識别。說明:點選“開始識别”按鈕後,會聽到一段提示音——“3,12,1開始”提示音結束後開始做動作,一直做到聽到語音播報,之後再進行下一個動作。
- 30s 時間到後,會響起“時間到,識别結束”提示音,此時識别結束。界面顯示每個動作的個數。
- 點選“存儲資料”,會将個人填寫的資訊以及識别的動作及個數存入資料庫對應的集合——“accelerometer”中。
:使用手機三軸傳感器;
模型搭建:以BP神經網絡為基礎,使用python進行訓練,最終訓練準确率為97%;
微信小程式實作:JS重寫模型結構,實作HIIT動作的離線識别。
一、資料收集
利用微信小程式,使用手機自帶的加速度傳感器,采集10s 動作資料,每個動作重複采集50次。
小程式的資料采集頁面:squat、jumpingJack、highStep、skiJump
1.小程式使用方法
- 點選“開始讀取”,程式開始計時,進度條進入10s 程序。使用者開始重複做對應的動作。
- 10s 時間到時,手機會發出“滴滴——”聲進行提示。
- 點選“存儲資料”,對應動作10s 内采集的資料會被存入對應名稱的collection裡面。
2.JS頁面代碼講解
四個采集頁面的代碼類似,下面以 squat 頁面為例進行介紹。
1)調用手機的加速度傳感器
//在 onload 函數裡 打開加速度傳感器監聽
2)存儲采集的資料到雲資料庫
//配置雲資料庫以及存儲到的collection
3)“時間到”聲音的配置
//配置音頻
二、資料處理與模型訓練
将存儲進雲資料庫的四個動作的資料導出為“csv”格式檔案。使用python進行資料處理和模型訓練。
1.資料處理
1)資料預處理思路
參考文獻:
[WISDM:Cell Phone-Based Biometric Identification]www.cis.fordham.edu
基于原始加速度計讀數,總共生成了40個次元的feature。下面介紹這40個要素,并在方括号中注明了每種要素類型生成的要素數量:
- 平均值[3] :平均加速度值(每個軸)
- 标準偏差[3] :标準偏差(每個軸)
- 平均絕對差[3] :在200個讀數中,每個絕對值之間的平均絕對差 ED和這200個值的平均值(每個軸)
- 平均結果加速度[1] :ED的每個軸上值的平方和的平方根為√(xi2 + yi2 + zi2 )
- Bined Distribution [30] :我們确定每個軸的值範圍(最大-最小),除以将該範圍分為10個大小相等的容器,然後記錄落入每個容器中的200個值的分數。
2)資料預處理部分的python代碼講解
①導入必要的包
#導入必要的包
②加載csv資料,并将每行的資料轉化為一個數組
# Load a CSV file
③将資料轉化為40個feature
#平均值
③将資料進行處理,轉化為40個feature,并存儲為一個新的csv檔案
output
2.模型訓練
使用BP神經網絡對模型進行訓練,目的是輸出訓練好的神經網絡,
可以直接用在小程式“姿态識别”界面的的JS頁面中,當做一個參數來做離線識别。1)資料标準化
①導入必要的包
import
②加載CSV檔案,并将資料轉化成浮點數,标簽值轉化為整數
# Load a CSV file
③擷取每一維資料的最大最小值,進行資料的标準化處理,将标準化後的資料存儲為一個新的CSV檔案
注:每一維資料的最大最小值需要存儲下來,以便于後期可以直接用在小程式“姿态識别”界面的的JS頁面中,當做一個參數來對實時收集的三軸加速度進行标準化處理。
# Find the min and max values for each column
④運作程式
# Test Backprop on Seeds dataset
得到的最大最小值集合(minmax_set)為: minmax_set
2)BP神經網絡 模型訓練
①導入必要的包
import
②模型訓練
# Initialize a network
學習率為0.05,循環500次,選取隐藏層14個進行訓練 :
error下降至:0.060
network為:
network
③模型準确率驗證
采用十倍交叉驗證法對該模型的準确率進行驗證,可以看到效果是非常好的。
三、小程式實作動作識别與計數
利用微信小程式,使用手機自帶的加速度傳感器,在30s 内随機做上述四個動作,小程式會自動進行識别并進行識别動作的語音播報;30s 結束後,小程式頁面顯示每個動作的個數,并可以将資料存入雲資料庫。
小程式的姿态識别頁面:recog
1.小程式使用方法
- 點選“姿态識别”,進入“個人資訊填寫”頁面,測試者可以填寫姓名、年齡、身高、體重、測試環境等資訊,以便于更好地在資料庫中進行記錄。
- 資訊填寫完畢後,進入“姿态識别”界面。
- 點選“開始識别”按鈕後,開始進行姿态識别。
說明:
點選“開始識别”按鈕後,會聽到一段提示音——“3,12,1開始”
提示音結束後開始做動作,一直做到聽到語音播報,之後再進行下一個動作。
- 30s 時間到後,會響起“時間到,識别結束”提示音,此時識别結束。界面顯示每個動作的個數。
- 點選“存儲資料”,會将個人填寫的資訊以及識别的動作及個數存入資料庫“accelerometer”中。
2.JS頁面代碼講解
1)資料準備
放入預先在python中訓練得到的 minmax_set 和 network
2)手機三軸加速度計的調用
打開和停止加速度傳感器監聽代碼 同上。
//設定一個定時器,每6s打開一次加速度計的監聽
3)提示音配置
同上。
4)動作識别——Judgement、Try、Predict函數
主要思路為将python模型訓練中的“資料标準化”部分代碼進行JS重寫,使其能在小程式中直接運作。
Judgement
5)動作計數——count函數
采用差分法選擇峰值,利用峰值進行動作計數。
//傳入參數(原始的三軸加速度資料)
整體的介紹就這麼多,主要的實作代碼也都在上面列出。
附上github連結:https://github.com/Liu-Rundi-SDUWH/HIIT_HAR
請大家不吝賜教。