Differentiable Rendering
Дифференцируемый рендеринг вычисляет, как меняется каждый пиксель отрисованного изображения при изменении формы сцены, материалов и камеры, позволяя подгонять 3D-сцены под фотографии.
Дифференцируемый рендеринг — это рендеринг, то есть преобразование описания геометрии, материалов и освещения 3D-сцены и параметров камеры в изображение, реализованное так, чтобы можно было вычислить производную каждого выходного пикселя по параметрам сцены. Затем функцию потерь, сравнивающую отрендеренное изображение с фотографией, можно минимизировать с помощью градиентного спуска, выполняя обратное распространение ошибки через рендерер к 3D-сцене. Поэтому дифференцируемый рендеринг лежит в основе обратного рендеринга — задачи компьютерного зрения, цель которой восстановить сцену по изображениям, — и методов нейронного рендеринга, таких как нейронные поля излучения (NeRF) и гауссово сплаттинг-представление, обучающих модели сцены с помощью рендеринга.
Почему рендеринг требует особой обработки#
Стандартный растеризатор недифференцируем именно там, где это важно. Наличие треугольника в пикселе зависит от положений его вершин по ступенчатой функции, поэтому небольшое перемещение вершины не меняет ни одного пикселя, пока край не пересечёт центр пикселя, а градиент по геометрии почти всюду равен нулю. Окклюзия добавляет новые разрывы везде, где одна поверхность скрывает другую. Дифференцируемые рендереры обрабатывают эти края по-разному:
- Приближённые градиенты: OpenDR (2014) и Neural 3D Mesh Renderer (2018) используют стандартный растеризатор на прямом проходе и приближённо вычисляют градиенты на обратном проходе.
- Мягкая растеризация: SoftRas (2019) заменяет жёсткое покрытие каждого пикселя вероятностью, плавно убывающей с расстоянием до края треугольника, и смешивает перекрывающиеся грани. Поэтому каждый пиксель рядом с краем передаёт градиент геометрии.
- Физически обоснованный дифференцируемый рендеринг: Трассировщики лучей, такие как redner (2018) и Mitsuba 3 (2022), выбирают точки на контурах силуэтов или перепараметризуют интеграл рендеринга, обеспечивая градиенты для теней, отражений и непрямого света.
- Объёмный рендеринг и рендеринг сплатов: Альфа-композитинг плотностей вдоль каждого луча в NeRF и растеризованные 3D-гауссианы в гауссовом сплаттинг-представлении по своей конструкции являются гладкими функциями параметров.
Мягкий растеризатор для одного диска демонстрирует эту идею в PyTorch: покрытие — это сигмоида от знакового расстояния до края диска, поэтому пиксели рядом с границей передают градиенты его центра и радиуса.
import torch
# Pixel coordinates of a 64x64 image
ys, xs = torch.meshgrid(torch.arange(64.0), torch.arange(64.0), indexing="ij")
def render(center, radius):
"""Soft-rasterize a disk: pixel coverage is a sigmoid of the signed distance to its edge."""
distance = torch.sqrt((xs - center[0]) ** 2 + (ys - center[1]) ** 2 + 1e-6)
return torch.sigmoid(radius - distance)
# Target image: a disk at (40, 24) with radius 12
target = render(torch.tensor([40.0, 24.0]), torch.tensor(12.0))
# Recover the scene from a wrong guess by backpropagating the pixel loss
center = torch.tensor([20.0, 40.0], requires_grad=True)
radius = torch.tensor(6.0, requires_grad=True)
optimizer = torch.optim.Adam([center, radius], lr=0.5)
for _ in range(300):
loss = ((render(center, radius) - target) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"center {center.detach().round(decimals=1).tolist()}, radius {radius.item():.1f}")Он выводит center [40.0, 24.0], radius 12.0: начиная примерно в 26 пикселях от цели и с половиной радиуса, оптимизатор Adam восстанавливает диск, используя только различия между пикселями. При жёстком покрытии (distance < radius).float() функция потерь не передала бы градиент ни одному из параметров.
Примеры применения в реальных условиях#
Функции потерь для силуэтов, подобные приведённой в коде, сравнивают маску отрендеренного объекта с наблюдаемой маской. Для фотографий без разметки модель сегментации экземпляров, например YOLO26 (yolo26n-seg.pt), формирует маску для каждого объекта на изображении.
- 3D-реконструкция: NeRF (2020) и 3D Gaussian Splatting (2023) восстанавливают сцену по десяткам фотографий с известными положениями камер. Затем Gaussian Splatting рендерит новые ракурсы в реальном времени — со скоростью 30 кадров в секунду или выше при разрешении 1080p.
- Аппроксимация тела человека: Методы с моделью тела подгоняют параметрическую сетку, например SMPL, к изображению, сопоставляя её отрендеренный силуэт и проекции суставов с маской и ключевыми точками человека.
- Генерация 3D-моделей по тексту: DreamFusion (2022) оптимизирует NeRF так, чтобы его изображения с произвольных ракурсов получали высокие оценки от диффузионной модели преобразования текста в изображение. Так создаются 3D-объекты без обучающих данных в 3D.










