Style2Paints — это звездный проект, у него более 10 тысяч звезд на Github, и, согласно этому сообщению, он занял 4-е место среди самых популярных проектов машинного обучения на Github. На картинке выше показан один из примеров, показанных в репозитории. Всего с помощью нескольких цветовых подсказок модель ИИ может преобразовать линейный набросок слева в это сказочное цветное изображение справа. Я не могу не думать, что я тоже могу быть художником.

Если вы еще не пробовали этот инструмент, я рекомендую вам попробовать и оценить его силу. Официальный репозиторий Style2Paints находится здесь, и хорошая новость: автор скомпилировал exe-версию для удобства использования (как же это круто!).

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

Этот пост пытается дать лучшее представление об этом проекте на основе опубликованной бумаги. Отказ от ответственности, Style2Paints постоянно развивается, и он достиг версии v4.5, но выпущенный код и документ относятся только к версии v3, поэтому, чтобы быть более конкретным, этот пост предназначен для понимания Style2Paints v3.

Без дальнейших церемоний, давайте погрузимся!

Двухэтапная раскраска эскиза

Автор Style2Paints опубликовал статью Двухэтапная раскраска эскиза. Как показано в документе, это контролируемое обучение, что означает, что набор обучающих данных состоит из линейного эскиза и соответствующего ему цветного изображения. Если у вас есть опыт обучения моделей ИИ, вы знаете, что для обучения обычно требуются тысячи точек данных, так как же нам найти эти тысячи пар штриховых эскизов и цветных изображений?

Данные

Ответ заключается в том, что мы не можем их найти, а вместо этого производим.

Людям проще представить линейный набросок из цветного изображения, чем наоборот. Так что интуитивно это должно быть более легкой задачей и для модели ИИ. Автор style2paints думает так же, и он любезно предоставил нам свой инструмент для создания линейного эскиза из цветного изображения. Инструмент называется SketchKeras. Бумаги для него нет, поэтому я не совсем понимаю, как он работает, но в любом случае он работает хорошо, и наше внимание здесь сосредоточено на процессе автоматического окрашивания.

Используемая база данных представляет собой базу данных аниме с открытым исходным кодом под названием Danbooru2019. Для тех, кто не очень хорошо знаком с миром аниме, обратите внимание, что для этого набора данных существует вариант загрузки SFW.

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

Первый этап, этап проекта

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

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

Как только входные данные подаются в модель генератора и создается цветное изображение, оно сравнивается с нашим целевым цветным изображением, чтобы получить потери L1, и как целевое цветное изображение, так и сгенерированное изображение проходят через дискриминатор для получения потерь GAN.

Используемая здесь модель генератора имеет структуру U-Net, а структура обучения такая же, как у Pix2Pix. Если вы хотите узнать больше, вы можете проверить информацию о GAN здесь, а информацию о U-Net и Pix2Pix здесь.

Раскрасить скетч аниме - непростая задача. В отличие от монохромной фотографии, на которой текстура и градиент служат подсказками для раскрашивания, скетчи аниме в основном состоят только из черных линий эскиза на белом пустом холсте и, таким образом, предоставляют гораздо меньше информации для раскрашивания. Согласно статье, результат первого этапа выглядит как набросок, сделанный художником во время быстрой цифровой живописи  — просто нанесение цвета на холст, не заботясь о деталях. И есть потребность в доработке. Поэтому наступает второй этап.

Второй этап, этап уточнения

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

Вот где начинается самое интересное. Если мы действительно используем выходные данные этапа 1 в качестве входных данных для этапа 2 для обучения нашей модели, мы не получим большого улучшения. Почему? Потому что это будет эквивалентно совместному обучению двух моделей вместе. Тогда они будут вести себя как единая модель и побеждают цель двух отдельных этапов.

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

Когда я впервые прочитал статью, я не думал, что эта идея создания черновика сработает. Исходя из моего опыта, выходные данные этапа 1, скорее всего, будут иметь дефекты, отличные от дефектов, созданных намеренно. Другими словами, распределение выходных данных этапа 1 может сильно отличаться от распределения сгенерированных черновиков. Это приведет к тому, что модель с треском провалится во время тестирования.

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

Процесс обучения аналогичен этапу 1, но вместо использования только объединенного эскиза и цветовых подсказок в модель поступает еще один вход — «черновик». Генератор представляет собой модифицированную версию U-Net. Подробности модификации расскажу в следующем посте.

Вывод

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

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

Увидимся в следующий раз!