Назад
218

Анимация детских рисунков

218

А вы думали в детстве об оживлении своих рисунков? Наш автор Антон — да! Но мог разве что рисовать много-много похожих изображений в углу листа, а потом быстро пролистывать тетрадку. А недавно исследователи воплотили мысль в реальность и нашли другой способ оживления рисунков — метод анимации детских персонажей. В статье мы расскажем:

  • какие методы и модели использовались для анимации
  • как авторы решили проблему с отсутствием данных для обучения моделей
  • что делать, если нейросети не справляются с задачей

Оживляем детские рисунки

Анимировать персонажа по фотографии не так уж и просто, поэтому авторы разделили весь процесс на отдельные этапы:

  1. Детекция персонажа;
  2. Сегментация персонажа;
  3. Определение положения тела персонажа в пространстве;
  4. Анимирование движений персонажа.

Общий пайплайн выглядит примерно так:

Рисунок 1. Общий пайплайн от фотографии рисунка до анимации персонажа.

На каждом этапе реализации анимации авторы брали за основу предобученные модели. Однако все модели из коробки не работали и их нужно было “дообучить”. Но как это сделать, если никто раньше не решал такую задачу и подходящих данных нигде нет? Создать демо — сайт с возможностью для каждого человека загружать свои рисунки. Так и поступают авторы, а еще они сообщают об этой новости в твиттере. Им удается собрать 6.7 миллионов фоток! Правда, после очистки и ручной обработки их остается 178 тысяч. О датасете мы еще скажем подробней чуть позже, а пока давайте перейдем к самим этапам метода анимации детских персонажей.

Детекция персонажа

На этом этапе мы находим границы персонажа, то есть определяем bounding box вокруг нарисованной фигурки. Так мы упрощаем работу следующим моделям: на рисунках часто есть посторонние элементы (типа деревьев, домиков и других), которые мы не будем оживлять (нас интересует только персонаж). Отметим также, что иногда на исходной фотографии в кадр может попасть что-то кроме самого рисунка, например, волосы девочки на рисунке 1.

Для поиска персонажа авторы использовали Mask R-CNN, предобученный на датасете MS-COCO с ResNet-50+FPN в качестве бекбона. А для “дообучения” модели авторы заморозили все веса у ResNet-50 и добавили один бинарный выходной слой, показывающий наличие персонажа в конкретном пикселе. На рисунке 2 мы видим разницу между тем, что у нас есть до и после обучения:

Рисунок 2. Примеры предсказаний модели до (слева) и после (справа) ее “дообучения”

Для определения качества моделей авторы используют следующую формулировку: “процент предсказаний модели, которые могут быть успешно использованы для анимации”. Именно это мы будем подразумевать под “качеством” во всей статье.

Качество модели определения границ, после “дообучения” на 2000 картинках составило 92.5% (против 0.4% до “дообучения”).

Сегментация персонажа

Мы нашли персонажа, и теперь его нужно отделить от фона (мы же хотим, чтобы двигался только персонаж). Но модели это сделать трудно. Авторы долго пытались обучить Mask R-CNN, однако у них не получилось добиться хорошего результата. Причина: детские рисунки содержат очень мало текстур и цветов и часто состоят только из линий, которые бывает сложно отличить от окружения, а вариативное освещение и плохое качество снимков еще больше ухудшают ситуацию. В итоге для получения маски персонажа, покрывающей его тело и не включающей элементы заднего фона, решили использовать классическое компьютерное зрение. Авторы предложили такой пайплайн:

  1. Ресайз персонажа до 400 пикселей с сохранением соотношения сторон;
  2. Переход к черно-белому изображению и бинаризация по трешхолду.
  3. Морфологическое закрытие (morphological closing) и расширение (dilating) с окном 3х3 для избавления от шума и соединения полигонов на переднем плане;
  4. Заполнение внутри границ для отсутствия пропусков у полученных полигонов;
  5. Выбор самого большого полигона в качестве маски.

А сейчас давайте посмотрим на реальный пример работы алгоритма:

Рисунок 3. Сегментация персонажа: a) исходное изображение, b) черно-белое изображение после бинаризации, c) morphological closing, d) dilating, e) заполнение внутри границ, f) выбор самого большого полигона, g) исходное изображение с примененной маской.

Такой метод хорошо сегментирует персонажа в сравнении с нейросетью. “Дообученная” модель показала качество в 24.7%, а классический метод — 42.4%.

Определение положения тела персонажа в пространстве

Для оживления персонажа нам нужно определить его положение и найти ключевые точки (руки, ноги, плечи, глаза и другие). Точнее, найти немного ключевых точек (у детей часто рисунки довольно простые, без некоторых частей тела). Авторы взяли 17 таких точек из датасета MS-COCO и обучили кастомную модель с предобученным на ImageNet ResNet-50 в основании. На выходе модель выдавала 17 тепловых карт: по одной карте для каждой ключевой точки. Максимальное значение на этой карте — позиция данной ключевой точки. В итоге получилось “дообучить” модель до качества в 94.6% (против 0.6% до «дообучения»). Давайте посмотрим на примеры рисунка ниже:

Рисунок 4. Примеры персонажей с правильно определенными ключевыми точками

Анимирование персонажа

Ура! Наконец мы приступаем к анимированию рисунков. Для этого авторы сначала взяли сегментационную маску и, используя триангуляцию Делоне, поделили ее на множество маленьких треугольников (ячеек триангуляции), которые чуть позже помогут нам создать эффект плавной анимации (про Делоне подробнее можно почитать тут). И параллельно с этим построили скелет персонажа при помощи найденных на предыдущем этапе ключевых точек. Скелет от ключевых точек отличается наличием груди и торса. Для определения их положения были усреднены позиции плеч и бедер соответственно. На рисунке 5 мы видим эти различия между скелетом и ключевыми точками:

Рисунок 5. Сравнение ключевых точек (а) и скелета (b)

Затем для каждого центра ячейки триангуляции авторы нашли ближайшую к ней ключевую точку скелета — это позволило разным частям тела двигаться по отдельности вслед за “своей” ключевой точкой во время анимации.

Далее персонажа анимируют при помощи метода as-rigid-as-possible(ARAP). О нем можно почитать подробнее по этой ссылке. Если сегментация — самый сложный этап с точки зрения обучения модели, анимирование же — с точки зрения количества необходимых для учета тонкостей. Для упрощения жизни и себе, и пользователю авторы самостоятельно выбрали определенный набор анимаций, который сможет повторить нарисованный персонаж.

Видео были взяты из реального мира, поэтому нужно было не только учитывать положение скелета и всех опорных точек, но и правильно проецировать движения на 2д плоскость. Для этого авторы проецировали скелет на 2 плоскости: фронтальную и сагиттальную (вид сбоку). То есть они проецировали каждую часть скелета на подходящую для нее плоскость.

Рисунок 6. Выбор проекции для анимации. (с) Выбор проекции для каждого узла скелета, в данном примере верхняя часть скелета была спроецирована на фронтальную ось, а нижняя на сагиттальную. (d) Итоговая поза персонажа после проекции.

А теперь мы перейдем к описанию демо, которое сделали авторы для сбора данных.

Демо

Чтобы собрать больше данных авторы создали сайт, на который можно было загрузить рисунки и анимировать их. При этом, во избежание ошибок в предсказаниях пользователь должен был пройти весь путь от детекции до анимации (как мы с вами за время этой статьи 🙂). И на каждом этапе анимации он имел возможность самостоятельно править предсказания модели. Например, пользователь мог передвинуть найденные границы вокруг персонажа после детекции или закрасить пиксели после сегментации.

Рисунок 7. Интерфейс демо: (а) загрузка изображения, (b) возможность поправить найденные границы персонажа после детекции, (c) исправить маску после сегментации, (d) переместить опорные точки, (e) выбрать одну из представленных анимаций.

Всего за 9 месяцев сайт посетили 3.2 миллиона пользователей, которые загрузили 6.7 миллионов фотографий и сгенерировали в среднем 4 анимации для каждого изображения. При этом, каждая картинка анимировалась за 10 секунд.

Датасет

Во время работы демо авторы спрашивали разрешение на использование изображений для публичного датасета. И в итоге они собрали 1.7 миллионов изображений. При этом, для каждого изображения у них уже была разметка на все необходимые этапы. Но среди сырых данных было много шумных изображений (аниме-персонажи, непристойности и повторы).

В качестве первичной очистки данных авторы прогнали каждую картинку через ResNet-50 и получили эмбеддинги, которые кластеризовали на 100 кластеров. Оказалось, что из сотни кластеров только 32 кластера соответствовали детским рисункам (остальные содержали нерелевантные изображения и были отброшены). Еще авторы выяснили, что эмбеддинги повторов — изображений с одинаковыми персонажами, сфотографированных под разным углом или освещением, распологаются близко друг к другу в пространстве эмбеддингов. Поэтому все картинки, Евклидово расстояние между которыми меньше 0.5, были помечены как дубликаты и удалены. После всех этих процедур осталась 471 тысяча изображений.

Потом авторам помогли люди, завалидировавшие 283 тысячи картинок в ручном режиме и выбравшие из них только подходящие — те, где есть хотя бы один человекоподобный персонаж в полный рост, нет интеллектуальной собственности (персонажей с авторскими правами типа Микки-Мауса), персональной информации и вульгарного контента.

В итоге получился датасет из 178 166 картинок с полноценной разметкой для каждого из этапов, описанных выше. Однако люди, валидирующие данные, не исправляли разметку, поэтому в датасете присутствует шумная разметка (это лучше иметь в виду, если вы захотите использовать датасет). Для статьи авторы вручную очистили 2000 примеров перед дообучением своих моделей.

Ссылки

Кстати, демо все еще работает! Поэтому у вас есть возможность попробовать силы в анимации! Хороший повод достать свои детские рисунки и оживить их 🙂

https://sketch.metademolab.com/canvas — сюда можно загрузить рисунки;

https://fairanimateddrawings.com/site/home — здесь написано, как запустить весь пайплайн самостоятельно;

https://arxiv.org/pdf/2303.12741.pdf — а тут можно почитать статью.

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!