Как нейронные сети графике помогали
Обзор ML/DL-задач в графике
Учителем выступает что-то “свыше” – либо из реальной жизни, либо что-то нарендеренное из движка:
- Создание правдоподобных анимаций
- Постобработка отрендеренных изображений
- Интерполяция кадров
- Генерация материалов
Учителем выступает какой-то алгоритм из вычислительной математики:
- Рендеринг сложных объектов: например, облаков
- Физические симуляции
Главная идея
Если у вас есть вычислительно сложная задача, которую вы решаете некоторым классическим вычислительным способом, попробуйте найти в этой задаче самое времязатратное место и найти решение с помощью нейронной сети или любого другого алгоритма машинного обучения.
- общий рецепт как еще можно найти применение для машинного обучения
Постановка проблемы
Нужно нарисовать физически корректно облако, которое представлено как плотность капелек жидкости в пространстве.
Физически сложный объект:
- Не твердый объект, нельзя наложить текстуру и рендерить
- Капельки воды почти не поглощают свет
- Они его переотражают, делают это анизотропно
Рендеринг облака может занимать много часов, дни.
Художнику хочется как можно быстрее получать ответ (отрендеренное облако), чтобы иметь возможность экспериментировать с освещением сцены, топологией облака и т.п.
Нужно ускорить.
Классическое решение
Сложное уравнение:
Второй терм уравнения – прямое освещение (Direct Light). Свет, который приходит от солнца, попадает на точку выхода, по вектору, который выпущен из камеры, приходит в камеру, при этом он как-то затухает, т.е. интенсивность теряется.
Первый терм – интегрирование по отрезку луча, проходящего внутри облака – опосредованное освещение (Indirect Light). Моделирует переотражение каплями света внутри облака. Интеграл I1 – это интеграл по сфере, которая окружает точку на луче. В классическом алгоритме считается с помощью Монте-Карло интегрирования.
Это самая долгая часть во всем алгоритме и самая сложная.
Рецепт для ML алгоритма
Самое тяжелое – посчитать Монте-Карло оценку. Она дает какое-то число, которое обозначает опосредованное освещение в точке.
Будем предсказывать Монте-Карло оценку освещения в точке – выход для ML алгоритма.
Вход:
- Топология плотности вокруг точки
- Направление на источник
- Направление на камеру (так как капли переотражают свет не изотропно)
Обучение
Нужно сконструировать вход в нейронную сеть.
Первое – описать локальную плотность. Вокруг точки на отрезке луча возьмем трехмерную сетку с шагом равным длине свободного пробега в облаке. В узлах сетки – плотность облака. Увеличим шаг между узлами сетки в два раза, возьмем новую сетку, измерим плотности в её узлах. Так сделаем несколько раз.
В результате этой процедуры имеем несколько сеток, охватывающих все большую и большую окрестность вокруг точки. Такое представление оправдано, потому что мы хотим максимально подробно описывать маленькую область, и чем мы дальше от точки тем менее подробное мы хотим описание.
Обучать будем так: нагенерим разных облаков, будем применять классический алгоритм, записывать что он получает как ответы Монте-Карло интегрирования и фичи, на которых эти ответы были получены. Получили датасет, на котором можно обучаться.
Архитектура сети
Не является ключевой в этой задаче.
Каждая сетка попадает в блок из двух fully-connected слоев.
Результаты
Повышение скорости рендеринга в несколько сотен раз.
Реализация:
- Инструмент для рендеринга произвольных сцен, в которых есть облака
- Облако задается кубом в интерфейсе Blender