引言
手勢辨識(Hand Gesture Recognition)是一種日益實用的人機介面(Human-Machine Interaction,HMI)技術,可透過多種技術實現,包括穿戴式感測器、雷達、飛行時間(Time-of-Flight,ToF)感測器以及視覺系統等。RGB 攝影機或許是最具潛力的方案,因為它能辨識最廣泛、最細微且最複雜的手勢動作。然而,RGB 影像所產生的大量高維度資料,也使手勢解析成為一項極具挑戰性的問題。
過去已有許多影像處理技術被用來從這些資料中偵測手勢,而近年人工智慧(AI)的發展則讓這項任務變得更加可行。此外,隨著能夠執行愈來愈複雜 AI 模型的邊緣裝置問世,手勢也逐漸成為日常設備的輸入方式,例如恆溫器、資訊娛樂系統、自動販賣機等。
遊戲控制器硬體架構
為了展示 AI 前處理技術如何有效提升基於 RGB 攝影機的視覺式手勢辨識能力,這裡建立了一套互動式展示系統(圖 1)。在此系統中,多款運行於 Raspberry Pi 上的遊戲可透過手勢啟動與控制。
為什麼選擇 STM32N6 作為邊緣 AI 平台?
此遊戲控制器以 STMicroelectronics 的 STM32N6 微控制器(MCU)為核心。STM32N6 是 ST 首款整合神經網路處理器(Neural Processing Unit,NPU)的產品,可讓較大型的 AI 模型,例如電腦視覺與音訊處理模型,在邊緣端即時執行。與依賴遠端伺服器進行 AI 推論的解決方案相比,此類應用可獲得更低延遲、更佳隱私保護,以及更低的硬體與頻寬成本。
其主要規格包含:
- Arm Cortex-M55 核心,最高 800 MHz
- 支援 Arm Helium MVE 向量擴充指令集
- 內建浮點運算單元(FPU)
- ST Neural-ART Accelerator NPU
- NPU 頻率最高 1 GHz
- 提供高達 600 GOPS AI 運算能力
- 4.2 MB SRAM
- 多組高速外部記憶體介面
- Neo-Chrome 2.5D GPU
- CSI-2 Camera Interface
- ISP 影像訊號處理器
- H.264 視訊編碼加速器
STM32N6570-DK Discovery Kit 開發套件
STM32N6570-DK Discovery Kit 是快速評估 STM32N6 的開發平台之一。開發板整合多項功能,包括 5" 觸控 LCD、攝影機模組、外部記憶體、數位麥克風以及多種通訊介面,可直接應用於展示系統中。如下圖 2 所示,它直接整合到演示中,以展示 STM32N6 的許多板載功能以及高級功能。
這些硬體資源使 STM32N6 成為新世代 Edge AI MCU 的代表產品,能夠將原本需雲端執行的 AI 工作負載移轉至終端設備。
此展示系統中的客製化遊戲應用程式可運行於任何 Linux 系統,但為了方便開發與展示,本文選擇 Raspberry Pi 作為平台。應用程式透過 USB 從 STM32N6570-DK 接收遊戲控制訊號,並將目前執行狀態回傳給控制器,例如主選單、遊戲一或遊戲二等。Raspberry Pi 與 STM32N6570-DK 均透過 USB Type-C 電源供電,以確保系統運作穩定。
遊戲控制器應用程式
為支援 STM32N6570-DK,ST 提供多個 AI 範例模型,可執行物件偵測(Object Detection)、影像分割(Segmentation)以及姿態估測(Pose Estimation)等任務。
本展示專案建立於 x-cube-n6-ai-hand-landmarks 範例之上,利用兩個來自 MediaPipe Hand Landmarker 的串接模型估算手部關鍵點。
第一個模型為掌部偵測器(Palm Detector),其負責將整張攝影機影像作為輸入並搜尋使用者的手部。當系統偵測到手掌後,便會裁切出該區域,並將其送入第二個模型。
第二個模型負責辨識手部關鍵點(Hand Landmarks)。整個推論流程皆於 STM32N6 上即時執行,使系統能維持每秒 30 張影像(30 FPS)的執行效能。
圖 3:兩階段 AI 流程回傳的 21 個手部關鍵點
Source: Hand landmarks detection guide | Google AI Edge | Google for Developers
這種由高維度影像資料濃縮而成的低維度關鍵點集合,通常被稱為 Skeleton Data(骨架資料)。骨架資料利用少量座標點表示關節或身體特徵,使系統能夠以遠低於原始影像的資料量進行分析。
手勢辨識邏輯
在本專案中,系統直接使用電腦視覺流程產生的 21 個關鍵點資料,並透過規則式決策邏輯(Rule-Based Decision Logic)進行手勢辨識。
以「#1」手勢為例,系統會比較各手指關節的 X 與 Y 座標,以確認:
- 拇指是否向內彎曲
- 食指是否垂直向上伸直
- 中指是否收起
- 無名指是否收起
- 小指是否收起
用於檢測此手勢和其他受支援手勢的完整程式碼可以在遊戲控制器原始碼的 app.c 檔案中找到。
列表 1:使用 Skeleton Data(骨架資料)偵測「#1」
手勢的 Pseudo Code(虛擬碼)。
FUNCTION check_num1_gesture(landmark)
// If the thumb is bent inward (works for left and right hands)
IF abs(landmark[4].x - landmark[17].x) < abs(landmark[3].x - landmark[17].x)
// If the index finger is not tilted either left or right by more than 33.7 degrees
IF (landmark[8].y - landmark[5].y) > (abs(landmark[8].x - landmark[5].x) * 1.5)
// If the index finger is pointed up
IF (landmark[6].y > landmark[5].y) AND (landmark[7].y > landmark[6].y) AND (landmark[8].y > landmark[7].y)
// If the middle finger is not pointed up
IF (landmark[10].y < landmark[9].y) OR (landmark[11].y < landmark[10].y) OR (landmark[12].y < landmark[11].y)
// If the ring finger is not pointed up
IF (landmark[14].y < landmark[13].y) OR (landmark[15].y < landmark[14].y) OR (landmark[16].y < landmark[15].y)
// If the pinky finger is not pointed up
IF (landmark[18].y < landmark[17].y) OR (landmark[19].y < landmark[18].y) OR (landmark[20].y < landmark[19].y)
RETURN True
RETURN False
END FUNCTION
此方法具有幾項優點:
- 容易實作
- 執行效率高
- 結果可預測
- 適合僅需辨識少量手勢的應用
然而,此方法也存在限制。例如,若使用者改以側面角度展示手勢,則原本針對手掌正面建立的規則可能失效。此外,當系統需支援更多手勢時,維護大量手工撰寫的規則也會變得愈來愈困難。
此外,更進一步的作法是利用 Skeleton Data 建立訓練資料集,並額外訓練第三個深度學習模型來直接預測手勢,而非透過人工規則判斷。不過,此作法需要投入額外的開發與驗證工作,也無法保證最終模型一定能獲得更好的效果。
遊戲狀態感知機制
為避免控制器在每一張影像中比對所有已知手勢,Raspberry Pi 上的遊戲應用程式會將目前遊戲狀態傳送給 STM32N6570-DK。
因此,控制器只需檢查與當前狀態相關的手勢。
例如:
- 主選單狀態僅偵測選單手勢
- Game 1 狀態僅偵測 Game 1 所需操作手勢
- Game 2 狀態僅偵測 Game 2 所需操作手勢
USB HID 與 CDC 通訊架構
圖 2 所示的控制指令與狀態資訊皆透過同一條 USB 連線交換。為此,開發團隊在 STM32N6570-DK 上加入 USB Device Middleware,並將 USB1 埠配置為 USB Composite Device。
此 Composite Device 同時整合兩種 USB Device Class:
HID(Human Interface Device)
作為 HID 鍵盤使用。
當 STM32N6 辨識到特定手勢時,即傳送對應按鍵事件給遊戲應用程式。舉例來說,當使用者比出「#1」手勢選擇 Game 1 時,STM32N6 會送出鍵盤按鍵「1」。
CDC(Communications Device Class)
提供虛擬 COM Port。
Raspberry Pi 與 STM32N6570-DK 可透過序列通訊交換狀態訊息,例如:“state:0” 和 “state:1”
讓控制器得知目前所執行的遊戲或選單狀態。
FreeRTOS 與 Middleware 整合
本文撰寫時所使用的 x-cube-n6-ai-hand-landmarks 應用程式採用 FreeRTOS,而 STM32CubeN6 套件中的 Middleware 元件則以 Eclipse ThreadX RTOS 為基礎。
因此,開發團隊選擇使用 ST 提供的 Classic Core Middleware,以便在不依賴 ThreadX 的情況下整合 USB Device 功能。
專案中實際使用的元件包括:
- HID Class
- CDC Class
- CompositeBuilder Class
後續再針對:
- HID Descriptor
- CDC State Parser
- Composite Device Builder
進行必要客製化設定,以整合鍵盤與虛擬 COM Port 功能。
遊戲啟動器與遊戲內容
雖然展示重點在 STM32N6570-DK 與其 AI 加速能力,但專案也包含客製化遊戲啟動器。
遊戲啟動器採用 Python 與 PyGame 開發,負責建立圖形化介面並處理鍵盤事件。遊戲則於獨立的網頁瀏覽器視窗中執行。
目前系統包含兩款遊戲:
- Zig Zag
- Fishy
圖 5(a):主選單介面
圖 5(b):Zig Zag 遊戲說明畫面
圖 5(c):Fishy 遊戲說明畫面
作為參考,遊戲應用程式檔案可在其 GitHub 儲存庫中找到,同時也提供了在 Raspberry Pi 上運行演示的說明。
結論與未來發展
本專案展示了 STM32N6 系列 MCU 執行日益複雜 AI 模型的能力,進一步證明先進 AI 應用已能夠實際部署於邊緣端設備。
未來仍有許多可擴充方向。例如,在目前的兩階段 AI 管線之後,再加入一個以 Skeleton Data 訓練而成的深度學習模型,直接預測手勢類別,而非依賴人工建立的規則。
若能在保持可靠度的情況下支援更多手勢,系統便可進一步擴展至更多遊戲應用。同時,除了遊戲控制之外,相關技術亦可應用於機器人控制、無人機導航等領域。STM32N6 所提供的運算能力,為各類 Edge AI 應用保留了相當充足的探索空間。






