«Любой из живущих в наше время может претендовать на участие в киносъёмке»,  Вальтер Беньямин, основоположник современной теории фотографии. В последние несколько лет активно развиваются генеративные модели, причём синтезировать с хорошим качеством уже сейчас получается и тексты, и аудио, и изображения, и видео, и 3D, и другие модальности. Если говорить про генерацию изображений, то стремительность прогресса в этом направлении обусловлена развитием диффузионного подхода и успехами при обучении больших диффузионных моделей (таких как DALL•E 2/3, Imagen, Stable Diffusion, Kandinsky 2.X). Этот тип моделей показывает также отличное качество синтеза видео (ImagenVideo, Make-a-Video, Video LDM, GEN-1, GEN-2, Pika Labs, ZeroScope) и 3D-объектов (DreamFusion, Magic3D). При этом каждый месяц мы можем наблюдать за появлением новых open source (и не только) решений и сервисов, которые обеспечивают очень высокое визуальное качество генераций.  Несмотря на стремление исследователей создать единую модель для синтеза видео, есть не менее элегантные подходы к генерации видеороликов. В этой статье речь пойдёт как раз о таком способе создания анимированных видео на основе модели генерации изображений по тексту — в нашем случае, это, как вы уже успели догадаться, модель Kandinsky 2.2. В деталях изучив направление моделирования различных визуальных эффектов вокруг генеративной модели, которая обладает способностью преобразования изображений (image-to-image) и механизмами дорисовки (inpainting/outpainting), мы разработали решение, которое расширяет границы статичных генераций и даёт возможность синтеза так называемых анимационных видео. В качестве такого фреймворка, где имплементированы различные варианты анимаций, мы взяли широко известный deforum, который хорошо зарекомендовал себя в связке с моделью Stable Diffusion. И поверьте, задача скрещивания deforum с Kandinsky была отнюдь не простой. Об этом и поговорим далее! Идея анимирования картинки довольно проста: из исходного 2D-изображения мы получаем псевдо-3D-сцену и затем моделируем облёт камерой этой сцены. Эффект псевдо-3D возникает ввиду восприятия глазом человека динамики движения через пространственные преобразования. Используя различные механики анимации движения, мы получаем последовательный набор кадров, как будто бы снятый на камеру от первого лица. Процесс создания такого набора кадров разбивается на 2 этапа: создание псевдо-3D-cцены и имитация облёта камеры (получение последовательных кадров); применение подхода image-to-image для дополнительной коррекции полученных изображений.  Рассмотрим подробнее как работает создание сцены и имитация съемки её камерой. Псевдо-3D-сцену мы получаем при помощи модели MiDaS, которая генерирует карту глубины по 2D-изображению. Диапазон значений этой карты по оси z ("вглубину") лежит на некотором отрезке [znear, zfar] (в системе координат, о которой речь будет чуть ниже). Камера характеризуется координатами положения в пространстве сцены (x, y, z), и направлением взгляда, которое задаётся тремя углами (𝛼, 𝛽, 𝛾). Соответственно, для задания траектории движения камеры необходимо определить зависимости x = x(t), y = y(t), z = z(t), 𝛼 = 𝛼(t), 𝛽 = 𝛽(t), 𝛾 = 𝛾(t). Импровизированная съёмка сцены камерой от первого лица представляет из себя операцию перспективных проективных преобразований. Изначально камера зафиксирована в начале координат, а сцена удалена на расстояние znear от неё. Отметим, что движение и повороты камеры эквиваленты тем же движениям и поворотам нашей сцены, взятыми со знаком минус. Соответственно преобразования поворота и трансляции мы можем применять к нашей сцене, а камеру зафиксировать в начале координат. По факту сцена представляет собой конечный набор точек в силу конечного набора пикселей в исходном изображении. Поэтому наши преобразования мы можем применить непосредственно к каждой из этих точек, вращая их относительно осей, проходящих через центр сцены, а затем применяя трансляцию этого центра. Вращение в трехмерном пространстве распадается на вращение вокруг трёх ортогональных осей.  Представляя каждую точку нашей сцены как вектор V_i с началом в центре сцены, мы получаем преобразование общего вида: Оно применяется к каждой точке для того, чтобы посмотреть на неё с камеры (x, y, z) под направлением взгляда (𝛼, 𝛽, 𝛾). Подробнее про операцию перспективного проецирования также можно прочитать в статье. Отдаление: преобразование трансляции вдоль оси, проходящий через камеру и центр сцены. Трансляция производится в сторону удаления от камеры. Динамика движения камеры описывается следующими уравнениями 𝛼(t), 𝛽(t), 𝛾(t), x(t), y(t) = 0, z(t)=z_0+v*t, где v — скорость движения, откуда выводится динамика каждого пикселя исходного изображения (см. формулу выше). Поворот: преобразования поворота вдоль одной оси, проходящей через центр сцены. Динамика описывается следующими уравнениями: 𝛼(t), 𝛾(t), x(t), y(t) = 0, z(t)=z_0, 𝛽(t)= w*t, где w — угловая скорость вращения, откуда выводится динамика каждого пикселя исходного изображения (см. формулу выше). Отметим, что карта глубины одной картинки всё же не является полноценной 3D-сценой и небольшие отклонения камеры от исходной проекции будут давать искажения, как это видно на картинках выше. Поэтому есть два необходимых дополнения к этим рассуждениям: каждое из последовательных преобразований должно незначительно менять положение сцены, т. е. применяемые операции должны быть инфинитезимальными преобразованиями для получения проекции без сильного искажения; после каждого такого преобразования необходимо применять подход image-to-image для устранения на изображении возможных искажений. Сначала небольшое напоминание, как работают диффузионные модели. Диффузионный процесс представляет собой два процесса: прямой и обратный. В ходе прямого процесса мы добавляем шум к входным данным, приводя их распределение шаг за шагом к стандартному нормальному. Обратный процесс представляет из себя пошаговое восстановление исходного распределения.  Оба процесса являются гауссовскими со следующими параметрами: Дисперсия прямого процесса 𝛽_t задается нами, а дисперсия обратного выражается через 𝛽_t и не зависит от данных. В обратном процессе обучаемым является среднее значение 𝜇_𝜃(xt, t) - именно оно моделируется глубокой нейронной сетью (обычно это UNet). Подробнее про диффузионный процесс и обучение диффузионных моделей можно прочитать в статьях Kandinsky 2.0, Kandinsky 2.1 и Kandinsky 2.2. Стоит отметить две вещи: • В силу случайности как прямого, так и обратного процессов мы не вернёмся в исходное состояние после последовательного их прохождения (см. изображение с распределениями выше). • если наша нейронная сеть обучена хорошо предсказывать среднее значение в обратном процессе, то на каждом шаге мы будем получать семпл с высокой вероятностью q(x_t). Идея реализации подхода image-to-image проста. Мы не будем проходить весь прямой процесс диффузии до конца, а сделаем лишь несколько шагов зашумления. Далее относительно полученного состояния начнём обратный процесс и в конечном итоге получим картинку, сильно похожую на исходное изображение. Применение метода image-to-image для моделирования облёта камеры является необходимым шагом, так как нам нужно получить картинку, похожую на реальную, после применения проективного преобразования. Если остановиться на шаге с получением проекции после преобразования псевдо-3D-сцены, полученной из карты глубины изображения, то синтезированное изображение будет содержать артефакты на краях, т. е. сильно отличаться от того, что можно считать  эстетически красивым. Однако, сделав после этого несколько шагов прямого процесса и столько же шагов в обратном направлении, можно получить существенно более красивую сцену (за счёт того, что проекция h_0, возможно, с низкой вероятностью q преобразуется после этого в p_0 уже с высокой вероятностью q, то есть становится больше похожа на обычное изображение). На картинке эти манипуляции можно представить следующим образом: С помощью такой «коррекции» проекций на основе метода image-to-image, получается алгоритм генерации  анимации из 2D-изображения: В качестве иллюстрации рассмотрим, как end-to-end устроены, например, операции отдаления и поворота (на очень наглядной картинке ниже): Бот — это наша основная площадка, где можно воспользоваться моделью. Пока что доступ на тестирование модели открыт только самым активным пользователям модели Kandinsky 2.2, но каждый может оставить заявку на получение доступа (внутри бота доступна кнопка «Оставить заявку»). Каждую неделю мы будем давать доступ к боту новым людям (как из числа активных пользователей Kandinsky 2.2, так и из этого списка). Более того, мы работаем над тем, чтобы доступ к генерации видео до конца года получили абсолютно все.  Для запуска бота необходимо ввести команду /start в меню, затем отправить текстовое описание и выбрать один из 16-ти эффектов анимации, после чего нажать «завершить сценарий» и выбрать разрешение изображения или ввести следующее описание и выбрать следующий эффект (всего для ввода доступны максимум 3 описания и эффекта).  По одному текстовому описанию генерируется 4-х секундное видео. Генерация 1 секунды видео занимает около 20 секунд, но ожидание может длиться дольше из-за очереди. Если вы ждёте слишком долго, не паникуйте и попробуйте сбросить генерацию командой /start и начать заново. Доступно три разрешения для генерации: горизонтальное (832х448 пикселей), квадратное (640х640 пикселей) и вертикальное (448х832 пикселей).  Как было сказано выше, всего нами реализовано 16 режимов анимации, каждый из которых — это некоторое движение камеры внутри сцены. Камера может погружаться вглубь изображения, обозревать объект на генерации с разных сторон, вращаться на 360 градусов от первого лица и так далее. Посмотреть примеры движения камерой можно в боте по команде /examples. Подробнее с каждым режимом можно также ознакомиться тут: Анимированное изображение, конечно, выглядит красиво, но киношедевр не может существовать одним статичным кадром в 4 секунды, где ничего не происходит, кроме, например, небольших движений милого котика. Кино — это в первую очередь история, разложенная покадрово. Наша главная фича, достойная отдельного обзора, — возможность генерировать 2-3 сцены за одну генерацию, что позволяет создавать мини-сценарии в меру своей фантазии. Переходы между сценами происходят с помощью склейки наплывом. Это значит, что один кадр плавно преобразуется в другой. Пример: Данное видео получено по следующим промптам c выбранным режимом «на месте»: «Jungle with flowers, graphic artist Magali Villeneuve, flowers, Pixar art, green and pink colors, highly detailed leaves, Lin Tinggui style, intricate oil painting, epic, delight» «Bird of paradise painting, graphic artist Magali Villeneuve, flowers, Pixar art, green and pink colors, highly detailed leaves, Lin Tinggui style, intricate oil painting, epic, delight» У генераций в 2-3 промпта есть свои особенности, которые нужно учитывать, чтобы создавать красочные видеоролики: промпты рекомендуется писать похожие или одного и того же стиля; режимы движения камеры должны развивать сюжет и логично продолжать друг друга. В противном случае у вас может получиться…что-то такое: Поэтому для каждого кадра продумывайте, как он объединится с предыдущим и как раскроется в художественном смысле. Советуем также сначала проверять промпты в Kandinsky 2.2 и уже потом генерировать видео, чтобы не тратить время на ожидание и получить не то, что представляли. Оценить возможности модели и создать свой сценарий можно через Telegram-бот, а обсудить генерации и посмотреть работы тех, у кого уже есть доступ, можно в ветке «Создаём AI-ролики c Kandinsky» нашего сообщества в Telegram и в чате «Создаём AI-ролики c Kandinsky» в ВК. Примеры промптов и генераций также есть в галерее на сайте rudalle.ru. В статье мы постарались в деталях описать, как насыщаем модель Kandinsky 2.2 новыми возможностями, выходя за границы статичных генераций и наделяя её возможностью создавать анимированные видео. Данный подход предопределён набором механик анимации, что является его заметным ограничением. Тем не менее создаваемые видео выглядят эффектно и демонстрируют уже проверенные навыки модели генерации изображений как в части качества картинки, так и в части скорости синтеза. Напомню, что 1 секунда 24 FPS видео генерируется около 20 секунд, то есть каждый кадр видеоролика создаётся меньше, чем за 1 секунду. Особенно интересно выглядит режим режиссёра, где пользователь может создать ролик из нескольких текстовых описаний (сцен), дополнительно применив к этим сценам различные виды анимаций. Несмотря на высокое качество генераций, с рядом артефактов ещё предстоит бороться, а неумолимое развитие end-to-end моделей синтеза видео вовлекает и нас в этот исследовательский стрим. Продолжая исследования в части высококачественной генерации видеороликов, мы непременно будем делиться получаемыми результатами. Цель таких исследований в конечном итоге перейти от анимации статических сцен к генерации по текстовому описанию полноценных сюжетов, в которых каждый объект и фон могут существовать и изменяться во времени самостоятельно, при этом не нарушая общую композицию сцены. Обязательно будем держать вас в курсе :) Дополнительно хочется сказать, что проекты на стыке науки и искусства могут быть сложными и требовать интеграции различных дисциплин (надо отметить, что это наблюдение далеко не новое). Важно, чтобы разработчики и креаторы находились в постоянном диалоге и обменивались своими знаниями и опытом для создания технологичного и эстетичного продукта. Если никакого симбиоза не происходит, тогда есть шанс (причем достаточно большой), что разработчик законсервируется внутри кода, не привнося нового в конечный результат, а креатор остановится на хорошей идее, которую невозможно технически реализовать.  Разработчикам пора погрузиться в картины Василия Кандинского, а креаторам — разобраться в генеративных моделях (особенно диффузионных)! Поэтому и текущая статья устроена так, что первая часть достаточно техническая, а вторая — достаточно креативная (статью прочитать целиком будет полезно всем — и специалистам в области DL, и креаторам). Очень приятно отметить, что у нас получилось собрать именно такую команду - состоящую как из технических специалистов, так и из креаторов (Ангелина Куц, Татьяна Паскова 😊👋), которые показывают наши модели всему миру с их лучшей стороны. Следите за новостями на каналах «Градиентное погружение», CompleteAI, AbstractDL, Dendi Math&AI и на канале Сергея Маркова. Функциональность синтеза анимированных видео на основе Kandinsky 2.2 разработана и исследована командой Sber AI. Коллектив авторов: Саид Азизов*, Арсений Шахматов*, Ангелина Куц (SberDevices), София Кириллова, Владимир Архипкин, Игорь Павлов, Татьяна Паскова, Михаил Шойтов, Сергей Нестерук, Андрей Кузнецов, Денис Димитров.* — equal contribution По всем возникающим вопросам и предложениям по развитию модели, добавления новых фичей и сотрудничеству в части использования наших разработок можно писать Денису или Андрею. сайт проекта Telegram-бот rudalle.ru канал в Telegram чат в VK  Data Scientist