iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
AI & Data

感知你的動作與情緒:深度學習在人機互動的應用系列 第 7

Day 7 | 手勢識別(1):資料集與預處理-MediaPipe + OpenCV 入門

  • 分享至 

  • xImage
  •  

前言

手勢,是人與人訊息傳達時最自然的肢體語言之一。當這些動作能被電腦正確解讀,就能開啟更多元的互動形式,例如虛擬手語翻譯、非接觸式控制、甚至是情緒與意圖識別。

本篇文章將從資料的角度出發,說明如何準備一套適合訓練手勢識別模型的資料。搭配 MediaPipe 提取關鍵點座標、OpenCV 進行視覺化,我們將一步步完成從影像到訓練數據的轉換。


資料來源

我們使用的資料集來自 Kaggle 的 Sign Language MNIST,其特點如下:

  • 每張影像大小為 28x28 灰階圖
  • 包含英文字母 A–Y(不含 J和Z,因為 J 和 Z 涉及動態移動軌跡,無法以單張靜態影像表示,故未包含於此資料集中。)
  • 每類約有數千筆影像
  • 已標記對應手勢字母標籤

雖然該資料集來源為靜態圖片,但它非常適合用來做為 CNN 模型的入門資料。若日後要擴展到動態識別(J和Z)或即時鏡頭互動,亦可搭配 MediaPipe 建立自有資料集。


整體流程架構

本次任務包含以下步驟:

  1. 載入 Kaggle 資料集並可視化
  2. 準備訓練資料(影像 + 標籤)
  3. 預處理:標準化與 reshape
  4. 選擇模型輸入格式(適合 CNN)
  5. 可視化每類手勢標籤分佈

載入並可視化資料集

資料集包含兩個 CSV 檔案:

  • sign_mnist_train.csv:訓練資料
  • sign_mnist_test.csv:測試資料
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 讀取資料
df = pd.read_csv("sign_mnist_train.csv")
labels = df['label'].values
images = df.drop('label', axis=1).values.reshape(-1, 28, 28)

# 顯示前 10 個標籤影像
plt.figure(figsize=(10, 2))
for i in range(10):
    plt.subplot(1, 10, i+1)
    plt.imshow(images[i], cmap='gray')
    plt.title(chr(labels[i] + 65))  # 轉換為英文字母
    plt.axis('off')
plt.suptitle("Sign Language MNIST Samples")
plt.show()

資料標準化與調整格式

CNN 通常需要這段格式:(Channel, Height, Width),所以我們加入 channel 維度,並將畫素值標準化為 0~1:

import torch
from torch.utils.data import TensorDataset, DataLoader

# Normalize and reshape
images = images / 255.0
images = images[:, np.newaxis, :, :]  # 加上 Channel 維度

# 轉為 PyTorch tensor
X = torch.tensor(images, dtype=torch.float32)
y = torch.tensor(labels, dtype=torch.long)

# 建立 DataLoader
dataset = TensorDataset(X, y)
train_loader = DataLoader(dataset, batch_size=64, shuffle=True)

類別分佈視覺化

看看每個類別的標籤分佈,了解是否均衡:

import seaborn as sns

plt.figure(figsize=(10, 4))
sns.countplot(x=labels)
plt.title("Class Distribution")
plt.xlabel("Class (A-Z, excluding J)")
plt.ylabel("Sample Count")
plt.show()

後續展望:加入 MediaPipe 與鏡頭互動

雖然這個資料集是靜態圖片,但如果想把模型應用到鏡頭輸入中,我們可以使用 MediaPipe Hands 即時偵測手部關鍵點,再透過 OpenCV 擷取手勢圖像進行視覺化與分類。

後續篇章將介紹:

  • 如何使用 MediaPipe 採集鏡頭資料
  • 建立自己的手勢資料集
  • 實現即時辨識與互動

結論

資料是訓練模型的根基,而手勢識別的第一步,就是對資料的理解與整理。無論是使用公開資料集,還是日後搭配鏡頭收集自有資料,這一篇希望能幫助你打好資料準備的基礎功。


上一篇
Day 6 | 語音辨識控制開關燈實作:用 CNN 讓燈光聽懂你的話
下一篇
Day 8 | 手勢識別 (2):用 CNN 打造你的第一個手勢辨識模型
系列文
感知你的動作與情緒:深度學習在人機互動的應用8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言