Capítulo 2 — Inspector (Vista Experto)

Inspector vacío antes de la importación: La barra lateral izquierda muestra el contador de imágenes 0 y la pista de soltar "Drop images here / or tap + to import". El Inspector de la derecha está totalmente funcional, pero los ajustes preestablecidos son solo informativos (sin entrenamiento activo). El ajuste preestablecido predeterminado "Preview" (5K iter) está marcado. Camera Alignment está en Apple Photogrammetry, Densification en Classic, SSIM Weight en 0,20, Render Scale al 50 %. En Training Metrics se muestran estados vacíos ("Start training to see live metrics") y en Loss History ("Loss curve will appear during training").

Inspector tras la importación: El estado de la cabecera dice "60 images ready". La barra lateral de imágenes lista los 60 fotogramas importados (frame_0001.jpg a frame_0945.jpg, cada 16º fotograma del dataset de 960 cámaras como subconjunto para iteraciones rápidas). La lógica auto de la escala de renderizado comprueba la resolución de imagen (1536×2048 = 3,1 MP) y ajusta Render Scale en consecuencia. El botón Play (verde, abajo a la izquierda) está ahora activo e inicia el entrenamiento con el ajuste preestablecido activo.

Inspector durante el entrenamiento: La barra de título muestra el progreso global "RadianceKit — Training NN %". La vista renderiza la reconstrucción Gaussiana en curso en tiempo real (actualizada cada 50 iteraciones — el intervalo de previsualización en vivo se puede configurar en Settings → General → Training → Live Preview). Barra de métricas bajo la vista: Loss actual, Learning Rate, número de Gaussianos y contador de iteración (p. ej., 1.600/5.000 con el ajuste preestablecido Preview). La tarjeta de ajuste preestablecido "Preview" del Inspector recibe una insignia "Modified" en cuanto cualquier parámetro se desvía del predeterminado integrado. La barra lateral "Log" recopila los eventos de las etapas de SfM y entrenamiento.

Inspector tras el entrenamiento: La barra de título muestra el número final de Gaussianos (aquí 2.991 — muy compacta, porque la escena sintética del ramo en Blender tiene geometría sencilla sobre fondo claro). La vista muestra la nube de puntos terminada — la navegación de arrastre orbital está activa (rota alrededor del centro de la escena). La sección Training Metrics está ahora rellena con valores finales, la gráfica de Loss History muestra el transcurso de las 5.000 iteraciones completas. La sección Export, abajo, está ahora activa (todos los botones de formato habilitados).
El Inspector es la barra lateral derecha en Modo Experto (⌘2). Agrupa todos los parámetros relevantes para el entrenamiento en cinco secciones colapsables: Presets, Training Configuration, Enhancements, Metrics y Loss Chart. Cada sección se puede colapsar haciendo clic en la cabecera, y el orden se puede reorganizar por arrastrar y soltar (InspectorView.swift:81-97). Por defecto, todas las secciones están visibles, y el estado de la app persiste las preferencias de colapsado y orden entre inicios.
Varios controles del Inspector también aparecen, en forma casi idéntica, en los Ajustes (Capítulo 3) — típicamente backend de SfM, sky masking y defaults similares. La división es deliberada: Settings provee la plantilla global de la app para proyectos recién creados, el Inspector sobrescribe esos valores para el proyecto abierto actualmente. Una vez conoces la lógica de operación de un lado, puedes usar el otro a ciegas.
La columna izquierda del Modo Experto — el Project Navigator — no forma parte del Inspector, pero es su vecino directo. Allí puedes seleccionar imágenes importadas haciendo clic, previsualizarlas con la barra espaciadora vía Quick Look y eliminarlas con el botón menos o la tecla Suprimir (con Cmd-Z para deshacer). El Inspector sigue la selección actual de la barra lateral con información de detalle según el contexto, pero las cinco secciones principales se mantienen siempre visibles.
Sección Presets (I1–I11)
La sección Presets es la forma más rápida de aplicar una configuración probada. Los ajustes preestablecidos integrados (Classic, MCMC, Scene-Class) ofrecen puntos de partida reproducibles a partir de más de 560 experimentos documentados; los propios se pueden guardar, exportar, importar y compartir. La lista se agrupa por categorías (Classic, MCMC, SceneClass, Custom) y puede haber más de una categoría expandida al mismo tiempo. El menú contextual (clic derecho sobre una fila) hace accesibles Export, Duplicate y — para ajustes preestablecidos personalizados — Delete.
I1Botón Save…
DÓNDE
Inspector → Sección Presets → botón Save… (barra de acciones de abajo).
TÉCNICO
Abre un popover con campo de texto y botones Save/Cancel. El estado actual de TrainingConfig se persiste como nuevo ajuste preestablecido personalizado (codificado en JSON, almacenado a nivel de app). El proceso de guardado copia los 81 parámetros de entrenamiento más la estrategia de densificación actual. El ajuste preestablecido aterriza automáticamente en la categoría Custom, con independencia de cuál fue el ajuste integrado del que derivó. Los nombres vacíos y las entradas con solo espacios en blanco se rechazan. Los nombres ya existentes no se rechazan — cada ajuste tiene su propio ID interno; los nombres duplicados son técnicamente válidos pero, en la práctica, confusos.
I2Campo de texto Preset Name
DÓNDE
Popover de Save → campo de texto "Preset Name".
TÉCNICO
Campo de texto simple con borde redondeado y forma ancha. El valor se toma como nombre del ajuste preestablecido al pulsar Save. Sin límite de longitud en la UI, pero el nombre almacenado debe ser codificable en JSON y mostrable en las listas de la UI — emojis y acentos funcionan. El contenido se restablece automáticamente a cadena vacía al abrir el popover. El botón Save se mantiene deshabilitado mientras el campo esté vacío tras un trim. No hay autosugerencia ni autocompletado con el nombre del ajuste preestablecido activo.
I3Botón Cancel (diálogo Save)
DÓNDE
Popover de Save → botón Cancel (izquierda).
TÉCNICO
Cierra el popover sin guardar. Descarta el contenido del campo de texto — en la próxima apertura, la lógica del botón Save… (I1) lo restablece a vacío. Estilo de botón estándar, sin diálogos de confirmación, sin hotkeys. La TrainingConfig actual no cambia, porque la vía de guardado ni siquiera se ejecutó.
I4Botón Save (diálogo Save)
DÓNDE
Popover de Save → botón Save (derecha, estilo prominente).
TÉCNICO
Dispara la persistencia real. Valida de nuevo que el nombre no esté vacío (chequeo defensivo) y entonces escribe la TrainingConfig actual como JSON al almacenamiento de la app. Luego cierra el popover. Resaltado en azul, atenuado mientras el campo de texto esté vacío. Si guardar falla (p. ej., porque el almacenamiento de la app está lleno — muy improbable), por ahora no hay un diálogo de error visible; el ajuste preestablecido simplemente no aparecería en el próximo arranque de la app.
I5Botón Export…
DÓNDE
Inspector → Sección Presets → barra de acciones → botón Export….
TÉCNICO
Exporta el ajuste preestablecido actualmente seleccionado como archivo .radiancepreset (internamente JSON). Deshabilitado si no hay ajuste seleccionado. Al hacer clic, la app abre un diálogo de guardar con un nombre de archivo de ajuste (nombre del ajuste + extensión .radiancepreset). El formato guardado contiene la TrainingConfig completa más metadatos (nombre, categoría, ID, flag de integrado). El doble clic en Finder abre la app — pero no automáticamente la importación; el usuario tiene que usar el botón Import (I6).
I6Botón Import…
DÓNDE
Inspector → Sección Presets → barra de acciones → botón Import….
TÉCNICO
Abre un diálogo de archivo que solo permite archivos .radiancepreset (multiselección deshabilitada). Al seleccionar, el archivo JSON se carga, valida e inserta en la categoría Custom — con un nuevo ID interno, para que no haya colisiones con los integrados. La importación fija automáticamente la categoría a Custom, incluso si el ajuste exportado era, p. ej., originalmente un integrado. Los archivos corruptos o incompatibles con una versión de schema más antigua se rechazan en silencio, sin diálogo de error (el log de consola sí da información).
I7Fila de ajuste preestablecido (activación por clic)
DÓNDE
Inspector → Sección Presets → cada fila de ajuste preestablecido en cada categoría.
TÉCNICO
Al hacer clic en una fila se reemplazan todos los campos de la TrainingConfig por los valores del ajuste preestablecido, se recuerda el ID del ajuste activo y se restablece el estado Modified. El check de activo delante de la fila solo aparece cuando el ajuste está seleccionado Y no modificado. En cuanto se cambia un valor en TrainingConfig (deslizador, stepper, conmutador en las otras secciones del Inspector), aparece una insignia naranja "Modified" tras el nombre. Los ajustes preestablecidos integrados no pueden sobrescribirse — ante modificación tienes que crear una copia mediante el botón Save (I1).
I8Menú contextual "Export…"
DÓNDE
Clic derecho en cualquier fila de ajuste preestablecido → primera entrada "Export…".
TÉCNICO
Funcionalidad idéntica a I5 (botón Export…), pero accesible más cómodamente — sin que el ajuste preestablecido tenga que seleccionarse primero. Exporta directamente el ajuste clicado en la fila. Funciona igual para todas las categorías (integrada o custom), sin restricción. La exportación contiene el flag de integrado y la categoría original, pero en la reimportación la categoría se mapea a Custom como se describe en I6.
I9Menú contextual "Duplicate"
DÓNDE
Clic derecho en cualquier fila de ajuste preestablecido → segunda entrada "Duplicate".
TÉCNICO
Clona el ajuste preestablecido en la categoría Custom. Crea un nuevo ID interno, añade " Copy" al nombre y guarda la copia. También funciona con ajustes integrados — el clon es entonces editable. El original queda intacto. La TrainingConfig se copia valor por valor (round-trip JSON), así que no quedan bindings de referencia entre original y copia.
I10Menú contextual "Delete"
DÓNDE
Clic derecho en filas de ajustes preestablecidos propios → última entrada "Delete" (rojo, destructivo).
TÉCNICO
Solo visible para ajustes personalizados. Los integrados no se pueden eliminar. La entrada está marcada como destructiva, aparece en rojo en el menú contextual y queda separada tras un divisor para que no se haga clic por accidente. No hay diálogo de confirmación — un clic elimina el ajuste de inmediato. El ajuste eliminado no es recuperable (Cmd-Z no funciona aquí — el Undo existe en la build actual solo para la lista de imágenes, no para operaciones de ajustes preestablecidos). Si el ajuste eliminado estaba activo, la TrainingConfig actual no cambia, solo se anula la selección de ajuste activo.
I11Cabecera de categoría (expandir/colapsar)
DÓNDE
Inspector → Sección Presets → cada cabecera de categoría (Classic, MCMC, SceneClass, Custom).
TÉCNICO
Estado de colapsado por categoría con predeterminados distintos: Classic arranca expandida, MCMC, SceneClass y Custom arrancan colapsadas. El estado no se persiste — al reiniciar la app, todas las categorías vuelven al estado por defecto. La flecha chevron rota animada. El número de la derecha en la cabecera muestra el número de ajustes en esa categoría. El área de impacto de clic abarca toda la región de la cabecera.
Sección Training Configuration (I12–I22)

Aquí viven las palancas centrales: qué backend de SfM debe calcular, cómo funciona la densificación, cuántas iteraciones, cuánto peso SSIM. Con la estrategia MCMC aparecen dos conmutadores adicionales ("MCMC Quality" y "Auto-scale by scene") que quedan ocultos en modo Classic. Con el backend Native SfM se añade el campo de override de FOV, necesario solo para fotogramas de vídeo sin distancia focal EXIF.
I12Selector Camera Alignment
DÓNDE
Inspector → Training Configuration → Camera Alignment (selector segmentado arriba).
TÉCNICO
Selector segmentado con dos opciones: Apple Photogrammetry y Native (Beta). La selección determina el backend de SfM usado en la próxima reconstrucción de cámara. A la vez influye en qué otros elementos del Inspector son visibles: Native muestra además el FOV override (I13), necesario solo con fotogramas de vídeo sin EXIF. Nota: para capturas exteriores muy grandes puedes importar el resultado de una herramienta externa (Metashape o COLMAP) mediante workspace import — véase Capítulo 1 (M5) y Capítulo 9 (Q3, Q6).
I13Campo FOV Override (Native SfM)
DÓNDE
Inspector → Training Configuration → FOV Override (solo visible con Camera Alignment = Native).
TÉCNICO
Campo de texto numérico (rango 0-170°), predeterminado 0 = determinación automática a partir de EXIF o heurística. La entrada manual se necesita cuando las imágenes de entrada se extrajeron de un vídeo que no contiene metadatos de focal. Valores típicos: iPhone Wide ≈ 73°, DJI Mavic Wide-Crop ≈ 70°, dron con sensor de cuadro completo ≈ 84°. El valor se hace clamp a [0, 170] — los valores fuera se empujan de vuelta. Solo afecta a la pipeline nativa de SfM (Q4/Q5); Apple Photogrammetry ignora por completo este valor.
I15Selector Densification
DÓNDE
Inspector → Training Configuration → Densification (selector segmentado, siempre visible).
TÉCNICO
Cambia entre las dos estrategias de densificación: Classic (procedimiento original 3DGS con clone/split/prune y umbral de gradiente) y MCMC (Stochastic Gradient Langevin Dynamics con Relocation, NeurIPS 2024). Al cambiar de Classic a MCMC, la app fija los campos específicos de MCMC automáticamente a valores por defecto probados (pesos de reg = 0, multiplicador de tope MCMC 3,0, schedule de sample/noise). Sin esa inicialización automática, las sesiones con ajustes preestablecidos antiguos sufrían el bug de colapso MCMC de la 1.4.4 (460K→5 Gaussianos, watchdog kill). La selección del selector determina además qué elementos del Inspector son visibles — con MCMC aparecen I16/I17. Efecto detallado por campo en el Capítulo 6, T11–T16 (Classic) y T61–T73 (MCMC).
I16Conmutador MCMC Quality
DÓNDE
Inspector → Training Configuration → MCMC Quality (solo con Densification = MCMC).
TÉCNICO
Cambia la acumulación de gradientes a 2 pasos (activo) o 1 paso (inactivo). Acumula los gradientes de dos vistas de cámara consecutivas antes de ejecutar el paso del optimizador. Empíricamente (Sesión 33, V544a) reduce el error L1 final en torno al 6 % (0,0246 con Quality vs 0,0261 sin, en promedio de 3 trials sobre Horse-Full-MCMC). El precio: el doble de tiempo de entrenamiento. Con entrenamientos muy largos (200K iteraciones) esto añade más de 10 minutos de espera — así que solo merece la pena si los últimos puntos porcentuales de calidad son realmente necesarios. Solo afecta al entrenamiento, no al formato de exportación ni a la visualización en la vista.
I17Conmutador Auto-scale by scene
DÓNDE
Inspector → Training Configuration → Auto-scale by scene (solo con MCMC).
TÉCNICO
Cuando está activo, escala el techo efectivo de max-Gaussians con el número de puntos init de SfM × multiplicador de tope MCMC (predeterminado 3,0). Ejemplo: SfM da 250K puntos init, tope base = 150K, multiplicador 3,0 → techo efectivo = max(150K, 750K) = 750K. Cuando está desactivado, solo se aplica estrictamente el base. Se introdujo en v1.4.5 porque las grandes capturas exteriores con más de 1000 fotogramas y, consecuentemente, alta densidad de puntos SfM, mataban de hambre la densificación con el tope rígido por defecto de 150K — los puntos sobrantes se quedaban, los nuevos no podían surgir. Predeterminado OFF en ajustes personalizados, ON en los integrados de MCMC. Solo afecta al tiempo de entrenamiento, no a la exportación.
I18Stepper Max Iterations
DÓNDE
Inspector → Training Configuration → GroupBox → Max Iterations.
TÉCNICO
Stepper con rango 1.000–100.000, paso 1.000. Determina el número total de iteraciones del optimizador. Linealmente correlacionado con el tiempo de entrenamiento (mitad ≈ 50 % del tiempo). Sweet spots empíricos: 20K (Classic Balanced, L1≈0,028), 40K (Classic Quality, L1≈0,023), 200K (MCMC Full, L1≈0,0246). Por encima de 40K con Classic apenas aporta mejoras en promedio — diminishing returns. Al cambiar, si la función link (I19) está activa, Densify Until se arrastra de forma proporcional (ratio predeterminado: 0,5, es decir, Densify-Until = Max/2).
I19Botón Link/Unlink (Densify ↔ Iterations)
DÓNDE
Inspector → Training Configuration → GroupBox → pequeño botón de enlace entre Max Iterations y Densify Until.
TÉCNICO
Botón conmutador que congela el ratio de Densify Until respecto a Max Iterations. Cuando está activo (icono de enlace resaltado), en cada cambio de Max Iterations el Densify Until se arrastra proporcionalmente. Cuando está desenlazado (icono link-plus), los valores permanecen independientes. El predeterminado está enlazado, porque eso refleja la correlación típica — cuando subes el entrenamiento al doble de iteraciones, normalmente quieres dejar correr también la densificación proporcionalmente más. El ratio se calcula a partir del valor actual al establecer el botón de enlace; un ratio típico es 0,5 (Densify-Until = la mitad del número de iteraciones).
I20Stepper Densify Until
DÓNDE
Inspector → Training Configuration → GroupBox → Densify Until.
TÉCNICO
Stepper con rango 500–50.000, paso 500. Determina el índice de iteración a partir del cual ya no se añaden nuevos Gaussianos mediante clone/split (Classic) o relocalización (MCMC). Tras alcanzarlo, solo se refinan posición y color. Valores más altos = más Gaussianos = archivo más grande, más tiempo de GPU por iteración (+30-60 % de tiempo de GPU por paso). Valores típicos: 15K (para 30K max-iter), 20K (para 40K), 100K (para 200K MCMC). Con link activo (I19), escalado automáticamente. Actúa de forma distinta con Classic vs MCMC: Classic detiene del todo el crecimiento, MCMC detiene la lógica de relocalización, pero la adaptación de sample/noise sigue corriendo.
I21Deslizador SSIM Weight
DÓNDE
Inspector → Training Configuration → GroupBox → SSIM Weight.
TÉCNICO
Deslizador 0,0–1,0 en pasos de 0,05, mostrado como "0.20". Mezcla loss L1 (0,0) y loss SSIM (1,0). L1 ajusta la luminosidad por píxel, SSIM ajusta la similitud estructural (bordes, estadísticas locales). El predeterminado 0,2 es el valor del paper 3DGS original (Kerbl 2023) y se ha verificado como compromiso robusto en numerosas sesiones. Valores más altos (0,5+) favorecen la preservación de detalle, pero pueden ignorar errores locales de luminosidad. Valores más bajos (< 0,1) llevan a pérdida de detalle en bordes nítidos. El cómputo de SSIM corre en el shader con una ventana Gaussiana 11×11. Rendimiento: en 0,0 (solo L1), el entrenamiento es aprox. un 8-12 % más rápido, porque el cómputo SSIM se omite en el shader.
I22Deslizador Render Scale
DÓNDE
Inspector → Training Configuration → GroupBox → Render Scale.
TÉCNICO
Deslizador 0,25–1,0 en pasos de 0,25, mostrado como "100%". Escala la resolución de renderizado del entrenamiento relativa al tamaño de la imagen fuente. La mayor palanca de rendimiento: 50 % reduce el tiempo de GPU aprox. un 75 % (porque 4× menos píxeles), 25 % aprox. un 94 %. El umbral de gradiente se escala junto automáticamente. Bajo el deslizador aparece una visualización de resolución en vivo en MP (p. ej., "2304×1296 (3,0 MP)"). Si el valor actual se desvía del recomendado, "— recomendado: 50 %" se muestra en texto naranja. La recomendación apunta a ~3 MP de resolución efectiva — el rango más eficientemente procesado por las GPUs de Apple Silicon. Las imágenes fuente 4K reciben, p. ej., una recomendación de 25 % automáticamente; las imágenes FullHD, 100 %. Un cambio también dispara la realocación de buffers.
Sección Enhancements (I26–I29)

La sección Enhancements agrupa cuatro funciones que mejoran la calidad de imagen sin cambiar en sí el bucle de entrenamiento. Las tres primeras (I26-I28) son etapas post-entrenamiento o de vista: Compactification limpia tras terminar el entrenamiento, MetalFX y MPS Lanczos son renderers puros de vista que no influyen en el entrenamiento en curso. El Perceptual Loss (I29), pese a pertenecer a la sección, es un componente del entrenamiento — se activa como término de loss adicional durante el entrenamiento; de ahí la separación de los conmutadores de vista mediante un divisor.
I26Conmutador Post-Training Compactification
DÓNDE
Inspector → Enhancements → Post-Training Compactification.
TÉCNICO
Activa el post-procesado V443: tras terminar las iteraciones de entrenamiento, los Gaussianos con opacidad por debajo de 0,01 (1 % de visibilidad) se eliminan. Empíricamente, esto reduce el tamaño de archivo en ~55-58 % sin pérdida visible de calidad — porque esos Gaussianos visualmente no aportan de todos modos. La compactificación corre como una pasada compact GPU y tarda fracciones de segundo a unos segundos según el número de Gaussianos. No afecta al rendimiento del entrenamiento. Si este conmutador está desactivado, también se exportan los Gaussianos invisibles — solo relevante si quieres usar el formato para otra etapa de entrenamiento (Continue Training); en caso contrario, almacenamiento desperdiciado.
I27Conmutador MetalFX Spatial Upscaling
DÓNDE
Inspector → Enhancements → MetalFX Spatial Upscaling.
TÉCNICO
Activa el MetalFX Spatial Upscaler de Apple en el renderer de la vista. Cuando la resolución de entrenamiento (vía I22 Render Scale) es menor que el tamaño de la vista, MetalFX escala el fotograma renderizado de forma basada en ML hasta el tamaño de visualización. Entrega los resultados más nítidos de todas las opciones de escalado, porque el modelo upscaler ML está optimizado para bordes nítidos. La pipeline del renderer se reconfigura en vivo al conmutar — visible al instante, sin reinicio. Tiene prioridad sobre MPS Lanczos (I28): si ambos están activos, gana MetalFX. Sobrecarga de rendimiento en la vista aprox. 1-2 ms por fotograma en GPUs M3. Actúa solo en la vista en vivo, no en las exportaciones renderizadas (vídeo orbital, capturas) — esas se renderizan a la resolución completa de la fuente.
I28Conmutador MPS Lanczos Scaling
DÓNDE
Inspector → Enhancements → MPS Lanczos Scaling.
TÉCNICO
Activa los Metal Performance Shaders de Apple con resampling Lanczos como upscaler de la vista. Lanczos es resampling clásico con filtro sinc de 8 taps — más nítido que bilineal, algoritmo clásico sin ML. La pipeline del renderer se reconfigura en vivo al conmutar. Se ignora si MetalFX (I27) también está activo. Sobrecarga mínima (< 0,5 ms por fotograma), pero la calidad es inferior a MetalFX. Aplicación: fallback para escenas en las que MetalFX produce artefactos (p. ej., estructuras de líneas fuertes que el upscaler ML a veces "alisa demasiado"). Actúa, como I27, solo en la vista en vivo, no en exportaciones.
I29Deslizador Perceptual Loss
DÓNDE
Inspector → Enhancements → Perceptual Loss.
TÉCNICO
Deslizador 0,0–0,2 en pasos de 0,01, mostrado en 0,0 como "Off", en otro caso como "0.05", etc. Activa un término de loss adicional que compara el blur Gaussiano multiescala del renderizado con la imagen ground truth (3 escalas de blur). Captura diferencias estructurales que L1+SSIM por sí solos no detectan. Implementación V460. Empíricamente, un valor de 0,05-0,1 mejora la puntuación L1 en las sesiones unos pocos puntos porcentuales, pero cuesta ~5 % de tiempo de entrenamiento (forward pass adicional por los kernels de blur). Por encima de 0,15, el entrenamiento se vuelve inestable y L1 vuelve a empeorar (el término de loss domina la optimización). Actúa durante el entrenamiento, no en post-procesado — pese a su posición en la sección "Enhancements", no es un acabado posterior puro.
Sección Metrics (I30–I38)

Mientras un entrenamiento está en curso, la sección Metrics muestra nueve valores en vivo del bucle de entrenamiento. Antes de iniciar un entrenamiento, la sección está vacía ("Start training to see live metrics"). Todos los valores se actualizan cada ~30 iteraciones (frecuencia de actualización del stream). La sección es de solo lectura — ningún elemento es clicable o modificable. Para un análisis más profundo, consulta los logs de entrenamiento JSONL en ~/Documents/RadianceKit/Logs/ (script python3 scripts/analyze_logs.py best 5).
I30Iteration
DÓNDE
Inspector → Metrics → Iteration. Solo lectura.
TÉCNICO
Se muestra en el formato "4523 / 40000" — iteración actual sobre el total de iteraciones planificadas. Cuenta de forma sincronizada con el bucle de entrenamiento, que empuja los valores cada ~30 iter. El segundo número corresponde al valor de Max Iterations en el momento del inicio; ya no cambia, aun cuando el usuario ajuste después el stepper — el run en curso usa su propia copia snapshot. Si la app añade iteraciones adicionales mediante el menú Training (Continue Training +5K/+10K/+20K), el denominador aumenta.
I31Loss
DÓNDE
Inspector → Metrics → Loss. Solo lectura.
TÉCNICO
Valor float con seis decimales (p. ej., "0.024385"). Mide el loss combinado L1+SSIM (mezcla controlada vía I21 SSIM Weight) más el Perceptual Loss opcional (I29) y otros regularizadores. La escala no es absoluta, sino dependiente de la escena — exige el mismo dataset para la mayoría de las comparaciones. Valores finales típicos con buenas configuraciones: - Classic Quality 40K iter: 0,022–0,025 (Horse, Truck, Garden) - MCMC Full 200K iter: 0,024–0,028 - Outdoor dron 30K: 0,030–0,060 (peor por razones de geometría) - Apartamentos indoor: 0,018–0,025
Valores por encima de 0,10 tras 5K iteraciones indican problemas de SfM (malas poses de cámara) — aborta y recalcula el SfM.
I32Learning Rate
DÓNDE
Inspector → Metrics → Learning Rate. Solo lectura.
TÉCNICO
Visualización en notación científica (p. ej., "1.60e-04"). Tasa de aprendizaje actual para los parámetros de posición (3DGS tiene seis LRs independientes para posición, SH-DC, SH-Rest, opacidad, escala, rotación — aquí se muestra la LR de posición como valor representativo). Valor inicial predeterminado 1,6e-4, que decae mediante decay exponencial a ~1,6e-6 al final del entrenamiento. El decay es ajustable mediante el campo LR schedule en la configuración de entrenamiento (campo T en el Cap. 6). Si la LR se mantiene inusualmente alta (p. ej., 1e-3 o más después de 10K iteraciones), podría indicar una configuración cargada incorrectamente.
I33SH Degree
DÓNDE
Inspector → Metrics → SH Degree. Solo lectura.
TÉCNICO
Entero 0-3. Grado de spherical harmonics para la representación de color. Empieza en 0 (solo el componente DC, es decir, color independiente de la dirección por Gaussiano — es decir, solo una constante RGB) y sube progresivamente hasta 3 a lo largo del entrenamiento. El schedule estándar sube el grado en 1000/2000/3000 iteraciones en 1 cada vez. SH-3 corresponde a 48 coeficientes de color por Gaussiano (3 canales RGB × 16 funciones base SH). Mayor grado SH = más reflejos dependientes de la dirección (las superficies brillantes se ven correctamente distintas bajo distintos ángulos de visión), pero también más memoria y entrenamiento más lento.
I34Gaussians
DÓNDE
Inspector → Metrics → Gaussians. Solo lectura.
TÉCNICO
Número actual de Gaussianos en el modelo, formateado con separador local (p. ej., "524.318"). Crecimiento: - Classic: empieza en los puntos init de SfM (típicamente 50K-300K), crece mediante clone/split hasta justo antes de Densify Until, después estático hasta el final del entrenamiento (módulo pruning) - MCMC: los puntos sample se añaden hasta el tope MCMC, después solo relocalización
Valores finales sanos: - Classic Quality: 400K-700K (Horse 524K, Garden 800K) - MCMC Full: exactamente en el tope (predeterminado 150K, con multiplicador auto-scale × número de SfM, según escena 500K-1,5M)
Con MCMC, si el número cae a < 60 % del tope → anomalía (indicador de colapso, sugiere regularizadores demasiado agresivos).
I35GPU Memory
DÓNDE
Inspector → Metrics → GPU Memory. Solo lectura.
TÉCNICO
Estimación del consumo de memoria del buffer de Gaussianos como número de Gaussianos × 616 bytes (formateado en estilo memoria). 616 bytes es el tamaño empírico de un Gaussiano totalmente equipado (posición, escala, rotación, opacidad, coeficientes SH grado 3, acumulador de gradiente). La visualización no captura el overhead del renderer (buffer de tiles, buffer de sort, buffer backward) — el requisito real de memoria GPU es típicamente 2-3× este valor. Con 500K Gaussianos: mostrado ~290 MB, real ~700 MB. Con 1,5M Gaussianos: mostrado ~880 MB, real ~2,5 GB. En M3 Max con 64+ GB de memoria unificada es no crítico, en M3 Pro con 18 GB ya es un límite.
I36Speed
DÓNDE
Inspector → Metrics → Speed. Solo lectura.
TÉCNICO
Iteraciones por segundo con un decimal ("24.3 it/s"). Calculado por el entrenador como media móvil sobre las últimas ~100 iteraciones. Valores típicos: - ajuste preestablecido Quick (1K iter): 80-120 it/s (corto, sin estado estable) - Classic 20K @ 1,0 Render Scale (escena 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 (más lento por la relocalización) - Con 1M+ Gaussianos y resolución completa: < 10 it/s
Una velocidad decreciente a lo largo del entrenamiento es normal — más Gaussianos = más cómputo por iteración. Las caídas repentinas (p. ej., de 30 → 5 it/s) indican thermal throttling de GPU o apps competidoras.
I37Elapsed
DÓNDE
Inspector → Metrics → Elapsed. Solo lectura.
TÉCNICO
Tiempo ya transcurrido como "4:23" (m:ss) o "1:23:45" (h:mm:ss). Cambio de formato a partir de 1 hora. Mide solo el tiempo de entrenamiento puro, no las fases previas (cómputo de SfM, importación de imágenes). Con pause/resume el reloj sigue corriendo — es decir, es wall-clock, no tiempo de CPU.
I38ETA
DÓNDE
Inspector → Metrics → ETA. Solo lectura.
TÉCNICO
Tiempo restante estimado como "17:42" o "1:12:35". Cálculo: (Max Iterations − iteración actual) / iteraciones por segundo. Muestra "–" cuando la velocidad es actualmente cero (al principio o durante una pausa). La estimación no se ajusta al ralentizamiento típico hacia el final del entrenamiento — especialmente con MCMC y Classic con valores grandes de Densify-Until, el entrenamiento tiende a volverse más lento porque entran cada vez más Gaussianos. En la realidad suele quedar 10-20 % por encima del ETA inicial.
Sección Loss Chart (I39–I41)

La sección Loss Chart visualiza el transcurso del entrenamiento a lo largo del tiempo. Consiste en dos gráficos: un gráfico Loss Curve (grande, arriba, azul) y un gráfico Gaussian Count (más pequeño, abajo, naranja). Ambos se construyen en vivo durante el entrenamiento y persisten hasta el siguiente inicio de entrenamiento. Antes del primer entrenamiento, el área está vacía ("Loss curve will appear during training"). Los gráficos son dibujos de path SwiftUI puros (no el framework Swift Charts), así que renderizan con fluidez incluso con 100K+ puntos.
I39Current Loss (visualización)
DÓNDE
Inspector → Loss Chart → área de etiqueta izquierda "Current: 0.0287". Solo lectura.
TÉCNICO
Valor float del último sample point de loss, formateado con cuatro decimales. Idéntico a I31 (Loss en la sección Metrics), solo que aquí formateado de forma más compacta. La fuente es el historial de loss — una lista que recibe una entrada cada ~30 iteraciones. Solo se añaden valores finitos a la lista — NaN/Infinity (muy raros, en el caso de un bug de explosión de gradiente) se filtran.
I40Min Loss (visualización)
DÓNDE
Inspector → Loss Chart → área de etiqueta derecha "Min: 0.0245" (verde). Solo lectura.
TÉCNICO
Mínimo de todos los valores de loss vistos jamás del run de entrenamiento actual. Recalculado en vivo a partir del historial de loss — sin persistencia separada. Visualizado con texto verde, porque "Min" = "Best so far". La línea verde discontinua en el borde inferior del gráfico marca esta posición Y visualmente. Con sesiones de continue-training, el seguimiento del min se reinicia — el historial antiguo es reemplazado en la UI por el nuevo (no anexado). Si el entrenamiento actual corre peor que el previo, la visualización del min puede ser mayor que el resultado final anterior.
I41Gráfico Gaussian Count
DÓNDE
Inspector → Loss Chart → segundo gráfico debajo (naranja). Solo lectura.
TÉCNICO
Gráfico de línea del número de Gaussianos sobre las iteraciones de entrenamiento. Fuente: el historial del número de Gaussianos (lista de pares (iter, count), rellenado por el entrenador cada ~30 iter). Escala Y dinámica entre mínimo y máximo del historial. Con la estrategia Classic la curva típicamente tiene este aspecto: subida sostenida hasta Densify Until, luego plana (con pequeñas fluctuaciones de pruning). Con MCMC: subida pronunciada hasta el tope, después línea horizontal (la relocalización mantiene el número constante). Si la curva cae pese a entrenamiento activo, la densificación está podando con demasiada agresividad — indicio de defaults incorrectos o un bug conocido de colapso MCMC (tema del hotfix v1.4.4).
¿Cómo leer la curva de loss?
El gráfico de loss es la herramienta de diagnóstico más importante del Inspector — ningún otro indicador muestra de manera tan directa si el entrenamiento avanza de forma útil o está estancado. La forma sana típica es una caída rápida en las primeras 1000-3000 iteraciones (de ~0,15 a ~0,05), seguida de un descenso lento y sostenido hasta el final del entrenamiento (hasta 0,020-0,030). De forma logarítmica, la curva parece una diagonal suave.
¿Qué significa una meseta en el loss? Si la curva permanece plana durante varios miles de iteraciones, hay dos lecturas posibles: (a) el entrenamiento ha "convergido" — el loss ya no puede bajar de forma significativa, porque el modelo es tan bueno como puede ser con los datos y ajustes dados. Eso es lo deseado; está "listo". (b) El entrenamiento "se cuelga" — el loss aún podría bajar, pero la optimización se estanca (mínimo local, learning rate demasiado bajo, densificación desactivada). Para distinguir: si el valor de loss cae en un rango típicamente bueno (0,020-0,030 con indoor/objeto, 0,040-0,060 con outdoor) y la curva está plana desde las 5K iteraciones, ha convergido. Si el valor es claramente más alto que con escenas comparables (p. ej., 0,08), se ha colgado.
Nota: meseta de Gaussianos ≠ meseta de loss. Una meseta en el número de Gaussianos no significa "el entrenamiento está hecho". Solo significa que la densificación ha dejado de añadir nuevos puntos — ya sea porque se ha alcanzado (Classic) o porque el tope MCMC está lleno. El entrenamiento continúa después y solo refina los puntos existentes. La señal real de "listo" la lees en la curva de loss y en la visualización de Iteración (I30), no aquí.
Regla práctica para abortar: Si la curva de loss tras 5000+ iteraciones está por encima de 0,08 y apenas baja, con alta probabilidad la reconstrucción de SfM está torcida. Aborta el entrenamiento, mira en el Capítulo 9 si el backend de SfM elegido encaja con la escena, posiblemente cambia a COLMAP/Native, después reinicia. Mejor invertir 10 minutos en un SfM mejor que 2 horas de entrenamiento con una mala alineación de cámara.
¿Cuándo recurrir al Inspector?
Referencia rápida: ¿qué sección + qué controles para qué caso de uso típico?
| Tarea habitual | Sección | IDs de control |
|---|---|---|
| Cargar un setup prefabricado | Presets | I7 (clic en fila) |
| Guardar un setup propio | Presets | I1 → I2 → I4 |
| Compartir un setup con un compañero | Presets | I5 (Export) o I6 (Import) |
| Cambiar backend de SfM (p. ej., porque Apple-PG es muy inestable) | Training Configuration | I12 (véase Cap. 9) |
| Procesar fotogramas de vídeo sin focal EXIF | Training Configuration | I13 (FOV Override) |
| Rendimiento de COLMAP: GLOMAP en lugar de Classic | Training Configuration | I14 |
| Cambiar de Classic a MCMC | Training Configuration | I15 |
| Dejar correr el entrenamiento más tiempo | Training Configuration | I18 (Max Iter) + I20 (Densify Until) — acoplados vía I19 |
| Reducir a la mitad el tiempo de GPU | Training Configuration | I22 (Render Scale al 50 %) |
| Calidad de entrenamiento +6 % (MCMC) | Training Configuration | I16 (MCMC Quality) |
| Escena exterior con muchos puntos SfM | Training Configuration | I17 (Auto-scale by scene) |
| Configurar / cambiar la ruta de COLMAP | Training Configuration | I23 / I24 / I25 |
| Hacer los archivos de exportación más pequeños | Enhancements | I26 (déjalo siempre activo) |
| Vista más nítida sin más tiempo de entrenamiento | Enhancements | I27 (MetalFX) |
| MetalFX suaviza demasiado → alternativa | Enhancements | I28 (MPS Lanczos) |
| El último ápice de detalle con estructuras finas | Enhancements | I29 (Perceptual Loss 0,05-0,1) |
| Monitorizar el entrenamiento | Metrics | I30 (progreso), I36 (ritmo), I38 (tiempo restante) |
| Valorar la calidad temprano | Metrics | I31 (Loss < 0,05 tras 5K = bueno) |
| Sospechar un problema de SfM | Metrics + Loss Chart | I31 + I39 (Loss > 0,08 tras 5K → rehacer SfM) |
| Distinguir convergencia vs estancado | Loss Chart | I39 + I40 (leer la meseta de loss) |
| Identificar un problema de densificación | Loss Chart | I41 (la curva Gaussian cae → bug) |