2025年4月23日 星期三

IMU 6軸數據進行人體姿態分類的應用案例使用 RNN( LSTM)

 典型的 IMU 6軸數據進行人體姿態分類的應用案例。

若你希望使用 RNN(尤其是 LSTM) 進行分類,我可以給你一份完整的 PyTorch 範例,

包含以下流程:


✅ 假設條件

  • 資料來源:6軸 IMU(3軸加速度 + 3軸陀螺儀)

  • 資料格式:每筆樣本是一段時間內的連續序列(例如 100 個時間點),每個時間點有 6 維資料

  • 分類標籤{0: '靜止', 1: '站立', 2: '行走', 3: '坐下'}


📦 第一步:準備資料

python
import numpy as np import torch from torch.utils.data import Dataset, DataLoader class IMUDataset(Dataset): def __init__(self, X, y): self.X = torch.tensor(X, dtype=torch.float32) self.y = torch.tensor(y, dtype=torch.long) def __len__(self): return len(self.X) def __getitem__(self, idx): return self.X[idx], self.y[idx] # 模擬資料:每筆資料是長度為 100 的序列,每個時間點有 6 維 IMU 資料 num_samples = 2000 sequence_length = 100 input_dim = 6 num_classes = 4 # 模擬 IMU 資料和標籤 X_data = np.random.randn(num_samples, sequence_length, input_dim) y_data = np.random.randint(0, num_classes, size=(num_samples,)) # 分割訓練與驗證 train_size = int(0.8 * num_samples) train_dataset = IMUDataset(X_data[:train_size], y_data[:train_size]) val_dataset = IMUDataset(X_data[train_size:], y_data[train_size:]) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=64)

🔁 第二步:建立 LSTM 模型

python
import torch.nn as nn class IMULSTMClassifier(nn.Module): def __init__(self, input_dim, hidden_dim, num_layers, num_classes): super(IMULSTMClassifier, self).__init__() self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, num_classes) def forward(self, x): out, _ = self.lstm(x) # 取最後時間步的輸出作為分類依據 out = out[:, -1, :] out = self.fc(out) return out

🧠 第三步:訓練模型

python
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = IMULSTMClassifier(input_dim=6, hidden_dim=64, num_layers=2, num_classes=4).to(device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) for epoch in range(20): model.train() total_loss = 0 for X_batch, y_batch in train_loader: X_batch, y_batch = X_batch.to(device), y_batch.to(device) optimizer.zero_grad() y_pred = model(X_batch) loss = criterion(y_pred, y_batch) loss.backward() optimizer.step() total_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {total_loss:.4f}")

🧪 第四步:驗證準確度

python
model.eval() correct = 0 total = 0 with torch.no_grad(): for X_batch, y_batch in val_loader: X_batch, y_batch = X_batch.to(device), y_batch.to(device) outputs = model(X_batch) _, predicted = torch.max(outputs.data, 1) total += y_batch.size(0) correct += (predicted == y_batch).sum().item() print(f"Validation Accuracy: {100 * correct / total:.2f}%")

📌 備註

  • 可進一步加入標準化(StandardScaler)或移動平均平滑數據。

  • 若你有 CSV/IMU 原始檔,我也可以幫你做資料前處理與轉換成 RNN dataset。

  • 此為 2K7(大概是說 PyTorch 2.0 + Python 3.7/3.8 的縮寫?),程式碼皆相容。



 

沒有留言:

張貼留言