Объясняю на котиках
Обратите внимание на дату выхода публикации. Если прошло уже достаточно много времени — например, несколько месяцев, — поищите в моём блоге материалы посвежее, потому что всё написанное здесь могло уже устареть.
Несколько дней назад нейросеть "Кандинский" запустила, пока в тестовом режиме, генерацию видео. В качестве бета-тестировщиков были приглашены самые отъявленные активные пользователи телеграм-бота "Кандинского". Всем же остальным разработчики обещают скоро предоставить возможность генерировать видео на сайте ruDALL-E.
К моему (приятному) удивлению, оказалось, что я достаточно часто мучаю "Кандинского", чтобы попасть в число активных пользователей. И меня не предупреждали, что ссылку нельзя никому давать, а я человек не жадный, поэтому берите. Маловероятно, что мы с вами — теми, кто успеет прочитать эту статью до официального запуска сервиса, — вместе обвалим сервер Сбера.
У меня эти несколько дней прошли довольно плодотворно: в изучении и разборе сгенерированных видео по винтикам. Точнее, по кадрам. Я не программист и об обучении нейросетевых моделей знаю очень мало, но когда дело касается более или менее очевидных вещей — таких как анимация, — я могу примерно предположить, как был достигнут результат. Всё, что мне к настоящему моменту стало понятно (или я думаю, что стало), я и собираюсь вам рассказать.
Но начну с теории.
"Правильная" анимация
Классический вид анимации — это покадровая анимация, в которой множество картинок быстро сменяют друг друга. Для создания иллюзии движения используются картинки, очень похожие в целом, но различающиеся в некоторых деталях. Если, например, нужно создать бегущего котёнка, то на каждой картинке положение его лап должно чуть-чуть меняться. Для большей убедительности можно изменять и другие детали: например, форму, которую принимает хвост, потому что он тоже подвижный. А вот менять форму головы было бы глупо, если только наш кот — не ксеноморф, потому что голова остаётся той же, как бы быстро он ни бежал.
На примере ниже разница между положением лап в кадрах слишком велика: анимация получится немного "дёрганой", но зато он нагляден. Обычно же для создания плавного движения делается намного больше кадров, а разница в положении объектов на них не так заметна.
Но, так или иначе, для передачи движения в покадровой анимации движущийся объект или его части должны изменять положение в пространстве относительно неподвижных частей. А вот неподвижные должны оставаться на месте.
Анимация "Кандинского"
Вообще-то утверждать, что анимация "Кандинского" — ненастоящая, неправильно. Если что-то в кадре мельтешит и шевелится — значит, это в любом случае настоящая анимация. Только у "Кандинского" она пока... ну... немного недоразвитая.
В телеграм-боте можно сгенерировать по текстовому описанию одну, две или три сцены подряд, и каждая из них будет длиться 4 секунды. Это даёт на выходе 4, 8 и 12 секунд общего времени видеоролика соответственно.
При соединении двух сцен, если это возможно, нейросеть попытается применить морфинг: сплавить воедино несколько последних кадров из одной сцены и несколько первых из следующей, превращая одни элементы в другие. Это как микширование треков ди-джеем, только визуальное. Вот вам первый способ создания анимации.
Хороший пример — анимация с девушкой, которая переплавляется в кошку на ваших глазах:
К каждой сцене можно применить эффект движения камеры, имитирующий работу оператора: она будет показываться с приближением, удалением, справа налево, слева направо и так далее. Это второй способ создания эффекта анимации.
Но внутри самой сцены крупные объекты почти никуда не движутся и в общем мало изменяются. Зато заметно изменяются мелочи. Больше всего это похоже на генерацию нейросетью набора картинок по одному "зерну", когда результаты почти одинаковы и различаются лишь небольшими погрешностями. (Подробнее о том, что такое "зерно" и как его использовать при генерации изображений, можно почитать в моей недавней публикации, но для понимания основной мысли настоящей статьи знать это, в общем-то, необязательно.)
Вот за счёт этих мелких отличий, которые сменяют друг друга при смене кадров, и создаётся главный эффект "оживления". Он, кстати, давно используется мультипликаторами вполне осознанно, и вы могли видеть его в старых эстетских мультфильмах "не для всех". То же и у "Кандинского": при простом сравнении двух картинок различий можно и не заметить, но если быстро сменять кадры — 24 в секунду, — то неодинаково отрисованные окна, стены, земля, мебель и прочее неодушевлённое начинает "шевелиться". А вот крупные объекты, которые должны перемещаться в пространстве, если и двигаются, то о-о-о-очень медленно.
Я не утверждаю, что объекты у "Кандинского" вообще не передвигаются. Например, при большом желании можно разглядеть, как у котёнка на этих кадрах изменяется положение правой передней лапы (и даже левой задней). Нумерация кадров проставлена для понимания скорости движения: весь этот экшн занимает почти 4 секунды. Это очень, очень заторможенный котёнок. А согласно моему запросу он должен был живенько играть с мячом.
Для сравнения посмотрите на раскадровку от AnimateDiff (модель lyriel v16, если интересно): этот ролик длится всего 2 секунды, но за это время котёнок успевает не только явно перебрать лапками, но и изменить положение головы и даже взгляд. А вот мелкие детали, хоть и меняются, но не настолько заметно, чтобы отвлекать внимание от основного действия.
Посмотреть на этого котика, а также других, таких же активных, в движении можно в оригинале видео по ссылке.
Я совсем не хочу обижать "Кандинского". Натренировать нейросеть не просто создавать серии похожих картинок, но и уяснить механику и принципы движения, причём разные для разных объектов, живых и неживых — наверное, дело небыстрое. Над обучением той же AnimateDiff сейчас работает множество людей, и результаты до сих пор варьируются от очень хороших до откровенно плохих. Кто начал работать раньше, тот уже добился значительного прогресса: можете сами поискать — да хоть тут же, в Дзене, — практически полноценные мультфильмы, созданные с помощью Midjourney. Так что команде разработчиков, которая работает над "Кандинским", я желаю терпения и успехов.
Всё сказанное совсем не значит, что ничего хорошего сейчас "Кандинский" сгенерировать не может. Очень даже может, если понимать его особенности и осознанно их использовать. В следующий раз я поделюсь с вами своими наблюдениями и дам пару-тройку, возможно, полезных советов по генерации видео с "Кандинским". Не переключайтесь.