Нейромережевий SDF: NeRF простою мовою

🎨 Комп'ютерна графіка ⏱ ~10 хв читання Складний рівень
Нейронний рендеринг SDF NeRF Об'ємний рендеринг MLP

Замість зберігання 3D-сцени як трикутників чи вокселів, нейромережа може навчитись бути самою сценою: крихітний багатошаровий перцептрон, який для 3D-точки видає або знакову відстань (нейромережевий SDF), або колір і густину (NeRF). Ідея "неявного нейронного представлення" стоїть за фотореалістичним захопленням сцен, генеративним 3D та сучасним моделюванням форм через signed distance. Ця стаття демістифікує обидва підходи, не передбачаючи глибокого знання машинного навчання.

Коротко: Ця стаття пояснює, як крихітні нейромережі можуть замінити явні 3D-дані: нейромережевий SDF видає знакову відстань до поверхні, а NeRF — колір і густину для об'ємного рендерингу. Розглянуто Eikonal-обмеження, позиційне кодування, цикл навчання та те, як Instant-NGP скоротив навчання з днів до секунд.

1. Основна ідея: мережі як функції

Традиційна 3D-модель — явна: список вершин, трикутників чи вокселів, що напряму зберігає геометрію. Неявне нейронне представлення натомість навчає невелику нейромережу fθ(x, y, z) → (значення), яка відповідає на запит про будь-яку точку простору на вимогу. Геометрія закодована у вагах мережі θ, а не в явній структурі даних. Домінують два підходи: нейромережеві SDF кодують форму (наскільки далеко ця точка від найближчої поверхні), а NeRF (Neural Radiance Fields) кодує вигляд (який колір і густину має ця точка простору, якщо дивитись з даного напрямку).

Явна сітка (mesh)

Фіксована кількість вершин, легка растеризація, важко представити гладкі тонкі структури чи ефекти, залежні від напрямку огляду.

Нейромережевий SDF

Неперервний, безкінечна роздільність, гладкі градієнти "безкоштовно" (корисно для sphere tracing і фізики).

NeRF

Захоплює колір, залежний від напрямку огляду (дзеркальні відблиски, відбиття), з чим важко впорались б сітки.

2. Нейромережевий SDF: мережа, що вимірює відстань до поверхні

Класичний SDF для сфери — формула в один рядок: length(p) - radius. Нейромережевий SDF замінює цю формулу невеликим MLP, навченим так, щоб його вихід апроксимував справжню знакову відстань для довільної складної форми — сканованої статуї, CAD-деталі, чи форми, інтерпольованої між двома іншими в латентному просторі.

f_θ(x) ≈ SDF(x), навчена так, щоб:

f_θ(x) = 0 на поверхні

|∇f_θ(x)| ≈ 1 (Eikonal-обмеження — робить це справжнім полем відстані)

sign(f_θ(x)) визначає всередині (−) чи зовні (+)

Саме Eikonal-складова похибки |∇f_θ(x)| − 1|² відрізняє добре поведений нейромережевий SDF від довільної occupancy-мережі — вона змушує модуль градієнта лишатись близько до 1 всюди, тому ray marching / sphere tracing через поле все ще коректно сходиться, а нормалі поверхні виходять безкоштовно як ∇f_θ(x).

// Крихітний нейромережевий SDF як псевдокод — 4-шаровий MLP із синусоїдними активаціями (SIREN)
function neuralSDF(p, weights) {
  let h = sin(matmul(weights.w0, p) + weights.b0);
  h = sin(matmul(weights.w1, h) + weights.b1);
  h = sin(matmul(weights.w2, h) + weights.b2);
  return matmul(weights.w3, h) + weights.b3;  // скалярна відстань
}

Оскільки ця мережа диференційовна всюди, її можна трасувати sphere-tracing точно так само, як написаний вручну SDF-шейдер — замініть аналітичну функцію відстані в WebGL ray marcher-і на forward-прохід через крихітний MLP, запечений у текстуру ваг, і поверхня відрендериться ідентично.

3. NeRF: radiance fields і рівняння об'ємного рендерингу

NeRF (Mildenhall та ін., 2020) представляє всю сцену як функцію Fθ(x, d) → (колір c, густина σ): для 3D-точки x і напрямку огляду d вона передбачає випромінений колір і густину об'єму в цій точці. Рендеринг пікселя означає марш променем через поле і інтегрування кольору, зваженого на накопичену густину — саме класичне рівняння об'ємного рендерингу з медичної візуалізації та рендерингу хмар.

C(r) = ∫ T(t)·σ(r(t))·c(r(t), d) dt

T(t) = exp(−∫₀ᵗ σ(r(s)) ds) — накопичена прозорість (transmittance)

Дискретизований варіант (використовується на практиці): C ≈ Σᵢ Tᵢ·(1−exp(−σᵢδᵢ))·cᵢ

Навчання мінімізує фотометричну похибку між відрендереними пікселями і набором реальних фотографій сцени з відомих позицій камери — 3D ground truth не потрібен, лише 2D-зображення і їхні параметри камери (з structure-from-motion, наприклад COLMAP).

4. Позиційне кодування: чому "сирі" координати не працюють

Подача сирих координат (x, y, z) напряму в звичайний MLP дає розмиті, низькочастотні результати — мережі з ReLU-активаціями мають зсув у бік вивчення гладких низькочастотних функцій ("spectral bias"). Виправлення NeRF — підняти кожну координату у простір Фур'є-ознак високої розмірності перед тим, як її побачить MLP:

γ(p) = (sin(2⁰πp), cos(2⁰πp), sin(2¹πp), cos(2¹πp), …, sin(2^(L−1)πp), cos(2^(L−1)πp))

Типово L = 10 для позиції, L = 4 для напрямку огляду

Саме цей трюк — відображення координат через синусоїди зростаючої частоти перед подачею в мережу — дозволяє NeRF відтворювати чіткі краї та тонку текстуру замість розмитої плями. Та сама ідея (Фур'є-ознаки / синусоїдні активації SIREN) знову з'являється у нейромережевих SDF з тієї ж причини.

5. Цикл навчання: промені, зразки, фотометрична похибка

for (const image of trainingImages) {
  for (const ray of sampleRaysFromCameraPose(image.pose)) {
    const samples = stratifiedSample(ray, 64);   // груба вибірка
    const { colors, densities } = mlp(samples.map(positionalEncode));
    const predicted = volumeRender(colors, densities, samples.t);
    const loss = mse(predicted, image.pixelAt(ray));
    backprop(loss);  // градієнтний спуск по вагах MLP
  }
}

Оригінальний NeRF використовував дворівневу ієрархію "груба-потім-точна" мережа (груба мережа підказує, де розмістити більше зразків для точної), займаючи від годин до доби на одну сцену на одній GPU — головна причина, чому подальші роботи зосередились цілком на прискоренні цього циклу.

6. Прискорення: hash-сітки та instant-NGP

Instant Neural Graphics Primitives (Müller та ін., 2022) замінили чисте позиційне кодування багаторівневою hash-сіткою маленьких навчених векторів ознак, що зчитуються та інтерполюються для кожної точки, а потім подаються у набагато меншу MLP. Це перенесло основну репрезентативну ємність у швидкі звернення до GPU-пам'яті замість великих множень матриць, скоротивши час навчання з годин до секунд для сцени порівнюваної якості.

МетодЧас навчанняКлючова ідея
Оригінальний NeRF (2020)~1–2 добиПозиційне кодування + велика MLP
Instant-NGP (2022)~5–60 секБагаторівнева hash-сітка + крихітна MLP
3D Gaussian Splatting (2023)~хвилиниЯвні гауссіани, не неявна MLP, растеризуються напряму

7. Практичне застосування в інтерактивних симуляціях

Для симуляцій у браузері в реальному часі практичний висновок — не "навчити NeRF прямо у WebGL" (все ще занадто важко для більшості пристроїв), а базовий патерн: невелика нейромережа, запечена як текстура ваг, може замінити написаний вручну SDF для органічних, сканованих чи процедурно змішаних форм, обчислюючись попіксельно у фрагментному шейдері через жменьку множень матриця-вектор. Sphere tracing проти нейромережевого SDF працює точно так само, як трасування аналітичного — гарантії гладкості з Eikonal-обмеження тримають марш стабільним.

🧊 Відкрити Ray Marching SDF →

🔗 Пов'язані симуляції

🧊Ray Marching ✳️Фрактал