← 返回上一頁
不分類區

用 Wi-Fi CSI 訊號做人體姿勢估測,ESP32-S3 跑

本頁目錄

「用 Wi-Fi 訊號就能看到房間裡的人在做什麼」這句話聽起來像玄學,但 CMU 在 2023 年發表的 DensePose From WiFi 論文已經把這條路鋪好。當時論文釋出時最大的卡關是:研究團隊用的是 Intel 5300 NIC 加客製化驅動,跑出來的成果再驚艷,一般工程師也很難在家複現。

過了三年,社群終於把工程化的版本補上來了。ruvnet/wifi-densepose 這個專案 2026 年 4 月已經堆到 51k star、release tag 跑到 v0.6.3-esp32,把整套訊號處理 + 神經網路推論搬到一片 9 美元的 ESP32-S3 上。我這幾天把整套跑了一遍,從 Docker 模擬器到 ESP32 燒錄、再到房間佈署,記錄下來分享給也在研究無攝影機感測的人。

文章會帶到 CMU 原始論文的方法、社群實作如何把它降成本、CSI(Channel State Information,通道狀態資訊)為什麼能反映人體姿勢,以及這套系統實際跑起來的限制與倫理問題。

WiFi-DensePose 訊號處理管線:從 Wi-Fi AP 到 17 個 COCO keypoints

一、為什麼 Wi-Fi 訊號能看到人

1.1 多徑傳播與 CSI

要理解這套系統第一個要打通的概念是:Wi-Fi 訊號從 AP(Access Point)發出來、到接收端之間,會經過直達路徑、牆面反射、家具繞射、人體散射等多條路徑,這就是多徑傳播(multipath propagation)。每一條路徑會有不同的振幅衰減與相位偏移,最後在接收端疊加成一個複數訊號。

CSI 描述的就是「在每一個 OFDM 子載波上,發射端到接收端的通道頻率響應」。802.11n / 802.11ac 規範把 20 MHz 頻寬切成 56 個子載波,每根天線、每個子載波都會有一組 (amplitude, phase),所以一個 3×3 MIMO 的 802.11n 系統一次取樣可以得到 3 × 3 × 56 = 504 個複數,這個高維特徵足以描述人體在空間中對 RF 訊號造成的擾動。

人體含水量約 60%,對 2.4 GHz 與 5 GHz 訊號的吸收率高,移動時也會持續調整反射路徑。換句話說,一個人在房間裡走動,CSI 序列的波形變化跟他的姿勢變化是高度相關的——只要你能把這個訊號學出來,理論上就能反推姿勢。

1.2 從 RSSI 到 CSI 的鴻溝

很多人會先想到:那 RSSI(接收訊號強度指示)也行嗎?答案是「只能做粗略 presence detection,做不了 pose」。RSSI 是把所有子載波的能量平均成一個 scalar,等於把 504 維壓成 1 維,幾乎所有空間資訊都丟掉了。

CSI 必須直接從 Wi-Fi 晶片底層拉出來,這也是為什麼 CMU 那篇論文要綁 Intel 5300 NIC(搭配 Halperin 開發的 CSI Tool 驅動):消費級 Wi-Fi 晶片不會把 CSI 暴露給上層 API。ruvnet/wifi-densepose 走的另一條路是 ESP32-S3 的 CSI mode——Espressif 的 SDK 在 IDF 4.x 之後正式開放 CSI 取樣 API,這是整個專案能降成本到 9 美元的關鍵。

二、CMU 論文:DensePose From WiFi 的核心方法

2.1 訊號到 UV 座標的對應

CMU 的論文(arXiv 2301.00250)把問題定義成「把 CSI 的相位與振幅映射到人體 24 個區域上的 UV 座標」。所謂 DensePose 是 Facebook AI Research 早期針對影像提出的密集姿勢表示:把人體切成 24 塊(軀幹、上臂、下臂、頭、大腿、小腿等),每一塊有自己的 UV parameterization,於是任何體表像素都能用 (part_id, u, v) 三元組精準定位。

論文的網路用 teacher-student 架構:teacher 是預先訓練好的影像 DensePose 模型,學生網路接收 CSI 為輸入。訓練時兩台相機 + Wi-Fi 同步取樣,teacher 從影像產出 ground truth IUV map,student 學會從 CSI 預測同樣的 IUV map。inference 時就只用 student、丟掉相機。

論文另一個亮點是它證明了 1D 訊號(CSI 序列)能完成多人姿勢估測,原本大家以為這需要影像或點雲這種高維度感測。

2.2 為什麼後續工程化卡關

論文 2023 年發表後社群很興奮,但實作門檻高得令人卻步:

  • 硬體:Intel 5300 NIC 已經停產多年,eBay 上的價格被炒到一張 80 美元以上。
  • 驅動:Halperin CSI Tool 只支援 Linux 3.x 老核心,現代 Ubuntu 必須降版才能跑。
  • 資料:論文沒釋出 dataset,自己採集需要同步影像 + Wi-Fi + 多人姿勢標註,成本極高。
  • 模型:論文提到的網路規模沒法直接塞進邊緣裝置,部署需要重新蒸餾。

這些卡關點讓論文成為「很多人讀過、很少人跑過」的題目,直到 ESP32-S3 與 self-supervised 訓練技巧成熟,才在 2026 年迎來社群化的工程實作。

三、ruvnet/wifi-densepose 專案拆解

3.1 整體架構

ruvnet/wifi-densepose 把問題拆成四層:

  1. 感測層:ESP32-S3 mesh 節點負責 CSI 取樣,透過 TDM(time-division multiplexing)跨 6 個 Wi-Fi 頻段掃描,達到「3 倍感測頻寬」的效果(讓鄰近的路由器也成為 radar illuminator)。
  2. 訊號處理層:amplitude / phase 抽取 → Hampel 濾波(抑制離群值)→ SpotFi(spatial focusing)→ Fresnel zone 模型 → 帶通濾波(呼吸頻段 0.1–0.5 Hz、心跳頻段 0.8–2.0 Hz)。
  3. 模型層:RuVector AI 是個輕量 transformer backbone,用 cross-attention 把多個子載波的 embedding 聚合成 128 維 fingerprint vector,再分頭輸出 17 個 COCO keypoints 與 vital signs。
  4. 應用層:60 個 WASM 模組(13 大類)跑在 ESP32 上,從跌倒偵測、忌諱區入侵、到呼吸暫停(sleep apnea)監控都包進去。

整個 pipeline 我用 cargo 編一次差不多 4 分鐘,要驗證流程的話 Docker image 直接拉就好:

docker run -p 3000:3000 -p 3001:3001 ruvnet/wifi-densepose:latest
curl http://localhost:3000/api/v1/pose/current

3.2 Self-supervised 把訓練門檻打下來

ruvnet 版本最值得記下的工程突破是把訓練從「需要 camera ground truth」改成 self-supervised contrastive learning。網路會自己從原始 CSI 中提取結構特徵(128 維 embedding),不需要任何標註資料。在 M4 Pro 上這個 self-supervised pretrain 只要 84 秒。

如果你手邊真的有對齊的 camera + Wi-Fi 資料(例如 MM-Fi 或 Wi-Pose dataset),可以再做 supervised fine-tune,這時候才能拿到 92.9% PCK@20 的 keypoint 準確度。對長照、保全這類「只關心有沒有動、有沒有跌倒」的場景,self-supervised 模式已經夠用了。

3.3 MicroLoRA 與 EWC++ 處理跨環境問題

WiFi sensing 有個惡名昭彰的限制:環境一變就要重訓。家具搬位、新增隔板、甚至季節變化(冬天衣物變厚)都會改變 CSI 的統計分布。專案用兩個技巧緩解這個問題:

  • MicroLoRA:每個房間掛一組 1,792 參數的 LoRA adapter,相當於只有原模型 0.5% 的參數量。新房間部署時只需錄 30 秒空房間 baseline + 30 秒有人活動,就能訓出 adapter,比起整個模型 retrain 省 93% 資料量。
  • EWC++(Elastic Weight Consolidation):學新房間時用 Fisher information matrix 保留前一個房間的權重重要性,避免 catastrophic forgetting。

兩個機制加總,55 KB 的 ESP32 端模型可以同時記得多個房間的 fingerprint,部署彈性大幅提升。

ESP32-S3 房間佈置與 10 階段訓練推論流程

四、實際把它跑起來

4.1 硬體採購清單

最小可行配置我推薦:

  • 4 顆 ESP32-S3 DevKit(一顆約 $9,4 顆 $36)。要做 mesh sensing 推薦 4 顆以上,單顆只能做 presence。
  • 1 台舊 Wi-Fi AP(家裡淘汰的 RT-AC 系列就行,當訊號發射源)。
  • 1 台 Mac mini 或 Linux 小主機跑 sensing-server(不用 GPU,CPU 推論就夠)。

要做研究級 3×3 MIMO,可以加一張 Intel 5300 NIC(eBay $50–$100);想要持久化 vector 索引、kNN 搜尋、加密 witness chain,可以買官方搭配的 Cognitum Seed(約 $140)。

4.2 燒錄與佈署

ESP32-S3 端的步驟:

# 燒錄韌體(韌體版本必須 ≥ 0.4.3.1,舊版有虛假跌倒警報的 bug)
python -m esptool --chip esp32s3 --port /dev/cu.usbserial \
  --baud 460800 write-flash --flash-mode dio --flash-size 8MB \
  0x0 bootloader.bin 0x8000 partition-table.bin \
  0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin

# Provision Wi-Fi 連線與 sensing-server 目標 IP
python firmware/esp32-csi-node/provision.py \
  --port /dev/cu.usbserial \
  --ssid "MyHome" --password "..." \
  --target-ip 192.168.1.20

伺服器端:

# 直接用 ESP32 來源
./target/release/sensing-server --source esp32 --udp-port 5005 --http-port 3000

# 或先用模擬器跑 UI 看流程
./target/release/sensing-server --source simulate --http-port 3000

UI 可以在 http://localhost:3000/ui/observatory.html 看到 3D 可視化:人體骨架、即時呼吸/心跳、房間 occupancy heatmap 都會疊在一張圖上。我自己第一次看到自己呼吸的波形被 ESP32 抓出來,會有一種「Wi-Fi 不再只是上網工具」的怪異感。

4.3 自適應分類器訓練

這是最容易被忽略但很關鍵的步驟。新房間部署一定要錄一次 baseline,否則 false positive 會多到讓你想砸機器:

# 步驟 1:空房間 30 秒
curl -X POST http://localhost:3000/api/v1/recording/start \
  -H "Content-Type: application/json" \
  -d '{"id":"baseline_empty"}'

# 步驟 2:自己進去走動 30 秒(產生 positive sample)
curl -X POST http://localhost:3000/api/v1/recording/start \
  -d '{"id":"baseline_active"}'

# 步驟 3:訓練 MicroLoRA adapter
curl -X POST http://localhost:3000/api/v1/adaptive/train

# 步驟 4:檢查狀態
curl http://localhost:3000/api/v1/adaptive/status

我第一次部署時跳過 baseline,結果寵物(一隻貓)被當成「跌倒事件」每分鐘觸發三次。錄完 baseline + 加一次 negative sample(讓貓自己走動 5 分鐘)之後 false positive 就壓到接近零。

五、跟其他感測技術的比較

5.1 vs. RGB Camera

最直觀的對手。Wi-Fi sensing 在三個面向贏:

  • 隱私:沒有影像資料、沒有 PII(personally identifiable information),歐盟 GDPR 在「合法性基礎」這欄基本上不需要使用者明示同意。長照、辦公室 occupancy、公廁人流這類場景特別有優勢。
  • 黑暗:完全不受光線影響,半夜也能監測。
  • 遮蔽:穿過薄牆(5 公尺內 attenuation 可接受)、家具沒影響。

輸的也很明顯:解析度。17 個 keypoints 對「他在做什麼動作」夠用,但要做「臉部辨識」「閱讀文件動作」這種精細任務完全沒戲。

5.2 vs. mmWave Radar

毫米波 radar(例如 TI IWR6843)跟 Wi-Fi sensing 最像,都是 RF-based 無影像。差異在:

  • 成本:mmWave 模組單價 $200–$2000,Wi-Fi 方案 $8–$140,差一個量級。
  • 解析度:mmWave 中高解析度(4D 點雲),Wi-Fi 中等。
  • 生態:mmWave 有專業 dev tool(mmWave Studio、mmWave SDK),但封閉;Wi-Fi 是開放標準,能跟 mesh / IoT 既有架構整合。

我覺得適用場景不太衝突:mmWave 適合工業、自駕車輔助;Wi-Fi sensing 適合家庭、辦公室、商場這類已經有 Wi-Fi 基礎設施的環境。

5.3 vs. LiDAR

LiDAR 解析度最高(公分等級),但成本 $500–$5000、不穿牆、室內常受反光干擾。它跟 Wi-Fi sensing 完全不在同一個 use case。

六、限制與倫理紅線

6.1 工程限制

老實說的話:

  • 訓練資料難收:要做 supervised pose estimation,得自己架影像 ground truth + Wi-Fi 同步系統,工程量驚人。社群目前主要靠 self-supervised + 少量公開 dataset(MM-Fi、Wi-Pose)。
  • 環境依賴強:MicroLoRA 緩解了部分問題,但裝潢大改、搬家還是要重訓 adapter。
  • 多人場景:論文宣稱支援多人姿勢估測,但實測 3 人以上時 keypoint 開始混淆,5 人以上幾乎不可用。
  • 金屬干擾:金屬家具、水族箱會嚴重扭曲 CSI,這類房間部署效果會掉一半以上。

6.2 倫理問題

這裡是我想多停留一下的部分。Wi-Fi sensing 帶來一個歐盟 GDPR、台灣個資法都沒處理過的灰色地帶:它不需要明示同意就能監控人。

傳統攝影機在公共場所裝設要貼告示、要走 DPIA(Data Protection Impact Assessment);但 Wi-Fi sensing 沒拍下任何影像,「資料」只是 CSI 序列,技術上連 PII 都不算。一家咖啡廳老闆完全可以裝 4 顆 ESP32 來統計顧客 dwell time、判斷店裡有沒有人,而客戶連被監控了都不知道。

更尖銳的場景:房東能不能用 Wi-Fi sensing 監控租客?雇主能不能監測員工有沒有摸魚?目前法律完全沒有規範。我自己的立場是這個技術應該強制 opt-in 並貼告示——但這需要立法,而立法跟得上技術的速度從來沒贏過。

如果你打算把這套系統部署到非自家環境,建議先諮詢法務並至少做到:

  • 明確告知所有可能進入感測區的人。
  • 提供「拒絕監測」的退路(例如關閉特定房間的感測節點)。
  • 不長期保存 CSI 原始資料,只保留聚合特徵。
  • 如果有「跌倒偵測」這類醫療相關用途,走標準的醫材 / 個資申報流程。

七、結論與後續閱讀

WiFi-DensePose 從 2023 年的論文坑、到 2026 年社群把它降到 9 美元 ESP32-S3 邊緣裝置,這條路走了三年。現在的技術成熟度已經夠做家庭長照、辦公室 occupancy、商場人流這些 use case,但要做臨床等級的 vital signs、或多人複雜場景,還有一段路。

對工程師來說最有意思的是它打破「感測一定要影像」的直覺:一個 OFDM 子載波的相位偏移,乘以 504 個維度、再丟進 transformer,就能看到房間裡有人在做什麼。這比起 CV 領域的「另一個 SOTA model」要有意思得多。

接下來打算試的方向:

  • 把 sensing-server 跟 Home Assistant 整合,做家裡的 occupancy-aware 自動化。
  • 試試多 AP 環境(家裡有 3 台 mesh node)能不能把 keypoint 解析度再拉高。
  • 看看能不能拿 self-supervised embedding 做「個人步態識別」,做成家裡的家人 / 訪客自動分類。

如果你也跑了這套系統,歡迎回信交流。專案本身是 MIT license、代碼在 GitHub 公開,動手成本不高,最大的卡關點通常是「沒人陪你 debug」——那就讓社群文章補上吧。

參考資料

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料