2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SpatialLMで室内の点群データから家具・壁を抽出してみた

2
Last updated at Posted at 2026-02-27

はじめに

SpatialLMは、3D点群データから室内の構造(壁・ドア・窓)や家具のバウンディングボックスを抽出できる3D Large Language Modelです。本記事では、実際にSpatialLMを試してみた結果を紹介します。

スクリーンショット 2026-02-27 123029.png

プロジェクトサイト

GitHub

紹介記事

SpatialLMの動作について

デモ動画を見ると、スマホのカメラ映像に対してリアルタイムで家具や壁が認識されているように見えますが、実際には事後処理で結果を重ね合わせたものです。
(公式リポジトリにも"Results aligned to video with GT cameras for visualization"と記載があります)

実際の処理フローは以下のようになります

  1. スマホ映像などから点群データを生成
  2. SpatialLMで点群を読み込み、構造と家具の情報を抽出
  3. 点群にバウンディングボックスを重ねて可視化

点群データの準備

SpatialLMの特徴の一つは、スマホのRGB映像から生成した点群にも対応している点です。

ただし今回は、LiDAR搭載iPhoneを所有していたため、Scaniverseアプリで撮影した点群データを使用しました。

メッシュ形式を選び、

スクリーンショット 2026-02-27 152204.png

部屋をスキャンします

スクリーンショット 2026-02-27 152321.png

出来上がったら共有から、PLYでエクスポートします

スクリーンショット 2026-02-27 152302.png

なお、RGB映像から点群を生成する場合は、SpatialLMリポジトリには含まれていないため、外部ツールを使用する必要があります。公式ドキュメントでは以下のようなSLAMシステムが推奨されています。

SLAM3R

MASt3R-SLAM

これらのツールを使えば、一般的なスマホカメラで撮影した動画からも点群データを生成できるようです。(未確認)

環境構築

実行環境

今回使用した環境は以下の通りです。

  • OS: Windows 11 + WSL2 (Ubuntu)
  • GPU: NVIDIA GeForce RTX 4070 Laptop GPU (VRAM 8GB)
  • CUDA Driver: 581.60

セットアップ手順

SpatialLMのリポジトリをクローンし、READMEに従って環境を構築します。

モデルはSpatialLM1.1-Qwen-0.5Bを使用しました。モデルはinference.pyの--model_path引数でHugging Faceのモデル名を指定すると、初回実行時に自動的にダウンロードされます(デフォルトのモデルはないため、毎回明示的に指定する必要があります)。

環境構築はClaude Codeにまかせたので、詳細は省きます。

ちなみにサンプル点群データを使いたい場合は以下でダウンロードします。

# サンプル点群データのダウンロード
huggingface-cli download manycore-research/SpatialLM-Testset pcd/scene0000_00.ply --repo-type dataset --local-dir .

推論の実行

PLYファイルを入力として、SpatialLMで推論を実行します。

python inference.py \
  --point_cloud input.ply \
  --output output.txt \
  --model_path manycore-research/SpatialLM1.1-Qwen-0.5B

処理は1,2分程度で完了しました。出力ファイル(output.txt)には、検出された壁・ドア・窓・家具のバウンディングボックス情報が構造化されたテキスト形式で保存されます。

image.png

結果の可視化

推論結果を可視化するには、Rerunというツールを使用します。まず結果をRerun形式に変換します。

python visualize.py \
  --point_cloud input.ply \
  --layout output.txt \
  --save output.rrd

次にRerunで表示します。

rerun --web-viewer output.rrd

すると、ブラウザで3Dビューアが起動し、元の点群データに検出されたバウンディングボックスが重ねて表示されます。壁や家具の配置が視覚的に確認できるため、認識精度を直感的に評価できます。

スクリーンショット 2026-02-20 095745.png

なお、プロジェクトサイトにはFloorPlanなどの表示形式とも互換性があると記載されていますが、現時点ではStructuralData形式のみがサポートされています(関連issue)。

image.png

認識精度について

公式サンプルデータ

公式が提供するテストセットの点群データ(scene0000_00.plyなど)では、家具や壁がかなり正確に認識されました。

image.png

自作の点群データ

一方、Scaniverseで自分で撮影した点群データでは、以下のような誤認識が見られました。

  • ベッドがソファと判定される
  • 何もない床面にカーペットが誤検出される
  • 壁の向きが全体的に斜めにずれている

検出された壁がグリッド軸に平行に配置されるため、元の点群の向きがずれていると正しく認識されないようです。

スクリーンショット 2026-02-27 115719.png

アライメントによる精度改善

点群データの軸を水平・垂直に揃えれば精度が向上するのではと考え、Claude Codeにアライメントスクリプトを作成してもらい、再度検出を実行しました。結果、壁の検出方向が大幅に改善されました。

スクリーンショット 2026-02-27 123029.png

家具のみの検出

家具のみを再検出したところ、認識結果が変化しました。ベッド部分が認識されるようになった一方(ただし浴槽として誤認識)、絵画などが認識されなくなったケースもあり、必ずしも精度が向上するわけではないようです。

スクリーンショット 2026-02-27 124343.png

エアコン、机、椅子、カーテン、ベッド(浴槽として認識)などが検出された様子:

スクリーンショット 2026-02-27 124118.png

3DGS(3D Gaussian Splatting)データの変換

3D Gaussian Splatting技術で生成した点群を、通常の点群形式(PLY)に変換して認識を試みました。変換スクリプトはClaude Codeで作成しました。

最初は点群のスケールが適切でなかったため、認識がほとんど機能しませんでした。

スクリーンショット 2026-02-20 105609.png

SpatialLMは点群が実寸スケール(1単位=1メートル)であることを前提として訓練されているため、スケールの正確性が重要です。

そこで、supersplatを使用して手動でスケールを実寸に近づけました。

スクリーンショット 2026-02-27 142133.png

スケール調整後、いくつかの家具が検出されるようになりました。

スクリーンショット 2026-02-27 145913.png

まとめ

SpatialLMを使用して、点群データから室内の構造と家具を抽出することができました。

このような空間認識技術は、いわゆるフィジカルAI の発展に寄与すると考えられます。物理世界を理解したAIやロボットが、空間の構造や物体の配置を認識することで、家事支援ロボットや自律移動システム、建設現場の自動化など、さまざまな実世界タスクを実行できるようになります。

個人的には、将来的に室内の環境情報(日当たり、風通しなど)も考慮して、植物の最適な設置場所を提案してくれるようなアプリケーションがあれば面白いと思います🌼

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?