簡單的機器學習程序_人體動作識別小程序【機器學習 人工智能】

人體動作識別(Human activity recognition)是健康領域一個熱點問題,它通過加速度計,陀螺儀等傳感器記錄人體運動數據,對人體動作進行識別。最近用微信小程序做了一個動作識別的項目,同時嘗試部署了單片機。首先奉上b站的視頻鏈接,里面詳細介紹了項目的思路和代碼:https://b23.tv/4VRvff

下面我將這個過程分成以下幾部分給大家進行講解:

3345e106ff515490905b78f95cbf2aa6.png

1.數據收集

人體動作的數據是通過手機內部自帶的六軸傳感器收集的,借助于微信小程序的API可以直接調用。

其中蹲起的數據采集頁面如下圖所示:

88acf7000794d56b9f6aff923d313a50.png

右手持手機,點擊“開始讀取”后,開始做深蹲,加速度軸和陀螺儀的實時數據會在數據框內顯示。做完動作后點擊存儲,會將采集的數據上傳到微信自帶的云數據庫,并且關閉加速度計和陀螺儀。

我們將每個動作分為不同的document,每個實驗者作為一個record,在數據庫中進行存儲。每條record由六個軸的六個數組、時間戳數組和用戶的其他信息組成,數組長度約為采樣頻率f*采樣總時間,大約是700。

將數據導出成JSON或csv文件之后便可以開始信號處理了。

2.信號處理

2.1濾波

本部分中的信號處理是通過python中的signal包來完成。

將csv文件導入到python中,將數組長度統一為700。首先我們可以先直觀地感受一下數據:

plt

展示出六個軸的數據,可以看出某些軸的數據是有明顯的周期性的,但是噪聲較多,需要進行濾波處理。

首先使用中值濾波器,這可以通過signal包中的medfilt函數來完成:

#中值濾波

然后是巴特沃斯濾波器,同樣是使用signal包中的函數來完成:

# butterworth濾波器

2.2數據切割

數據經過濾波之后在圖像上的體現是變得更加平滑,濾掉了高頻的噪音,此時我們將數據進行切割:設定一個時間窗口,以及一個overlap的比例,將數據切分成許多小段。這樣就增加了樣本的數量,滿足機器學習需要的數據量。

2.3特征提取

注意,通過微信小程序提取的數據為時間序列,本身不能作為輸入直接喂給機器學習模型,而是需要從中提取一些特征,作為輸入向量。此處我們首先將數據進行了快速傅里葉變換,計算功率譜密度、自相關函數,在此基礎上得到了時間序列的特征向量。將以上功能封裝到一個函數中:

def 

當我們將時域數據轉換到頻域數據上之后,便可以提取特征,使用分類器進行建模。提取特征的常用方法可以是信號的頻率分量以及在此分量上的振幅。

3.模型構建

數據的處理工作完成之后就要開始機器學習的核心部分:模型訓練了。此處我們用python強大的機器學習第三方包:sklearn來完成這一部分的工作。

3.1模型選擇

機器學習模型眾多,如何選擇一個適合自己的呢?在此我們選擇了一些常用的機器學習模型,查看它們在此數據集上的表現。

首先構建一個裝有模型的字典:

dict_classifiers 

然后,我們可以在此字典和每個分類器上迭代:

  • 訓練分類器.fit(X_train, Y_train)
  • 評估分類器在訓練集中的性能.score(X_train, Y_train)
  • 評估分類器在測試集上的性能.score(X_test, Y_test)
  • 記錄訓練分類器所需的時間。
  • 將訓練模型、訓練分數、測試分數和訓練時間保存到字典中。如有必要,此字典可以使用 Python 的pickle模塊保存。
def 

最終結果如下所示:

2db35a74171fb79febb939748ddc99d1.png

可以發現,Gradient Boosting算法效果是最好的,同時訓練時間也最長,高達88秒;表現最不好的是SVM;訓練時間最短的是Native Bayes。

通過模型的訓練與對比,結合我們自身的需求,選擇最為合適的模型進行參數調優。考慮到本項目后期需要部署JS,因此需要在算法的復雜程度和準確率之間取舍,此處我選擇MLP(多層神經網絡)作為最終的模型。

3.2超參數調優

當選擇好合適的模型之后,我們就需要調整模型的參數,使其表現的最好,這就是超參數調優。MLP模型的參數主要有:激活函數、學習率

、隱藏層數、隱藏層神經元個數。通過循環遍歷的方式進行超參數調優:
MLP_params

可以看出,當激活函數relu,alpha=1,隱藏層神經元個數為100時,MLP模型表現是最好的;同時relu函數運算較快,100個神經元大小適中,用來部署JS較為合適。

模型訓練好后,用sklearn自帶的函數輸出權重矩陣和偏置向量,保存到csv文件中,便于后續模型的部署。

對于大部分的機器學習教程而言,模型訓練完之后就算是萬事大吉了,但我們的目標是最終做出一個能用于實際生活的小程序,因此還需要進行模型的部署。

4.模型部署

4.1小程序部署

我們將上面保存好的csv文件復制到小程序的js里,對六軸到的數據進行計算。通過幾次實驗發現,由于安卓系統傳感器采集數據的頻率較低,因此濾波對本數據集的影響不大。同時因為時間前后的相關性,不對序列進行特征提取,直接將序列喂給模型也能達到同樣的準確率。

每隔2秒鐘對數據進行一次分類,js代碼就是根據MLP的原理進行矩陣的乘法,此處不再贅述。

4.2單片機部署

由于近些年來手環的興起,因此我也嘗試部署了單片機。這里模型比較龐大,即便是功能強大的STC8A8K系列的單片機也只有64KB的內存,是遠遠不夠的,需要進行內存擴展。此處給出我的老師提供的一種方案:

117028da5769c5517f4de469b504f588.png

按照上述方案,我使用了洞洞板+單片機的方式進行了連接,洞洞板上是內存擴展芯片,另一塊板子是做其他項目時用到的,這里只用到了它的單片機:

252a5a120c90d1f099a0e540986f1931.png

十分凌亂,大家實驗沒問題之后還是用PCB打樣吧。。。

最終我通過離線的方式,測試準確率達到了70%,實現了單片機的部署。

寫在最后

本文從零開始實現了一個能夠落地的人工智能項目,同時部署到小程序端可以實現離線識別,擺脫了對網絡的依賴。

非常感謝大家的耐心閱讀,我也是一名正在學習中的大二學生,所寫內容如有不當之處歡迎大家批評指正。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python基礎查漏補缺1--算數、字符串與變量

1. math相關函數 函 數描 述ceil(x) 大于或等于x的整數cos(x)  x的余弦 degrees(x)將x的弧度轉換為度數exp(x)e的x次方factorial(n)計算n的階乘(n!),n 必須為整數log(x)以e為底的x的對數log(x,b)以b為底的x的對數pow(x,y)x的y次方radians(s)將x轉換為弧度數sin(x)x的正弦…

CSS布局說——可能是最全的

前言 現在,我們被稱為前端工程師。然而,早年給我們的稱呼卻是頁面仔。或許是職責越來越大,整體的前端井噴式的發展,使我們只關注了js,而疏遠了css和html。 其實,我們可能經常在聊組件化,咋地咋地…

php dingo和jwt,dingo配合laravel、JWT使用

介紹:dingo api包是給laravel和lumen提供的Restful的工具包,它可以與jwt組件一起配合快速的完成用戶認證,同時對于數據和運行過程中所產生的異常能夠捕獲到并且可以做出對應的響應。dingo文檔地址:https://github.com/dingo/api/w…

重啟開源,分享無限--微軟面試187題精選

重啟開源,分享無限--誠邀你加入微軟面試187題的解題中 前期回顧 我想,只要是稍微瀏覽過我博客的朋友都知道,本博客內總體上大致分為兩個部分的內容:1、算法(如十六個經典算法研究系列);2、面試與…

二三星縮水軟件手機版_還在抱怨三星手機不好用?用這些軟件立馬解決

S10系列上市讓三星在國內的銷量有所回暖,但是很多小伙伴拿到手機后都在吐槽三星的軟件工程師不行,比如手勢操作太難用了,不如小米人性化。其實這只是你沒找到秘訣而已,三星手機原來還可以這樣使用?三星有一個官方軟件&…

使用Settings Bundle為程序添加設置項

創建一個Demo來學習一個Setting Bundle為程序存儲設置項 Settings Bundle是在自己的程序中建立的一組文件,利用它可以告訴設備中的Settings程序我們寫的程序有哪些設置項。用戶在Settings程序中設置好相關相關選項后回到我們自己的程序,自己的程序中的對…

Netty自娛自樂之協議棧設計

---恢復內容開始--- 俺工作已經一年又6個月了,想想過的真快,每天寫業務,寫業務,寫業務......。然后就是祈禱著,這次上線不要出現線上bug。繼續這每天無聊的增刪改查,學習學習一下自己感興趣的事&#xff0c…

Linux 狀態命令之磁盤狀態 df du

df df(disk free)命令用于顯示目前在 Linux 系統上的文件系統磁盤使用情況統計。獲取硬盤被占用了多少空間,目前還剩下多少空間等信息,如果沒有文件名被指定,則所有當前被掛載的文件系統的可用空間將被顯示。 默認情…

C++包擴展_利用 MATLAB Coder 將M代碼生成C/C++代碼

利用MATLAB Coder將MATLAB代碼生成C/C代碼?mp.weixin.qq.comMATLAB Coder 可以將MATLAB代碼生成工程中常用的嵌入式或其他硬件平臺的C或者C代碼。使用者可以在MATLAB中進行驗證,然后將生成后的代碼集合到工程中。集合的方式可以是源碼,靜態庫和動態庫。…

linux 進程通信機制,linux的進程通信機制小結

linux向應用軟件提供下列進程間通信手段:####第一類通信方式:只能用于父進程與子進程之間,或者兩個兄遞進程之間。>管道Pipe>信號Signal>跟蹤Trace管道:由父進程來建立。管道兩端的進程各自都將該管道視作一個文件。一個…

看穿面試這件事兒……

報 版權聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章原始出版、作者信息和本聲明。否則將追究法律責任。本文地址: http://blog.csdn.net/jobchanceleo/archive/2007/04/17/1568254.aspx 有個朋友Min十幾年工作經驗&…

阿里云胡曉明:數據智能將為城市生活帶來真正價值

8月30日,在2017全球(上海)人工智能創新峰會-世界人工智能城市規劃大會上,阿里巴巴集團資深副總裁、阿里云總裁胡曉明作《通往智能之路》主題演講,指出數據智能將從交通、醫療、城市治理等方面影響城市生活,…

MySQL 之 information_schema

一、information_schema簡介 在MySQL中,把 information_schema 看作是一個數據庫,確切說是信息數據庫。其中保存著關于MySQL服務器所維護的所有其他數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權 限等。在INFORMA…

【iCore1S 雙核心板_FPGA】例程十二:基于單口RAM的ARM+FPGA數據存取實驗

實驗現象: 核心代碼: module single_port_ram(input CLK_12M,input WR,input RD,input CS0,inout [15:0]DB,input [24:16]A,output FPGA_LEDR,output FPGA_LEDG,output FPGA_LEDB); //----------------------------pll-------------------------------//…

curl post https_Linux命令cURL詳解,并實現文件定時上傳到ftp服務器的程序

前言前段時間群里討論,想實現某個文件定時上傳到服務器要怎么來實現。我記得之前做過 一個項目:為高通的iot模組編寫FOTA功能:實現模組可以遠程下載升級鏡像包,實現版本升級功能。并當時使用的一個超級強大的工具cURL。心血來潮&a…

linux系統頁面緩存,Linux緩存機制之頁緩存

內核采用一種通用的地址空間方案,來建立緩存數據與其來源之間的關聯。1) 內存中的頁分配到每個地址空間。這些頁的內容可以由用戶進程或內核本身使用各式各樣的方法操作。這些數據表示了緩存中的內容;2) 后備存儲器struct backing_dev_info指定了填充地…

十月百度,阿里巴巴,迅雷搜狗最新面試七十題(更新至10.17)

十月百度,阿里巴巴,迅雷搜狗最新面試十一題 引言 當即早已進入10月份,十一過后,招聘,筆試,面試,求職漸趨火熱。而在這一系列過程背后浮出的各大IT公司的筆試/面試題則蘊含著諸多思想與設計&…

python threading 結束線程

python threading 啟動的線程,并沒有提供終止線程的方法,現總結一下在網上找到的方法 1、通過threading.Thread._Thread__stop()結束線程 import time import threading def f():while 1:time.sleep(0.1)print(1)t threading.Thread(targetf) t.start…

快讀模板

快速讀入字符 inline char readc(){ static char buf[1 << 18], *fs, *ft;return (fs ft && (ft (fs buf) fread(buf, 1, 1 << 18, stdin)), fs ft) ? EOF : *fs; } 快速讀入數字 inline int readint(){register char creadc();register int res0;re…

fasttext 文本分類_4種常見的NLP實踐思路【特征提取+分類模型】

越來越多的人選擇參加算法賽事&#xff0c;為了提升項目實踐能力&#xff0c;同時也希望能拿到好的成績增加履歷的豐富度。期望如此美好&#xff0c;現實卻是&#xff1a;看完賽題&#xff0c;一點思路都木有。那么&#xff0c;當我們拿到一個算法賽題后&#xff0c;如何破題&a…