在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用移動傳感器產(chǎn)生的原始數(shù)據(jù)來識別人類活動

新機器視覺 ? 來源:DeepHub IMBA ? 作者:DeepHub IMBA ? 2022-08-01 10:46 ? 次閱讀

人體活動識別(HAR)是一種使用人工智能AI)從智能手表等活動記錄設(shè)備產(chǎn)生的原始數(shù)據(jù)中識別人類活動的方法。當(dāng)人們執(zhí)行某種動作時,人們佩戴的傳感器(智能手表、手環(huán)、專用設(shè)備等)就會產(chǎn)生信號。這些收集信息的傳感器包括加速度計、陀螺儀和磁力計。人類活動識別有各種各樣的應(yīng)用,從為病人和殘疾人提供幫助到像游戲這樣嚴重依賴于分析運動技能的領(lǐng)域。我們可以將這些人類活動識別技術(shù)大致分為兩類:固定傳感器和移動傳感器。在本文中,我們使用移動傳感器產(chǎn)生的原始數(shù)據(jù)來識別人類活動。 23b68bf8-1142-11ed-ba43-dac502259ad0.png

在本文中,我將使用LSTM (Long - term Memory)和CNN (Convolutional Neural Network)來識別下面的人類活動:

下樓

上樓

跑步

坐著

站立

步行

概述

你可能會考慮為什么我們要使用LSTM-CNN模型而不是基本的機器學(xué)習(xí)方法? 機器學(xué)習(xí)方法在很大程度上依賴于啟發(fā)式手動特征提取人類活動識別任務(wù),而我們這里需要做的是端到端的學(xué)習(xí),簡化了啟發(fā)式手動提取特征的操作。 23cdaf22-1142-11ed-ba43-dac502259ad0.png ? 我將要使用的模型是一個深神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)是LSTM和CNN的組合形成的,并且具有提取活動特征和僅使用模型參數(shù)進行分類的能力。 ? 這里我們使用WISDM數(shù)據(jù)集,總計1.098.209樣本。通過我們的訓(xùn)練,模型的F1得分為0.96,在測試集上,F(xiàn)1得分為0.89。 ?

導(dǎo)入庫

首先,我們將導(dǎo)入我們將需要的所有必要庫。


from pandas import read_csv, unique
import numpy as np
from scipy.interpolate import interp1dfrom scipy.stats import mode
from sklearn.preprocessing import LabelEncoderfrom sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay
from tensorflow import stackfrom tensorflow.keras.utils import to_categoricalfrom keras.models import Sequentialfrom keras.layers import Dense, GlobalAveragePooling1D, BatchNormalization, MaxPool1D, Reshape, Activationfrom keras.layers import Conv1D, LSTMfrom keras.callbacks import ModelCheckpoint, EarlyStoppingimport matplotlib.pyplot as plt%matplotlib inline
import warningswarnings.filterwarnings("ignore")
我們將使用Sklearn,Tensorflow,Keras,Scipy和Numpy來構(gòu)建模型和進行數(shù)據(jù)預(yù)處理。使用PANDAS 進行數(shù)據(jù)加載,使用matplotlib進行數(shù)據(jù)可視化。

數(shù)據(jù)集加載和可視化

WISDM是由個人腰間攜帶的移動設(shè)備上的加速計記錄下來。該數(shù)據(jù)收集是由個人監(jiān)督的可以確保數(shù)據(jù)的質(zhì)量。我們將使用的文件是WISDM_AR_V1.1_RAW.TXT。使用PANDAS,可以將數(shù)據(jù)集加載到DataAframe中,如下面代碼:

def read_data(filepath):  df = read_csv(filepath, header=None, names=['user-id',                                              'activity',                                              'timestamp',                                              'X',                                              'Y',                                              'Z'])  ## removing ';' from last column and converting it to float  df['Z'].replace(regex=True, inplace=True, to_replace=r';', value=r'')  df['Z'] = df['Z'].apply(convert_to_float)  return df
def convert_to_float(x):  try:      return np.float64(x)  except:      return np.nan
df = read_data('Dataset/WISDM_ar_v1.1/WISDM_ar_v1.1_raw.txt')df

23da8120-1142-11ed-ba43-dac502259ad0.png

plt.figure(figsize=(15, 5))
plt.xlabel('Activity Type')plt.ylabel('Training examples')df['activity'].value_counts().plot(kind='bar',                                title='Training examples by Activity Types')plt.show()
plt.figure(figsize=(15, 5))plt.xlabel('User')plt.ylabel('Training examples')df['user-id'].value_counts().plot(kind='bar',                                title='Training examples by user')plt.show()
23fccdfc-1142-11ed-ba43-dac502259ad0.png ? 現(xiàn)在我將收集的三個軸上的加速度計數(shù)據(jù)進行可視化。 ?

def axis_plot(ax, x, y, title):  ax.plot(x, y, 'r')  ax.set_title(title)  ax.xaxis.set_visible(False)  ax.set_ylim([min(y) - np.std(y), max(y) + np.std(y)])  ax.set_xlim([min(x), max(x)])  ax.grid(True)
for activity in df['activity'].unique():  limit = df[df['activity'] == activity][:180]  fig, (ax0, ax1, ax2) = plt.subplots(nrows=3, sharex=True, figsize=(15, 10))  axis_plot(ax0, limit['timestamp'], limit['X'], 'x-axis')  axis_plot(ax1, limit['timestamp'], limit['Y'], 'y-axis')  axis_plot(ax2, limit['timestamp'], limit['Z'], 'z-axis')  plt.subplots_adjust(hspace=0.2)  fig.suptitle(activity)  plt.subplots_adjust(top=0.9)  plt.show()
2411ff1a-1142-11ed-ba43-dac502259ad0.png

數(shù)據(jù)預(yù)處理

數(shù)據(jù)預(yù)處理是一項非常重要的任務(wù),它使我們的模型能夠更好地利用我們的原始數(shù)據(jù)。這里將使用的數(shù)據(jù)預(yù)處理方法有:

標(biāo)簽編碼

線性插值

數(shù)據(jù)分割

歸一化

時間序列分割

獨熱編碼

標(biāo)簽編碼 由于模型不能接受非數(shù)字標(biāo)簽作為輸入,我們將在另一列中添加' activity '列的編碼標(biāo)簽,并將其命名為' activityEncode '。標(biāo)簽被轉(zhuǎn)換成如下所示的數(shù)字標(biāo)簽(這個標(biāo)簽是我們要預(yù)測的結(jié)果標(biāo)簽)

Downstairs [0]

Jogging [1]

Sitting [2]

Standing [3]

Upstairs [4]

Walking [5]



label_encode = LabelEncoder()df['activityEncode'] = label_encode.fit_transform(df['activity'].values.ravel())df
24206654-1142-11ed-ba43-dac502259ad0.png ? 線性插值 利用線性插值可以避免采集過程中出現(xiàn)NaN的數(shù)據(jù)丟失的問題。它將通過插值法填充缺失的值。雖然在這個數(shù)據(jù)集中只有一個NaN值,但為了我們的展示,還是需要實現(xiàn)它。

interpolation_fn = interp1d(df['activityEncode'] ,df['Z'], kind='linear')null_list = df[df['Z'].isnull()].index.tolist()for i in null_list:  y = df['activityEncode'][i]  value = interpolation_fn(y)  df['Z']=df['Z'].fillna(value)  print(value)
數(shù)據(jù)分割 根據(jù)用戶id進行數(shù)據(jù)分割,避免數(shù)據(jù)分割錯誤。我們在訓(xùn)練集中使用id小于或等于27的用戶,其余的在測試集中使用。

df_test = df[df['user-id'] > 27]df_train = df[df['user-id'] <= 27]
歸一化 在訓(xùn)練之前,需要將數(shù)據(jù)特征歸一化到0到1的范圍內(nèi)。我們用的方法是: 2431a946-1142-11ed-ba43-dac502259ad0.png ?

df_train['X'] = (df_train['X']-df_train['X'].min())/(df_train['X'].max()-df_train['X'].min())df_train['Y'] = (df_train['Y']-df_train['Y'].min())/(df_train['Y'].max()-df_train['Y'].min())df_train['Z'] = (df_train['Z']-df_train['Z'].min())/(df_train['Z'].max()-df_train['Z'].min())df_train
24412754-1142-11ed-ba43-dac502259ad0.png ? 時間序列分割 因為我們處理的是時間序列數(shù)據(jù), 所以需要創(chuàng)建一個分割的函數(shù),標(biāo)簽名稱和每個記錄的范圍進行分段。此函數(shù)在x_train和y_train中執(zhí)行特征的分離,將每80個時間段分成一組數(shù)據(jù)。

def segments(df, time_steps, step, label_name):  N_FEATURES = 3  segments = []  labels = []  for i in range(0, len(df) - time_steps, step):      xs = df['X'].values[i:i+time_steps]      ys = df['Y'].values[i:i+time_steps]      zs = df['Z'].values[i:i+time_steps]
      label = mode(df[label_name][i:i+time_steps])[0][0]      segments.append([xs, ys, zs])      labels.append(label)
  reshaped_segments = np.asarray(segments, dtype=np.float32).reshape(-1, time_steps, N_FEATURES)  labels = np.asarray(labels)
  return reshaped_segments, labels
TIME_PERIOD = 80STEP_DISTANCE = 40LABEL = 'activityEncode'x_train, y_train = segments(df_train, TIME_PERIOD, STEP_DISTANCE, LABEL)
這樣,x_train和y_train形狀變?yōu)椋?

print('x_train shape:', x_train.shape)print('Training samples:', x_train.shape[0])print('y_train shape:', y_train.shape)
x_train shape: (20334, 80, 3)Training samples: 20334y_train shape: (20334,)
這里還存儲了一些后面用到的數(shù)據(jù):時間段(time_period),傳感器數(shù)(sensors)和類(num_classes)的數(shù)量。

time_period, sensors = x_train.shape[1], x_train.shape[2]num_classes = label_encode.classes_.sizeprint(list(label_encode.classes_))
['Downstairs', 'Jogging', 'Sitting', 'Standing', 'Upstairs', 'Walking']
最后需要使用Reshape將其轉(zhuǎn)換為列表,作為keras的輸入:

input_shape = time_period * sensorsx_train = x_train.reshape(x_train.shape[0], input_shape)print("Input Shape: ", input_shape)print("Input Data Shape: ", x_train.shape)
Input Shape: 240Input Data Shape: (20334, 240)
最后需要將所有數(shù)據(jù)轉(zhuǎn)換為float32。

x_train = x_train.astype('float32')y_train = y_train.astype('float32')
獨熱編碼 這是數(shù)據(jù)預(yù)處理的最后一步,我們將通過編碼標(biāo)簽并將其存儲到y(tǒng)_train_hot中來執(zhí)行。

y_train_hot = to_categorical(y_train, num_classes)print("y_train shape: ", y_train_hot.shape)y_train shape: (20334, 6)

模型

244ffb62-1142-11ed-ba43-dac502259ad0.png ? 我們使用的模型是一個由8層組成的序列模型。模型前兩層由LSTM組成,每個LSTM具有32個神經(jīng)元,使用的激活函數(shù)為Relu。然后是用于提取空間特征的卷積層。 ? 在兩層的連接處需要改變LSTM輸出維度,因為輸出具有3個維度(樣本數(shù),時間步長,輸入維度),而CNN則需要4維輸入(樣本數(shù),1,時間步長,輸入)。 ? 第一個CNN層具有64個神經(jīng)元,另一個神經(jīng)元有128個神經(jīng)元。在第一和第二CNN層之間,我們有一個最大池層來執(zhí)行下采樣操作。然后是全局平均池(GAP)層將多D特征映射轉(zhuǎn)換為1-D特征向量,因為在此層中不需要參數(shù),所以會減少全局模型參數(shù)。然后是BN層,該層有助于模型的收斂性。 ? 最后一層是模型的輸出層,該輸出層只是具有SoftMax分類器層的6個神經(jīng)元的完全連接的層,該層表示當(dāng)前類的概率。 ?


model = Sequential()model.add(LSTM(32, return_sequences=True, input_shape=(input_shape,1), activation='relu'))model.add(LSTM(32,return_sequences=True, activation='relu'))model.add(Reshape((1, 240, 32)))model.add(Conv1D(filters=64,kernel_size=2, activation='relu', strides=2))model.add(Reshape((120, 64)))model.add(MaxPool1D(pool_size=4, padding='same'))model.add(Conv1D(filters=192, kernel_size=2, activation='relu', strides=1))model.add(Reshape((29, 192)))model.add(GlobalAveragePooling1D())model.add(BatchNormalization(epsilon=1e-06))model.add(Dense(6))model.add(Activation('softmax'))
print(model.summary())
245d6ab8-1142-11ed-ba43-dac502259ad0.png

訓(xùn)練和結(jié)果

經(jīng)過訓(xùn)練,模型給出了98.02%的準(zhǔn)確率和0.0058的損失。訓(xùn)練F1得分為0.96。


model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])history = model.fit(x_train,                  y_train_hot,                  batch_size= 192,                  epochs=100                  )
246a0f16-1142-11ed-ba43-dac502259ad0.png ? 可視化訓(xùn)練的準(zhǔn)確性和損失變化圖。 ?

plt.figure(figsize=(6, 4))plt.plot(history.history['accuracy'], 'r', label='Accuracy of training data')plt.plot(history.history['loss'], 'r--', label='Loss of training data')plt.title('Model Accuracy and Loss')plt.ylabel('Accuracy and Loss')plt.xlabel('Training Epoch')plt.ylim(0)plt.legend()plt.show()
y_pred_train = model.predict(x_train)max_y_pred_train = np.argmax(y_pred_train, axis=1)print(classification_report(y_train, max_y_pred_train))
2475c40a-1142-11ed-ba43-dac502259ad0.png248ad002-1142-11ed-ba43-dac502259ad0.png ? 在測試數(shù)據(jù)集上測試它,但在通過測試集之前,需要對測試集進行相同的預(yù)處理。 ?

df_test['X'] = (df_test['X']-df_test['X'].min())/(df_test['X'].max()-df_test['X'].min())df_test['Y'] = (df_test['Y']-df_test['Y'].min())/(df_test['Y'].max()-df_test['Y'].min())df_test['Z'] = (df_test['Z']-df_test['Z'].min())/(df_test['Z'].max()-df_test['Z'].min())x_test, y_test = segments(df_test,                        TIME_PERIOD,                        STEP_DISTANCE,                        LABEL)
x_test = x_test.reshape(x_test.shape[0], input_shape)x_test = x_test.astype('float32')y_test = y_test.astype('float32')y_test = to_categorical(y_test, num_classes)
在評估我們的測試數(shù)據(jù)集后,得到了89.14%的準(zhǔn)確率和0.4647的損失。F1測試得分為0.89。

score = model.evaluate(x_test, y_test)print("Accuracy:", score[1])print("Loss:", score[0])
249661a6-1142-11ed-ba43-dac502259ad0.png ? 下面繪制混淆矩陣更好地理解對測試數(shù)據(jù)集的預(yù)測。 ?

predictions = model.predict(x_test)predictions = np.argmax(predictions, axis=1)y_test_pred = np.argmax(y_test, axis=1)cm = confusion_matrix(y_test_pred, predictions)cm_disp = ConfusionMatrixDisplay(confusion_matrix= cm)cm_disp.plot()plt.show()
24a7e49e-1142-11ed-ba43-dac502259ad0.png ? 還可以在測試數(shù)據(jù)集上評估的模型的分類報告。 ?

print(classification_report(y_test_pred, predictions))

24bdd196-1142-11ed-ba43-dac502259ad0.png

總結(jié)

LSTM-CNN模型的性能比任何其他機器學(xué)習(xí)模型要好得多。本文的代碼可以在GitHub上找到。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7246

    瀏覽量

    91145
  • 人工智能
    +關(guān)注

    關(guān)注

    1804

    文章

    48783

    瀏覽量

    246888
  • 機器學(xué)習(xí)
    +關(guān)注

    關(guān)注

    66

    文章

    8493

    瀏覽量

    134161
  • 移動傳感器
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    8632
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    使用移動傳感器產(chǎn)生原始數(shù)據(jù)識別人類活動

    我們將使用Sklearn,Tensorflow,Keras,Scipy和Numpy構(gòu)建模型和進行數(shù)據(jù)預(yù)處理。使用PANDAS 進行數(shù)據(jù)加載,使用matplotlib進行數(shù)據(jù)可視化。
    的頭像 發(fā)表于 08-01 10:43 ?4079次閱讀
    使用<b class='flag-5'>移動</b><b class='flag-5'>傳感器</b><b class='flag-5'>產(chǎn)生</b>的<b class='flag-5'>原始數(shù)據(jù)</b><b class='flag-5'>來</b><b class='flag-5'>識別人類</b><b class='flag-5'>活動</b>

    使用ADS1298出的8通道原始數(shù)據(jù)是多少?

    大家使用ADS1298出的8通道原始數(shù)據(jù)是多少,我使用的心電模擬儀送信號,出來的原始數(shù)據(jù)的基線怎么這么高,下位機需要做哪些處理才能把基線拉倒一個固定的位置,希望TI老師或者做過的師傅指導(dǎo)指導(dǎo)。
    發(fā)表于 12-04 08:38

    如何通過波形原始數(shù)據(jù)獲得頻率

    目前在用stm32做一個小型心電儀,實現(xiàn)方法是通過AD轉(zhuǎn)換獲取心電波形的原始數(shù)據(jù),然后進行分析,目前有一個關(guān)鍵的困難,那就是如何在知道這些原始數(shù)據(jù)的情況下,分析出心率,希望大家可以給一些建議和幫助,謝謝
    發(fā)表于 04-21 17:03

    LSM303AGR如何消除原始數(shù)據(jù)失真?

    /components/X-NUCLEO-IKS01A2/ 從傳感器收集數(shù)據(jù)。我以為這個庫是正確的。#magnetometer#lsm303agr#raw-data #distortions以上來自于谷歌翻譯以下
    發(fā)表于 10-11 16:50

    通過DMA1將原始數(shù)據(jù)寫入DAC寄存

    序列,通過DMA1將原始數(shù)據(jù)寫入DAC寄存,同時產(chǎn)生正弦波,AD讀取頻率稍大于DA頻率。將AD讀取寄存中的數(shù)據(jù)以串口發(fā)送至matlab軟
    發(fā)表于 08-17 07:16

    請問STEVAL-IDB011V1板為什么無法通過BLE發(fā)送原始數(shù)據(jù)

    我有 STEVAL-IDB011V1 板,我想通過 BLE 發(fā)送原始數(shù)據(jù)或外部傳感器數(shù)據(jù),我已經(jīng)修改了 BLE 傳感器演示示例。我收到類似無法正確讀取特征的錯誤。
    發(fā)表于 12-12 06:39

    如何將陀螺儀的原始數(shù)據(jù)轉(zhuǎn)換成角速度呢

    我正在使用 lsm6dsl 傳感器。我正在獲取有關(guān)寄存數(shù)據(jù)。如何將原始數(shù)據(jù)轉(zhuǎn)換成角度
    發(fā)表于 12-15 08:19

    如何提取sensortile.box的原始數(shù)據(jù)

    如何提取sensortile.box的原始數(shù)據(jù)
    發(fā)表于 12-30 07:09

    ABPDLNN100MG2A3壓力傳感器如何將原始數(shù)據(jù)轉(zhuǎn)換為毫巴?

    大家好我正在研究來自霍尼韋爾的 ABPDLNN100MG2A3 壓力傳感器,它是一種 i2c 通信,我已經(jīng)通過 i2c 讀取傳感器數(shù)據(jù)并將其保存在兩個變量 a 和 b 中,問題是如何將原始數(shù)據(jù)
    發(fā)表于 02-01 06:23

    MPU6050原始數(shù)據(jù)處理

    我用MPU6050接到小熊派開發(fā)版上讀取到加速度原始數(shù)據(jù),按照網(wǎng)上說的公式轉(zhuǎn)換成加速度,加速度基本上都是在0附近,要大力快速晃動MPU6050傳感器,加速度值才會變化。這是什么原因?
    發(fā)表于 05-17 19:28

    MPU6050的原始數(shù)據(jù)怎么處理能得到向x,y,z方向移動的距離?

    MPU6050的原始數(shù)據(jù)怎么處理能得到向x,y,z方向移動的距離?
    發(fā)表于 11-08 07:41

    基于模板的SAR原始數(shù)據(jù)模擬

    合成孔徑雷達(Synthetic Aperture Radar,SAR)原始數(shù)據(jù)模擬是SAR 模擬的基礎(chǔ),對SAR 系統(tǒng)研究有重要意義。時域模擬方法重現(xiàn)了回波數(shù)據(jù)產(chǎn)生過程,數(shù)據(jù)逼真度
    發(fā)表于 12-19 14:14 ?13次下載

    基于DCT-TCQ的SAR原始數(shù)據(jù)壓縮算法

    該文提出了一種基于離散余弦變換(DCT)和網(wǎng)格編碼量化(TCQ)的SAR 原始數(shù)據(jù)壓縮算法。SAR 原始數(shù)據(jù)可以看成是距離向和方位向的2 維線性調(diào)頻信號的線性平移疊加,因而含有豐富的
    發(fā)表于 06-23 14:29 ?0次下載

    用STM32實現(xiàn)MPU6050原始數(shù)據(jù)的讀取

    STM32+MPU6050讀取加速度計和陀螺儀原始數(shù)據(jù)
    發(fā)表于 12-06 11:51 ?11次下載
    用STM32實現(xiàn)MPU6050<b class='flag-5'>原始數(shù)據(jù)</b>的讀取

    使用通用傳感器API的人類活動識別

    電子發(fā)燒友網(wǎng)站提供《使用通用傳感器API的人類活動識別.zip》資料免費下載
    發(fā)表于 07-04 10:45 ?0次下載
    使用通用<b class='flag-5'>傳感器</b>API的<b class='flag-5'>人類</b><b class='flag-5'>活動</b><b class='flag-5'>識別</b>
    主站蜘蛛池模板: 狠狠亚洲狠狠欧洲2019 | 一级毛片不收费 | 老司机色网| a资源在线观看 | 四虎永久在线精品2022 | 日本三级精品 | 国产精品久久久久影院色老大 | 色婷婷狠狠 | 天天爽夜夜爽精品免费 | 亚洲一区精品中文字幕 | 黄 色 录像成 人播放免费99网 | 性做久久久久久久免费观看 | 国产亚洲卡二卡3卡4卡乱码 | 国产精品入口免费视频 | 午夜老湿影院 | 综合网在线观看 | 午夜国产精品久久久久 | 精品一区二区视频 | 俄罗斯欧美色黄激情 | 特黄一级真人毛片 | bt天堂在线最新版在线 | 四虎影院永久在线 | 性人久久久久 | 免费一级毛片正在播放 | 色婷婷婷婷 | 黄色在线网站视频 | 欧美毛片网站 | 怡红院亚洲怡红院首页 | 国产在线永久视频 | 视频黄色免费 | 狠狠色噜噜狠狠狠狠米奇777 | 亚洲你我色 | 天天爽夜夜春 | 日本成本人三级在线观看2018 | 欧美五月婷婷 | 色花堂国产精品首页第一页 | 操吧 | 国产网站免费观看 | 日本一线a视频免费观看 | 高清色本在线www | 国产精品久久久亚洲第一牛牛 |