Игорь Градов
Игорь Градов
6 мин
ai

NeRF 3D синтез на JAX: пошаговый гайд от установки до готовой сцены

Технология NeRF (Neural Radiance Field, нейронное поле излучения) позволяет из набора обычных фотографий объекта собрать полноценную трёхмерную сцену, которую можно вращать, приближать и рендерить с любого ракурса, и этот гайд проведёт вас от установки библиотек до готового 3D-результата на JAX.

NeRF 3D синтез на JAX: пошаговый гайд от установки до готовой сцены
Почему это важно

NeRF 3D синтез до сих пор остаётся темой, которую русскоязычные разработчики вынуждены осваивать по англоязычным туториалам. Здесь собран полный пошаговый маршрут на русском: от клонирования репозитория до оценки качества и экспорта геометрии.

Оригинальный туториал, на котором построен этот гайд, описывает сборку иерархического NeRF с использованием JAX, Flax, Optax и примитивов объёмного рендеринга из библиотеки jax3d. Подход включает позиционное кодирование, skip-соединения (пропускные связи, когда сигнал перепрыгивает через несколько слоёв сети), раздельные «грубую» и «тонкую» сети, а также иерархическую выборку по значимости. Ниже разложено всё по шагам так, чтобы повторить результат мог и разработчик без опыта в объёмном рендеринге.

Что понадобится?

  • Python 3.9+ и менеджер пакетов pip
  • JAX с поддержкой GPU (на CPU тоже работает, но медленнее и с урезанными параметрами)
  • Flax (библиотека для описания нейросетей поверх JAX), Optax (оптимизаторы), etils (утилиты массивов)
  • Клон репозитория google-research/jax3d (клонируется автоматически скриптом)
  • Google Colab с GPU T4 или локальная машина с видеокартой NVIDIA
  • Около 30 минут на GPU (на CPU с уменьшенными параметрами хватит примерно 15 минут, но качество будет ниже)

Пошаговая инструкция

1. Установите зависимости и загрузите jax3d

Скрипт сам ставит пакеты и клонирует репозиторий. Если вы работаете в Colab, просто запустите ячейку:

import os, sys, subprocess

def _sh(cmd):
    subprocess.run(cmd, shell=True, check=False,
                   stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

_sh(f'{sys.executable} -m pip install -q '
    f'"etils[array-types,epy,etree,enp]" chex flax optax scikit-image')

REPO_DIR = "/content/jax3d"
if not os.path.isdir(REPO_DIR):
    _sh(f"git clone -q --depth 1 "
        f"https://github.com/google-research/jax3d.git {REPO_DIR}")

Модуль volume_rendering загружается напрямую из клона без полной установки пакета, это позволяет обойти тяжёлые зависимости вроде gin и tfds.

2. Настройте конфигурацию под своё железо

Все ключевые параметры собраны в датакласс Config. На GPU используются полные значения, на CPU скрипт автоматически уменьшает разрешение, число обучающих ракурсов и ширину сети:

import dataclasses

@dataclasses.dataclass
class Config:
    H: int = 64          # высота изображения в пикселях
    W: int = 64          # ширина
    n_train_views: int = 24
    n_coarse: int = 64   # точки выборки для грубой сети
    n_fine: int = 64     # точки для тонкой сети
    deg_pos: int = 10    # степень позиционного кодирования
    deg_dir: int = 4
    width: int = 128     # ширина скрытых слоёв
    depth: int = 6       # глубина сети
    skip: int = 3        # слой skip-соединения
    steps: int = 2500    # шагов обучения
    lr_init: float = 5e-4
    lr_final: float = 5e-6

Если GPU нет, скрипт сам переключится на облегчённый режим: разрешение 40 на 40, 400 шагов, ширина сети 64.

3. Постройте камеры и сгенерируйте лучи

Камеры расставляются по куполу вокруг сцены методом «золотого угла» (golden-angle), это даёт равномерное покрытие ракурсов. Для каждого ракурса строятся лучи через пинхол-модель (модель камеры-обскуры, когда все лучи проходят через одну точку):

import math, numpy as np

FOCAL = 0.5 * cfg.W / math.tan(0.5 * math.radians(cfg.fov_deg))
poses = orbit_poses(cfg.n_train_views, cfg.cam_radius)
origins, directions = rays_from_pose(poses[0], cfg.H, cfg.W, FOCAL)

Функция rays_from_pose возвращает начала и направления лучей для каждого пикселя. Направления нормализованы, поэтому глубины соответствуют реальным расстояниям в мировых координатах.

4. Создайте синтетическую сцену

В туториале используется аналитическая сцена из трёх цветных сфер с объёмной геометрией и освещением, зависящим от направления взгляда. Сцена нужна, чтобы иметь идеальный ground truth (эталон), с которым потом сравнивается результат NeRF 3D синтеза.

5. Соберите архитектуру NeRF

Сеть состоит из двух частей:

  • Грубая сеть (coarse): получает позиционно закодированные координаты точки и предсказывает плотность и цвет
  • Тонкая сеть (fine): работает с точками, выбранными по иерархической выборке из sample_piecewise_constant_pdf (функция, которая сгущает точки там, где грубая сеть нашла что-то непрозрачное)

Обе сети используют skip-соединения (сигнал со входа подаётся напрямую в средний слой) и отдельный вход для направления взгляда, чтобы моделировать блики и зеркальные отражения.

6. Обучите модель

Обучение запускается с JIT-компиляцией (just-in-time, когда JAX компилирует функцию при первом вызове и дальше выполняет её на GPU без накладных расходов):

  • Оптимизатор: Adam
  • Расписание скорости обучения: экспоненциальное затухание от 5e-4 до 5e-6
  • Обрезка градиентов (gradient clipping), чтобы предотвратить «взрывы» весов
  • Размер пакета: 2048 лучей на шаг (1024 на CPU)

7. Оцените результат

После обучения скрипт считает PSNR (Peak Signal-to-Noise Ratio, отношение сигнала к шуму в децибелах: чем выше, тем ближе к оригиналу), визуализирует карту глубин и непрозрачности, строит 360-градусный облёт камеры и извлекает геометрию методом marching cubes (алгоритм, который из поля плотности строит полигональную поверхность).

Как оценить, что всё получилось?

Три индикатора успеха:

  • PSNR выше 25 дБ на тестовых ракурсах, значит, сеть научилась воспроизводить сцену
  • Карта глубин показывает чёткие контуры объектов, а не шум
  • 360-градусный рендер выглядит плавным, без «дыр» и артефактов
Что ввели и что получили

На входе: 24 синтетических ракурса сцены с тремя цветными сферами, разрешение 64 на 64 пикселя, 2500 шагов обучения на GPU T4.

На выходе: обученная модель NeRF 3D синтеза, которая генерирует новые ракурсы той же сцены с визуально неотличимым качеством. PSNR на тестовых видах показывает, насколько точно восстановлена картинка. Дополнительно извлечена полигональная 3D-модель через marching cubes, которую можно открыть в любом 3D-редакторе.

Частые ошибки
  • Запуск без GPU и с полными параметрами. Скрипт переключится сам, но если вы вручную оставите steps=2500 и width=128 на CPU, обучение займёт часы вместо минут. Проверяйте платформу через jax.devices().
  • Неправильная версия etils. Модуль volume_rendering чувствителен к версии. Если при загрузке возникает ошибка, установите конкретную версию: pip install 'etils[array-types,epy,etree,enp]==1.9.4'.
  • Ненормализованные направления лучей. Если направления не единичной длины, глубины перестанут соответствовать реальным расстояниям, и карта глубин будет бессмысленной. Функция rays_from_pose из туториала нормализует автоматически, но при замене на свою камеру проверьте это вручную.
  • Путаница с near/far. Границы выборки (1.9 и 4.7 в конфигурации) подобраны под конкретную сцену. Для своих данных пересчитайте: если объект ближе near или дальше far, сеть его просто не увидит.
Мнение редакции dzen.guru

Этот туториал хорош как учебный стенд: синтетическая сцена с известным ответом позволяет понять, работает ваш код или нет, ещё до перехода к реальным фотографиям. Я рекомендую сначала добиться PSNR выше 25 на этих сферах и только потом подставлять свои данные.

Честная оговорка: NeRF в варианте 2020 года уже не передний край. Для продакшена посмотрите на 3D Gaussian Splatting и Instant-NGP, они быстрее на порядки. Но для понимания того, как устроен объёмный рендеринг через нейросеть, классический NeRF на JAX остаётся лучшим учебным маршрутом. Из доступных в РФ аналогов для экспериментов с 3D: Sber3D и инструменты на базе открытых моделей (опенсорс) из Hugging Face, но готового аналога jax3d с таким же набором примитивов на русском пока нет.

Если вы дошли до 360-градусного рендера и видите чистую картинку без артефактов, вы освоили полный цикл NeRF 3D синтеза: от лучей до полигональной модели. Следующий шаг, подставить вместо синтетических сфер фотографии реального объекта и проверить, как сеть справится с настоящими данными.

Научитесь создавать контент с помощью нейросетей

На dzen.guru собраны практические гайды по ИИ-инструментам для авторов и разработчиков

Перейти к гайдам
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Архитектура трансформер с обратной связью: идея из Принстона пока без экспериментов
ai

Архитектура трансформер с обратной связью: идея из Принстона пока без экспериментов

Принстонский исследователь Ифан Чжан опубликовал технический отчёт Recurrent Looped Transformer, архитектуру трансформер нейронной сети, где последний слой…

5 мин
Anthropic, OpenAI и xAI впервые объединились: правовое регулирование искусственного интеллекта берёт индустрия
ai

Anthropic, OpenAI и xAI впервые объединились: правовое регулирование искусственного интеллекта берёт индустрия

Anthropic 12 сентября 2026 года выступила с планом замедления гонки за мощность ИИ-моделей, и в течение суток его поддержали руководители OpenAI и xAI, впервые…

6 мин
Как мультимодальность влияет на развитие ИИ-агентов: баг Reasoning Lock сжигает токены и возвращает пустоту
ai

Как мультимодальность влияет на развитие ИИ-агентов: баг Reasoning Lock сжигает токены и возвращает пустоту

Почему это важно Когда ИИ-агент в продакшене тратит токены, рапортует об успехе и отправляет клиенту пустую строку, бизнес теряет деньги и клиентов без единого…

6 мин