Guia do Usuário

Capítulo 6 — Configuração de Treinamento

Preset de pré-visualização exportado como JSON + exibido no TextEdit — campos id/name/category/version/createdAt/description, trainingConfig com todos os parâmetros relevantes (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, seis alternadores booleanos)
Preset de pré-visualização exportado como JSON + exibido no TextEdit — campos id/name/category/version/createdAt/description, trainingConfig com todos os parâmetros relevantes (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, seis alternadores booleanos)

Uma exportação típica de Preset em JSON. Campos de nível superior: id (UUID), name, (classic | mcmc | sceneClass | custom), (versão do schema), (timestamp), (texto livre). O objeto aninhado contém os parâmetros críticos para a reprodutibilidade — durante a importação, o bloco inteiro é lido na Configuração de Treinamento, e valores padrão da versão do app preenchem os campos que faltam no JSON (por exemplo, após uma atualização do app). Quem repassa um Preset para outro Mac apenas envia esse arquivo JSON.

A Configuração de Treinamento é o coração de cada execução de treinamento no RadianceKit. Ela reúne todos os parâmetros que influenciam o treinamento — desde o número máximo de iterações, passando pelas oito taxas de aprendizado, até os campos especiais para MCMC, Mip-Splatting, o Curriculum e a lógica de Cap sensível à cena (scene-aware). Você a edita na barra lateral, na seção de Configuração de Treinamento (Expert View), salva-a como Preset ou a repassa como exportação JSON para outro Mac. Durante o treinamento, exatamente esse objeto é congelado e entregue ao backend de GPU.

Este capítulo é material de referência para usuários avançados. Ele lista os 80 campos configuráveis da Configuração de Treinamento, os 9 Presets incluídos e a resolução do Gaussian-Cap dependente da cena. Em caso de dúvida, vale o valor definido pelo Preset escolhido — você o vê no Inspector ou na exportação JSON do Preset.

Índice:

+ Iteração (T1–T2) + Learning Rates (T3–T10) + Densification — Classic (T11–T16) + Loss (T17–T20) + SH-Degree-Progression (T21) + Performance (T22–T24) + Diagnóstico e Preparação da Nuvem de Pontos (T26–T30) + Regularização (T31–T37) + Refinement (T38–T44) + Sky-Dome (T45–T48) + Adam + LR-Schedule (T49–T55) + Post-Processing + Apple AI (T56–T60) + MCMC-Densification (T61–T73) + Mip-Splatting (T74–T76) + Adaptive Densification (T77–T79) + Curriculum (T80–T81) + Presets Estáticos (TP1–TP9) + Como o app determina o Gaussian-Cap + Qual campo serve para quê? (Cheat-Sheet) + Campos Perigosos

Iteration (T1–T2)

T1maxIterations

DETALHES

Padrão: 30 000 (Initializer), 35 000 (.full), 200 000 (.fullMCMC) Faixa: 1 000 – 500 000 (UI-Slider), sem limite superior rígido na lógica

TÉCNICO

Número total de iterações de treinamento que o Backend percorre. Uma iteração corresponde a um Forward-Render de uma única câmera de treinamento, um Backward-Pass sobre todos os componentes de Loss (L1 + SSIM + regularizações opcionais + Sky-Mask) e um passo do Adam-Optimizer. Esse número afeta diretamente os outros schedules: a taxa de aprendizado de posição segue uma curva de Cosine-Annealing de 0 até T1 mesmo ou até T50 positionLRScheduleEndIteration; a Densification para em T2 densifyUntilIteration; o decaimento de MCMC-Noise termina em T69 mcmcNoiseDecayEnd; as atualizações de SH-Degree acontecem nas três marcas definidas em T21. Com Densification clássica, a faixa comprovada fica entre 20 000–35 000 iterações; com MCMC, entre 60 000–200 000. Um aumento drástico além dos valores definidos no Preset raramente traz qualidade adicional — o momentum do Adam satura, e sem o fim do LR-Decay o Loss estagna. Por outro lado, ficar abaixo de ~5 000 leva a geometrias incompletamente convergidas (o Density-Control tem pouco tempo para clonar/dividir).

T2densifyUntilIteration

DETALHES

Padrão: 15 000 (Initializer), 5 000 (.full), 160 000 (.fullMCMC) Faixa: 0 – T1 maxIterations

TÉCNICO

Iteração a partir da qual a Densification para. Até esse ponto, os Gaussians são clonados, divididos e podados (prune) segundo as regras parametrizadas em T11–T16 (Classic) ou T67–T70 (MCMC); depois disso, o número de Gaussians permanece constante e apenas posições, rotações, escalas, opacidades e coeficientes SH continuam sendo otimizados (fase de Refinement). No artigo original do 3DGS, o valor fica em 50% de T1; no Preset .full do RadianceKit, apenas ~14% (5 000 de 35 000): depois de cerca de 5 000 iterações, mais Densification tende a piorar o resultado — mais Floaters, mais uso de memória, sem ganho de qualidade. Já o MCMC deixa a Relocation rodar até 80% de T1, porque o MCMC não produz Floaters prejudiciais. Se T2 for escolhido pequeno demais (< 1 000), surgem poucos Gaussians; grande demais no Classic (> 50% de T1) leva a Overgrowth e a outliers de saturação RGB (veja Outdoor-Overtraining-Findings).

Learning Rates (T3–T10)

T3positionLearningRate

DETALHES

Padrão: 0.00016 Intervalo: 1e-7 – 1e-3 (recomendado)

TÉCNICO

Taxa de aprendizado Adam para a posição XYZ de cada Gaussian no início do treinamento (iteração 0). Segue uma curva de cosine annealing e diminui ao longo do treinamento até T4 positionLearningRateFinal. O padrão 0.00016 vem do artigo original de 3DGS (Kerbl et al.~2023) e no RadianceKit não deve ser escalonado mesmo com aumento da resolução da imagem — a posição se move no sistema de coordenadas do mundo, não no espaço de pixels. Um aumento significativo (> 0.0005) faz com que Gaussians saltem por distâncias longas e o loss fique instável; valores bem abaixo disso (< 0.00005) fazem com que nuvens de pontos inicializadas incorretamente nunca encontrem seu lugar. Para a grande maioria das cenas, o valor padrão é, portanto, a escolha certa. Observe: em .fullMCMC deixamos esse valor propositalmente no padrão — o MCMC precisa de taxas de aprendizado constantes para sua lógica de relocation, então ajustar aqui não traz benefício algum.

T4positionLearningRateFinal

DETALHES

Padrão: 0.0000016 (Initializer + artigo), 0.000016 (.full, .fullMCMC — 10× mais alto) Intervalo: 0 – T3 positionLearningRate

TÉCNICO

Valor final da curva de cosine annealing da LR de posição. É alcançado em T1 maxIterations ou, se definido, em T50 positionLRScheduleEndIteration. O preset .full do RadianceKit usa 0.000016 — portanto, 10× mais alto que o padrão do artigo, 0.0000016. Tanto um valor final significativamente menor quanto um valor inicial significativamente maior pioram o resultado de forma perceptível. O valor final alto não é um trade-off, mas uma escolha deliberada: com decaimento forte demais, os Gaussians perdem, durante a fase de refinement, a capacidade de se ajustar a candidatos de densification recém-adicionados. A fase do schedule pode ser encurtada (T50 < T1), de modo que T4 já seja alcançado antes do fim do treinamento e o restante do treinamento ocorra com uma mini-LR constante — configuração típica: T50 = 20 000, T1 = 35 000, ou seja, refinement a 0.000016 por 15 000 iterações.

T5shDCLearningRate

DETALHES

Padrão: 0.0025 (Initializer + artigo), 0.005 (.full e todos os presets MCMC — 2×) Intervalo: 0.0001 – 0.05

TÉCNICO

Taxa de aprendizado Adam para a componente DC (grau 0, ou seja, albedo constante) da cor em spherical harmonics. SH-DC corresponde ao tom base independente de direção de um Gaussian, uma espécie de "cor base". O RadianceKit dobra o padrão do artigo nos presets de qualidade — isso acelera a convergência de cor, o que é necessário porque em treinamentos curtos (< 5 000 iterações) a SH-DC do contrário não chega a se formar. Diferente das LRs geométricas, a SH-DC não tem decaimento; a taxa de aprendizado permanece constante ao longo de todas as iterações (ou apenas segue o decaimento opcional de extended phase de T51). Valores ainda mais altos (por volta de 0.01) voltam a piorar o resultado e deixam as cores instáveis.

T6shRestLearningRate

DETALHES

Padrão: 0.000125 (Initializer + artigo), 0.00025 (.full e MCMC — 2×) Intervalo: 0.000001 – 0.005

TÉCNICO

Taxa de aprendizado Adam para os coeficientes de SH de ordem superior (grau 1, 2, 3 — ou seja, as componentes de cor dependentes da direção de visão, responsáveis por brilhos, reflexos e sombreamento suave). 20× menor que T5 por convenção do artigo, porque esses coeficientes crescem quadraticamente em número (3 para o grau 1, 5 para o grau 2, 7 para o grau 3 → totalizando 15 floats por Gaussian) e sem uma taxa de aprendizado menor saturariam a imagem. É liberado em duas etapas — até a primeira marca em T21 shDegreeUpgradeIterations apenas o grau 0 está ativo (ou seja, só T5), depois 1, mais tarde 2, finalmente 3. Valores baixos aqui são especialmente importantes em cenas com muita iluminação difusa; em superfícies muito brilhantes (pintura automotiva, água) não vale a pena ajustar — a representação em SH em si é limitada.

T7opacityLearningRate

DETALHES

Padrão: 0.05 (Initializer + artigo), 0.1 (.full, MCMC — 2×) Intervalo: 0.001 – 1.0

TÉCNICO

Taxa de aprendizado Adam para o logit-opacidade de cada Gaussian. O aplicativo armazena a opacidade como um valor float irrestrito e o transforma com sigmoid em [0, 1]; a LR atua no espaço de logit. Os presets de qualidade dobram o padrão do artigo para 0.1; isso torna o pruning mais eficiente — Gaussians mortos caem mais rápido abaixo do T14 pruneOpacityThreshold. Qual valor funciona melhor depende, no entanto, da configuração do Adam; a interação entre os dois não é trivial. Valores baixos (< 0.01) fazem com que Gaussians "mortos" fiquem eternamente por aí consumindo memória; valores altos demais (> 0.5) podem causar explosão de opacidade, por isso o otimizador limita rigidamente o valor de logit a [-15, 3].

T8opacityLearningRateFinal

DETALHES

Padrão: 0.0 (= "sem decaimento") Intervalo: 0 ou 0.001 – T7 opacityLearningRate

TÉCNICO

Valor final opcional de cosine decay para a LR de opacidade. Se 0.0, o decaimento é desativado e a LR de opacidade permanece constante em T7 durante todo o treinamento. Um decaimento de 0.1 para 0.01 piora o resultado de forma perceptível; por isso o padrão é "desligado". A hipótese por trás desse campo: na fase de refinement, uma LR de opacidade constante poderia levar a oscilação, de modo que splats que já atingiram o nível correto de transparência seriam deslocados novamente por flutuações aleatórias de gradiente. Empiricamente, isso não se confirma — a lógica de logit-clamping já contém isso de qualquer forma. O campo permanece disponível para experimentos futuros; até execuções MCMC muito longas (> 500K iterações) poderiam se beneficiar disso.

T9scaleLearningRate

DETALHES

Padrão: 0.005 (Initializer + artigo), 0.01 (.full, MCMC — 2×) Intervalo: 0.0001 – 0.1

TÉCNICO

Taxa de aprendizado Adam para as três componentes de escala de cada Gaussian no espaço logarítmico (o RadianceKit armazena log(scale), para que as escalas permaneçam positivas). O padrão do artigo é 0.005, no RadianceKit dobrado para 0.01 para melhor convergência de escala com as configurações ajustadas de taxas de aprendizado. Se o valor permanecer no padrão do artigo em conjunto com as demais taxas de aprendizado de qualidade, surgem visivelmente Gaussians de menos — o controle de densidade não consegue clonar, porque as atualizações de escala acompanham devagar demais. A escala controla a extensão de cada Gaussian — aprendizado rápido demais leva a Gaussians "agulha" (splats extremamente longos e finos, veja T34 scaleRatioPruneThreshold), aprendizado lento demais faz com que os splats permaneçam compactos demais e o controle de densidade precise dividir com muita frequência.

T10rotationLearningRate

DETALHES

Padrão: 0.001 (Initializer + artigo), 0.002 (.full, MCMC — 2×) Intervalo: 0.0001 – 0.05

TÉCNICO

Taxa de aprendizado Adam para os quatro componentes de quaternion de cada Gaussian. O quaternion é renormalizado a cada passo do otimizador após a atualização do Adam (norma L2 = 1) — caso contrário, a matriz de covariância se tornaria degenerada. O RadianceKit dobra o padrão do artigo nos presets de qualidade, porque a rotação tem magnitudes de gradiente absolutas menores em comparação com escala/posição (na esfera unitária, cada passo permanece curto) e sem o 2× a rotação ficaria claramente sub-convergida na janela de 35 000 iterações. Em cenas do NeRF-Blender (Lego, Chair), a rotação tem um efeito especialmente notável — as bordas dos objetos só se alinham corretamente após 5 000–10 000 iterações.

Densification — Classic (T11–T16)

T11densifyGradThreshold

DETALHES

Padrão: 0.000002 (Initializer, calibrado para resolução 0,5×), 0.0000011 (.full, calibrado para 1,0×), 0.000004 (.quickTest, calibrado para 0,25×), 2e-7 (.fullClassicPaper) Intervalo: 1e-8 – 1e-3 (dependente da resolução)

TÉCNICO

Limiar para a norma L2 do gradiente de posição projetado no espaço da tela, acima do qual uma Gaussian é marcada para clonagem ou divisão (split). O valor absoluto depende diretamente da resolução de treinamento — ele escala aproximadamente com 1/resolução² (mais pixels = gradientes por pixel menores). Por isso, cada nível de T22 trainingRenderScale precisa de um limiar calibrado: 0,25× → 4e-6, 0,5× → 2e-6, 1,0× → 5e-8 … 1,1e-6 (.full). O padrão do paper (0.0002) é normalizado em NDC e não é diretamente comparável no pipeline em espaço-mundo do RadianceKit. Com a flag T52 adaptiveDensifyThreshold, o valor pode ser calculado em tempo de execução a partir do p98 da distribuição atual de gradientes — em cenas reais, porém, o número de Gaussians despenca dramaticamente (poda em massa); a flag permanece desativada. T77–T79 oferecem uma lógica adaptativa alternativa via mediana móvel (rolling median). Este campo não é inofensivo — reduzir pela metade gera 2–4× mais Gaussians (pressão de memória, risco de OOM); dobrar pode causar subdensificação da cena.

T12densifyFromIteration

DETALHES

Padrão: 500 Intervalo: 100 – 5 000

TÉCNICO

Primeira iteração a partir da qual a densificação fica ativa. Antes disso, ocorre apenas aprendizado "puro" sobre a nuvem de pontos SfM inicial, sem que novas Gaussians sejam criadas. O padrão 500 vem do paper 3DGS e dá tempo para a inicialização se estabilizar — se a densificação começasse já na iteração 0, pontos SfM mal posicionados se clonariam muitas vezes antes de encontrar sua posição correta. Um início muito mais tardio (por exemplo, 1.000) piora ligeiramente o resultado; mantenha o padrão.

T13densifyInterval

DETALHES

Padrão: 100 (Initializer, MCMC), 200 (.full) Intervalo: 50 – 1 000

TÉCNICO

Quantas iterações existem entre duas etapas de densificação. No padrão do paper, 100 — a cada 100 iterações, a lista de candidatos à densificação é avaliada, clonada/dividida, e simultaneamente a lista de candidatos à poda (sigmoid(opacity) < T14 pruneOpacityThreshold) é removida. Para .full, 200 se mostrou eficaz — isso alivia a GPU, pois menos passes de reorganização são executados, e dá a cada Gaussian mais tempo para se estabilizar após uma ação de clonagem. Intervalos mais curtos levam, na configuração Quality, a sobredensificação: surgem muito mais Gaussians sem que a imagem melhore. No MCMC, o mesmo campo é interpretado como intervalo de realocação; veja T67 mcmcRelocationInterval para a lógica específica do MCMC.

T14pruneOpacityThreshold

DETALHES

Padrão: 0.005 (Initializer, Paper, MCMC), 0.001 (.full) Intervalo: 0.0001 – 0.1

TÉCNICO

Limiar de opacidade sigmoide, abaixo do qual uma Gaussian é excluída na próxima etapa de densificação. Atua em conjunto com T7 opacityLearningRate e a lógica de clamp logit no otimizador. Em .full, o valor é 0.001 em vez de 0.005 — splats que só têm relevância sob ângulos de visão exóticos permanecem assim por mais tempo e contribuem para o detalhe de SH. Valores ainda menores (cerca de 0.0001) não trazem mais benefício: pouco é podado e memória é desperdiçada. Importante: o controle de densidade DEVE SEMPRE podar, mesmo que a capacidade do buffer já esteja cheia por outras medidas — caso contrário, Gaussians mortas se acumulam e a contagem congela.

T15opacityResetInterval

DETALHES

Padrão: 3 000 (Initializer + Paper), 100 000 (.full = efetivamente desativado), 200 000 (.fullMCMC = desativado) Intervalo: 1 000 – 100 000+

TÉCNICO

A cada quantas iterações a opacidade de todas as Gaussians é resetada para um valor baixo (~0.01) — uma medida do paper 3DGS para reavaliar splats "congelados". Junto com o warmup do RadianceKit, a configuração de treinamento estocástica e as taxas de aprendizado duplicadas, o reset de opacidade custa qualidade perceptível, e o clamp logit no otimizador já cobre essa função de qualquer forma. Por isso, em .full, está praticamente desativado (100 000 > 35 000 = nunca disparado). Em .fullClassicPaper (variante fiel ao paper), ele é deliberadamente definido novamente como 3 000 — ali o objetivo é atingir os orçamentos de Gaussians do paper original.

T16maxScreenSize

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 (desligado) ou > 0

TÉCNICO

Tamanho máximo em espaço de tela (em pixels projetados) que uma Gaussian pode alcançar antes de ser forçadamente dividida. O valor está definido em 0 — o controle de densidade do RadianceKit usa, em vez disso, o limiar de escala em espaço-mundo da mesma lógica de gradiente. Permanece no catálogo de campos porque experimentos futuros com Mip-Splatting (T74–T76) ou estratégias de splatting específicas de cena poderiam se beneficiar disso. Ativação (valor > 0, por exemplo 20) forçaria splats que ficaram muito grandes na tela a se dividir — relevante em grandes superfícies planas de parede, onde um único splat gigante oferece pouco detalhe.

Loss (T17–T20)

T17ssimWeight

DETALHES

Padrão: 0.2 (Initializer + Paper + .full), 0.05 (todos os Presets MCMC) Intervalo: 0.0 – 1.0

TÉCNICO

Peso da parcela D-SSIM na função de loss combinada loss = (1 - λ) * L1 + λ * D-SSIM, onde λ = T17. O padrão 0.2 do paper 3DGS é a escolha certa para a Densification clássica — já 0.3 piora o resultado visivelmente. Para o MCMC, por outro lado, o valor adequado é 0.05, porque o MCMC precisa de uma parcela L1 mais forte devido à sua exploração estocástica — pesos SSIM mais altos diluiriam as decisões de relocation. O SSIM é bem mais caro de calcular do que o L1 (janelas locais de 11×11 sobre a imagem inteira); o RadianceKit usa uma implementação acelerada por MPS que fica abaixo de 1 ms por imagem em 1080p. Os presets de Scene Class usam valores específicos por cena entre 0.082 (.outdoorPreset) e 0.171 (.indoorPreset).

T18ssimWeightRefinement

DETALHES

Padrão: 0.0 (= "sem mudança, mantém ssimWeight") Intervalo: 0 ou 0 – 1.0

TÉCNICO

Valor de SSIM opcional para a fase de refinamento após T2 densifyUntilIteration. Aumentar de 0.2 para 0.3 na fase de refinamento piora o resultado em ambas as métricas — tanto L1 quanto SSIM; por isso o padrão fica em 0.0. A hipótese por trás desse campo era que, após a Densification — quando não surgem mais novos Gaussians — uma parcela SSIM mais forte maximizaria a nitidez estrutural. Empiricamente errado: aumentar o peso do SSIM significa indiretamente reduzir o peso do L1, e o L1 é o sinal muito mais significativo na fase final de refinamento. O campo continua disponível para experimentos futuros com loss perceptual (T60) ou Edge-Loss (T19), onde uma composição de loss específica para o refinamento poderia fazer sentido.

T19edgeLossWeight

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 0.001 – 1.0

TÉCNICO

Termo de loss experimental: peso de um Sobel-Gradient-Domain-L1-Loss, que compara diretamente as bordas da imagem (Sobel do ground-truth vs Sobel da renderização), além do L1+SSIM. Hipótese: a informação de bordas é um pilar perceptual da qualidade de imagem e um termo explícito deveria incentivar os Gaussians a acertarem melhor as bordas. Na prática, não traz nada: um peso perceptível (0.1) piora o resultado, um peso pequeno (0.01) não altera a qualidade, mas custa tempo de processamento. O passo Sobel custa um forward MPS adicional sobre o ground-truth e a renderização. Por isso, permanece desativado permanentemente. Caso de uso futuro: cenas com bordas artificiais duras (arquitetura, móveis, renderizações) poderiam se beneficiar — mas os presets de Scene Class não usam esse termo para isso, e sim escalam o peso do SSIM.

T20skyMaskingEnabled

DETALHES

Padrão: false (Initializer e todos os presets) Intervalo: boolean

TÉCNICO

Ativa o Sky Masking. Nesse processo, em cada imagem, a região do céu é mascarada com a ajuda do Apple Vision Framework, e o loss nessa área é definido como zero. Motivo: cenas externas frequentemente sofrem porque pixels de céu azul/cinza/branco levam o app a posicionar Gaussians exatamente ali — o que é percebido como "floater". Sem a máscara de céu, o loss nessa área nunca seria zero, porque o céu na imagem varia levemente e o app tenta eternamente reconstruir isso com splats. A máscara do Vision é calculada uma vez por câmera antes do treinamento e mantida na RAM. Normalmente é ativada junto com T45 skyDomeEnabled (lógica de UI na Settings-View). Em cenas internas ou renderizações sintéticas, deixe desativado — a máscara reconheceria erroneamente tetos ou paredes como "céu" nesses casos.

SH-Degree-Progression (T21)

T21shDegreeUpgradeIterations

DETALHES

Padrão: [1_000, 2_000, 3_000] (Initializer), [2_000, 5_000, 8_000] (.full, MCMC), [1_000, 2_000] (.preview — Grau 3 pulado) Intervalo: [Int], cada valor em [0, maxIterations], monotonicamente crescente

TÉCNICO

Iterações nas quais o SH-Degree ativo é elevado de 0→1, 1→2, 2→3. Antes da primeira marca, apenas os componentes DC estão ativos (ou seja, T5 shDCLearningRate), após a primeira marca o DC + 3 coeficientes de Degree 1, após a segunda marca + 5 coeficientes de Degree 2, após a terceira marca todos os 15 coeficientes. O consumo de memória por Gaussian cresce assim em estágios — 4 Floats → 16 Floats → 36 Floats → 64 Floats. Os Presets de qualidade atrasam os aumentos de grau em relação aos padrões do Initializer, porque a geometria deve primeiro se estabilizar, antes que os detalhes de cor com sua frequência mais alta sejam adicionados. As marcas mais precoces [1K, 2K, 3K] produzem em .full um resultado visivelmente pior. O .preview limita no Degree 2, porque o Degree 3 não converge em 5.000 iterações e apenas consome capacidade do otimizador. O Curriculum (T80–T81) oferece uma lógica alternativa, que substitui essa lista dinamicamente.

Performance (T22–T24)

T22trainingRenderScale

DETALHES

Default: 1.0 (Initializer, .full, MCMC, Scene-Class), 0.5 (.preview), 0.25 (.quickTest) Range: 0.05 – 2.0 (típico 0.25, 0.5, 1.0)

TÉCNICO

Resolução de renderização durante o treinamento, relativa à resolução original das imagens de treinamento. Com 0.5, cada imagem é reduzida para 50 % de largura × 50 % de altura (ou seja, 25 % dos pixels) e a renderização gaussiana ocorre nessa resolução menor. Reduz tanto o consumo de memória quanto o esforço computacional de forma quadrática. Importante: T11 densifyGradThreshold precisa combinar com a resolução escolhida — as magnitudes de gradiente escalam com 1/resolução², por isso .quickTest (0.25×) tem um threshold muito mais alto (4e-6) do que .full (1.0×, 1.1e-6). O RadianceKit avisa em caso de imagens muito grandes e ajusta automaticamente — resolução-alvo de 3 MP. Em entradas 4K extremas, 0.5 ou até 0.25 seriam sensatos, senão qualquer Mac ficaria limitado à compactação por CPU.

T23resolutionWarmupScale

DETALHES

Default: 0.0 (= desativado) Range: 0 ou 0.1 –

TÉCNICO

Treina a fase de Densification (iter. 0 até T2) em uma resolução mais baixa do que a fase de Refinement. Para .full isso está desligado, porque com T22 = 1.0 e Cosine-Annealing o ganho de tempo é pequeno e a qualidade sofre um pouco. Permanece no catálogo de campos porque poderia voltar a fazer sentido com entradas 4K e treinamentos longos — o Curriculum (T80) retoma uma lógica semelhante, mas lá ela está acoplada ao cronograma de LR. Se ativado e T80 curriculumResolutionRamp também for true, o Curriculum vence e sobrescreve este valor.

T24tileSize

DETALHES

Default: 16 Range: 8, 16, 32

TÉCNICO

Tamanho dos tiles de rasterização em pixels. A renderização de Gaussian Splatting é baseada em tiles: a imagem é dividida em blocos de 16×16 pixels, cada bloco reúne os Gaussians relevantes para ele, ordena-os por profundidade e os mescla. 16 é o padrão usado praticamente por todas as implementações de 3DGS e está fixo no código dos kernels Metal do RadianceKit; alterar esse valor exigiria recompilar os shaders e não é efetivo no estado atual. Permanece como campo caso uma versão futura do engine venha a suportar tile-size dinâmico.

Diagnóstico e preparação de nuvem de pontos (T26–T30)

T26depthDistortionWeight

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 0.0001 – 0.05

TÉCNICO

Experimental: peso de uma loss de regularização de Depth-Distortion. Penaliza Gaussians que estão empilhados profundamente ao longo de um raio de renderização, mas que conceitualmente pertencem à mesma superfície — isso encoraja distribuições de profundidade concentradas e reduz floaters. Em todas as intensidades testadas, o resultado piora em vez de melhorar. A vantagem teórica — melhorar a consistência multi-view — não se reflete na L1-loss, porque a hipótese assume implicitamente que a geometria SfM está correta e que os Gaussians só precisam ser "empilhados". Na prática, a nuvem de pontos SfM costuma ser o componente mais fraco, não o empilhamento. Permanece disponível para conjuntos de dados multi-view com poses especialmente limpas (Synthetic, Mip-NeRF 360 com Ground Truth).

T27singleViewOverfit

DETALHES

Padrão: false Intervalo: boolean

TÉCNICO

Flag de diagnóstico: se true, em cada iteração de treinamento é usado obrigatoriamente o índice de câmera 0 em vez de um índice aleatório do pool de câmeras. Objetivo: se o modelo não conseguir sequer sobreajustar (overfit) uma única view (ou seja, a loss na view 0 também não tende a zero após 10.000 iterações), há um bug fundamental no forward/backward pass. Esse interruptor foi usado intensamente durante o desenvolvimento dos shaders Metal e dos kernels de rasterizador diferenciável. Hoje disponível apenas como verificação de sanidade, quando alguém alterou algo no backend de treinamento e quer conferir novamente. Na interface não há um controle para isso — o campo está desligado em todos os Presets e permanece assim.

T28maxCameras

DETALHES

Padrão: 0 (= "usar todas as câmeras") Intervalo: 0 ou 1 – N

TÉCNICO

Limite de diagnóstico: treina apenas com as primeiras N câmeras, ignora todas as demais. Objetivo original: testar a hipótese de que câmeras demais geram conflitos de gradiente (sinais de loss contraditórios demais para o mesmo Gaussian). Uma limitação artificial não traz vantagem — mais frames praticamente sempre trazem mais qualidade. Na interface não há nenhum controle para isso; o campo está definido como 0 em todos os Presets, ou seja, "todas as câmeras".

T29maxInitialPoints

DETALHES

Padrão: 0 (= "usar todos os pontos SfM") Intervalo: 0 ou 1.000 – 200.000+

TÉCNICO

Salvaguarda: limita o número de pontos SfM iniciais com os quais o treinamento começa. Reconstruções COLMAP densas podem produzir > 60.000 pontos, o que, em escalas iniciais grandes, resulta em 200–300 Gaussians por sobreposição de pixel — isso cria um "campo de neblina" no qual o treinamento não converge. Subamostrar para ~16.000 pontos (lógica de hard-cap no motor de treinamento) traz a densidade inicial para o nível usado pelo 3DGS de referência, e reduz drasticamente a sobreposição. O app define isso automaticamente em reconstruções muito densas; não há um controle para isso.

T30cameraClusterOutlierMultiplier

DETALHES

Padrão: 10.0 (todos os Presets — nunca sobrescrito) Intervalo: 1.0 – 100.0

TÉCNICO

Multiplicador para o filtro de outliers do Camera-Cluster. Antes do treinamento, o motor de treinamento calcula o centroide de todas as posições de câmera e a distância máxima de uma câmera em relação ao centroide. Pontos SfM cuja distância em relação ao centroide ultrapassa multiplier × maxCameraDistance são descartados como outliers. O padrão de 10× foi escolhido deliberadamente com folga. Um efeito colateral sutil: SfM mais compacto (câmeras mais próximas entre si) → limiar menor → mais pontos são descartados como outliers. SfM mais disperso → limiar maior → menos pontos descartados. Disso resulta um efeito surpreendente: uma reconstrução SfM mais compacta e, em princípio, melhor pode piorar o treinamento, porque pontos iniciais demais são descartados. O campo está definido como 10 em todos os Presets e não é ajustável na interface. Valores abaixo de 5 costumam ser muito restritivos, acima de 20 são ineficazes.

Regularização (T31–T37)

T31coarseToFineBlurRadius

DETALHES

Padrão: 0 (= desativado) Intervalo: 0 ou 1 – 10

TÉCNICO

Experimental: raio de desfoque em caixa (box blur) que é aplicado à imagem de referência (ground truth) no início da fase de Densification e reduzido linearmente até 0 no final da Densification (T2). Hipótese: um treinamento coarse-to-fine — primeiro aprender estruturas grosseiras, depois detalhes — deveria produzir geometria mais estável. Em todos os raios testados, o resultado piora. O motivo do fracasso: a Densification decide com base em gradientes no domínio da imagem, e o desfoque reduz exatamente os sinais que são importantes para "aqui precisa clonar". Permanece no catálogo de campos para testes futuros com outro esquema de controle de densidade.

T32scaleRegWeight

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 0.0001 – 0.05

TÉCNICO

Experimental: regularização L1 sobre a escala no espaço do mundo. Penaliza Gaussians que ficam grandes demais — evita "mega-splats" que cobrem paredes inteiras com uma única Gaussian. Quando ativado, o número de Gaussians explode para milhões e o resultado piora várias vezes. O motivo: a regularização de escala entra em conflito com o controle de densidade — escalas menores significam que mais Gaussians são necessárias, então o controle de densidade divide (split) com mais frequência, o que por sua vez significa mais custo de gradiente. Desativado, mas documentado para experimentos com Mip-Splatting (T74): nesse contexto, um limite inferior de escala poderia fazer sentido.

T33anisotropyRegWeight

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 0.0001 – 0.05

TÉCNICO

Experimental: penalidade sobre a razão max(scale)/min(scale), destinada a evitar Gaussians "agulha" (needle) extremamente alongadas, que são percebidas como floaters. Em todas as intensidades testadas, o resultado piora nitidamente. O motivo: a regularização força splats em direção a uma forma "arredondada", o que é exatamente errado em uma superfície plana (parede, mesa, chão) — ali, uma Gaussian achatada e larga é mais eficiente do que uma esférica. Desativado. T34 scaleRatioPruneThreshold persegue o mesmo objetivo de forma mais direcionada, mas também está desativado por padrão.

T34scaleRatioPruneThreshold

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 5.0 – 100.0 (tipicamente 10.0 – 30.0)

TÉCNICO

Poda (pruning) experimental pós-treinamento, que exclui toda Gaussian cuja razão max(scale)/min(scale) ultrapasse o limiar linear definido aqui. Tem como alvo floaters extremamente alongados do tipo "agulha/disco" (needle/disc), que não podem ser eliminados apenas com regularização. No teste, a poda removeu floaters como esperado, mas ao mesmo tempo também removeu splats planos úteis em paredes e pisos — a imagem ficou mais cheia de buracos. Por isso, desativado por padrão. Desde a versão 1.8 existe para isso o botão Remove Needle/Disc Floaters na seção "Training" do Inspector, sob a linha "Runs automatically at the end of training". Quando ativado, ele trabalha de forma deliberadamente conservadora (apenas splats cujo eixo mais longo ultrapassa cerca de 50× o mais curto) e passa a valer a partir da próxima execução de treinamento.

T35opacityRegWeight

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 0.0001 – 0.05

TÉCNICO

Experimental: penalidade de entropia cruzada binária (binary cross-entropy) que empurra a opacidade para 0 ou 1 (ou seja, para longe de "meio transparente"). Hipótese: uma distribuição de opacidade mais nítida melhoraria a clareza da imagem. Junto com T33, a regularização custa qualidade; ambas estão desativadas. Atenção: na 1.4.3-Beta surgiu um bug que alterou exatamente este campo em um valor padrão do inicializador (Initializer = 0.01), o que levou a uma extinção em massa da contagem de Gaussians (460 mil → 5 em uma iteração). Desde a 1.4.4, fixado firmemente em 0.0 como padrão.

T36opacityDecayFactor

DETALHES

Padrão: 0.0 (Initializer = desativado), 0.9995 (.full, .classicBalanced — padrão HTGS) Intervalo: 0 (desligado) ou 0.95 – 1.0

TÉCNICO

Implementação do esquema HTGS (Hierarchical Time-Gating, Eurographics 2025): a cada T37 opacityDecayInterval iterações, a opacidade sigmoide de cada Gaussian é multiplicada por este fator. 0.9995 × 100 aplicações resulta em ~95% de permanência por fase de Densification — uma pressão descendente leve, porém constante, sobre todas as opacidades, que faz com que Gaussians de contribuição fraca caiam de forma confiável abaixo do T14 pruneOpacityThreshold. O resultado é um desempenho nitidamente melhor do que sem o decay. Ativo apenas durante a fase de Densification (até T2); depois disso, o treinamento continua sem decay, para que as opacidades estabelecidas no refinamento permaneçam estáveis. Não é usado no MCMC (o MCMC tem seus próprios mecanismos via T67 mcmcRelocationInterval + T68 mcmcDeadOpacityThreshold).

T37opacityDecayInterval

DETALHES

Padrão: 50 Intervalo: 10 – 500

TÉCNICO

Intervalo de iterações em que T36 opacityDecayFactor é aplicado. Padrão do paper HTGS é 50, mantido em .full. Intervalos longos (>200) anulam parcialmente o efeito, porque entre duas aplicações acontecem atualizações de gradiente suficientes para que a opacidade volte a subir. Intervalos mais curtos (<20) tornam o decay agressivo demais. Ativo apenas na fase de Densification.

Refinement (T38–T44)

T38gradientAccumulationSteps

DETALHES

Padrão: 1 (= „uma View por passo do Adam") Intervalo: 1 – 8

TÉCNICO

Número de Views cujos gradientes são acumulados antes de um update do Adam ser executado. Com > 1, o app roda em um caminho separado de backward-project "unfused", que soma os gradientes em um buffer separado; a aplicação final escala com 1/N para manter a magnitude constante. No treinamento clássico, o valor 2 não traz ganho de qualidade, mas custa tempo, porque o caminho unfused é mais caro que o fused. No MCMC, porém, accum = 2 reduz sensivelmente a diferença de qualidade em relação ao Classic — por isso é oferecido lá como um interruptor. Nos Presets, o valor está em 1. Na interface, você o acessa através do interruptor MCMC Quality na seção "Training" do Inspector: ligado, o app acumula 2 Views por passo, desligado, 1. Outros valores além de 1 e 2 só podem ser atribuídos por meio de um Preset editado.

T39testViewIndices

DETALHES

Padrão: [] (= vazio, todas as Views são usadas para o treinamento) Intervalo: Set<Int>, qualquer subconjunto dos índices de câmera

TÉCNICO

Conjunto de índices de câmera que NÃO são usados para treinamento, mas reservados como holdout para avaliação de PSNR/SSIM/LPIPS. Só é preenchido nas execuções de medição internas: então a cada oitava View, começando pelo índice 0 (padrão LLFF, idêntico às convenções dos papers Mip-NeRF 360 e 3DGS). No estado de entrega, o campo permanece vazio — o treinamento usa todas as Views, e não há elemento de controle na interface para isso. Cuidado: definir manualmente este campo em um arquivo de Preset sem entender os índices torna uma medição inutilizável (por exemplo, se todos os índices forem definidos acima de N, enquanto há apenas N-50 Views → nenhum holdout → nenhuma avaliação). Na exportação de Preset própria, testViewIndices não é gravado, porque depende da cena e, caso contrário, deixaria valores sem sentido entre diferentes conjuntos de dados.

T40refinementPruneInterval

DETALHES

Padrão: 0 (= desativado) Intervalo: 0 ou 100 – 5 000

TÉCNICO

A cada N iterações durante a fase de refinamento (após T2), um passo adicional de prune é executado, que remove Gaussians com sigmoid(opacity) < T41 refinementPruneOpacityThreshold. Objetivo: durante a densificação, há chamadas regulares de density-control, depois não mais — mas Gaussians cuja opacity continua caindo permanecem no buffer. Na prática, esse prune adicional prejudica: junto com a segunda fase de densificação (T54), pode esvaziar completamente o conjunto de Gaussians. Está em 0 em todos os Presets e não é ajustável na interface; se, ainda assim, for definido através de um arquivo de Preset editado, 1.000 ou 2.000 são valores razoáveis.

T41refinementPruneOpacityThreshold

DETALHES

Padrão: 0.0 (= "usar T14") Intervalo: 0 ou 0.001 – 0.1

TÉCNICO

Limiar de opacity separado para o prune de refinamento. Após a densificação, a maioria dos Gaussians atingiu uma opacity consideravelmente maior (> 0.001), de modo que o T14 pruneOpacityThreshold padrão seria fraco demais. Se T40 estiver ativo, este campo determina o próprio limiar. Com 0.0, T14 continua sendo usado. Só é relevante se T40 > 0.

T42midTrainingCompactificationIterations

DETALHES

Padrão: [] (= desativado) Intervalo: [Int], valores em (densifyUntilIteration, maxIterations)

TÉCNICO

Pontos de iteração explícitos durante a fase de refinamento, nos quais um passo de compactification é executado (remove sigmoid(opacity) < 0.01 + Gaussians com outlier-scale, a mesma lógica que T56 postTrainingCompactification). Objetivo: fases longas de refinamento podem mostrar acúmulo de confete/floaters, cujo SH então sofre overfitting em artefatos específicos de view. Configuração típica se ativado: [10000, 20000, 30000] para 40K Classic. MAS: marcas de limpeza escolhidas livremente pioram consistentemente o resultado final — o número de Gaussians de fato cai bastante, mas o erro de imagem aumenta mais. Como lista de iterações livremente definível, o campo permanece, por isso, vazio em todos os Presets. Você alcança o efeito em si na interface através do interruptor Floater Cleanup na seção "Training" do Inspector: em execuções clássicas a partir de 30.000 iterações, ele coloca duas passagens de limpeza no meio do treinamento. Marcas próprias só podem ser definidas por meio de um arquivo de Preset editado.

T43frustumCullEnabled

DETALHES

Padrão: false Intervalo: boolean

TÉCNICO

Após o treinamento, todos os Gaussians fora da união de todos os frusta das câmeras de treinamento são removidos. Tais Gaussians nunca foram restringidos pelo sinal de loss e são sempre floaters. Especialmente eficaz para cenas em que a Novel-View fica atrás ou ao lado do trajeto da câmera (por exemplo, a parte de trás de um voo linear de drone) — os floaters ali nunca ficam visíveis durante a fase de treinamento, mas ficam sim ao se mover posteriormente no visualizador 3D. Em voos de drone, isso traz visivelmente menos floaters, por isso é disponibilizado como opt-in. Padrão false, porque em capturas de objetos com cobertura orbital completa, a união de frusta abrange toda a cena e o recurso não remove nada — é oferecido em Settings sob "Floater Reduction". O Preset Outdoor não o ativa, porque o sky dome resolve o mesmo problema melhor ali.

T44frustumCullExpansion

DETALHES

Padrão: 1.1 Intervalo: 1.0 – 2.0

TÉCNICO

Margem NDC para T43 frustumCullEnabled. 1.0 cortaria exatamente na borda da imagem, o que cortaria demais splats instáveis na borda da imagem. 1.1 = 10% de padding além do enquadramento exato da câmera — dá alguma tolerância para pixels de borda que, em uma Novel-View ligeiramente deslocada, poderiam se tornar visíveis. Valores > 1.2 tornam o cull praticamente ineficaz, porque o frustum ampliado abrange muito mais espaço.

Sky-Dome (T45–T48)

T45skyDomeEnabled

DETALHES

Default: false (Initializer + todos os Presets exceto P9 Outdoor) Range: boolean

TÉCNICO

Antes do início do treinamento, uma nuvem de pontos esférica é gerada (Fibonacci-sphere com T46 Sample-Points), colocada em um raio de T47 skyDomeRadiusMultiplier × scene_extent ao redor do centro da cena e inicializada com as cores dos pixels mascarados de céu de todas as câmeras de treinamento (ver T20 skyMaskingEnabled). Esses Sky-Dome-Gaussians são inseridos no início do Gaussian-Buffer e "congelados" durante o treinamento (gradientes de posição/escala/rotação = 0, apenas SH e opacidade permanecem otimizáveis). Efeito: em vez de "confetes" pretos ao fundo, o usuário vê um céu de verdade em Novel-Views. Em cenas de drone e paisagens isso funciona muito bem; no Preset Outdoor (P9) vem ligado por padrão. Em cenas de interiores, deixe desligado — a esfera ficaria pendurada sem sentido fora do ambiente.

T46skyDomeSampleCount

DETALHES

Default: 5 000 Range: 1 000 – 50 000 (típico 2 000 – 10 000)

TÉCNICO

Número de pontos de amostra Fibonacci-Sphere na Sky-Dome-Sphere. Valores mais altos → sky-dome mais denso (melhor em resoluções grandes e com muito céu visível), mas maior demanda de memória. 5 000 é o ponto ideal para renderizações em 4K; em resoluções menores, 2 000–3 000 já bastam. Os pontos são inicializados de acordo com a distância de cosseno em relação a cada vetor de visão de câmera de treinamento com os pixels mascarados de céu correspondentes — pontos de amostra cujo cone de visão nenhuma câmera vê permanecem com valor inicial de opacidade baixo ao fundo, mas não são alterados durante o treinamento (congelados).

T47skyDomeRadiusMultiplier

DETALHES

Default: 30.0 (Initializer + maioria dos Presets), 59.0 (P9 Outdoor) Range: 5.0 – 200.0

TÉCNICO

Raio da Sky-Dome-Sphere em relação à extensão da cena (= distância média entre posições de câmera). 30 = a esfera tem 30 vezes o diâmetro da nuvem de câmeras. Muito pequeno (< 5) → o sky-dome interfere com a própria cena (por exemplo, um splat do sky-dome acaba em primeiro plano); muito grande (> 100) → perda de precisão float32 nas posições do sky-dome, o que causa glitches de renderização à distância. Para cenas externas amplas, 59.0 é o valor adequado — o padrão de 30.0 é pequeno demais para paisagens profundas, e então os pixels do sky-dome aparecem visivelmente como uma "parede" nas bordas da imagem.

T48frozenGaussianCount

DETALHES

Default: 0 (= nenhum Gaussian congelado) Range: 0 ou 1 – T46

TÉCNICO

Número de Gaussians no início do buffer cujos gradientes de posição/escala/rotação são zerados no otimizador — eles permanecem espacialmente rígidos durante todo o treinamento. O Density-Control não pode cloná-los, dividi-los ou removê-los (prune). Usado para a injeção do Sky-Dome (ver T45): quando o sky-dome está ligado, este campo é automaticamente definido como T46 skyDomeSampleCount. É possível definir manualmente (por exemplo, para congelar uma nuvem de pontos pré-posicionada de uma varredura LiDAR), mas isso não é diretamente acessível na interface. Importante: os primeiros N Gaussians no buffer são sempre os congelados — a ordem no buffer decide, não um índice explícito.

Adam + LR-Schedule (T49–T55)

T49adamResetIteration

DETALHES

Default: 0 (= desativado) Range: 0 ou 100 –

TÉCNICO

Iteração na qual os acumuladores de momentum do Adam-Optimizer (m1, m2) são zerados. A correção de viés (bias correction) depois roda com (iter - adamResetIteration) em vez de com iter. Um reset após o fim da densificação piora o resultado nitidamente. Motivo: o momentum do Adam, acumulado durante a densificação, carrega informação sobre as magnitudes típicas dos gradientes e acelera a fase de refinement. Descartá-lo custa convergência nas primeiras ~500 iterações do refinement. Por isso permanece em 0 em todos os presets e não é ajustável na interface.

T50positionLRScheduleEndIteration

DETALHES

Default: 0 (Inicializador = "usa maxIterations"), 20 000 (.full — Cosine termina em 20K apesar de maxIter=35K), 30 000 (.fullClassicPaper) Range: 0 ou 1 000 –

TÉCNICO

Iteração na qual a curva de Cosine-Annealing para a Position-LR atinge seu mínimo. Se 0, é idêntico a T1 maxIterations. Se > 0, a schedule roda até esse valor e depois permanece constante em T4 positionLearningRateFinal. Isso permite uma "extended refinement phase" com taxa de aprendizado mínima, porém constante — refina posições lentamente sem novo decay. .full faz isso (fim da schedule em 20K, treinamento roda até 35K); na vizinhança — 15K até 25K — quase nada muda, 20K é o melhor compromisso. É usado em conjunto com T51 para também modificar as LRs não relacionadas à posição na extended phase.

T51extendedPhaseLRDecay

DETALHES

Default: 0.0 (= desativado, LRs constantes) Range: 0 ou 0.01 – 1.0

TÉCNICO

Multiplicador mínimo para as LRs não relacionadas à posição (escala, rotação, opacidade, SH) na "extended phase" — ou seja, depois que T50 é atingido e a Position-LR já está em T4. Se 0.1, escala/rotação/opacidade/SH por sua vez sofrem cosine-decay de 1.0 (= sua LR padrão) para 0.1× de seu padrão. Se 0.0 (Padrão), permanecem constantes. Decay completo até zero produz o mesmo resultado que nenhum decay — o comportamento parece mais "limpo" com decay, mas não é mensuravelmente melhor. Por isso permanece em 0 em todos os presets e não é ajustável na interface.

T52adaptiveDensifyThreshold

DETALHES

Default: false Range: boolean

TÉCNICO

Experimental: se true, o app calcula em cada etapa de densificação o p98 da distribuição atual de gradientes e o usa como limiar dinâmico (limitado a no mínimo 0.5× do valor configurado em T11, para que não se desvie demais). Hipótese: adaptação automática à fase atual da cena tornaria o controle de densidade mais robusto — por exemplo, pruning mais rigoroso no início, mais permissivo depois, ou vice-versa. Na prática, o número de Gaussianas cai drasticamente — mass-pruning, porque o p98 nas primeiras iterações é extremamente alto e depois quase nada mais ultrapassa o limiar. O threshold fixo já está bem calibrado, a adaptação dinâmica prejudica mais do que ajuda. T77 oferece uma lógica adaptativa alternativa via rolling median, que contorna o problema.

T53mergeAfterDensification

DETALHES

Default: false (Inicializador), true (.full, .classicBalanced, .fullClassicPaper) Range: boolean

TÉCNICO

No final da fase de densificação (iter T2), é realizada uma passagem única de merge, que combina Gaussianas próximas entre si com escala e cor semelhantes. Reduz o número de Gaussianas tipicamente em 5–15 % sem perda visível de qualidade. Motivo: após clonagem intensiva surgem clusters de Gaussianas quase idênticas, que não contribuem com nada de novo — o merge libera capacidade do otimizador para outras áreas. Padrão nos presets Classic-Quality. Não usado no MCMC, porque o MCMC, por sua lógica de relocação, nem sequer deixa esses clusters se formarem.

T54densifyPhase2FromIteration

DETALHES

Default: 0 (= desativado) Range: 0 ou T2T1

TÉCNICO

Experimental: possibilita uma segunda fase de densificação, que começa nesta iteração após a pausa de refinement e roda até T55. Hipótese: após uma fase de refinement, os acumuladores de gradiente têm magnitudes mais estáveis e conseguem indicar com mais precisão quais áreas ainda precisam de Gaussianas adicionais. Na prática, a segunda fase de densificação termina em uma cascata até zero Gaussianas — junto com o pruning de refinement (T40), ela esvazia completamente o buffer. Por isso permanece em 0 em todos os presets e não é ajustável na interface.

T55densifyPhase2UntilIteration

DETALHES

Default: 0 Range: 0 ou T54T1 Defined in:

TÉCNICO

Fim da segunda fase de densificação. Só relevante se T54 > 0. Ambos os campos juntos desativados.

Post-Processing + Apple AI (T56–T60)

T56postTrainingCompactification

DETALHES

Padrão: true (em todos os Presets de produção), false (.quickTest, .preview) Intervalo: boolean

TÉCNICO

Após o término do treinamento, Gaussians com sigmoid(opacity) < 0.01 são removidos de forma definitiva (eles praticamente não contribuem mais para a imagem). Reduz a contagem de Gaussians tipicamente em 58 % e o tamanho do arquivo de exportação em 55 %, sem perda visível de qualidade. Ativo por padrão nos Presets de produção — o resultado final deve poder ser entregue o mais compacto possível. Desativado no .quickTest, porque uma execução de diagnóstico não é exportada de qualquer forma. Ao contrário de T42 midTrainingCompactificationIterations, a Compactification acontece apenas ao final — o Refinement pode até lá usar todos os Gaussians.

T57metalFXUpscaling

DETALHES

Padrão: false Intervalo: boolean

TÉCNICO

⚠ Desde 2026-07-18 desativado e sem qualquer efeito. O campo pertencia ao seletor "Viewport Scaling" (Off/MetalFX/Lanczos) no Inspector. O renderizador nunca o leu: a decisão de blit é puramente geométrica (renderizado com supersampling ⇒ downsample MPS-Lanczos para suavização de bordas, caso contrário bilinear), e para o caminho MetalFX não havia ponto de chamada algum. O seletor e as duas informações incorretas que ele alimentava foram removidos; a legenda do overlay agora se chama "Sampling", não "Scaling", e em nenhum lugar do app há upscaling via MetalFX. O campo em si permanece, porque a configuração de treinamento é salva por completo — ele está presente em cada cena salva, em cada Preset e no comentário de configurações de PLYs já exportados; removê-lo faria a chave desaparecer silenciosamente na regravação e quebraria essa troca. Pelo mesmo motivo, o campo é excluído da comparação "Modified": uma cena antiga pode conter true, e não há mais como redefinir isso pela interface. Nada o lê — não o reconecte.

T58mpsLanczosScaling

DETALHES

Padrão: false Intervalo: boolean

TÉCNICO

⚠ Desde 2026-07-18 desativado e sem qualquer efeito — veja T57 metalFXUpscaling, onde também se explica por que o campo mesmo assim precisa continuar sendo salvo. Vale destacar explicitamente um equívoco comum: o app de fato usa MPS-Lanczos no viewport, mas isso é controlado exclusivamente pela geometria — uma imagem renderizada com supersampling é reduzida para suavização de bordas. Isso é um downscaling, não um upscaling, e este campo nunca o acionou.

T59livePreviewInterval

DETALHES

Padrão: 50 (Initializer; os Presets não definem este campo) Intervalo: 0 (desligado), 50, 250 ou 1 000 no seletor de Ajustes

TÉCNICO

Com que frequência o visualizador 3D é atualizado durante o treinamento com os Gaussians atuais. 50 = uma nova renderização a cada 50 iterações — suficiente para acompanhar o progresso sem desacelerar o treinamento de forma perceptível. 0 = o visualizador não é atualizado (treinamento em segundo plano, velocidade máxima). Em execuções longas de MCMC, vale a pena usar 250 ou 1 000, porque o overhead de atualização acaba pesando no total. Papel especial: embora o campo pertença à configuração do treinamento, é um ajuste global do app (Ajustes → Treinamento) e não faz parte da receita de treinamento. Por isso é excluído da comparação "Modified", é preservado ao trocar de Preset e, desde 2026-07-18, não é mais copiado do arquivo ao abrir uma cena — antes disso, uma cena carregada substituía silenciosamente a taxa de quadros do usuário pela do autor da cena, incluindo "Off", e não havia nenhum outro lugar de onde recuperá-la.

T60perceptualLossWeight

DETALHES

Padrão: 0.0 (= desativado) Intervalo: 0 ou 0.001 – 0.5

TÉCNICO

Peso de um termo de perda perceptual (Multi-Scale-Blur-Feature-Matching). Captura semelhança estrutural e textural em um nível mais alto do que L1+SSIM — tipicamente onde "pixel-perfect" é menos importante do que "parece realista". O valor é 0.0 (desligado) em todos os Presets. Na interface, você o ajusta pelo controle deslizante Perceptual Loss na seção "Training" do Inspector, intervalo de 0 a 0,20 em passos de 0,01; em 0 o app exibe "Off".

Densificação MCMC (T61–T73)

T61densificationStrategy

DETALHES

Padrão: .classic (Initializer + Presets Clássicos), .mcmc (todos os Presets MCMC + Scene-Class) Intervalo: .classic ou .mcmc

TÉCNICO

Escolhe entre Densificação Clássica (clone/split/prune, Kerbl et al.~2023) e Densificação MCMC (Stochastic Gradient Langevin Dynamics com Relocation, Kheradmand et al.~NeurIPS 2024). Com .classic são avaliados T11–T16, com .mcmc os T62–T73. Atenção ao trocar: os padrões Clássicos e os padrões MCMC estão calibrados de forma completamente diferente — quem alterna o seletor no Expert View sem carregar um Preset adequado corre o risco de uma extinção em massa estilo bug 1.4.3 (460 K → 5 em uma iteração, porque o MCMC-OpacityReg em 0.01 mata as opacidades Clássicas). Por isso os padrões MCMC-Init foram deliberadamente "suavizados" (todos os valores de Reg em 0.0).

T62mcmcMaxGaussians

DETALHES

Padrão: 150 000 (Initializer + .fullMCMC + .mcmcBalanced), 100 000 (.mcmcPreview), 1 500 000 (.fullMCMCMip — variante Mip-Splatting com 10× de orçamento), 1.19 M (.renderPreset), 1.25 M (.outdoorPreset), 670 K (.indoorPreset) Intervalo: 0 (= "usar capacidade do Buffer") ou 10 000 – 5 000 000 Definido em:

TÉCNICO

Limite superior rígido para o número de Gaussians na estratégia MCMC. O número cresce gradualmente pela T70 mcmcGrowthRate (tipicamente 5 %) por passo de Relocation até esse teto. 150 K é um bom valor de partida — bem acima disso a qualidade dos splats se dilui (muitos Gaussians pequenos e redundantes), bem abaixo a cena permanece sub-densificada. Em cenas muito grandes (ex.: voo de drone com 1.545 fotos e 158 K de SfM-init) 150 K é baixo demais — daí a extensão da 1.4.5 T72 mcmcCapMultiplier + T73 mcmcAutoScaleByScene. Os Presets Scene-Class usam valores específicos da cena entre 670 K (Indoor) e 1.25 M (Outdoor). Com o valor 0 o motor usa a capacidade total do Buffer como teto.

T63mcmcNoiseScale

DETALHES

Padrão: 0.00005 (5e-5 = padrão do paper) Intervalo: 1e-6 – 1e-3

TÉCNICO

Multiplicador para o ruído gaussiano que é adicionado à posição de cada Gaussian em cada iteração MCMC (lógica SGLD). Mais alto = mais exploração (Gaussians se movem mais, potencialmente encontram lugares melhores), mais baixo = mais exploração de conhecimento (Gaussians permanecem onde já estão bons). 5e-5 é o valor adequado — bem menor significa exploração de menos, bem maior (1e-4) demais, e os splats se dissolvem. É reduzido de forma cosseno ao longo do tempo de treinamento até T69 mcmcNoiseDecayEnd — ao final da faixa de decaimento o ruído é efetivamente 0 e os Gaussians convergem.

T64mcmcOpacityRegWeight

DETALHES

Padrão: 0.0 (= desativado nos padrões do RadianceKit, paper: 0.01) Intervalo: 0 ou 0.001 – 0.05

TÉCNICO

Penalidade L1 específica do MCMC sobre a opacidade. Padrão do paper 0.01 (empurra Gaussians não usados para próximo de zero, tornando-os disponíveis para Relocation). No RadianceKit o resultado sem essa regularização é mensuravelmente melhor. Motivo: o critério de pruning definido em T68 mcmcDeadOpacityThreshold já basta sozinho — uma penalidade L1 adicional também força Gaussians valiosos de baixa opacidade a "morrer". Por isso o padrão é 0. Atenção: no build beta 1.4.3 o padrão do Initializer era erroneamente 0.01, o que resultou no bug de extinção em massa (veja explicação do T61); desde a 1.4.4 foi fixado em 0.0.

T65mcmcScaleRegWeight

DETALHES

Padrão: 0.0 (= desativado, paper: 0.01) Intervalo: 0 ou 0.001 – 0.05

TÉCNICO

Penalidade L1 específica do MCMC sobre os autovalores de escala. Padrão do paper 0.01. Aqui também o resultado sem regularização é melhor, pelo mesmo motivo do T64. Desativado em todos os Presets MCMC do RadianceKit. Atenção como no T64: bug 1.4.3.

T66mcmcRelocationInterval

DETALHES

Padrão: 100 (Initializer + todos os Presets MCMC, padrão do paper), 155 (P9 Outdoor) Intervalo: 50 – 500

TÉCNICO

Intervalo de iterações em que o MCMC realoca Gaussians mortos (sigmoid(opacity) < T68 mcmcDeadOpacityThreshold) para novas posições. Intervalos mais curtos (por volta de 50) atuam de forma disruptiva demais, o loss oscila; intervalos bem mais longos (por volta de 200) tiram a capacidade de reação do MCMC. 100 é o valor correto. Para cenas externas é um pouco mais alto, com 155 — os intervalos mais longos dão ao Adam mais tempo para integrar Gaussians recém-posicionados antes que o próximo evento de Reloc os pressione.

T67mcmcWarmupIterations

DETALHES

Padrão: 500 Intervalo: 100 – 5 000

TÉCNICO

Número de iterações iniciais em que ainda não ocorre Relocation MCMC. Somente após esse warmup a lógica de Reloc começa. Motivo: nas primeiras iterações os valores de opacidade ainda não se estabilizaram — se começasse direto com Reloc, Gaussians seriam colocados nos lugares errados e teriam que ser movidos novamente logo em seguida, o que destrói o momentum do Adam. Padrão do paper 500. O RadianceKit adota esse valor porque se mostrou robusto.

T68mcmcDeadOpacityThreshold

DETALHES

Padrão: 0.005 (Initializer, padrão do paper), 0.01 (.fullMCMC e todos os Presets MCMC) Intervalo: 0.001 – 0.05

TÉCNICO

Limiar de sigmoid(opacity) abaixo do qual um Gaussian é considerado "morto" e elegível para Relocation. 0.01 é o valor adequado — 0.005 quase não muda nada, 0.02 é pior. Mais alto = Reloc mais agressivo (mais Gaussians são movidos), mais baixo = mais cauteloso. 0.01 corresponde aproximadamente a "0,5 % de visibilidade visual". P10 Indoor usa 0.0142.

T69mcmcNoiseDecayEnd

DETALHES

Padrão: 0 (Initializer = "sem decaimento"), 160 000 (.fullMCMC = 80 % de 200K), 96 000 (.mcmcBalanced = 80 % de 120K), 40 000 (.mcmcPreview) Intervalo: 0 ou 1 000 –

TÉCNICO

Iteração em que o ruído de T63 mcmcNoiseScale é completamente reduzido a zero (decaimento cosseno da iteração 0 até aqui). 80 % do maxIterations é o valor adequado — isso dá ao MCMC tempo suficiente de exploração, mas deixa os últimos 20 % para convergência sem ruído. 0 = ruído constante durante todas as iterações (raramente sensato, o MCMC não consegue convergir nesse caso).

T70mcmcGrowthRate

DETALHES

Padrão: 0.05 (padrão do paper = 5 %) Intervalo: 0.01 – 0.2

TÉCNICO

Taxa de crescimento do alvo de população MCMC por passo de Relocation. A lógica: a cada evento de Reloc o tamanho-alvo da população é aumentado por (1 + growthRate), até que T62 mcmcMaxGaussians (ou a variante escalada por T72/T73) seja atingido. 0.05 é o valor adequado — valores mais altos levam a um crescimento rápido demais (Gaussians são inseridos antes que o momentum do Adam consiga integrá-los), valores mais baixos levam a cenas sub-densificadas no final.

T71mcmcSigmoidK

DETALHES

Padrão: 100.0 Intervalo: 10.0 – 500.0 Definido em:

TÉCNICO

Parâmetro de nitidez do sigmoid para a atenuação de ruído do MCMC. No passo SGLD, o ruído por Gaussian é atenuado — Gaussians de alta opacidade (cujo logit é positivo) recebem exponencialmente menos ruído do que os de baixa opacidade. K = 100 é nítido, ou seja, a transição de "ruído total" para "sem ruído" acontece muito rapidamente em torno da opacidade 0.5. K = 100 é o valor adequado — valores menores (10–50) deixam até Gaussians de alta opacidade "tremerem" também (destrói Gaussians convergidos), valores maiores (> 500) tornam a transição artificialmente abrupta e Gaussians mortos deixam de ser movidos.

T72mcmcCapMultiplier

DETALHES

Padrão: 3.0 (Initializer + .fullMCMC), 2.0 (.mcmcPreview), 2.5 (.mcmcBalanced), 2.98 (P8 Render), 5.32 (P9 Outdoor), 1.76 (P10 Indoor) Intervalo: 0 (= desativado) ou 1.0 – 10.0

TÉCNICO

Recurso da 1.4.5: escalonamento adaptativo do teto conforme a cena. Quando T73 mcmcAutoScaleByScene é true, o teto efetivo é calculado como (limitado à capacidade do Buffer). Motivo: em cenas grandes (ex.: voo de drone com 1.545 fotos → 158 K de SfM-init) T62 = 150 000 é baixo demais — o Density-Control não conseguiria crescer o suficiente. Com Multiplier 3.0 o teto neste exemplo é escalado para 474 K (158 K × 3.0). Os Presets Scene-Class usam valores específicos da cena: Outdoor se beneficia de um multiplicador alto (5.32 → ~830 K de teto com 156 K de pontos iniciais), Indoor se contenta com 1.76 (paredes saturam mais rápido). Resolução completa do teto ver método .

T73mcmcAutoScaleByScene

DETALHES

Padrão: true (Initializer + todos os Presets MCMC) Intervalo: boolean

TÉCNICO

Recurso da 1.4.5: chave mestra para a lógica de teto sensível à cena (veja T72 +). Se false, apenas T62 mcmcMaxGaussians é usado como teto (voltando ao comportamento da 1.4.4). Ativado por padrão, porque os problemas de extinção em massa em cenas grandes da 1.4.3 retornariam. Desative manualmente somente se quiser definir explicitamente um teto rígido — por exemplo, para treinar uma variante de 150 K cujo tamanho final seja previsível.

Mip-Splatting (T74–T76)

Status: Mip-Splatting não trouxe ganho de qualidade na prática e em algumas cenas externas até prejudicou o resultado. Os campos permanecem opt-in para experimentos; em todos os presets entregues, o Mip-Splatting está desativado.

T74useMipSplatting

DETALHES

Default: false (todos os Presets de produção), true (.fullMCMCMip — Sibling de pesquisa) Range: boolean

TÉCNICO

Ativa o Mip-Splatting (Yu et al.~CVPR 2024): filtro de suavização 3D + filtro 2D + compensação de α, que limita a frequência por Gaussian ao limite de Nyquist da taxa de amostragem da câmera de treinamento mais densa. Objetivo teórico: eliminação do aliasing ao renderizar em escalas fora do treinamento (0,5× ou 2× da resolução de treinamento). Está ativado nos shaders de pré-processamento e de projeção reversa (backward projection) e funciona corretamente. Na prática, porém, o ganho de qualidade esperado não se concretizou: ao renderizar na resolução de treinamento, praticamente nada muda, e em cenas externas a imagem chega a piorar. Uma explicação possível: a suavização 3D trabalha contra a realocação do MCMC assim que muitos Gaussians entram em jogo. O campo permanece disponível para experimentos próprios com multi-escala.

T75mipSmoothing3DScale

DETALHES

Default: 0.2 (default do paper) Range: 0.05 – 1.0

TÉCNICO

Parâmetro de escala de suavização 3D (Yu et al.~§3.3, default do paper 0.2). Maior = mais suavização no espaço do mundo por Gaussian (= mais anti-aliasing, mas também mais desfoque na escala padrão), menor = mais nítido, porém mais suscetível a aliasing. Só é consultado quando T74 useMipSplatting = true. Não foi otimizado além disso — mesmo com o default do paper de 0.2, o Mip-Splatting não traz ganho algum.

T76mipFilter2DVariance

DETALHES

Default: 0.3 (= exatamente o comportamento anterior) Range: 0.1 – 1.0

TÉCNICO

Variância do filtro Mip 2D, que é somada à diagonal de Σ_2D (variância direta, não elevada ao quadrado). 0.3 é exatamente o valor que, antes do Mip-Splatting, estava fixo no kernel. Quando T74 useMipSplatting = false, o kernel ignora esse valor completamente e grava o valor fixo 0.3 — de modo que nada muda no comportamento anterior, garantidamente. Quando ativado, o valor definido aqui é usado. Permanece no catálogo de campos para os sweeps de Mip.

Densificação Adaptativa (T77–T79)

T77adaptiveDensification

DETALHES

Default: false Range: boolean

TÉCNICO

Rolling-Median-Tracker como alternativa ao T11 densifyGradThreshold fixo. Quando true, em cada Densify-Step o limiar atual é sobrescrito com median(letzte N avgGrad-Samples) × T79 adaptiveDensifyMultiplier . N = T78 adaptiveWindow. Mais rigoroso que a variante p98 do T52, que ali dispara o Mass-Pruning: mediana vezes 2 fica, em estado estabilizado, em torno do p70–p80 da distribuição de gradientes. Ativado sozinho, o campo não traz ganho de qualidade; junto com o currículo (ver T80/T81), sim — ali o currículo carrega o ganho, este campo mais a estabilidade. Não existe um controle de interface para isso: o campo está desativado em todos os Presets e só pode ser configurado editando um arquivo de Preset.

T78adaptiveWindow

DETALHES

Default: 1 000 Range: 100 – 10 000 Defined in:

TÉCNICO

Rolling-Median-Window em eventos de Densification (NÃO iterações — cada step de T13 densifyInterval gera uma amostra). Default 1 000 — com isso, as últimas 100 000 iterações de treinamento contribuem para a mediana, ou seja, tipicamente todo o histórico de treinamento até esse ponto. Fase inicial (antes de T78 amostras): o tracker retorna nil → fallback para o limiar fixo T11. Relevante apenas quando.

T79adaptiveDensifyMultiplier

DETALHES

Default: 2.0 Range: 1.0 – 4.0

TÉCNICO

Multiplicador aplicado sobre a mediana móvel para o limiar adaptativo. O padrão 2.0 corresponde aproximadamente ao p70–p80 da distribuição de gradientes típica. Menor = crescimento mais agressivo (mais clones), maior = mais rigoroso (menos clones). Na faixa 1.5–3.0, 2.0 é o melhor valor. Relevante apenas quando.

Curriculum (T80–T81)

T80curriculumResolutionRamp

DETALHES

Padrão: false Intervalo: boolean

TÉCNICO

A resolução de treinamento começa em 0.5× e muda em T50 positionLRScheduleEndIteration / 2 (ou T1 maxIterations / 2, caso T50 não esteja definido) para T22 trainingRenderScale. Sobrepõe-se a T23 resolutionWarmupScale, quando ativado. Dos dois recursos adaptativos (veja T77), este curriculum é responsável pelo verdadeiro ganho de qualidade — o aumento gradual da resolução dá ao aplicativo tempo para encontrar uma geometria grosseira na resolução mais baixa, antes de passar para o trabalho fino de detalhes. Não pode ser ajustado na interface — apenas através de um arquivo de preset editado, e nesse caso, faz sentido combinar com T81.

T81curriculumSHProgression

DETALHES

Padrão: false Intervalo: boolean

TÉCNICO

Sobrepõe-se a T21 shDegreeUpgradeIterations com [maxIter/4, maxIter/2, maxIter*3/4], distribuindo assim as promoções de grau SH uniformemente ao longo do tempo de treinamento, em vez de concentrá-las no início. Hipótese: uma geometria estável é estabelecida antes da explosão de detalhes de cor, o que posiciona com mais precisão os efeitos de brilho dependentes da direção de visualização. Junto com T77, isso traz um ganho em algumas cenas; quem sustenta esse ganho é este campo, T77 sozinho não é suficiente. Não pode ser ajustado na interface — apenas através de um arquivo de preset editado.

Presets estáticos (TP1–TP9)

Aqui apenas as diferenças estruturais em relação ao padrão do Initializer. A descrição completa de marketing dos onze Presets de UI P1–P11 você encontra no Capítulo 7.

TP1.preview

DETALHES

Preset de diagnóstico/pré-visualização para sistemas ≥ 10 GB de RAM. Overrides em relação ao Initializer:

  • maxIterations 30 000 → 5 000
  • densifyUntilIteration 15 000 → 3 500 (70 % de maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× mais alto, decaimento menos agressivo)
  • shDCLearningRate, shRestLearningRate, opacityLearningRate, scaleLearningRate, rotationLearningRate cada um 2×
  • opacityResetInterval 3 000 → 100 000 (efetivamente desligado — o reset destruiria treinamentos curtos)
  • shDegreeUpgradeIterations [1K, 2K, 3K][1K, 2K] (o grau 3 não converge em execuções tão curtas)
  • trainingRenderScale 1.0 → 0.5

TP2.full

DETALHES

Classic de qualidade de produção. Overrides:

  • maxIterations 30 000 → 35 000 (acima disso há risco de overtraining: mais Gaussians sem ganho de qualidade)
  • densifyUntilIteration 15 000 → 5 000 (valor consagrado; parar mais tarde é pior)
  • Todos os LRs 2×
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× mais alto que o padrão do paper)
  • densifyGradThreshold 2e-6 → 1.1e-6 (calibrado para resolução 1.0×)
  • densifyInterval 100 → 200
  • pruneOpacityThreshold 0.005 → 0.001
  • opacityResetInterval 3 000 → 100 000 (efetivamente desativado)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K] (aumento de grau retardado)
  • opacityDecayFactor 0.0 → 0.9995 (esquema HTGS, ganho de qualidade nítido)
  • opacityDecayInterval 50 (inalterado)
  • mergeAfterDensification false → true
  • positionLRScheduleEndIteration 0 → 20 000
  • postTrainingCompactification true (já é o padrão do Initializer para .full)

TP3.fullClassicPaper

DETALHES

Variante Classic fiel ao paper, do TP2. Overrides em relação ao TP2:

  • maxIterations 35 000 → 30 000 (padrão do paper)
  • densifyUntilIteration 5 000 → 15 000 (paper: 50 % de maxIter)
  • positionLearningRateFinal 1.6e-5 → 1.6e-6 (padrão do paper)
  • opacityLearningRate, scaleLearningRate, rotationLearningRate de volta aos padrões do paper (0.05, 0.005, 0.001)
  • densifyGradThreshold 1.1e-6 → 2e-7 (calibrado para ~1–2 M Gs em Bicycle)
  • densifyInterval 200 → 100 (paper)
  • pruneOpacityThreshold 0.001 → 0.005 (padrão do paper)
  • opacityResetInterval 100 000 → 3 000 (paper §5.2, arriscado — custa qualidade na configuração do RadianceKit)
  • opacityDecayFactor 0.9995 → 0.0 (o paper não tem decaimento)
  • positionLRScheduleEndIteration 20 000 → 30 000 (cosseno chega a 100 % de maxIter)

TP4.fullMCMC

DETALHES

MCMC de qualidade de produção. Overrides em relação ao Initializer:

  • maxIterations 30 000 → 200 000 (MCMC precisa de cerca de 5× mais iterações que o Classic)
  • densifyUntilIteration 15 000 → 160 000 (80 % de maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5
  • Cronograma de LR como no TP2 (todos 2×)
  • ssimWeight 0.2 → 0.05 (MCMC precisa de um sinal L1 mais forte)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K]
  • densificationStrategy .classic.mcmc
  • mcmcMaxGaussians 150 000 (já no Initializer, confirmado no preset)
  • mcmcNoiseScale 5e-5 (valor do paper, consagrado)
  • mcmcDeadOpacityThreshold 0.005 → 0.01
  • mcmcNoiseDecayEnd 0 → 160 000 (80 % de maxIter)
  • mcmcCapMultiplier 3.0 (já no Initializer)
  • mcmcAutoScaleByScene true (já no Initializer)
  • opacityResetInterval 3 000 → 200 000 (efetivamente desligado, o MCMC usa Reloc em vez de reset)

TP5.fullMCMCMip

DETALHES

Variante Mip-Splatting do TP4 com o orçamento de Gaussians do paper original. Overrides em relação ao TP4:

  • mcmcMaxGaussians 150 000 → 1 500 000 (10×, magnitude do paper)
  • useMipSplatting false → true (Mip ligado)

TP6.classicBalanced

DETALHES

Classic de nível intermediário. Overrides em relação ao TP2:

  • maxIterations 35 000 → 20 000 (entrega praticamente o mesmo resultado que 30 000, com tempo de espera visivelmente menor)
  • positionLRScheduleEndIteration 20 000 → 0 (o cosseno chega a maxIter = 20K, sem fase estendida)

TP7.mcmcPreview

DETALHES

Diagnóstico MCMC. Overrides em relação ao TP4:

  • maxIterations 200 000 → 60 000
  • densifyUntilIteration 160 000 → 48 000 (80 %)
  • mcmcMaxGaussians 150 000 → 100 000
  • mcmcNoiseDecayEnd 160 000 → 40 000
  • mcmcCapMultiplier 3.0 → 2.0 (o preview escala de forma mais contida)

TP8.mcmcBalanced

DETALHES

MCMC de nível intermediário. Overrides em relação ao TP4:

  • maxIterations 200 000 → 120 000
  • densifyUntilIteration 160 000 → 96 000 (80 %)
  • mcmcNoiseDecayEnd 160 000 → 96 000 (80 %)
  • mcmcCapMultiplier 3.0 → 2.5 (entre o 2.0 do Preview e o 3.0 do Full)

TP9.quickTest

DETALHES

Teste funcional puro. Overrides em relação ao Initializer:

  • maxIterations 30 000 → 1 000
  • densifyUntilIteration 15 000 → 500
  • densifyGradThreshold 2e-6 → 4e-6 (calibrado para resolução 0.25×)
  • densifyInterval 100 → 50
  • opacityResetInterval 3 000 → 100 000 (desligado, pois seria curto demais)
  • trainingRenderScale 1.0 → 0.25

Como o app determina o limite de Gaussians

A resposta definitiva para a pergunta "até quantos Gaussians o MCMC pode deixar crescer?". Três grandezas entram nessa conta: o valor configurado em T62 mcmcMaxGaussians, o número de pontos de inicialização SfM da tua cena e a capacidade de buffer reservada previamente. O app calcula nesta ordem:

+ O valor inicial é T62. Se estiver em 0, o app define 150 000 — esse piso de segurança evita o incidente de extinção em massa descrito em 1.4.3. + Se T73 mcmcAutoScaleByScene estiver ativado e T72 mcmcCapMultiplier for maior que 0, o app compara o valor inicial com "pontos de inicialização × T72" e usa o maior dos dois valores. + Por fim, limita o resultado à capacidade do buffer.

Exemplo: Bicycle (Mip-NeRF 360, 194 frames de fotos) → inicialização SfM com ~156 mil pontos, T62 = 150 000, T72 = 5.32, auto-scale ativado, capacidade de buffer de 8 milhões. 156 mil × 5,32 resulta em 830 mil, que é maior que 150 000 e menor que 8 milhões — então o limite efetivo é 830 mil. É esse o limite que a realocação do MCMC respeita.

Calcula o número máximo real de splats no MCMC. O app pega a tua configuração "Max Gaussians", observa quantos pontos a tua cena tem no início e aplica o multiplicador, caso "Auto-scale by scene" esteja ativado. Assim, o limite se ajusta à cena, em vez de forçar o mesmo valor para uma cena pequena e uma cena enorme. Você não precisa fazer nada para isso — o app calcula tudo sozinho ao iniciar o treinamento.

Qual campo serve para quê? (Cheat-Sheet)

ObjetivoCampos para ajustar
Mais detalhe à distânciaT62 mcmcMaxGaussians alto, T72 mcmcCapMultiplier 5+
Mais detalhe em geral (Classic)T1 maxIterations alto (≤ 40K), T2 densifyUntilIteration ≤ 14 % de T1
Reduzir floaters em voos de droneT43 frustumCullEnabled ativado, T20 skyMaskingEnabled ativado, T45 skyDomeEnabled ativado
Céu bonito em cenas externasT45 skyDomeEnabled ativado, T47 skyDomeRadiusMultiplier 30–60
Arquivo de exportação menorEstratégia .mcmc (T61), T56 postTrainingCompactification ativado, T62 mcmcMaxGaussians ≤ 200K
Treinamento mais rápidoT22 trainingRenderScale 0.5, T1 maxIterations pela metade — mas não os dois ao mesmo tempo!
Reflexos melhoresT21 shDegreeUpgradeIterations com [2K, 5K, 8K] (sem early-front-load), MCMC + 200K iter
Pré-visualização ao vivo com mais frequênciaT59 livePreviewInterval em 50 — o valor mais denso que Ajustes → Treinamento oferece
Transições mais suaves em sombrasT17 ssimWeight um pouco alto (0.15–0.25), mas não acima de 0.3
Manter ambientes internos compactosPreset P10 Interno (, T72 = 1.76)

Campos Perigosos

Esses campos podem causar OOM, crash do app, extinção em massa dos Gaussians ou dados de benchmark inutilizáveis se configurados incorretamente. A tratar com cautela:

  • T11 densifyGradThreshold — reduzir pela metade pode gerar 2–4× mais Gaussians, o que rapidamente estoura a memória da GPU. Também é preciso observar: precisa combinar com T22 trainingRenderScale (1.0× → 1e-6, 0.5× → 2e-6, 0.25× → 4e-6).
  • T72 mcmcCapMultiplier — em cenas grandes com > 200 mil pontos de init do SfM e multiplicador > 5, surge um cap resolvido de milhões de Gaussians. Em Macs com 36 GB de RAM, é possível OOM. O valor externo (Outdoor) de 5.32 só funciona porque a cena de referência associada tem cerca de 156 mil pontos de init → cap de 830 mil.
  • T39 testViewIndices — definir manualmente em um arquivo de Preset pode inutilizar uma medição de qualidade (todos os índices > N → nenhum holdout). Deixe a lista vazia.
  • T64 mcmcOpacityRegWeight e T65 mcmcScaleRegWeight — Na versão beta 1.4.3, definidos como 0.01, o que causou extinção em massa (460 mil → 5 Gaussians em uma iteração). Desde a versão 1.4.4, fixados em 0.0, mas aumentá-los manualmente pode reproduzir o problema.
  • T15 opacityResetInterval — se não estiver em 100.000+ (efetivamente desligado) e o treinamento durar menos de 10.000 iterações, o reset destrói a convergência. Por isso o .preview o mantém em 100.000 apesar de maxIterations = 5 000.
  • T54/T55 densifyPhase2* — A segunda fase de densificação termina em uma cascata até zero Gaussians. Deixe ambos em 0.
  • T74 useMipSplatting — não traz ganho de qualidade e pode até piorar a qualidade da imagem em algumas cenas externas. Desativado por padrão, opt-in apenas para experimentos.

Se um campo estiver nessa lista e você quiser alterá-lo, faça antes um backup do seu Preset atual (exportar como JSON) e pense se você consegue medir o resultado de forma reproduzível — caso contrário, depois você não vai saber se causou uma melhora ou uma piora.