NeRF 3D синтез на JAX: пошаговый гайд от установки до готовой сцены
Технология NeRF (Neural Radiance Field, нейронное поле излучения) позволяет из набора обычных фотографий объекта собрать полноценную трёхмерную сцену, которую можно вращать, приближать и рендерить с любого ракурса, и этот гайд проведёт вас от установки библиотек до готового 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, сеть его просто не увидит.
Этот туториал хорош как учебный стенд: синтетическая сцена с известным ответом позволяет понять, работает ваш код или нет, ещё до перехода к реальным фотографиям. Я рекомендую сначала добиться PSNR выше 25 на этих сферах и только потом подставлять свои данные.
Честная оговорка: NeRF в варианте 2020 года уже не передний край. Для продакшена посмотрите на 3D Gaussian Splatting и Instant-NGP, они быстрее на порядки. Но для понимания того, как устроен объёмный рендеринг через нейросеть, классический NeRF на JAX остаётся лучшим учебным маршрутом. Из доступных в РФ аналогов для экспериментов с 3D: Sber3D и инструменты на базе открытых моделей (опенсорс) из Hugging Face, но готового аналога jax3d с таким же набором примитивов на русском пока нет.
Если вы дошли до 360-градусного рендера и видите чистую картинку без артефактов, вы освоили полный цикл NeRF 3D синтеза: от лучей до полигональной модели. Следующий шаг, подставить вместо синтетических сфер фотографии реального объекта и проверить, как сеть справится с настоящими данными.
Научитесь создавать контент с помощью нейросетей
На dzen.guru собраны практические гайды по ИИ-инструментам для авторов и разработчиков
Перейти к гайдам
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

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

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

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