はじめに
屋外などの広範囲なシーンを Gaussian Splatting で再現する手法が注目を集めています。SNS やブログで関連情報を見かける機会も増えてきましたが、情報が各所に散らばっており、効率的なワークフローを構築するのは容易ではありません。
前回の記事(基本手順編)では、筆者が趣味でのGaussian Splattingで運用している、基本的に無料で使えるツールだけで構成したワークフローの最小構成をご紹介しました。今回は、その手順にほんの少しの工夫を加えるだけで、クオリティをさらに引き上げる方法を解説します。また、無料ツールだけでなく、有償のソフトウェアであるAgisoft Metashapeを用いたワークフローについては「Metashape編」で紹介していますので、興味がある方はそちらもご覧ください。
💡 本記事を読む前に
本記事では Python スクリプトを使用するステップが含まれます。Gaussian Splatting が初めての方や Python に不慣れな方は、まず「基本手順編」で全体の流れを掴んでから挑戦することをおすすめします。
基本手順編との出力比較
下の画像は、基本手順と本記事の手順による出力を比較したものです。タイルの継ぎ目やオブジェクトの輪郭がよりくっきりと再現されていることがわかります。

📝 注意
本記事は単独でも手順を追えるよう、前回と重複するセクションが含まれています。ご了承ください。
基本手順編との違い
前回の記事をすでにお読みいただいた方に向けて、主な変更点をまとめます。
基本手順編(前回):
Equirectangular 画像で SfM と点群を生成 → Cube マップに分割した画像をそのまま Gaussian Splatting の GUI ツールに投入
クオリティ改善編(今回):
Equirectangular 画像で SfM と点群を生成した後、以下の処理を追加します。
1. 上下画像の除外 — 複数の視点に切り出す際、空や地面の割合が多い上下の画像を使用しません。これにより、ノイズの原因となる低テクスチャ領域を削減できます。
2. 点群の再生成 — 切り出した画像をもとに点群を再計算します。SfM 時に使用した Equirectangular ではなく Gaussian Splatting のトレーニング時に使用するピンホールカメラモデルにマッチした点群を生成することで、トレーニング中のノイズ要因を排除します。
⚠️ 前提条件
本記事では、360° カメラを垂直に近い状態を保って撮影していることを前提としています。
動作環境
PC スペック
| 項目 | 環境 |
|---|---|
| OS | Windows 11 |
| GPU | NVIDIA GeForce RTX 4070 SUPER |
| CPU | AMD Ryzen7 8700G |
| RAM | 32 GB |
360° カメラ
- Insta360 X4 Air
※ THETA など他メーカーのカメラでも利用可能です。8K 以上を推奨します。
ソフトウェア
| ソフトウェア | 用途 |
|---|---|
| LichtFeld Studio v0.5.1 | 3D Gaussian Splatting の GUI ツール |
| 360° Gaussian v1.4.2 | Gaussian Splatting の各ステップを自動化するツール(2026/4/8 更新) |
| RealityScan | 点群の再生成に使用 |
| 360-to-RealityScan | SphereSfM の結果を RealityScan で読み込める形式(.xmp)に変換するツール |
その他
- Python 実行環境(360-to-RealityScan 用)
例:Anaconda
全体の流れ
Gaussian Splatting では、一般的に以下のステップを踏みます。
| # | 工程 | 内容 |
|---|---|---|
| 1 | 撮影 | 360° カメラでシーンを撮影する |
| 2 | SfM(Structure from Motion) | 各画像がどの位置から撮影されたかを推定する |
| 3 | 点群生成 | SfM で得られたカメラ位置をもとに点群を生成する |
| 4 | Gaussian Splatting | 点群をもとに 3D Gaussian Splatting モデルを生成する |
本記事では、Step 3 と Step 4 の間に点群の再生成ステップを追加します。
Step 1. 撮影・動画のエクスポート
360° カメラでシーンを撮影します。処理時間が長くなる場合があるため、慣れるまでは 1 分以内の短い動画 でテストすることをおすすめします。
撮影した動画は Equirectangular 形式 で PC にコピーしてください。
Insta360 を使用している場合は、Insta360 Studio(PC 用アプリ)でエクスポートします。
⚠️ 手ぶれ補正に関する注意
手ぶれ補正は ON / OFF どちらでも構いませんが、ON にする場合は以下の項目を必ずオフにしてください。
- 方向ロック
- ティルトリカバリー
- 微振動補正
💡 ヒント
手ぶれ補正を ON にしておくと、カメラが傾いても自動で垂直補正がかかります。厳密に言えば、この補正によって生じるわずかな歪みが後続の処理でノイズの原因となるケースもありますが、まずは手ぶれなどの細かいことを気にせず手軽に試してみたいという場合は「手ぶれ補正 ON」の設定で進めるのもありです。

Step 2. SfM と点群生成
この手順では 360° Gaussian を使用します。
360° Gaussianは、SfMやGaussian Splattingにおいてそれぞれ複数のツールをサポートしているため、ツールや手法の組み合わせを容易に比較検証できるのが特徴です。
詳しい使い方を知りたい方は以下の動画を参考にしてください。
- 📺 基本解説
- 📺 上記動画以降の追加要素の解説
2.1 画像の切り出し
1. 360° Gaussian を起動します
2. Add Video(s) をクリックし、Equirectangular 形式の動画を選択します
3. Splitting を選択し、画像の切り出し条件を設定します
| パラメータ | 説明 |
|---|---|
| Extra frame every | 指定した秒数(またはフレーム数)のインターバルで画像を切り出す |
| Sharp frame extraction | 前後のフレームと比較して、ボケの少ない画像を優先的に選択するかどうか |
| Sharpness check range | 例えば 10 の場合、前後 5 フレームを比較して最もシャープな画像を選択する |

2.2 画像のマスク(オプション)
AutoMasker は、Gaussian Splatting の処理に不要な領域を自動でマスクしてくれるツールです。
ℹ️ この手順はオプションです
AutoMasker を使用しない場合は、2.3 SfM の設定 へスキップしてください。
1. AutoMasker をクリックします
2. Use AutoMasker をオンにします
3. Detection Keywords にピリオド(.)区切りでキーワードを入力します
例:person.sky

💡 マスクが重要な 2 つの理由
まず、人・車・低テクスチャオブジェクトなど動いたり特徴点の少ない被写体は SfM のノイズになりやすく、カメラ位置の推定精度を下げます。SfM の精度はその後の Gaussian Splatting の出力品質に直結するため、これらをマスクで除外することが重要です。
さらに、トレーニング段階でも同様のノイズが品質を低下させます。同じ被写体が場所によって異なる見た目で映り込むと、Gaussian が正しい形状・色に収束しにくくなります。マスクはこの両方の工程でクオリティを守る役割を果たします。
📺 参考動画
📝 AutoMasker について
AutoMasker は有償(46€)ですが、独立したアプリとして単独で動作するため、360° Gaussian を使った Gaussian Splatting の自動化ワークフローだけでなく、Gaussian Splatting 以外の用途(360° 画像へのマスク処理全般)にも幅広く活用できます。
類似ツールを購入するよりもこれを利用・導入する方を検討することをお勧めします。
購入後の 360° Gaussian との連携設定については、こちらの動画 を参考にしてください。
2.3 SfM の設定
1. Alignment をクリックします
2. Training Method を設定します
LichtFeld を選択すると、SfM・点群生成・Gaussian Splatting まで一括で実行できます。ただし、LichtFeld Studio のウィンドウが開かない状態で処理が進むため、過程を確認できません。
筆者は処理の経過を観察したいため、以下のように設定しています。
- Training Method:
No Training - SfM:
SphereSFM GUT
⚠️ 基本手順編との違い
基本手順編ではSphereSFMを選択しましたが、本記事ではSphereSFM GUTを使用します。お間違いのないようご注意ください。

3. Advanced SphereSFM Setting を開き、Preset からカメラの画像サイズを選択します
例:8K で撮影している場合は Ultra (8K) を選択

4. Matcher で sequential を選択します
360°Gaissian v1.4.0 から Loop detection with vocabulary tree がサポートされたため、ループクロージング性能が大幅に向上しました。
その他の設定はデフォルトのままで問題ありません。
参考として、筆者が実際によく使う設定例を以下に示します。

💡 sequential でうまくいかない場合:exhaustive を最終手段として試す(開く)
sequential でうまくいかない場合は、最終手段として exhaustive を試す方法があります。全画像ペアを総当たりでマッチングするため処理時間は大幅に増加しますが、sequential では繋ぎきれなかった画像ペアをカバーできる可能性があります。
設定の一例として、筆者が比較的広域の撮影で使用している設定を以下に示します。

デフォルト設定と比べて計算回数が多くなり多少時間を要しますので、まずはデフォルト設定で試してみましょう。
筆者の推奨する設定方針は以下の通りです。
- Iterations(Global)・Refinements(常時:高め)
- 高めに設定することで、インライア率が低い難しいペアに対しても正しい位置関係(ジオメトリ)を見つけやすくなります。
- MinInliers(最小インライア数)
- 広範囲のエリア(低め):低めに保ちます。特徴点が少なく「弱いマッチ」と判定されがちなペアも検証を通過しやすくなり、ループ接続のわずかな糸口を取りこぼしにくくなります。
- (補足)狭いエリア(高め):画像間で多数の特徴点が安定して一致するため、あえて高めに設定し「確実なマッチング」のみを採用することで誤マッチングを排除でき、より精度が高まります。
- Reprojection threshold(再投影誤差の閾値)
- 広範囲のエリア(緩め):照明・天候・遠近の変化などでループ始点・終点の視点変化が大きくなります。ここで閾値を厳しくすると特徴の少ない場所でのマッチが弾かれ、ループがクローズ(接続)しない原因になるため、シーンの多様性に合わせて許容度を緩めに設定するのが基本です。
- (補足)狭いエリア(厳しめ):画像間の視点変化が小さく特徴点が安定するため、逆に閾値を厳しく(きつめに)設定しても十分な点が残ります。これによりノイズを排除でき、より高精度なカメラ位置推定が可能になります。
つまり、広域スキャンにおいては「丁寧に検証して(Iterations(Global)/Refinements 高め)、その結果は捨てず(MinInliers 低め)、空間の多様性に合わせて許容度を上げる(Reprojection threshold 緩め)」という組み合わせによって、SfMの成功率を最大限に引き出す狙いがあります。
2.4 SfM の実行
Start をクリックして SfM を実行します。
処理が完了すると、以下のような画面が表示されます。

カメラの位置情報と点群が正しく生成されていることを確認してください。
📁 動画が置かれたフォルダ
└── 📁 動画名と同じフォルダ
└── 📁 lichtfeld
├── 📁 images
├── 📁 masks
├── 📄 pointcloud.ply
└── 📄 transforms.json
次のステップの準備として、lichtfeld フォルダと同じ階層に RealityScan フォルダを作成しておきます。
📁 動画が置かれたフォルダ
└── 📁 動画名と同じフォルダ
├── 📁 lichtfeld
│ ├── 📁 images
│ ├── 📁 masks
│ ├── 📄 pointcloud.ply
│ └── 📄 transforms.json
└── 📁 RealityScan ← 作成したフォルダ
Step 3. 点群の再生成
ここが本記事のポイントとなるステップです。SfM で得られた結果を RealityScan に取り込み、ピンホールカメラモデルに適した点群を再生成します。
3.1 入出力ファイルの設定
1. ターミナル(Python 実行環境)を開き、以下のコマンドを実行して spheresfm_to_realityscan.py を起動します
cd C:\path\to\360-to-RealityScan python spheresfm_to_realityscan.py
📝 補足
Python スクリプトの取得方法および環境設定方法については、以下のリポジトリの README を参照してください。
https://github.com/TakashiYoshinaga/360-to-RealityScan
2. 以下のように各パスを指定します
| 項目 | 指定先 |
|---|---|
| transform.json | lichtfeld フォルダ内の transforms.json |
| PLY file (optional) | lichtfeld フォルダ内の pointcloud.ply |
| Input folder (equirectangular) | images フォルダ |
| Mask folder (equirectangular, optional) | masks フォルダ |
| Output folder | 作成した RealityScan フォルダ |
3.2 分割設定
基本的にはデフォルトのままで問題ありません。
| パラメータ | 説明 |
|---|---|
| Additional Pitch Angles | 赤道(画面上下中央 = 0°)は常に自動で含まれます。Equirectangular 画像の中央から上下に何度か傾けた方向も切り出したい場合は、カンマ区切りで角度を入力します(例:-45,45 で中央から上45°・下45°を追加)。空欄のままにすると赤道方向のみが切り出されます |
| Split Count (Equator) | 赤道方向の分割数。デフォルトは 6 です。4 に設定すると Cube マップの側面のみになります |
💡 Additional Pitch Angles の補足
撮影シーンによっては、上下方向の画像を加えることで Gaussian Splatting の出力品質が向上する場合があります。たとえば床や天井にタイルや模様など特徴的なテクスチャがある場合は、-45,45のように仰角・俯角を追加してみてください。
3.3 変換の実行
Start Conversion をクリックして変換を実行します。
完了すると以下のような画面が表示されます。

SfM の結果を RealityScan に取り込む準備が整いました。
📝 補足
transforms.jsonと PLY ファイルを両方指定して実行した場合、カメラ姿勢・点群・画像情報をすべて含む完全な COLMAP 形式のデータが出力されます。
RealityScan による点群の再生成は不要で、このツールで分割した画像をそのまま Gaussian Splatting に使用したい場合は、Step 4. Gaussian Splatting に進んでください。
3.4 RealityScan での点群生成
1. RealityScan を起動します
2. WORKFLOW タブをクリックします
3. Folder をクリックし、RealityScan フォルダ内の all フォルダを指定します
4. Inputs を開き、Ctrl + A ですべての画像を選択します

5. 以下のように詳細情報を設定します
| カテゴリ | 項目 | 設定値 |
|---|---|---|
| Prior pose | Absolute pose | Locked |
| Prior calibration | Calibration group | 0(すべてのカメラを同じ設定にする) |
| Prior | Fixed(画角固定) |
|
| Prior lens distortion | Lens group | 0(すべてのカメラを同じ設定にする) |
| Prior | Fixed(歪み固定) |

6. ALIGNMENT タブをクリックします 7. Align Images をクリックします

処理が完了すると、点群が再生成されます。

3.5 エクスポート
【カメラの位置姿勢情報と点群を COLMAP 形式でエクスポート】
1. WORKFLOWタブをクリックします
2. Export をクリックします
3. COLMAP をクリックします
4. RealityScan フォルダに任意のファイル名(例:colmap)で保存します
📝 ファイル上書きに関する注意
spheresfm_to_realityscan.pyで出力されたcameras.txt・images.txt・points3D.txtは上書きされます。上書きしても問題はありませんが、点群再生成前の COLMAP ファイルを保存しておきたい場合は、事前に別のフォルダに退避してください。
5. Export Dialog で Directory structureをFlatにします
6. Export masks を No に設定します
7. Export images を一旦 Yes に設定します
8. Export image setting が表示されます
9. Image format を jpg に設定
10. Naming convention を original file nameに設定
11. Export images を一旦 No に設定します
12. OK をクリックします

💡 ヒント
allフォルダとその中の画像は RealityScan での処理(点群生成など)のためだけに使用されます。そのため、エクスポート完了後に不要になれば削除して構いません。もし再度必要になった場合は、spheresfm_to_realityscan.pyを実行することでいつでも再生成できます。
Step 4. Gaussian Splatting
4.1 データの読み込み
1. LichtFeld Studio を起動します
2. 動画名フォルダ直下の RealityScan フォルダをウィンドウにドラッグ&ドロップします
3. Load DataSet ダイアログが表示されたら、そのままLoad をクリックします

点群と画像が正しく読み込まれたことを確認してください。
カメラ画像の表示が不要な場合は、画面右側の Rendering タブにある Camera Frustum のチェックを外します。

4.2 トレーニング設定
ここではトレーニング設定の一例を紹介します。慣れてきたらさまざまな設定を試してみてください。
1. Training タブをクリックします
2. Strategy で MRNF を選択します
3. Steps Scaler を適宜設定します
| 条件 | 推奨値 |
|---|---|
| 画像数が 300 枚以下 | 1 |
| 画像数が 300 枚以上 | 画像枚数 / 300 |
⚠️ トレーニングがうまくいかない場合
上記の設定で実行してもGaussian Splattingのトレーニングが進むにつれて収束せずにホワイトアウトしてしまう場合は、Steps Scaler を画像枚数 / 300の 2〜3 倍 に設定すると安定しやすいです。
4. Max Gaussians で最大ガウシアン数を設定します
基本的にはデフォルト値で問題ありませんが、ディテールが不足していると感じたら値を増やしてみてください。
オプション設定:
Auto Maskerを使ってマスク画像を作成した場合のみ下記の設定を行います。
- Mask Mode → Ignore に設定
- Use Alpha as Mask → チェックを外す

他のパラメータについては、まずは上記の設定で進め、慣れてきてから試行錯誤してみてください。
4.3 トレーニングの実行
1. マウス操作で、トレーニングの経過を観察したいエリアにクローズアップしておきます
(筆者の例では橋の周辺)
2. Start Training をクリックしてトレーニングを開始します
3. 最初はぼんやりとした表示ですが、ステップが進むにつれて徐々にクリアになっていきます

トレーニングステップが上限に達すると自動で終了します。
途中経過を保存しておきたい場合は、Save Checkpoint をクリックするとその時点の結果を記録できます。
4.4 エクスポート
出力したデータは SuperSplat Editor などのツールを使って、動画作成やビューワーでの閲覧に活用できます。
1. File → Export をクリックします
2. 出力フォーマットを選択します(例:.ply)
まとめ
屋内・屋外のさまざまなシーンで検証を重ねた結果、基本手順に少し工夫を加えるだけでクオリティを明確に向上できることが確認できました。ポイントは以下の 2 点です。
1. 低テクスチャ領域(上下画像)の除外 によるノイズ削減
2. ピンホールカメラモデルに合わせた点群の再生成 によるトレーニング精度の向上
これらに共通する考え方として、質の高いアウトプットには質の高いインプットが不可欠という点が挙げられます。
- SfM では、高品質な入力画像と適切なマスク情報がカメラ位置推定の精度を左右します。
- Gaussian Splatting のトレーニングでは、その SfM の精度に加え、引き続き高品質な画像とマスクがアウトプットの品質を決定づけます。
各ステップでインプットの質を意識して整えていくことが、クオリティ向上への近道だと筆者は考えています。
本記事の手順をベースにさらなるアレンジを加えることで、より高品質な Gaussian Splatting を追求できるはずです。
出力サンプル
下の動画は、基本手順編よりも広域を撮影したシーンへの適用結果です。基本手順編ではトレーニングが収束せず奇麗な出力が得られませんでしたが、本記事の手法でうまく処理できました。
