Как нейронные сети графике помогали

Обзор ML/DL-задач в графике

Учителем выступает что-то “свыше” – либо из реальной жизни, либо что-то нарендеренное из движка:

Учителем выступает какой-то алгоритм из вычислительной математики:

Главная идея

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

- общий рецепт как еще можно найти применение для машинного обучения

Постановка проблемы

Нужно нарисовать физически корректно облако, которое представлено как плотность капелек жидкости в пространстве.

1-problem

Физически сложный объект:

Рендеринг облака может занимать много часов, дни.

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

Нужно ускорить.

Классическое решение

Сложное уравнение:

classic-solution

Второй терм уравнения – прямое освещение (Direct Light). Свет, который приходит от солнца, попадает на точку выхода, по вектору, который выпущен из камеры, приходит в камеру, при этом он как-то затухает, т.е. интенсивность теряется.

Первый терм – интегрирование по отрезку луча, проходящего внутри облака – опосредованное освещение (Indirect Light). Моделирует переотражение каплями света внутри облака. Интеграл I1 – это интеграл по сфере, которая окружает точку на луче. В классическом алгоритме считается с помощью Монте-Карло интегрирования.

Это самая долгая часть во всем алгоритме и самая сложная.

Рецепт для ML алгоритма

Самое тяжелое – посчитать Монте-Карло оценку. Она дает какое-то число, которое обозначает опосредованное освещение в точке.

ml-receipt

Будем предсказывать Монте-Карло оценку освещения в точке – выход для ML алгоритма.

Вход:

Обучение

Нужно сконструировать вход в нейронную сеть.

Первое – описать локальную плотность. Вокруг точки на отрезке луча возьмем трехмерную сетку с шагом равным длине свободного пробега в облаке. В узлах сетки – плотность облака. Увеличим шаг между узлами сетки в два раза, возьмем новую сетку, измерим плотности в её узлах. Так сделаем несколько раз.

В результате этой процедуры имеем несколько сеток, охватывающих все большую и большую окрестность вокруг точки. Такое представление оправдано, потому что мы хотим максимально подробно описывать маленькую область, и чем мы дальше от точки тем менее подробное мы хотим описание.

learning

Обучать будем так: нагенерим разных облаков, будем применять классический алгоритм, записывать что он получает как ответы Монте-Карло интегрирования и фичи, на которых эти ответы были получены. Получили датасет, на котором можно обучаться.

Архитектура сети

Не является ключевой в этой задаче.

Каждая сетка попадает в блок из двух fully-connected слоев.

neural-net-architecture

Результаты

Повышение скорости рендеринга в несколько сотен раз.

Реализация:

results