Глава 2 — Инспектор (Expert View)

Пустой Инспектор до импорта: Левая боковая панель показывает счётчик Images 0 и подсказку дропа «Drop images here / or tap + to import». Инспектор справа полностью функционален, но предустановки только информативны (нет активного обучения). Предустановка по умолчанию «Preview» (5K итераций) помечена. Camera Alignment установлен на Apple Photogrammetry, Densification — на Classic, SSIM Weight — 0.20, Render Scale — 50 %. В Training Metrics и Loss History показаны пустые состояния («Start training to see live metrics», «Loss curve will appear during training»).

Инспектор после импорта: Статус заголовка гласит «60 images ready». Боковая панель изображений перечисляет все 60 импортированных кадров (frame_0001.jpg–frame_0945.jpg, каждый 16-й кадр из набора Bouquet на 960 камер как подмножество для быстрых итераций). Логика автоматического render scale проверяет разрешение изображений (1536×2048 = 3.1 MP) и подстраивает Render Scale соответствующим образом. Кнопка Play (зелёная, внизу слева) теперь активна и запускает обучение с активной предустановкой.

Инспектор во время обучения: Строка заголовка показывает глобальный прогресс «RadianceKit — Training NN %». Viewport рендерит текущую реконструкцию Gaussian в реальном времени (обновляется каждые 50 итераций — интервал живого предпросмотра задаётся в Settings → General → Training → Live Preview). Строка метрик под viewport: текущий Loss, Learning Rate, число Gaussians и счётчик итераций (напр. 1 600/5 000 с предустановкой Preview). Карточка предустановки «Preview» получает пометку «Modified», как только любой параметр отклоняется от встроенного значения по умолчанию. Боковая панель «Log» собирает события этапов SfM и обучения.

Инспектор после обучения: Строка заголовка показывает финальное число Gaussians (здесь 2 991 — очень компактно, поскольку синтетическая сцена Bouquet из Blender имеет простую геометрию на светлом фоне). Viewport показывает законченное облако точек — активна orbital drag-навигация (вращает вокруг центра сцены). Секция Training Metrics теперь заполнена финальными значениями, график Loss History показывает ход всех 5 000 итераций. Секция Export внизу теперь активна (все кнопки форматов разблокированы).
Инспектор — это правая боковая панель в Expert Mode (⌘2). Он объединяет все параметры, относящиеся к обучению, в пять сворачиваемых секций: Presets, Training Configuration, Enhancements, Metrics и Loss Chart. Каждая секция может быть свёрнута щелчком по заголовку, а порядок можно менять через drag-and-drop (InspectorView.swift:81-97). По умолчанию все секции видны, и состояние приложения сохраняет предпочтения свёртывания и порядка между запусками.
Ряд элементов управления Инспектора также появляются почти в идентичной форме в Settings (глава 3) — обычно SfM-бэкенд, sky masking и аналогичные значения по умолчанию. Разделение сделано сознательно: Settings предоставляет глобальный для приложения шаблон для вновь создаваемых проектов, Инспектор переопределяет эти значения для текущего открытого проекта. Стоит освоить логику работы одной стороны — и другую можно использовать вслепую.
Левая колонка в Expert Mode — Project Navigator — не входит в Инспектор, но является его прямым соседом. Там можно выбирать импортированные изображения щелчком, предпросматривать их по пробелу через Quick Look и удалять через кнопку минус или клавишу Delete (с Cmd-Z для отмены). Инспектор следует за текущим выбором в боковой панели контекстно-зависимой детальной информацией, но пять основных секций всегда остаются видимыми.
Секция Presets (I1–I11)
Секция Presets — самый быстрый способ применить протестированную конфигурацию. Встроенные предустановки (Classic, MCMC, Scene-Class) дают воспроизводимые отправные точки из 560+ задокументированных экспериментов; собственные предустановки можно сохранять, экспортировать, импортировать и передавать. Список сгруппирован по категориям (Classic, MCMC, SceneClass, Custom), и одновременно может быть развёрнуто несколько категорий. Контекстное меню (правый клик по строке) делает доступными Export, Duplicate, а для пользовательских предустановок — Delete.
I1Кнопка Save…
ГДЕ
Инспектор → секция Presets → кнопка Save… (панель действий внизу).
ТЕХНИЧЕСКИ
Открывает popover с текстовым полем и кнопками Save/Cancel. Текущее состояние TrainingConfig сохраняется как новая пользовательская предустановка (JSON-encoded, хранится для всего приложения). Процесс сохранения копирует все 81 параметр обучения плюс текущую стратегию densification. Предустановка автоматически попадает в категорию Custom, независимо от того, из какой встроенной предустановки была получена. Пустые имена и ввод из одних пробелов отклоняются. Уже существующие имена не отклоняются — у каждой предустановки свой внутренний ID, дубли имён технически разрешены, но практически путают.
I2Текстовое поле Preset Name
ГДЕ
Save-popover → текстовое поле «Preset Name».
ТЕХНИЧЕСКИ
Простое текстовое поле со скруглённой обводкой, широкое. При щелчке по кнопке Save значение берётся как имя предустановки. Лимита длины в UI нет, но сохраняемое имя должно быть JSON-кодируемым и отображаемым в списках UI — эмодзи и умляуты работают. Содержимое автоматически сбрасывается в пустую строку при открытии popover. Кнопка Save остаётся деактивированной, пока поле пусто после trim. Auto-suggest и pre-fill именем текущей активной предустановки нет.
I3Кнопка Cancel (диалог Save)
ГДЕ
Save-popover → кнопка Cancel (слева).
ТЕХНИЧЕСКИ
Закрывает popover без сохранения. Отбрасывает содержимое текстового поля — при следующем открытии оно будет сброшено в пустое логикой кнопки Save… (I1). Стандартный стиль кнопки, без диалогов подтверждения и без hotkeys. Текущая TrainingConfig остаётся без изменений, поскольку путь сохранения вообще не выполнялся.
I4Кнопка Save (диалог Save)
ГДЕ
Save-popover → кнопка Save (справа, заметный стиль).
ТЕХНИЧЕСКИ
Триггерит собственно сохранение. Ещё раз валидирует, что имя непустое (defensive check), и затем пишет текущую TrainingConfig как JSON в app-storage. Затем закрывает popover. Выделено синим, серым пока текстовое поле пусто. Если сохранение не удаётся (напр. из-за полного app-storage — очень маловероятно), видимого диалога об ошибке пока нет; предустановка просто не появится при следующем запуске приложения.
I5Кнопка Export…
ГДЕ
Инспектор → секция Presets → панель действий → кнопка Export….
ТЕХНИЧЕСКИ
Экспортирует текущую выбранную предустановку в файл .radiancepreset (внутри — JSON). Деактивирована, если не выбрана ни одна предустановка. По щелчку приложение открывает save-диалог с именем файла предустановки (имя предустановки + расширение .radiancepreset). Сохранённый формат содержит полную TrainingConfig плюс метаданные (имя, категория, ID, built-in-флаг). Двойной щелчок в Finder открывает приложение, но не автоматически импорт; пользователь должен воспользоваться кнопкой Import (I6).
I6Кнопка Import…
ГДЕ
Инспектор → секция Presets → панель действий → кнопка Import….
ТЕХНИЧЕСКИ
Открывает файловый диалог, разрешающий только файлы .radiancepreset (multiselect отключён). При выборе JSON-файл загружается, валидируется и вставляется в категорию Custom — с новым внутренним ID, чтобы не было коллизий со встроенными. Импорт автоматически устанавливает категорию в Custom, даже если экспортированная предустановка изначально была, напр., built-in. Повреждённые или несовместимые со старой версией схемы файлы тихо отклоняются, без диалога ошибки (консольный лог информацию даёт).
I7Строка предустановки (активация щелчком)
ГДЕ
Инспектор → секция Presets → каждая строка предустановки в каждой категории.
ТЕХНИЧЕСКИ
Щелчок по строке предустановки заменяет все поля TrainingConfig значениями из предустановки, запоминает ID активной предустановки и сбрасывает статус Modified. Активная галочка перед строкой появляется только когда предустановка выбрана И не изменена. Как только значение в TrainingConfig меняется (слайдер, степпер, переключатель в других секциях Инспектора), после имени появляется оранжевая пометка «Modified». Встроенные предустановки нельзя перезаписать — при модификации нужно создать копию кнопкой Save (I1).
I8Контекстное меню «Export…»
ГДЕ
Правый клик на любой строке предустановки → первая запись «Export…».
ТЕХНИЧЕСКИ
Идентичная функциональность с I5 (кнопка Export…), но удобнее доступна — без необходимости предварительно выбирать предустановку. Экспортирует напрямую предустановку из строки, по которой щёлкнули. Работает одинаково для всех категорий (built-in или custom), без ограничений. Экспорт содержит built-in-флаг и оригинальную категорию, но при повторном импорте категория мапится в Custom, как описано под I6.
I9Контекстное меню «Duplicate»
ГДЕ
Правый клик на любой строке предустановки → вторая запись «Duplicate».
ТЕХНИЧЕСКИ
Клонирует предустановку в категорию Custom. Создаёт новый внутренний ID, добавляет « Copy» к имени и сохраняет копию. Работает и для встроенных предустановок — клон тогда редактируем. Оригинал остаётся нетронутым. TrainingConfig копируется значение-за-значением (JSON round-trip), так что нет reference-bindings между оригиналом и копией.
I10Контекстное меню «Delete»
ГДЕ
Правый клик на ваших собственных строках предустановок → последняя запись «Delete» (красная, destructive).
ТЕХНИЧЕСКИ
Видна только для пользовательских предустановок. Встроенные удалить нельзя. Запись помечена как destructive, появляется в контекстном меню красной и отделена разделителем, чтобы не щёлкнуть случайно. Диалога подтверждения нет — щелчок сразу удаляет предустановку. Удалённая предустановка не восстанавливается (Cmd-Z здесь не работает — Undo в текущей сборке существует только для списка изображений, не для операций с предустановками). Если удалённая предустановка только что была активной, текущая TrainingConfig остаётся без изменений, обнуляется только выбор активной предустановки.
I11Заголовок категории (expand/collapse)
ГДЕ
Инспектор → секция Presets → каждый заголовок категории (Classic, MCMC, SceneClass, Custom).
ТЕХНИЧЕСКИ
Состояние свёртывания на категорию с разными значениями по умолчанию: Classic стартует развёрнутой, MCMC, SceneClass и Custom — свёрнутыми. Состояние не сохраняется — при перезапуске приложения все категории снова в значении по умолчанию. Стрелка-шеврон поворачивается с анимацией. Число справа в заголовке показывает количество предустановок в этой категории. Hit-area щелчка охватывает всю область заголовка.
Секция Training Configuration (I12–I22)

Здесь живут центральные рычаги: какой SfM-бэкенд должен считать, как работает densification, сколько итераций, сколько веса SSIM. При стратегии MCMC появляются два дополнительных переключателя («MCMC Quality» и «Auto-scale by scene»), скрытые в Classic-режиме. При бэкенде Native SfM добавляется поле FOV override, нужное только для видеокадров без EXIF focal length.
I12Picker Camera Alignment
ГДЕ
Инспектор → Training Configuration → Camera Alignment (сегментированный picker наверху).
ТЕХНИЧЕСКИ
Сегментированный picker с двумя опциями: Apple Photogrammetry и Native (Beta). Выбор определяет SfM-бэкенд, используемый при следующей реконструкции камер. Одновременно он влияет, какие дополнительные элементы Инспектора видны: Native дополнительно показывает FOV override (I13), нужный только для видеокадров без EXIF. Примечание: для очень больших уличных съёмок можно через workspace import импортировать результат внешнего инструмента (Metashape или COLMAP) — см. главу 1 (M5) и главу 9 (Q3, Q6).
I13Поле FOV Override (Native SfM)
ГДЕ
Инспектор → Training Configuration → FOV Override (видно только при Camera Alignment = Native).
ТЕХНИЧЕСКИ
Числовое текстовое поле (диапазон 0–170°), по умолчанию 0 = автоматическое определение из EXIF или эвристика. Ручной ввод нужен, когда входные изображения извлечены из видео, не содержащего метаданных focal length. Типичные значения: iPhone Wide ≈ 73°, DJI Mavic Wide-Crop ≈ 70°, дрон с full-frame-сенсором ≈ 84°. Значение ограничивается [0, 170] — выходящие значения сразу отбрасываются обратно. Влияет только на нативный SfM-конвейер (Q4/Q5); Apple Photogrammetry это значение полностью игнорирует.
I15Picker Densification
ГДЕ
Инспектор → Training Configuration → Densification (сегментированный picker, всегда виден).
ТЕХНИЧЕСКИ
Переключает между двумя стратегиями densification: Classic (оригинальная процедура 3DGS с clone/split/prune и gradient threshold) и MCMC (Stochastic Gradient Langevin Dynamics с Relocation, NeurIPS 2024). При переключении с Classic на MCMC приложение автоматически устанавливает MCMC-специфичные поля в проверенные значения по умолчанию (reg weights = 0, MCMC cap multiplier 3.0, sample/noise schedule). Без этой автоматической инициализации сессии со старыми предустановками страдали от 1.4.4 MCMC-collapse-бага (460K→5 Gaussians, watchdog kill). Выбор picker дополнительно определяет, какие элементы Инспектора видны — при MCMC появляются I16/I17. Подробный эффект полей — в главе 6, T11–T16 (Classic) и T61–T73 (MCMC).
I16Переключатель MCMC Quality
ГДЕ
Инспектор → Training Configuration → MCMC Quality (только при Densification = MCMC).
ТЕХНИЧЕСКИ
Переключает gradient accumulation на 2 шага (актив) или 1 шаг (неактив). Накапливает градиенты из двух последовательных видов камеры перед выполнением шага оптимизатора. Эмпирически (Session 33, V544a) уменьшает финальную L1-ошибку примерно на 6 % (0.0246 с Quality против 0.0261 без, в среднем по 3 прогонам на Horse-Full- MCMC). Цена: удвоенное время обучения. При очень длинных тренировках (200K итераций) это приводит к 10+ минутам дополнительного ожидания — так что оправдано только если действительно нужны последние проценты качества. Влияет только на обучение, не на формат экспорта или отображение в viewport.
I17Переключатель Auto-scale by scene
ГДЕ
Инспектор → Training Configuration → Auto-scale by scene (только при MCMC).
ТЕХНИЧЕСКИ
Когда активен, масштабирует эффективный потолок max-Gaussians по числу SfM init-точек × MCMC cap multiplier (по умолчанию 3.0). Пример: SfM даёт 250K init-точек, base cap = 150K, multiplier 3.0 → эффективный потолок = max(150K, 750K) = 750K. При деактивации строго применяется только base. Был введён для v1.4.5, потому что большие уличные съёмки свыше 1000 кадров и соответственно высокой плотностью SfM-точек морили densification жёстким cap 150K по умолчанию — избыточные точки оставались, новые не могли появляться. По умолчанию OFF в пользовательских предустановках, ON во встроенных MCMC. Влияет только на время обучения, не на экспорт.
I18Степпер Max Iterations
ГДЕ
Инспектор → Training Configuration → GroupBox → Max Iterations.
ТЕХНИЧЕСКИ
Степпер с диапазоном 1 000–100 000, шаг 1 000. Определяет общее число итераций оптимизатора. Линейно коррелирует с временем обучения (половина = прим. 50 % времени). Эмпирические sweet spots: 20K (Classic Balanced, L1≈0.028), 40K (Classic Quality, L1≈0.023), 200K (MCMC Full, L1≈0.0246). Свыше 40K с Classic в среднем едва ли что-то даёт — diminishing returns. При изменении, если активна link-функция (I19), Densify Until пропорционально подтягивается (отношение по умолчанию: 0.5, т.е. Densify- Until = Max/2).
I19Кнопка Link/Unlink (Densify ↔ Iterations)
ГДЕ
Инспектор → Training Configuration → GroupBox → маленькая link-кнопка между Max Iterations и Densify Until.
ТЕХНИЧЕСКИ
Кнопка-переключатель, замораживающая соотношение Densify Until к Max Iterations. Когда активна (link-значок выделен), при каждом изменении Max Iterations Densify Until подтягивается пропорционально. Когда unlinked (значок link-plus), значения остаются независимыми. По умолчанию linked, потому что это отражает типичную корреляцию — когда вы тянете обучение на удвоение итераций, обычно хотите, чтобы densification тоже шёл пропорционально дольше. Соотношение вычисляется из текущего значения при установке link-кнопки; типичное соотношение — 0.5 (Densify-Until = половина числа итераций).
I20Степпер Densify Until
ГДЕ
Инспектор → Training Configuration → GroupBox → Densify Until.
ТЕХНИЧЕСКИ
Степпер с диапазоном 500–50 000, шаг 500. Определяет индекс итерации, начиная с которого больше не добавляются новые Gaussians через clone/split (Classic) или relocation (MCMC). После достижения уточняются только позиция и цвет. Более высокие значения = больше Gaussians = больший файл, более долгое per-iteration-время (+30–60 % GPU-времени на шаг). Типичные значения: 15K (для 30K max-iter), 20K (для 40K), 100K (для 200K MCMC). При активном link (I19) автоматически масштабируется. Действует по-разному при Classic vs MCMC: Classic полностью останавливает рост, MCMC останавливает relocation-логику, но адаптация sample/noise продолжает работать.
I21Слайдер SSIM Weight
ГДЕ
Инспектор → Training Configuration → GroupBox → SSIM Weight.
ТЕХНИЧЕСКИ
Слайдер 0.0–1.0 с шагом 0.05, отображается как «0.20». Смешивает L1 loss (0.0) и SSIM loss (1.0). L1 ужесточает яркость на пиксель, SSIM ужесточает структурное сходство (края, локальные статистики). По умолчанию 0.2 — значение из оригинальной статьи 3DGS (Kerbl 2023) и обратно-инженерно определено как устойчивый компромисс в многочисленных сессиях. Более высокие значения (0.5+) способствуют сохранению деталей, но могут игнорировать локальные ошибки яркости. Более низкие значения (< 0.1) ведут к потере деталей на резких краях. Вычисление SSIM работает в шейдере с гауссовым окном 11×11. Производительность: при 0.0 (только L1) обучение примерно на 8–12 % быстрее, поскольку вычисление SSIM в шейдере пропускается.
I22Слайдер Render Scale
ГДЕ
Инспектор → Training Configuration → GroupBox → Render Scale.
ТЕХНИЧЕСКИ
Слайдер 0.25–1.0 с шагом 0.25, отображается как «100 %». Масштабирует разрешение рендеринга обучения относительно размера исходного изображения. Самый большой рычаг производительности: 50 % сокращает GPU-время прим. на 75 % (поскольку в 4× меньше пикселей), 25 % — прим. на 94 %. Gradient threshold автоматически масштабируется. Под слайдером появляется живое отображение разрешения в MP (напр. «2304×1296 (3.0 MP)»). Если текущее значение отклоняется от рекомендованного, оранжевым текстом показывается «— recommended: 50 %». Рекомендация целится в ~3 MP эффективного разрешения — диапазон, наиболее эффективно обрабатываемый GPU Apple Silicon. Для 4K-исходных изображений рекомендуется, напр., 25 %, для FullHD — 100 %. Изменение дополнительно триггерит buffer reallocation.
Секция Enhancements (I26–I29)

Секция Enhancements группирует четыре функции, которые улучшают качество изображения, не меняя сам базовый цикл обучения. Первые три (I26–I28) — это post-training или viewport-этапы: Compactification наводит порядок после окончания обучения, MetalFX и MPS Lanczos — чистые viewport-рендереры, не влияющие на идущее обучение. Perceptual Loss (I29), несмотря на принадлежность к секции, является компонентой обучения — активируется как дополнительный loss-член во время обучения, поэтому отделена от viewport-переключателей разделителем.
I26Переключатель Post-Training Compactification
ГДЕ
Инспектор → Enhancements → Post-Training Compactification.
ТЕХНИЧЕСКИ
Активирует V443 post-processing: после завершения итераций обучения Gaussians с непрозрачностью ниже 0.01 (1 % видимости) удаляются. Эмпирически это уменьшает размер файла на ~55–58 % при нулевой видимой потере качества — потому что эти Gaussians и так не вносят визуального вклада. Compactification работает как GPU compact pass и занимает от долей секунды до нескольких секунд в зависимости от числа Gaussians. Не влияет на производительность обучения. Если этот переключатель выключен, невидимые Gaussians тоже экспортируются — актуально только если хотите использовать формат для другого этапа обучения (Continue Training), иначе впустую потраченное хранилище.
I27Переключатель MetalFX Spatial Upscaling
ГДЕ
Инспектор → Enhancements → MetalFX Spatial Upscaling.
ТЕХНИЧЕСКИ
Активирует Apple MetalFX Spatial Upscaler в рендерере viewport. Когда разрешение обучения (через I22 Render Scale) ниже размера viewport, MetalFX масштабирует отрендеренный кадр ML-based до размера дисплея. Даёт самые резкие результаты из всех вариантов масштабирования, потому что модель ML-upscaler оптимизирована на резкие края. Конвейер рендерера переконфигурируется вживую при переключении — видно немедленно, без перезапуска. Имеет приоритет над MPS Lanczos (I28): если оба активны, MetalFX побеждает. Overhead производительности в viewport прим. 1–2 мс на кадр на GPU M3. Действует только на живой viewport, не на отрендеренные экспорты (orbit video, скриншоты) — те рендерятся в полном разрешении источника.
I28Переключатель MPS Lanczos Scaling
ГДЕ
Инспектор → Enhancements → MPS Lanczos Scaling.
ТЕХНИЧЕСКИ
Активирует Apple Metal Performance Shaders с Lanczos-resampling как viewport upscaler. Lanczos — классический resampling с 8-tap sinc-фильтром — резче, чем билинейный, классический алгоритм без ML. Конвейер рендерера переконфигурируется вживую при переключении. Игнорируется, если MetalFX (I27) тоже активен. Минимальный overhead (<0.5 мс на кадр), но качество ниже MetalFX. Применение: fallback для сцен, в которых MetalFX даёт артефакты (напр., сильные линейные структуры, которые ML-upscaler иногда «утюжит»). Действует, как и I27, только на живом viewport, не в экспортах.
I29Слайдер Perceptual Loss
ГДЕ
Инспектор → Enhancements → Perceptual Loss.
ТЕХНИЧЕСКИ
Слайдер 0.0–0.2 с шагом 0.01, при 0.0 отображается как «Off», иначе как «0.05» и т.д. Активирует дополнительный loss-член, сравнивающий многомасштабное гауссово размытие рендеринга с ground truth-изображением (3 blur scale). Захватывает структурные различия, которые L1+ SSIM сами по себе не обнаруживают. Реализация V460. Эмпирически значение 0.05–0.1 улучшает L1-балл в сессиях на несколько процентов, но стоит ~5 % времени обучения (дополнительный forward pass через blur-kernel). Свыше 0.15 обучение становится нестабильным, и L1 снова ухудшается (loss-член доминирует в оптимизации). Действует во время обучения, не в post-processing — несмотря на позицию в секции «Enhancements» это не чистая post-обработка.
Секция Metrics (I30–I38)

Пока идёт обучение, секция Metrics показывает девять живых значений из цикла обучения. До начала обучения секция пуста («Start training to see live metrics»). Все значения обновляются каждые ~30 итераций (частота обновления потока). Секция read-only — ни один элемент не кликабелен и не изменяем. Для более глубокого анализа смотрите JSONL- training-логи под ~/Documents/RadianceKit/Logs/ (скрипт python3 scripts/analyze_logs.py best 5).
I30Iteration
ГДЕ
Инспектор → Metrics → Iteration. Read-only.
ТЕХНИЧЕСКИ
Отображается в формате «4523 / 40000» — текущая итерация над общим планируемым числом итераций. Считает синхронно с циклом обучения, который отправляет значения каждые ~30 iter. Второе число соответствует значению Max Iterations на момент старта; оно больше не меняется, даже если пользователь подкручивает степпер позднее — идущий прогон использует собственную snapshot-копию. Если приложение через меню Training (Continue Training +5K/+10K/+20K) додавливает дополнительные итерации, знаменатель увеличивается.
I31Loss
ГДЕ
Инспектор → Metrics → Loss. Read-only.
ТЕХНИЧЕСКИ
Float-значение с шестью знаками после запятой (напр. «0.024385»). Измеряет комбинированный L1+SSIM loss (смесь управляется через I21 SSIM Weight) плюс опциональный Perceptual Loss (I29) и другие регуляризаторы. Шкала не абсолютная, а зависит от сцены — для большинства сравнений требуется тот же датасет. Типичные конечные значения при хороших конфигурациях: - Classic Quality 40K iter: 0.022–0.025 (Horse, Truck, Garden) - MCMC Full 200K iter: 0.024–0.028 - Outdoor drone 30K: 0.030–0.060 (хуже из-за геометрии) - Indoor apartments: 0.018–0.025
Значения выше 0.10 после 5K итераций указывают на SfM- проблемы (плохие позы камер) — прервите и пересчитайте SfM.
I32Learning Rate
ГДЕ
Инспектор → Metrics → Learning Rate. Read-only.
ТЕХНИЧЕСКИ
Отображение в научной нотации (напр. «1.60e-04»). Текущая скорость обучения для параметров позиции (у 3DGS шесть независимых LR для позиции, SH-DC, SH-Rest, непрозрачности, масштаба, поворота — здесь отображается позиция-LR как представительное значение). Начальное значение по умолчанию — 1.6e-4, которое спадает через exponential decay до ~1.6e-6 к концу обучения. Decay настраивается через поле LR schedule в training configuration (T-поле в главе 6). Если LR остаётся необычно высоким (напр. 1e-3 или более после 10K итераций), это может указывать на неверно загруженную конфигурацию.
I33SH Degree
ГДЕ
Инспектор → Metrics → SH Degree. Read-only.
ТЕХНИЧЕСКИ
Integer 0–3. Степень спherical harmonics для цветового представления. Стартует на 0 (только DC-компонента, т.е. независимый от направления цвет на Gaussian — значит только одна RGB-константа) и прогрессивно растёт до 3 по ходу обучения. Стандартное расписание поднимает степень на итерациях 1000/2000/3000 на 1 каждый раз. SH-3 соответствует 48 цветовым коэффициентам на Gaussian (3 RGB-канала × 16 SH-базисных функций). Более высокая SH-степень = более зависимое от направления отражение (глянцевые поверхности выглядят корректно по-разному под разными углами обзора), но также больше памяти и более медленное обучение.
I34Gaussians
ГДЕ
Инспектор → Metrics → Gaussians. Read-only.
ТЕХНИЧЕСКИ
Текущее число Gaussians в модели, отформатировано с locale-разделителем (напр. «524.318»). Рост: - Classic: стартует на SfM init-точках (обычно 50K–300K), растёт через clone/split до незадолго до Densify Until, затем статично до конца обучения (по модулю pruning) - MCMC: sample-точки добавляются до MCMC cap, затем только relocation
Здоровые конечные значения: - Classic Quality: 400K–700K (Horse 524K, Garden 800K) - MCMC Full: точно на cap (по умолчанию 150K, с auto-scale множителем × SfM count, в зависимости от сцены 500K–1.5M)
При MCMC, если число падает до < 60 % cap → аномалия (collapse-индикатор, указывает на слишком агрессивные регуляризаторы).
I35GPU Memory
ГДЕ
Инспектор → Metrics → GPU Memory. Read-only.
ТЕХНИЧЕСКИ
Оценка потребления памяти Gaussian-буфера как число Gaussians × 616 байт (отформатировано в memory-стиле). 616 байт — эмпирический размер полностью оснащённого Gaussian (позиция, масштаб, поворот, непрозрачность, SH-коэффициенты степени 3, gradient accumulator). Отображение не учитывает overhead рендерера (tile buffer, sort buffer, backward buffer) — реальная потребность в GPU-памяти обычно в 2–3 раза выше этого значения. При 500K Gaussians: отображается ~290 MB, реально ~700 MB. При 1.5M Gaussians: отображается ~880 MB, реально ~2.5 GB. На M3 Max с 64+ GB Unified Memory не критично, на M3 Pro с 18 GB уже предел.
I36Speed
ГДЕ
Инспектор → Metrics → Speed. Read-only.
ТЕХНИЧЕСКИ
Итерации в секунду с одним знаком после запятой («24.3 it/s»). Вычисляется тренером как скользящее среднее по последним ~100 итерациям. Типичные значения: - предустановка Quick (1K iter): 80–120 it/s (коротко, без устойчивого состояния) - Classic 20K @ 1.0 Render Scale (сцена Truck, M3 Max): 25–35 it/s - Classic 20K @ 0.5 Render Scale: 80–120 it/s - MCMC 200K @ 0.5 Render Scale: 25–50 it/s (медленнее из-за relocation) - При 1M+ Gaussians и полном разрешении: < 10 it/s
Уменьшение скорости по ходу обучения нормально — больше Gaussians = больше вычислений на итерацию. Внезапные провалы (напр. с 30 → 5 it/s) указывают на GPU thermal throttling или конкурирующие приложения.
I37Elapsed
ГДЕ
Инспектор → Metrics → Elapsed. Read-only.
ТЕХНИЧЕСКИ
Уже прошедшее время как «4:23» (m:ss) или «1:23:45» (h:mm:ss). Смена формата от 1 часа. Измеряет только чистое время обучения, не предшествующие фазы (вычисление SfM, импорт изображений). С pause/resume часы продолжают идти — так что это wall-clock, не CPU time.
I38ETA
ГДЕ
Инспектор → Metrics → ETA. Read-only.
ТЕХНИЧЕСКИ
Оценочное оставшееся время как «17:42» или «1:12:35». Расчёт: (Max Iterations − текущая итерация) / итерации в секунду. Показывает «–», когда скорость сейчас нулевая (в самом начале или во время паузы). Оценка не подстраивается под типичное замедление к концу обучения — особенно при MCMC и Classic с большими значениями Densify-Until обучение склонно становиться медленнее, потому что появляется всё больше Gaussians. Реально обычно остаётся на 10–20 % выше изначального ETA.
Секция Loss Chart (I39–I41)

Секция Loss Chart визуализирует ход обучения со временем. Состоит из двух графиков: Loss Curve (большой, сверху, синий) и Gaussian Count (меньше, снизу, оранжевый). Оба строятся вживую во время обучения и сохраняются до следующего старта обучения. До первого обучения область пуста («Loss curve will appear during training»). Графики — чистые SwiftUI path-drawings (не Swift Charts framework), поэтому рендерятся плавно даже при 100K+ точек.
I39Current Loss (отображение)
ГДЕ
Инспектор → Loss Chart → левая label-область «Current: 0.0287». Read-only.
ТЕХНИЧЕСКИ
Float-значение последней точки loss-выборки, форматировано с четырьмя знаками после запятой. Идентично с I31 (Loss в секции Metrics), здесь только компактнее отформатировано. Источник — loss-history — список, получающий запись каждые ~30 итераций. В список добавляются только конечные значения — NaN/Infinity (очень редко, в случае gradient explosion bug) фильтруются.
I40Min Loss (отображение)
ГДЕ
Инспектор → Loss Chart → правая label-область «Min: 0.0245» (зелёный). Read-only.
ТЕХНИЧЕСКИ
Минимум всех когда-либо виденных значений loss текущего прогона обучения. Живо пересчитывается из loss-history — никакого отдельного сохранения. Отображается зелёным текстом, потому что «Min» = «лучший на данный момент». Пунктирная зелёная линия на нижнем краю графика визуально маркирует эту Y-позицию. С continue- training-сессиями отслеживание min рестартует — старая история заменяется в UI новой (не дописывается). Если текущее обучение идёт хуже предыдущего, отображение min может оказаться больше предыдущего конечного результата.
I41График Gaussian Count
ГДЕ
Инспектор → Loss Chart → второй график снизу (оранжевый). Read-only.
ТЕХНИЧЕСКИ
Линейный график числа Gaussians по итерациям обучения. Источник: история числа Gaussians (список пар (iter, count), заполняемый тренером каждые ~30 iter). Y- шкала динамическая между минимумом и максимумом истории. При стратегии Classic кривая обычно выглядит так: стабильно растёт до Densify Until, потом плоская (с маленькими pruning-колебаниями). При MCMC: крутой подъём до cap, затем горизонтальная линия (relocation удерживает число постоянным). Если кривая падает несмотря на активное обучение, densification прунит слишком агрессивно — индикация неверных дефолтов или известного MCMC-collapse- бага (тема hotfix v1.4.4).
Как читать кривую loss?
График loss — важнейший диагностический инструмент в Инспекторе — ни один другой индикатор не показывает так напрямую, продвигается ли обучение полезно или застряло. Типичная здоровая форма — быстрый спад в первые 1000–3000 итераций (от ~0.15 до ~0.05), за которым следует медленный, устойчивый спад до конца обучения (до 0.020–0.030). Логарифмически кривая выглядит как гладкая диагональ.
Что означает плато в loss? Если кривая остаётся плоской несколько тысяч итераций, есть два возможных прочтения: (a) обучение «сошлось» — loss больше не может существенно падать, потому что модель так хороша, как может быть с данными данными и настройками. Это желаемое; это «готово». (b) Обучение «висит» — loss мог бы ещё падать, но оптимизация застаивается (локальный минимум, learning rate слишком мал, densification выключен). Различение: если значение loss лежит в типично хорошем диапазоне (0.020–0.030 при indoor/object, 0.040–0.060 при outdoor), и кривая плоская с 5K итераций, оно сошлось. Если значение явно выше, чем у сравнимых сцен (напр. 0.08), оно висит.
Примечание: плато Gaussians ≠ плато Loss. Плато по числу Gaussians не означает «обучение готово». Это только означает, что densification перестал добавлять новые точки — либо потому что достигнут (Classic), либо потому что MCMC cap полон. Обучение продолжается после этого и только уточняет существующие точки. Фактический сигнал «готово» вы читаете по кривой loss и по отображению Iteration (I30), не здесь.
Правило большого пальца для отмены: Если кривая loss после 5000+ итераций лежит выше 0.08 и едва ли снижается, с высокой вероятностью SfM-реконструкция перекошена. Прервите обучение, загляните в главу 9, подходит ли выбранный SfM-бэкенд к сцене, при необходимости переключитесь на COLMAP/Native, потом перезапустите. Лучше вложить 10 минут в лучший SfM, чем 2 часа обучения с плохим выравниванием камер.
Когда обращаться к Инспектору?
Быстрая справка: какая секция + какие элементы управления для какого типичного варианта использования?
| Распространённая задача | Секция | ID элементов |
|---|---|---|
| Загрузить готовую настройку | Presets | I7 (клик по строке) |
| Сохранить свою настройку | Presets | I1 → I2 → I4 |
| Поделиться настройкой с коллегой | Presets | I5 (Export) или I6 (Import) |
| Сменить SfM-бэкенд (напр., потому что Apple-PG слишком нестабилен) | Training Configuration | I12 (см. гл. 9) |
| Обработать видеокадры без EXIF focal length | Training Configuration | I13 (FOV Override) |
| COLMAP-производительность: GLOMAP вместо Classic | Training Configuration | I14 |
| Переключить с Classic на MCMC | Training Configuration | I15 |
| Дать обучению дольше работать | Training Configuration | I18 (Max Iter) + I20 (Densify Until) — связаны через I19 |
| Уполовинить GPU-время | Training Configuration | I22 (Render Scale на 50 %) |
| Качество обучения +6 % (MCMC) | Training Configuration | I16 (MCMC Quality) |
| Уличная сцена с большим числом SfM-точек | Training Configuration | I17 (Auto-scale by scene) |
| Настроить / сменить путь COLMAP | Training Configuration | I23 / I24 / I25 |
| Сделать экспорт-файлы меньше | Enhancements | I26 (всегда оставлять включённым) |
| Более резкий viewport без увеличения времени обучения | Enhancements | I27 (MetalFX) |
| MetalFX слишком сильно сглаживает → альтернатива | Enhancements | I28 (MPS Lanczos) |
| Последний процент детализации с тонкими структурами | Enhancements | I29 (Perceptual Loss 0.05–0.1) |
| Мониторинг обучения | Metrics | I30 (прогресс), I36 (темп), I38 (оставшееся время) |
| Раннюю оценку качества | Metrics | I31 (Loss < 0.05 после 5K = хорошо) |
| Подозрение на SfM-проблему | Metrics + Loss Chart | I31 + I39 (Loss > 0.08 после 5K → SfM-redo) |
| Различать convergence vs застрял | Loss Chart | I39 + I40 (читать loss-плато) |
| Выявить densification-проблему | Loss Chart | I41 (кривая Gaussian падает → bug) |