第4章 — 補助ウィンドウ
メインウィンドウ (3D Viewport と Inspector) に加えて、RadianceKit は Help メニュー から開く 7 つの追加ウィンドウを管理します。上から下の順番: User Guide (⌘?)、 Keyboard Shortcuts (⌘/)、Open Training Logs… (アプリウィンドウではなく Finder を 開くため、ここでは扱いません)、Manage Storage…、Pareto Dashboard… (⇧⌘D)、 Holdout Analysis… (⇧⌘H)、BayesOpt Console… (⇧⌘B)。そのうち 3 つ — Dashboard、 Holdout、BayesOpt — は独立した分析ツールです。それぞれ独自の ViewModel スタックを 持ち、ディスク上の JSON ファイルを読み書きし、各ウィンドウをアプリ起動時に特定の ファイルを表示するように指定する CLI 引数があります (–dashboard-dir、 –holdout-file、–bayesopt-autorun)。
4 つのシンプルなウィンドウ (User Guide、Keyboard Shortcuts、Manage Storage、加えて サブメニュー項目 Open Training Logs / Open Exports Folder) は、コントロールごとに 短いエントリを得ます。3 つの分析ウィンドウはより詳細に記載されています — それぞれ、 ウィンドウで何を見るか、いつ開くべきか、表示される画像をどのように解釈するかを 説明する導入付きです。
章末には、メインウィンドウの Inspector へのクロスリファレンスセクションがあります: 実行中のトレーニング中にライブ Loss チャートと Gaussian Count 表示で意味を持って 読み取れるもの。
User Guide (W1〜W4)

何か: アプリに同梱されている guide_<言語>.md をレンダリングする 組み込みヘルプウィンドウ。言語は設定 (タブ General → Language) から、または そこに「System」がある場合は macOS 言語設定から導出されます。レイアウトは 古典的: 左にすべての見出しがあるサイドバー、右に本文。
単一の点について素早いリマインダが必要な場合 — キーワード代替として。詳細なリファレンスはこのマニュアルです。組み込みヘルプ ウィンドウは、コマンドラインの –help に近いものです。各アプリリリースで 更新されますが、内容的にはより表面的に保たれています。
W1NavigationSplitView (サイドバー + 詳細)
場所
Help → User Guide (⌘?)。
技術詳細
コンテンツツリー用の狭いサイドバー (最小 180 pt 幅) と、実際の Markdown コンテンツ用のスクロール可能な詳細領域を持つ 2 列レイアウト。ウィンドウは 700 × 500 pt の最小サイズです。最初に開くとき、ウィンドウは適切な guide_<lang>.md をアプリバンドルから読み込み (フォールバック guide_en.md)、 ブロックレコード (H1〜H4 見出し、段落、リスト、テーブル、区切り線) に解析し、 サイドバー用に見出し構造を別に抽出します。インラインフォーマット (Bold、 Italic、Code-Span) は組み込み Markdown エンジンでレンダリングされます。言語は アプリ設定から読み取られ、これらのバリアントが zh または pt と異なるため、 中国語 (zh-Hans) とブラジルポルトガル語 (pt-BR) は完全なロケールタグとして 保持される特別なケースです。
W2List (見出しサイドバー)
場所
User Guide ウィンドウの左カラム。
技術詳細
現在の Markdown ドキュメントのすべての H2 と H3 見出しのリスト。 H2 エントリはインデントなしで Medium フォントウェイト、H3 エントリは左に 16 pt の インデントと縮小された前景スタイルで表示されます。H4 以下は無視されます。 深度がさらに深くなるとサイドバーが見にくくなるためです。アンカー ID は見出し テキストから slugification 経由で生成されます (小文字 + スペースをダッシュに + 文字/数字/ダッシュに対するフィルタリング — GitHub が Markdown アンカーで使用するのと 同じアルゴリズム。そのため、ドキュメントへの外部 URL も同じアンカーに到達する 可能性があります)。リストはネイティブ macOS スタイルを使用します。
W3Button (見出し → アンカージャンプ)
場所
サイドバーの行ごとに 1 つのボタン。
技術詳細
各サイドバーエントリはボタンで、現在のアンカーを設定しますが、視覚的には リストエントリのように見えます。次に Observer 変数が、対応するアンカーへの スクロールジャンプを 0.3 秒のソフトアニメーションでトリガーします。ジャンプ後、 同じアンカーへの次のクリックが再び発火するように、アンカー値がリセットされます (そうでなければ、値が変わっていないため、Observer は再度トリガーされません)。
W4ScrollView (詳細コンテンツ)
場所
右カラム。
技術詳細
スクロール可能で垂直に積み重なるコンテンツ領域で、長いガイドが簡単に 200 以上の Markdown ブロックを持つ可能性があるため、Lazy レンダリングが使用されます — 非 Lazy バリアントはすべてを同時にインスタンス化します。各ブロックは独自の ID を 取得します。見出しアンカー (ジャンプ可能な H1〜H3 用) またはインデックス プレースホルダーのいずれか。最大幅は 720 pt、パディングは水平 32、垂直 24 で、 長い行が読みやすいレイアウトを保ちます。テーブルは水平スタックと区切り線で セル単位でレンダリングされます。インラインコードは組み込み Markdown エンジンに よって。実際のコードブロックは現在段落として扱われます — Help ウィンドウの 既知の制限。
Keyboard Shortcuts (W5〜W6)

5 つのセクションでの静的 リファレンスリスト。Navigation: Mouse Drag (Orbit/Fly)、Shift+Drag/Right-Drag (Pan)、 Scroll (Zoom)、WASD (Fly-Through 移動)、Q/E (Up/Down)、F (Orbit/Fly 切り替え)、 ダブルクリック (再センター)、Cmd+Scroll (FoV 調整)。Views: R (Reset Camera)、T (Auto-Rotation)、P (Camera Playback)、B (Background-Cycle)、0〜9 (Training-Cam 1=10%/5=50%/0=last にジャンプ)、左/右矢印 (Prev/Next Cam)。Capture: S (Desktop に Screenshot)、V (Turntable Video)、C (Copy Camera Info)。Editor: Tab (Edit モード)、Click/Drag (Paint-Select)、Option+Click (Deselect)、X / Delete (選択を削除)、Cmd-Z (最後の削除を取り消し)、[ / ] (ブラシサイズの縮小/拡大)、 Esc (選択解除)。Training: Start、Pause/Resume、Cancel、Continue +5K/+10K/+20K M9〜M14 のメニューショートカット経由。
何か: すべてのキーボードショートカットのシンプルな静的概要 — Navigation、Views、Capture、Editor、Training。コンテンツはハードコードされており、 Markdown ロードはありません。
Viewport で何かを行う最も速い方法を探している場合。 WASD Fly-Through、カメラリセット用 R、背景循環用 B — すべてここにあります。
W5ScrollView (コンテンツ領域)
場所
Help → Keyboard Shortcuts (⌘/)。
技術詳細
垂直リストが含まれるシンプルなスクロール領域。20 のパディングが全周囲、 サイドバーナビゲーションツリーなし (リストは十分短い)。コンテンツは 5 つの セクション (Navigation、Views、Capture、Editor、Training) にグループ化されています。 キーの組み合わせごとに、両カラムに翻訳可能なテキストを持つ 1 行。左カラム (キーコード) は 180 pt 幅に固定されているため、右側の説明は垂直に整列したまま。 スクロール以外の操作はありません — 行をクリックしても何もトリガーされません。 ショートカットは、メニューと Viewport の実際のキーボード修飾子です。
W6VStack (ショートカットセクション)
場所
ScrollView 内。
技術詳細
16 pt の間隔で左揃えにスタックされたセクション。5 つのセクション内に それぞれ見出し + 行のシーケンス。見出しはセカンダリサブヘッドラインスタイルを使用 します — セクションはナビゲート可能である必要がないため、Title フォーマットは 意図的に使用しません。コンポーネントがすべての macOS バージョンで変更なしで実行され、 ファイルが読みやすいままになるように、コンテンツは意図的にフラット (Disclosure、 Search、Filter なし) です。
Manage Storage (W7〜W12)

RadianceKit が管理する すべてのファイルのテーブルビュー。ヘッダーは 693 アイテム、16.74 GB の合計サイズを カウントします。上部のツールバー: 「Show in Finder」+ 「Refresh」。各行: PLY アイコン、ファイル名 (例えば training_20260527T211321Z.ply)、エクスポート日、 サイズ (7 KB から 218 MB まで変動)、虫眼鏡アイコン (Reveal)、ゴミ箱アイコン (Move to Trash)。ファイルは日付でソートされ、最新のものが上にあります。この デモ撮影では、–benchmark で多く作業したため、PLY エクスポートが優勢です。
何か: RadianceKit が ~/Documents/RadianceKit/ 以下に配置するすべての ディスク使用量概要 — ログ、エクスポート、シーン、キャプチャバンドル (iOS コンパニオンから)、インポート (入力画像のステージングコピー)。エントリごとに バイト単位のサイズと 2 つのボタン: 「Finder で表示」と「ゴミ箱に移動」。自動 クリーンアップは NOT — アプリ自体は何も削除しません。エントリごとに決定します。
ディスクがいっぱいになったとき。特にログが蓄積されます (トレーニング試行ごとに 1 つの JSONL、加えて _qualityMetrics.json)。 エクスポートも当然 (PLY 100% 生データ、エクスポートごとに 1 つ)。クラッシュ後、 インポートステージングディレクトリがまだ入力画像の古いコピーを保持している場合 にも便利です (dev_v549f-needle-reduction.md の「Disk-pressure incident」参照)。
W7ボタン「Show in Finder」
場所
Storage ブラウザウィンドウの右上のヘッダー。
技術詳細
Finder で RadianceKit ディレクトリ全体 (~/Documents/RadianceKit/) を 開き、フォルダ構造を直接見て、Finder 自体で操作することもできます。アクションは 新しい Finder ウィンドウを開き、アプリ Sandbox コンテナに切り替えません — ~/Documents/RadianceKit/ はアプリに通常アクセス可能な Documents ドメインで、 Sandbox コンテナパスではありません。
W8ボタン「Refresh」
場所
ヘッダー、Finder ボタンの隣。
技術詳細
大きなディレクトリツリーのスキャンが UI をブロックしないように、ユーザー 開始の非同期タスクで実行されるバックグラウンドスキャンをトリガーします。実際の ウォークは、各既知のサブフォルダ (Logs、Exports、Scenes、Captures、Imports) を 通過し、直接の子ごとに Storage エントリを生成します。エントリごとに、再帰サイズが 決定されます — 論理ファイルサイズへのフォールバックとともに、実際のディスク使用量 (APFS ハードリンク共有を含む) を優先します。
W9List (Storage エントリ)
場所
ヘッダー下のメインコンテンツ。
技術詳細
行ごとに次のレイアウトを持つリスト: カテゴリ固有の SF Symbol アイコン (Logs 用ドキュメント、Exports 用アップロード矢印、Scenes 用キューブ、Imports 用 トレイ)、名前 + サブタイトル (Kind ラベル + フォーマットされた変更日)、右側の バイトカウンター (右揃え、monospace)、Reveal ボタン (虫眼鏡シンボル)、Trash ボタン (ゴミ箱)。ソート: 主に種類別 (最初に Scenes、次に Exports、Logs、Captures、 Imports、Other)、次に変更日降順 (最新が上)。スキャンが実行中の場合、その場所には 代わりに「Scanning…」進捗が表示されます。何も見つからない場合、Tray アイコンを 持つ空状態表示。
W10行ボタン「Reveal in Finder」
場所
行ごと、右側の虫眼鏡シンボル。
技術詳細
Finder を開き、特定のアイテム (ファイルまたはフォルダ) を選択します。 W7 との違い: W7 はルートディレクトリを開きます。W10 はこの 1 つのエントリを 正確にマークします。実用的なワークフロー: 大きなエントリを識別し、虫眼鏡を クリックし、例えば外部ボリュームにコピーします。
W11行ボタン「Move to Trash」
場所
行ごと、虫眼鏡の隣の右側のゴミ箱シンボル。
技術詳細
確認ダイアログボックス (W12) をトリガーします。確認後にのみ、macOS 標準の 「ゴミ箱に移動」操作が実行されます (つまり、可逆的、直接削除ではありません)。 ゴミ箱への移動が成功した後、エントリはリストから削除され、合計バイトカウンターが 更新されます。エラーが発生した場合、モーダルエラーダイアログが表示されます。
W12ConfirmationDialog (削除確認)
場所
W11 によってトリガーされ、macOS シートとして表示されます。
技術詳細
動的タイトル「Delete <name>?」と、エントリがゴミ箱に着地し、そこから 復元可能であることを明示的に指摘するメッセージ行を持つ標準確認ダイアログ (ゴミ箱が空にされるまで)。2 つのボタン: 破壊的アクションとしての「Move to Trash」 (赤で表示) と自動 Esc バインディングを持つ「Cancel」。可逆的削除に対する macOS 標準であるため、ダイアログはアプリ全体ではなくこのウィンドウのみをブロックする 意味で非モーダルです。
Pareto Dashboard (W13〜W22)

空状態 (最初に開いた後) — 「Open Reports Folder…」コールトゥアクション付き 空状態。トレーニングレポートが読み込まれるとすぐにデータポイントが表示されます。 次のショット参照。

ヘッダーツールバーは 「129 reports of 129」を表示します (選択されたフォルダ内のすべてのレポートが 正常に解析されました — 21 の追加ファイルは古いフォーマットのため解析できません でした。右側のヒントリスト参照)。軸: X 軸ピッカーは Gaussians、Y 軸ピッカーは PSNR (dB) 上。Scatter Plot: 緑のポイント = Classic 戦略、青のポイント = MCMC。 破線 Pareto Front 線は、最高達成された PSNR 値に沿って実行され、約 500K Gaussian から PSNR≈30 dB でプラトーになります。右側のフィルターチップ: 7 シーン (bicycle、bonsai、family、flowers、kitchen、stump、truck)、2 戦略 (classic、 mcmc)、3 Mip-Splatting オプション (All、On、Off)。現在、すべてのフィルターが 開いているため、密なポイントクラスター。
何か: マルチ実行比較ツール。過去に複数のシーンまたは同じシーンを異なる プリセットでトレーニングしました — これらの各トレーニング実行は (–benchmark を 渡したか、ベンチマーク機能経由で呼び出した場合) Final PSNR、SSIM、LPIPS、Gaussian カウント、Wallclock 時間を含む JSON レポートファイルを生成します。Dashboard は そのようなレポートのフォルダ全体を同時に読み込み、選択可能な軸を持つ 2D Scatter としてプロットします。さらに、Pareto Front (支配されない点のセット) が破線として 描画されます。
少なくとも 3 つまたは 4 つのトレーニングレポートを作成した後。 少ないポイントでは、Frontier ラインは意味がありません。典型的なユースケース: 屋外シーンを再構築しようとし、順次 P3 Balanced (Classic)、P4 Quality (Classic)、 P7 MCMC Quality、P9 Outdoor (tuned) を試しました — 今、どの構成が秒あたりの 最良のトレーニング時間 PSNR を提供するか、または特定の PSNR に必要な最小の Gaussian を提供するかを知りたいです。
両軸は自由に選択可能 (X 軸:、、psnr、ssim、 lpips など。Y 軸も同じ)。ParetoFront2D.indices の Pareto Front ロジックは、 メトリックごとに「小さい = 良い」(例えば LPIPS、Loss、Time) または「大きい = 良い」 (PSNR、SSIM) かを知っています — したがって、線は軸の選択に応じて左下から右上、 または左上から右下に実行され、常に最高達成された組み合わせに沿って。点は、 他の点が両方の次元で少なくとも同じくらい良くない場合、Pareto 最適です (つまり、他の点が支配しません)。Pareto 最適点は線上にあり、他の点は線の右/上 (軸の方向に応じて) にあります。線上の点は「最高のプリセット」の本当の候補です。 線から遠い点は無駄なトレーニング時間です。
選択を特定のシーン (例えば屋外実行のみを比較したい 場合)、特定の戦略 (Classic または MCMC)、または Mip-Splatting オン/オフ (Phase Q1.5 以降に関連、ここで Mip は opt-in Advanced フラグとして残ります) に 制限できます。
「truck」シーン用の 3 つのレポートが ~/Documents/RadianceKit/Reports/ の下にあります: Run A (P4 Quality、40K 反復、 524K Gs、105 秒、PSNR 23.4)、Run B (P7 MCMC、200K 反復、150K Gs、693 秒、 PSNR 24.6)、Run C (P9 Outdoor、100K 反復、1.25M Gs、312 秒、PSNR 25.8)。X 軸を trainingTime に、Y 軸を PSNR に設定します。Run B は右上に、Run C はさらに右上に、 Run A は左下にあります。Pareto Front は A と C を接続します — 両方とも 支配されていません。Run B は「失われ」ています (C は Time と PSNR の両方で より良い)。洞察: 「truck」では MCMC デフォルトは価値がありません。高速 + OK (A) または長く + 非常に良い (C) のいずれか。C からの構成を独自プリセットとして保存 (Inspector → I1 Save Preset)。
次のアクション: 最良の構成をプリセットとして保存します。具体的に: Pareto 点を見て (Hover でツールチップに PSNR/SSIM/LPIPS/Gs/Time が表示)、 Time vs Quality トレードオフが最も適しているものを決定し、対応するレポートを 開き (ファイル名に Run タイムスタンプが含まれます)、そのトレーニング構成を 新しい実行にコピーするか、次のトレーニングセッション後に Inspector 経由で プリセットとして保存します。
W13ボタン「Open Reports Folder…」
場所
左上のツールバー。
技術詳細
「Select a folder containing benchmark .json reports」プロンプト付き フォルダ選択ダイアログを開きます。確認後、フォルダ内のすべての .json ファイルを 順次解析するバックグラウンドタスクが実行されます。欠陥のあるレポート (破損 JSON、 誤ったスキーマ) が収集され、サイドバーの下に「N file failed to parse」として 表示されます — クラッシュなし。最初のロードが実行中の場合に 2 回目のクリックが 発生すると、以前のタスクが中止され、2 つの結果が同時に状態に書き込まれないように します。
CLI 経由でも: –dashboard-dir /path/to/reports はアプリ起動時にフォルダをロード します。
W14ピッカー「X-Axis」
場所
チャートの上、左。
技術詳細
Dashboard モジュールのすべての利用可能なメトリック軸 (PSNR、SSIM、 LPIPS、Gaussian カウント、トレーニング時間など) を持つメニューピッカー。 デフォルトは Gaussian カウントです。切り替え時、Hover ポイントがリセットされます。 以前にハイライトされた位置が、軸変更後の古い軸座標系で意味をなさないためです。 ピッカーはコンテンツ幅に制限され、幅全体に引き伸ばされないようにします。
W15ピッカー「Y-Axis」
場所
チャートの上、X 軸の隣。
技術詳細
W14 と同じですが、デフォルトは PSNR です。軸選択は独立して保存される ため、ユーザーはナンセンスな組み合わせ (X=PSNR、Y=PSNR — すべての点を対角線に 配置します) を選択することもできます。しかし、そのような組み合わせはキャッチ されません。意図的な決定です。「SSIM vs PSNR」の比較は、メトリックがどれだけ 一貫して動作するかを見るために十分興味深いからです。
W16トグル「Show Pareto Front」
場所
軸ピッカーの右隣。
技術詳細
標準 macOS トグル。アクティブな場合、Pareto チャートでは点群に加えて、 計算された 2D Pareto Front の線が描画されます。スタイル: 破線 (ダッシュパターン 4–4)、グレー半透明、線太さ 1.5 pt。Pareto 計算はメインスレッドで実行されます — 典型的なレポート数 (≤ ~50) では問題なく高速です。トグルがオフの場合、線は省略 され、生の点のみが表示されます。
W17チップ「Scene」フィルター
場所
Dashboard ウィンドウの右サイドバー。
技術詳細
ロードされたレポートに表示される各シーン用のフィルターチップ。幅が使い 果たされるとすぐに、チップを複数行に自動的に再パッキングする独自の Flow Layout。 アクティブなチップはアクセント背景を取得し、非アクティブなチップは中立的な標準 マテリアル背景を取得します。複数選択が可能 (Set セマンティクス)。チップが選択 されていない場合、すべてのシーンが「通過」と見なされます — つまり、Set ロジックは 「空の選択 = すべて」であり、「空の選択 = 何もない」ではありません。
W18チップ「Strategy」フィルター
場所
サイドバーの Scene フィルターの下。
技術詳細
W17 と同じですが、トレーニング戦略用 — 通常、ベンチマークレポート JSON の Strategy フィールドから導出された 2 つの値「classic」と「mcmc」。両方の 戦略のレポートを混在させ、1 種類のみを表示したい場合 (例えば、Classic を すでに除外しているため「MCMC 実行のみを表示」) に役立ちます。
W19チップ「Mip-Splatting」フィルター
場所
サイドバーの Strategy フィルターの下。
技術詳細
3 値フィルター (W17/W18 のような Set ではなく): 「All」/「On」/「Off」。 背景: Mip-Splatting は Phase Q1.5 で実験的マルチスケール改善として評価され、 最終評決は「全体的に良い勝利はない。opt-in フラグとして保持」でした。Mip on/off 比較を行う場合、しばしば非常に明確に区別したいです。したがって、状態「すべて通す」、 「Mip オンのみ」、「Mip オフのみ」を持つ専用の三値フィルター。サイドバーセクションは、 データセットに少なくとも 1 つの Mip レポートと少なくとも 1 つの非 Mip レポートが ある場合にのみ表示されます (そうでなければ、フィルタリングは意味がありません)。
W20ChipButton (フィルタートグル、all/on/off)
場所
ヘルパーコンポーネント、W17/W18/W19 で使用。
技術詳細
ミニマリストのボタンラッパー。コンテンツ: Caption フォントグレードの ラベルテキストとパディング水平 10 / 垂直 5。条件付き背景: アクティブな場合 → 白いテキストでアプリのアクセント色。それ以外、黒いテキストで中立的な標準 マテリアル背景。形状はカプセル (薬丸状)。Capsule マテリアルがシステム境界線で オーバーレイされないように、Plain ボタンスタイル。
W21チャート (Pareto Scatter)
場所
Dashboard の中央領域。
技術詳細
2 つのレイヤーを持つ Swift Charts ダイアグラム: 1. レポートあたり 1 つの ポイント — 選択された X と Y メトリックからの位置、戦略による色、Mip ステータスに よる Symbol。Symbol サイズ通常 80、ハイライトされた 200 (ID が現在 Hover された レポートに対応する場合)。2. Pareto Front 用の線、トグルがオンの場合のみ。
チャートオーバーレイ: 透明な長方形がマウス移動を登録します。フレームごとに、 プロットフレーム内の最も近いユークリッドポイント位置が決定され、距離が 24 px 未満の場合は Hover されたレポートが更新されます (そうでなければリセット)。これで、 クリックせずにツールチップを取得できます — Hover で十分です。
W22ツールチップ (Hover 詳細)
場所
チャートの下、Hover 時に表示。
技術詳細
水平スタック: シーン名 (Headline)、Strategy タグ (Caption)、区切り線、 次に PSNR/SSIM/LPIPS/Gs/Time メトリックがそれぞれ小さな垂直グループ (ラベル + monospace 値) に。Mip が有効化されていた場合、アクセント色の追加の「Mip」 Capsule タグも。背景は半透明 Blur、8 pt 半径の角丸長方形。マウスが実際にポイント上に ある場合にのみ表示。離れると自動的に消えます。
Holdout Analysis (W23〜W29)

「Open transforms.json…」コールトゥアクション付き空状態と空状態。NeRF Studio と Instant-NGP 形式を受け入れます。
空状態 (最初に開いた後) — カメラマーカーは transforms.json がロードされる とすぐに表示されます。次のショット参照。

ヘッダーはロードされた ファイル (transforms_train.json) と Cam カウント (「100 cameras」) を表示 します。左サイドバー: 2 つのオプションを持つ Strategy ピッカー — アクティブな Angular (longitudinal) (Fold を球体上の経度/緯度セクターに合わせます。各 Test fold が幾何学的に密になるように) vs Linear (round-robin) (順序ベース、 すべての k 番目のフレームを Test セットとして)。k-Folds スライダーは 5、Test Fold ピッカーは Fold 1。Export ボタンは Nerfstudio/Instant-NGP 用の fold-assignment.json を生成します。中央パネル: 全 100 カメラの 3D グローブ 投影 — 緑のポイント = Train、赤のポイント = 現在の Test fold (20 カメラの Fold 1)。右サイドバー (Angular Correlation): Fold あたり 20 Cams + Mean Nearest Angle (Fold 1: 7.9°、Fold 2: 7.8°、Fold 3: 7.7°、Fold 4: 7.0°、Fold 5: 6.3°) — 小さい値は、この Fold 内のカメラが互いに密接に位置していることを意味します。 つまり、Holdout 分割は空間的にコヒーレントです。
何か: クロス検証ロジックを備えたカメラ配置の 3D ビジュアライザー。 transforms.json (カメラポーズ用の Nerfstudio / Instant-NGP の標準形式) を ロードし、アプリはすべてのカメラを読み取り、視線方向を単位球に投影し、仮想 グローブ上の小さな球マーカーとして表示します。次に、カメラを k Fold (選択された 戦略: angular または linear) に分割し、トレーニング部分を緑、テスト部分 (Holdout) を 赤でマークし、Fold ごとに Angular Correlation スコアを計算します。これは、 Test fold が視線空間でトレーニング fold からどれだけ離れているかを示します。
Holdout 評価を行いたいとき — つまり: モデルは未見の 視点にどれだけ良く一般化するか?トレーニングの標準は「8 番目ごとのビューを Holdout として」(Mip-NeRF360 規約) ですが、これは非常に線形な分割です。例えば 画像が時間的にクラスター化されている場合 (まずオブジェクトの一方の側、次に もう一方)、「8 番目ごと」は代表的ではありません — ランダムなシーケンス位置が Test に着地しますが、すべての隣接が Training にあります。それは簡単すぎます。 「angular」では代わりに視線空間にわたって層別化されます: 各 Fold には Orbit の すべての領域からのカメラが含まれるため、Test は本当に一般化ギャップをテストします。
Angular vs Linear: - Angular (標準): カメラを Longitudinal 角度 (Y 軸周りの φ 座標) で k 個の等しいセクターに分割します。Fold 0 は φ ∈ [0°、 360/k°) のカメラ、Fold 1 は次のなど。利点: 各 Fold が Orbit の一部をカバーします。 Test fold は空間的にコンパクトですが、ワールドデータセット全体に広く分布しています。 古典的なオービット撮影に良い。- Linear (Round-Robin): Fold インデックス = (image_index modulo k)。これはシンプルな「k 番目ごと」分割。画像の順序に空間バイアスが ない (例えばランダムにソートされたドローン撮影) 場合に機能します。画像が時間的に クラスター化される場合、うまく機能しません。
3D グローブで、すぐに見えます: 緑のポイント (Training) と赤のポイント (Test)。 赤のポイントがすべて角にクラスター化されている場合、Holdout は悪いです (良い 一般化テストではありません)。緑の間に均等に位置している場合、それは良いです。 Fold ごとの Angular Correlation スコア (右サイドバー、度数) はさらに、より小さい 値 = Test がトレーニングに近い (各 Test カメラに近いトレーニングカメラがある、 簡単なテスト) を伝えます。より大きい値 = Test がトレーニングから離れている (より難しい一般化)。
Truck シーンを 251 枚の画像で撮影し、メニュー項目 M33 (Export SfM transforms.json) 経由で nerfstudio ファイルをエクスポートします。 Holdout ウィンドウ (⇧⌘H) を開き、「Open transforms.json…」経由で JSON を ロードし、グローブを見ます。k=5 (デフォルト) は 5 Fold を提供します。「Fold 3」を クリック — 赤のマーカーがある程度均一かを確認します。はいの場合: 「Export fold-assignment.json」で、エクスポートされたファイルを Reports フォルダに配置し、 –benchmark (または対応する Inspector 設定) を使用した次のトレーニング実行で、 標準の「8 番目ごと」の代わりに正確にこの Fold 分割が Test Holdout として 使用されます。
W23ボタン「Open transforms.json…」
場所
左上のツールバー。
技術詳細
JSON ファイルに制限されたファイル選択ダイアログを開きます。確認後、 Holdout モジュールはファイルをロードします。ローダーは、nerfstudio 形式 (カメラ 内部パラメータと画像パスと変換マトリクスを持つフレームのリスト) と instant-ngp 形式 (同じ構造) の両方を解析します。フレームごとに、視線方向が変換マトリクスから 抽出され (カメラローカル基底の z 軸)、保存されます。解析が失敗した場合、Status 領域にエラーメッセージが表示されます。
CLI 経由でも: –holdout-file /path/to/transforms.json は、ロード済みのファイルで 直接ウィンドウを開始します。
W24ピッカー「Strategy」 (angular/linear)
場所
左サイドバー、上部。
技術詳細
2 つのオプションを持つラジオピッカー: Angular と Linear。戦略の切り替えは、 fold の自動再計算をトリガーします。視線方向は球面上の 3D 単位ベクトルのリスト です。Angular 戦略はそれらを Longitudinal 角度 φ に投影してソートし、Linear 戦略はフレームインデックスにわたって単にモジュロ分割を行います。
W25スライダー「k Folds」
場所
左サイドバー、中央。
技術詳細
3 から 10 までのスライダー、ステップ幅 1。変更時、Fold 計算が自動的に 再トリガーされ、Folds リスト、Training/Test インデックス、Fold ごとのスコアが すぐに再計算されます。選択された値は、ラベルの右側に monospace 数字テキストとして 表示されます。
経験則: k=5 が標準 (Fold ごとに 20% のテストを提供、これがクロス検証の標準) です。 非常に多くのデータがあり、統計的有意性のためにより多くの Fold が必要な場合は k=10。データが少ない場合は k=3。
W26ピッカー「Test Fold」
場所
左サイドバー、k スライダーの下。
技術詳細
メニューピッカー。オプションは動的に 0..<k、ラベル「Fold 1」から 「Fold N」(つまり UI で 1-indexed、内部では 0-indexed)。以前に選択されたインデックスが k 以上の場合 (例えば k を 10 から 5 に減らしたため)、自動的に 0 にリセットされます。 選択された Test fold はグローブで赤で表示され、他のすべては緑です。
W27ボタン「Export fold-assignment.json」
場所
左サイドバー、下部。
技術詳細
デフォルトファイル名 fold-assignment.json を持つ保存ダイアログを開きます。 確認後、Holdout モジュールは現在の分割を JSON スキーマ (フレームごとの Fold 割り当て + Strategy メタブロック) にエンコードします。このファイルは、–benchmark を使用した次のトレーニングに渡すことができ、同じ Holdout が最終メトリック評価に 使用されます。書き込みエラーはエラーテキストとして表示されます。成功は緑のテキストで 「Saved to (filename)」として。
W28SCNView (3D Camera Globe)
場所
Holdout ウィンドウの中央パネル。
技術詳細
SceneKit グローブビュー。シーンは: ワイヤフレーム球 (半径 1.0、36 セグメント、 暗いグレー)、3 つの色付き軸スタブ (X/Y/Z 用の赤/緑/青、それぞれ 1.2 長)、対応する 視線方向位置の単位球上のカメラごとの小さなマーカー球 (半径 0.03) (ワイヤフレーム 球内に消えないように、わずかに外側) で構成されます。マーカーは Fold 変更ごとに 再構築されません — 再構築は、フレームリストが変更されたとき (つまり、新しい JSON がロードされたとき) にのみ必要です。代わりに、更新ごとにマテリアル色の インプレース更新が実行されます: Test インデックスには赤、Training には緑、どちらでも ない場合は明るいグレー。これにより、N > 1000 カメラでもスライダーティックがパフォーマンスを 維持します。
カメラコントロールが有効化されています — マウスでグローブを回転、ズーム、パン できます。照明により、マーカーが平らに見えないようにします。背景は暗いグレーです。
W29FoldCard (タップで Fold を選択)
場所
右サイドバー、「Angular Correlation」セクション。
技術詳細
Fold ごとに 1 つのカードビュー — 6 pt 半径の角丸長方形、パディング 10、 2 行の垂直レイアウト (上「Fold N」+ カメラ数、下「Mean nearest angle:」+ 度数値)。 背景色は条件付き: アクティブな Fold = アクセント色半透明、非アクティブ = 中立的な 標準マテリアル。タップで Fold を選択し、グローブはライブで再着色します。
「Mean nearest angle」スコアは、Test カメラごとの最も近いトレーニングカメラまでの 平均最小角度です (内部的にラジアンで計算され、UI では度数で表示)。
BayesOpt Console (W30〜W39)

Search-Space ピッカー (RadianceKit defaults (6-dim))、Trial-Budget スライダー (デフォルト 40)、Random Seed (42)、Convergence チャート、Trial Log、Search-Space パラメータリスト用の 3 つの空パネルを持つ空状態。
空状態 (最初に開いた後) — Convergence チャートと Trial テーブルは、実行が 開始されるとすぐに埋まります。次のショット参照。

右上のステータス「Finished — best 0.9943 after 40 trials」。左サイドバー: Search-Space ピッカーは RadianceKit defaults (6-dim)、Trial Budget 40、Random Seed 42。Parameter リスト は、値範囲を持つチューニングする 6 つのハイパーパラメータを表示します: mipSmoothing3DScale [0.05, 0.5]、mipFilter2DVariance [0.1, 0.6]、 densifyGradThreshold [5e-07, 5e-06]、ssimWeight [0.05, 0.5]、 mcmcNoiseScale [1e-05, 0.0001]、mcmcRelocationInterval [50, 200]。中央: Convergence チャート (X = Trial インデックス 1〜40、Y = Objective Value 0〜1) — グレーポイント = 初期サンプル (LHS)、青ポイント = BayesOpt 取得、オレンジポイント = Restart 試行 (#22 と #31)。Best Value 線は試行 ~7 まで急上昇し、その後試行 15 まで わずかな改善のみ、それからフラットなプラトーが 0.99+。右サイドバー: スコア + タグ (init/bo/restart) 付き Trial Log #1〜#34。右上の Save Best Config ボタンは bayesopt-best.json を書き込みます。
何か: ハイパーパラメータ検索用のベイズ最適化コンソール。Bayes-Opt は、 できるだけ少ない実験で未知の関数の最適点を見つけようとする自動プロセスです — 通常: 「mcmcMaxGaussians、capMultiplier、ssimWeight、gradThreshold のどの組み合わせが 私のシーンクラスに最良の PSNR を提供するか?」6^4 = 1296 試行のグリッドの代わりに、 Bayes-Opt は約 40〜100 の情報を持つ試行を試し、それで最適に近づきます。
重要: アプリで提供される現在のバージョンは、実際のトレーニング実行に対して 最適化を実行しません (数日かかる)。代わりに合成デモオブジェクティブに対して 実行します — Hill-Climbing 特性と軽いノイズを持つマルチモーダルランドスケープ。 これは意図的: ウィンドウは Optimizer の動作 (収束進行、サンプルポイント、Best So Far) を示し、Search Space 定義を理解させる必要があります。実際のトレーニング駆動の BayesOpt 実行 (Phase Q7 で Scene-Class プリセット用に実行されたように) には、 別のオフライン CLI ワークフローが使用されます。ウィンドウはライブ UI バリアントです。
3 つのユースケース: 1. BayesOpt がどのように動作するかを 理解したい — そうしたらデモ実行を開始し、Convergence チャートを観察します。 2. 組み込みの 10 プリセットが完全に適合しない新しいシーンクラス (「アクアリウム」や 「アンティーク家具」など) を計画しています。検索空間を心理的に定義し、ここで 「Bowl demo」や「Densify」プリセットでテストし、Best Config を JSON としてエクスポートし、 実際のトレーニング実行の出発点として使用します。3. RKBayesOpt パッケージで定義 されたデフォルト Search Space (Mip サブセット、RadianceKit デフォルト) を検査 したい — これらは左サイドバーの Parameter パネルにリストされます。
- Convergence チャート (中央列): Y = これまで 最高達成された Objective Function 値。X = Trial インデックス。最初は急上昇 (BayesOpt は初期サンプルをランダムに試し、一部は幸運)、次第に平坦になります。 最適に近い領域が使い果たされたためです。線が 20+ 試行にわたって平坦なままの場合、 実行を停止できます — さらなる試行は何ももたらしません。チャート内の個々の点は 個々の Trial 値 (つまり、「これまで最良」ではない) で、フェーズによって色付け: グレー = 初期サンプル、青 = bayesopt 取得、オレンジ = restart。- Trial テーブル (右列): #1、#2、#3、... それぞれ値と Phase タグ。これまで最良の Trial は黄色の星でマークされます。テーブルから Best Trial を識別し、そのパラメータ 値を後でエクスポート時に見られます。- Search Space インスペクター (左サイドバー): 選択されたプリセットのすべてのパラメータ名とその検索範囲 [lo, hi] を表示します。「RadianceKit defaults (6-dim)」プリセットの場合、例えば 「densifyGradThreshold [5e-7、5e-6]」— つまりこれら 2 つの値の間の log-uniform が表示されます。
プリセット「RadianceKit defaults (6-dim)」、Trial Budget 40、Seed 42 を選択。「Start」をクリック。観察: 最初の 8 試行はグレー (初期サンプル、 LHS Latin-Hypercube)、続く青 (BayesOpt 取得)。Convergence チャートは試行 ~15 まで 急で、その後平坦になります。試行 ~30〜40 で Best Value が安定します。「Save Best Config」をクリック — プリセット名、Trial インデックス、値、デコードされたパラメータ 値を含む bayesopt-best.json が保存されます。この JSON を、手動でプリセット定義に 引き継げます。
W30ボタン「Start」
場所
Idle/Finished 状態の左ツールバー。
技術詳細
Trial リストをリセットし、Running 状態に切り替え、新しい Run ID を生成 (複数 Start クリックでの Stale 検出用) し、新しい Pause ゲートを生成します。 次に、Optimizer を非同期ストリームとして実行するバックグラウンドタスクが開始されます。 初期サンプルサイズは min(8, budget / 4 + 1) から導出されます — つまり、Budget ≥ 28 で通常 8 Latin-Hypercube サンプル、小さい Budget でより少ない。Trial 更新は 増分的に受信され、リストに追加されます。Stale Run 保護: 2 番目の Start クリックが その間に Run ID を新しく設定する場合、古い実行からの更新は破棄されます。
目立つボタンの外観用の Primary Action スタイル。
W31ボタン「Pause」
場所
Running 状態の左ツールバー。
技術詳細
Pause ゲートをアクティブに設定し、Paused 状態に切り替えます。実際の効果: ランナーは次の Objective 関数を評価する前に 50 ms ポーリングループで待機します。 これは、現在実行中の Trial が完了することを意味します (合成でマイクロ秒のみ続く) が、それ以上の Trial は開始されません。Resume が実行されるとすぐに、停止した場所から 続行されます。
W32ボタン「Stop」
場所
Running と Paused 状態の左ツールバー。
技術詳細
ランナータスクを中止し、参照をクリアし、Pause ゲートを解除 (まだ paused だった場合) し、Finished 状態 (Trial が存在する場合) または Idle 状態 (存在しない場合) に切り替えます。すでに計算された Trial はリストで表示されたまま です — Stop は削除しません。破壊的なボタンの役割は、ボタンを赤で示します。 実行を中止するためです。
W33ボタン「Resume」
場所
Paused 状態の左ツールバー。
技術詳細
Pause ゲートを解除し、Running 状態に戻します。ランナータスクはすでに 実行中 (ポーリングループで待機中)。ループが Pause が解除されたことに気付くとすぐに、 継続して次の Trial を開始します。
W34ボタン「Save Best Config」
場所
右ツールバー、常に表示 (ただし bestTrial が存在しない場合は無効)。
技術詳細
JSON に制限された、デフォルトファイル名 bayesopt-best.json を持つ 保存ダイアログを開きます。確認後、Payload Dictionary が構築されます: プリセット名、 Trial インデックス、値 (Objective スコア)、Parameter (デコードされたパラメータ名 → 値の Dictionary)。デコーディングは、正規化された検索空間座標を [0,1]^d で元の 値範囲に戻し投影します (それに応じて log-uniform/linear/integer スケール付き)。 JSON 出力は pretty-print されており、キーがソートされています。書き込みエラー時 (現在のデモバージョン) は静かに無視されます — これがデモパスであるため、エラー UI はありません。
Trial が実行されていない限り、ボタンはグレーのままです。
W35ピッカー「Search Space」プリセット
場所
左サイドバー、上部。
技術詳細
4 つのプリセットオプションを持つメニューピッカー: - 「RadianceKit defaults (6-dim)」— すべての Q7 ハイパーパラメータを持つ完全な標準検索空間。- 「Mip subset (2-dim)」— mipSmoothing3DScale [0.05、0.5] log-uniform と mipFilter2DVariance [0.1、0.6] linear のみ。シーンクラス用に Mip-Splatting を チューニングしたい場合に便利。- 「densify-until + ssim-weight + grad-thresh」— 3 つの Densify 関連パラメータ (densifyGradThreshold log-uniform、ssimWeight linear、densifyUntilIter integer)。- 「Bowl demo (1-dim)」— 「BayesOpt は こう動作する」デモ用の教育的シングルパラメータ検索空間。
実行がアクティブな間、検索空間は切り替えられません (Optimizer を混乱させます)。
W36スライダー「Trial Budget」
場所
左サイドバー、Search Space ピッカーの下。
技術詳細
10 から 200 までのスライダー、ステップ幅 5。デフォルト 40。それが 意味するもの: BayesOpt は最大 N Trial を行うことができます。そのうちの最初のいくつかは 初期サンプル (Latin-Hypercube) で、残りは実際の BayesOpt Trial です。実践用の 経験則: d 次元を持つ検索空間は、良い最適化のために約 10d から 20d Trial を 必要とします。6-dim Defaults では 60〜120、2-dim Mip サブセットでは 20〜40、 1-dim Bowl デモでは 10〜20。
実行中、スライダーは無効化されています。
W37スライダー「Random Seed」
場所
左サイドバー、Budget スライダーの下。
技術詳細
1 から 100 までのスライダー、ステップ幅 1。デフォルト 42。Seed は、 初期 Latin-Hypercube サンプルとデモオブジェクティブの Noise コンポーネントの両方に 渡されます。再現性: 同じ Seed + 同じ検索空間 + 同じ Budget は、まったく同じ Trial シーケンスを提供します。「同僚全員がデモを再構築すると同じ実行を取得する?」に 役立ちます。実行中は無効化。
W38チャート (Convergence)
場所
ウィンドウの中央列。
技術詳細
2 つのレイヤーを持つ Swift Charts ダイアグラム: 1. Trial ごとの 「best-value-so-far」用の線 — アクセント色の単調増加または一定の曲線。2. Trial ごとに 個別の Objective 値を持つポイント、フェーズによって色付け。Symbol サイズ 40。 3 つのフェーズラベル: 「init」(グレー)、「bo」(青)、「restart」(オレンジ)。
小さな凡例が左上に Phase の色を表示します。Trial リストが空の場合 (最初の Start 前)、チャートアイコンとヒント「Press Start to begin a BayesOpt run.」を持つ空状態 表示が代わりに表示されます。
W39テーブル (Trial Log)
場所
ウィンドウの右列。
技術詳細
Lazy にスタックされた Trial 行を持つスクロール領域。行ごとに水平スタック: Trial 番号 (3 桁 monospace、左)、値 (monospace、右揃え、70 pt 幅)、Phase タグ (Capsule、Phase 色で 25% 透明度で塗りつぶし)、この Trial が現在最良の場合は オプションで黄色の星。Auto-Scroll メカニズムは、新しい Trial が追加されるとすぐに、 自動的に最後にジャンプします — 自分でスクロールすることなく、ライブ進行を画面 下部で読み取れます。
メインウィンドウ: Loss 進行と Gaussian Count (I39〜I41、クロスリファレンス)
メインウィンドウの 3 つの Inspector 表示には独自の説明が必要です。実行中の トレーニング中に常に表示され、進行が健全に見えるかの重要な経験則があるためです。 表示は Inspector の「Loss Chart」セクション (第 2 章 — Inspector 参照) にあり、 上の補助ウィンドウからの Holdout 分析を補完します。
Loss 曲線はいつ健全か? 健全な Loss 曲線は 3 つのフェーズを示します: (1) Warmup — 最初の 200〜500 反復で、Loss は高 (シーンに応じて L1+SSIM 結合で通常 0.15〜0.25) から約半分に急落します。Loss がこのフェーズで 落ちない場合、通常入力が間違っています (画像が破損、SfM ポーズが悪い、初期 Gaussian の数が少なすぎる)。(2) Densification — ~500 から densifyUntilIteration (古典的に 15K、MCMC で 20K または 25K まで) の間で Loss は さらに落ちます。Densify 操作が新しい Gaussian を挿入し、Optimizer がそれを利用すると、 しばしば小さな下方ジャンプが発生します。Gaussian カウントはこのフェーズで上昇します。 (3) Refinement — その後、Loss はより平坦な Tail に入ります。典型的な 終値: P4 Quality の Tanks-&-Temples Truck は L1 ≈ 0.023、Full Classic V546 の Horse は L1 ≈ 0.0230、Outdoor Mip-NeRF360 シーンはしばしばより悪い (0.04〜0.07)。
プラトーは何を意味するか? プラトー (Loss 曲線が数千の反復にわたって 水平に走る) は 2 つの解釈を持ちます: (a) モデルが収束しました、それ以上のトレーニングは 何ももたらしません — それが良いケースです。(b) モデルがスタックしています (ローカル最小値、悪い勾配情報、バッファ制限のキャップ) — 悪いケース。両方とも チャートで同じに見えます。区別: Gaussian カウントを見ます。それも平坦で MCMC キャップに 近い場合 (例えば .fullMCMC で 150K のうち 150K)、限界にいます — キャップを 上げるかプラトーを受け入れます。Gaussian カウントがまだ成長しているが Loss が 落ちない場合、スタックしています。
中止 vs 続行のタイミングは? 経験則: Min-Loss の改善なしで 10K 反復 → 中止、さらなる反復は無駄です。その前: 境界改善が見える場合、Cmd+T (Training メニュー → Continue Training → +5K 反復) 経由で延長を追加できます。注意: MCMC ではプラトーは しばしば本物です — キャップは自然な制限です。
Gaussian カウントプラトーは「完了」信号ではありません。 MCMC がキャップに 達したか、Classic Densification が使い果たされたことを意味するだけです。実際の 「完了」質問は Holdout 分析でのみ尋ねられます — Holdout ウィンドウ (W23〜W29) や –benchmark フラグで評価された独立したテストセットでの PSNR/SSIM/LPIPS。
PSNR/Holdout は真実、Loss はプロキシのみ。 Loss は相対メトリックです: モデルがトレーニングビューに適応する間に落ちます。しかし、低い Loss は自動的に 良いモデルを意味しません — モデルがトレーニング画像を暗記した (オーバーフィッティング) 場合、Loss は小さいですが、未見ビュー (Holdout) での PSNR は悪いでしょう。 したがって: 最終品質評価では常に Holdout メトリックを見て、End-Loss だけを 見ません。
経験則ボックス
- User Guide と Keyboard Shortcuts は静的ヘルプ — キーワード質問には速い、 深さにはここにあるマニュアルを使用してください。 - ディスクが 10% 未満の空き容量に落ちるとすぐに Manage Storage を開きます。 ログとインポートステージングが通常の罪人です。 - Pareto Dashboard は、少なくとも 3〜4 のトレーニングレポートを取得した後にのみ 意味があります。X 軸 = コスト (Time / Gs)、Y 軸 = 品質 (PSNR / SSIM)。Pareto Front は効率的な組み合わせを示します。 - 他者と PSNR ベンチマークを公開する前に Holdout Analysis を使用してください — テストセットが本当に代表的であることを保証します。 - BayesOpt Console は主に Search Space 定義の学習および検査ツールです。実際の トレーニング駆動のハイパーパラメータチューニングには、オフライン CLI ワークフローを 使用してください。 - Loss プラトーと Gaussian カウントプラトーは別々に解釈する必要があります。Cap 制限は「完了」信号ではありません。実際の品質は Holdout PSNR のみが測定します。 - Min-Loss の改善なしで 10K 反復 → トレーニングを停止します。