カメラを一切使わず、手持ちのWiFi信号だけで部屋にいる人の存在、呼吸数、心拍数、さらには体の姿勢まで推定できるOSSが注目を集めています。
ruvnet/RuView は、63,000を超えるスターを獲得したWiFiセンシングプラットフォームです。9ドルのESP32-S3マイコンをセンサーノードとして使い、WiFi電波の「反射パターン」を解析することで、映像データを一切使わずに空間の状態を把握します。
本記事では、RuViewの仕組み・アーキテクチャ・具体的な使い方と、類似OSS(espressif/esp-csi、WirelessEye)との違いを整理します。「自分のプロジェクトで採用すべきか」を判断するための情報を提供します。
RuViewとは何か — WiFi信号を「目」に変えるOSS

カメラレスでなぜ人物検知ができるのか(CSIの仕組み)
RuViewが利用するのは、WiFiの通信規格に含まれる CSI(Channel State Information / チャネル状態情報) です。
WiFi信号は、送信機から受信機へ届くまでの間に壁・家具・人体に反射・散乱します。CSIは、この「電波の伝わり方」を各サブキャリア(周波数帯域の細かい区切り)ごとに振幅・位相として数値化したものです。人が動くとCSIの数値パターンが変化するため、その変化を機械学習で解析することで人体の状態を推定できます。
この技術的背景は、カーネギーメロン大学の研究論文「DensePose From WiFi」に基づいています。RuViewはその学術的枠組みを実用的なエッジシステムとして実装したプロジェクトです。
何が検知できるか(機能一覧)
RuViewが提供する検知機能は以下のとおりです。
機能 | 詳細 |
|---|---|
存在検知 | 壁越しで最大約5メートルの範囲での人物有無 |
バイタルサイン | 呼吸数(6〜30 BPM)・心拍数(40〜120 BPM)のリアルタイム計測 |
姿勢推定 | 17キーポイント(COCOフォーマット)によるカメラレスボディポーズ推定 |
活動認識 | 歩行・着席・ジェスチャー・転倒の検知 |
睡眠解析 | 睡眠ステージ分類・睡眠品質評価 |
バリデーションセット上での存在検知精度は100%と報告されています。ただし、姿勢推定の精度(PCK@20)は約2.5%であり、カメラベースのシステムと同等ではありません。開発チームは将来の目標値を35%以上としています。
技術アーキテクチャ

ハードウェア構成(ESP32-S3メッシュ)
RuViewのセンサーノードとして使用するのは ESP32-S3マイコン(1台あたり約9ドル)です。ESP32-C3や初代ESP32は処理能力の不足により非対応です。
推奨構成は4〜6ノードのマルチスタティックメッシュです。複数のノードを部屋の異なる位置に配置することで、360度の空間カバレッジと高い空間分解能を実現します。単一ノード構成では空間分解能が制限されます。
オプションとして Cognitum Seedアプライアンス(140ドル)を追加することで、センサーデータに暗号証明と永続ストレージを付与できます。
AIモデルとエッジ処理パイプライン
信号処理は「マルチバンドフュージョン」パイプラインで構成されています。
- 3チャンネル × 56サブキャリアのCSIデータ取得
- コヒーレンスゲート(信号安定性フィルタリング)
- アテンション加重クロスビューポイント埋め込み(マルチスタティック解析)
- 128次元CSI埋め込みへの変換
事前学習モデルは ruvnet/wifi-densepose-pretrained としてHugging Faceで公開されています。12.2Mステップ・6万フレーム・61万コントラスト三つ組で学習されており、4ビット量子化により わずか8KBのフットプリント でRaspberry Pi上でもマイクロ秒単位で推論できます。
量子化バリアントとして以下の4種類が用意されています。
バリアント | サイズ | 用途 |
|---|---|---|
Q2 | 4KB | 最軽量、精度低 |
Q4(推奨) | 8KB | バランス型 |
Q8 | 16KB | 高精度 |
フル | 48KB | 最高精度 |
新しい環境への適応には30秒以内が目安であり、ラベル付きデータや追加学習なしで動作します(MERIDIAN技術)。
ソフトウェアスタックと対応プラットフォーム
要素 | 詳細 |
|---|---|
センシングサーバー | Rust 1.85+(高パフォーマンス・低メモリ) |
モデル形式 | safetensors + JSONL RVFコンテナ |
学習フレームワーク | Candle(オンデバイス学習対応) |
デプロイ方式 | Docker / WASM / ネイティブバイナリ(aarch64 + x86_64) |
テスト | 1,463件通過 |
動かしてみる前に知っておくべきこと(制限と前提)
RuViewを採用・評価する前に、以下の制限を把握しておくことが重要です。
ハードウェア制限
- ESP32-C3・初代ESP32は非対応
- 一般的なノートPC内蔵WiFiはRSSIのみ取得可能(粗い存在検知のみ)
- 検知範囲は約5メートルが上限(壁越しの場合は信号状況に依存)
精度の現状
- 存在検知: 100%(バリデーションセット)
- 姿勢推定: PCK@20で約2.5%(開発中。カメラシステムと同水準には達していない)
デプロイの前提
- Dockerデモはシミュレーション用であり、実際のWiFiセンシング機能にはCSI対応ハードウェア(ESP32-S3)が必要
- 単一ノードでは空間分解能が限られる。本格展開には4〜6ノード推奨
Dockerで動作確認する(ハードウェア不要)
RuViewはDockerイメージで配布されており、実際のESP32-S3ハードウェアなしにシミュレーションデータでシステムの動作を確認できます。
Dockerによるシミュレーション起動
以下のコマンドでコンテナを起動します(出典: 公式ユーザーガイド)。
docker pull ruvnet/wifi-densepose:latest
docker run -p 3000:3000 -p 3001:3001 ruvnet/wifi-densepose:latest
起動後、http://localhost:3000 でThree.jsベースの3Dビジュアライゼーションダッシュボードにアクセスできます。
REST APIでバイタルサインを取得する
サーバーが起動している状態で、REST APIから現在の計測値を取得できます(出典: 公式ユーザーガイド)。
curl -s http://localhost:3000/api/v1/vital-signs | python -m json.tool
レスポンス例:
{
"breathing_bpm": 16.2,
"heart_bpm": 72.1,
"breathing_confidence": 0.87
}
また、17キーポイントの姿勢データは /api/v1/pose/current で取得できます。
WebSocketでリアルタイムストリーミング
WebSocket接続 (ws://localhost:3001/ws/sensing) からリアルタイムにデータを受信できます(出典: 公式ユーザーガイド)。
import asyncio, websockets, json
async def stream():
async with websockets.connect("ws://localhost:3001/ws/sensing") as ws:
async for message in ws:
data = json.loads(message)
print(f"Breathing: {data['vital_signs']['breathing_bpm']} BPM")
asyncio.run(stream())
ESP32-S3による本格展開
実際のWiFiセンシングを行うには、ESP32-S3にRuViewのファームウェアをフラッシュする必要があります。詳細な手順は 公式ビルドガイド に記載されています。
ファームウェアのフラッシュとプロビジョニング
ESP32-S3をPCにUSB接続し、以下のコマンドでファームウェアを書き込みます(出典: 公式ユーザーガイド)。
python -m esptool --chip esp32s3 --port COM9 --baud 460800 \
write_flash 0x0 bootloader.bin 0x8000 partition-table.bin \
0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin
フラッシュ後、WiFi認証情報とサーバーのIPアドレスをプロビジョニングします。
python firmware/esp32-csi-node/provision.py --port COM9 \
--ssid "YourWiFi" --password "secret" --target-ip 192.168.1.20
マルチノードメッシュ構成
RuViewは6つのWiFiチャンネルにわたるTDM(時分割多重)プロトコルによるマルチ周波数メッシュスキャンに対応しています。3ノード以上の構成で空間分解能が大きく向上し、単一ノードでは検出困難な姿勢推定の精度が改善されます。
Claude Code統合として /ruview-provision コマンドが提供されており、メッシュ設定を対話的に実行できます。
類似OSSとの比較
WiFi CSIセンシングのOSSには複数の選択肢があります。RuViewを採用する際の判断材料として、主要な類似OSSとの差分を整理します。
espressif/esp-csiとの違い(ローレイヤー vs 統合プラットフォーム)
espressif/esp-csi(スター数: 約1,300)は、ESP32シリーズ全体でCSIデータを取得するためのライブラリとサンプルアプリの集合体です。Espressif(ESP32メーカー)が公式に提供しており、ESP32-C3を含む全シリーズに対応しています。
RuViewとの最大の違いは「抽象化の層」です。esp-csiは「CSIデータをどう取り出すか」というローレイヤーを担当します。姿勢推定・バイタルサイン監視・105種類のエッジモジュールといった高レイヤーの機能はありません。
esp-csiを選ぶ場面: 独自のCSI解析アルゴリズムを開発したい、ESP32-C3など他のESP32バリアントを使いたい、CSIデータ取得の基礎から理解したい場合。
RuViewを選ぶ場面: 姿勢推定・バイタルサイン・ユースケース別モジュールを即座に使いたい、Docker/RESTで素早くプロトタイプしたい場合。
WirelessEye(WiFiEye)との違い(研究ツール vs 実用展開)
WirelessEye(スター数: 約30)は、Raspberry Pi + NexmonファームウェアでCSIデータをキャプチャ・可視化するGUIツールです。PerCom 2024のWiSenseワークショップで発表された学術ペーパーに基づいています。
TensorFlowによる機械学習分類機能を持ちますが、RuViewのような姿勢推定・バイタルサイン・エッジモジュールは搭載されていません。Raspberry PiとNexmonファームウェアが必須であり、RuViewのようなDockerやESP32単体での展開には対応していません。
WirelessEyeを選ぶ場面: CSIデータのリアルタイム可視化・記録が目的、既存のRaspberry Pi + WiFi環境を活用したい場合。
ユースケース別適用例
RuViewのユースケースは105種類のエッジモジュールとして体系化されています。主要な適用例を紹介します。
医療・ヘルスケア
転倒検知と睡眠時無呼吸スクリーニングは、RuViewの最もニーズが高いユースケースです。高齢者施設では、カメラを設置できないプライバシー制約がある部屋(浴室・トイレ前)でも存在検知・転倒検知が可能です。患者への接触なしに呼吸数・心拍数をモニタリングする非接触バイタル監視にも適用できます。
スマートビルディング・小売
建物内の占有ゾーン管理・HVAC自動化・エネルギー管理に活用できます。小売業では顧客フロー追跡・商品ゾーン滞留ヒートマップ・待ち行列長推定を、新たなカメラ設置工事なしに既存WiFiインフラで実現できます。
捜索救助・セキュリティ
倒壊した建物内の生存者検知(WiFi-Matプロトコル)は、RuViewの特に注目されるユースケースです。呼吸シグネチャによって生存者を検知できます。セキュリティ用途では壁越しの侵入検知・不審な動き検知に利用できます。
まとめ — 採用判断のポイント
RuViewは、WiFi CSI技術をエッジシステムとして実用化した統合プラットフォームです。以下の観点で採用可否を判断することをお勧めします。
採用に向いている場面
- 既存WiFiインフラを活用したカメラレスセンシングを構築したい
- 呼吸数・心拍数の非接触モニタリングが必要
- ESP32-S3(約9ドル)でコスト効率よくプロトタイプしたい
- DockerベースのREST APIで素早くPoC(概念実証)したい
- プライバシー保護のためカメラを使えない環境でのセンシングが必要
慎重に評価すべき場面
- カメラベースの姿勢推定と同等の精度が必要(現時点で姿勢推定精度はPCK@20で約2.5%)
- ESP32-C3・初代ESP32など他のマイコンを使いたい(非対応)
- 既存の研究用CSIデータ取得環境(Nexmon等)を流用したい
- 5メートルを超える長距離センシングが必要
まずはDockerで動作原理を確認し、ユースケースが合致すると判断した段階でESP32-S3ハードウェアによる本格展開を検討する、という段階的なアプローチが適しています。



