Примечание. Этот пост является продолжением статьи Флаг № 8 — Первые эксперименты по обработке изображений с помощью TensorFlow, написанной год назад.

Пролог

Двигаясь вперед, мы все больше и больше понимаем, что распознавание изображений сложно даже для людей. Эксперимент Andrej Karpathy показывает, что он смог достичь только 5,1% коэффициента ошибок в топ-5 в наборе данных ILSVRC. В статье ILSVRC 2015 (Руссаковский О. и др.) на следующем изображении показаны некоторые проблемы классификации изображений.

В прошлом году я решил попробовать TensorFlow после того, как предложил задачу: «Есть ли способ распознавать 2D-персонажей или персонажей аниме?» С этого момента я провел несколько выходных с несколькими бурно развивающимися технологиями, которыми хочу поделиться здесь :)

2D-персонаж равен 3D-человеку

Моя первоначальная наивная идея заключалась в том, что 2D-персонаж аниме равен 3D-человеку. Позже будет доказано, что это неверно, и к концу этого раздела вы узнаете, почему это просто не работает. Для начала я попробовал использовать библиотеку OpenFace для классификации моих обучающих изображений. Я подготовил 3 персонажа с 40 изображениями в каждом, что было очень мало для стандарта распознавания изображений.

Первоначально OpenFace попытается обнаружить лица с помощью предварительно обученных моделей из dlib или OpenCV. Это можно сделать либо с каскадом LBP, либо с каскадом Хаара. После этого он преобразует лицо с оценкой позы в реальном времени dlib и аффинным преобразованием OpenCV для изменения положения некоторых черт лица, таких как глаза и губы. Затем он изменит размер данного изображения до аналогичного размера пикселей, прежде чем применить к нему глубокую нейронную сеть. Причина неудачи: черты лица двухмерных аниме-персонажей отличаются от человеческих. Начнем с того, что у 2D-персонажей аниме обычно нет носа :p

На этом этапе становится ясно, где что-то пошло не так. В предварительно обученных моделях выше нет обнаруженных лиц. К счастью, nagadomi, создатель waifu2x, создал детектор лиц для аниме-персонажей, используя OpenCV, основанный на каскаде LBP. Я попытался сравнить его с OpenFace на https://github.com/freedomofkeima/opencv-playground, и результат меня вполне удовлетворил.

Темный век

Вот и пришло время, когда я боролся с разными идеями. После правильного определения лица из 2D-персонажей, что мы можем делать дальше? Я попытался прочитать некоторые научные статьи, такие как Обнаружение лиц и распознавание лиц мультипликационных персонажей с использованием извлечения признаков», написанные Такаямой, К., и др. др. в 2012 году. В то время они пытались извлечь несколько признаков, таких как цвет волос, цвет кожи и количество волос. Они достигли 74,2% истинно положительных, 14,0% ложноположительных и 11,8% ложноотрицательных результатов с помощью предложенного метода.

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

Другая идея состоит в том, чтобы применить стратегию IQDB поиска исходных изображений: проверка сходства изображения между входным изображением и его базой данных, поскольку стиль 2D-искусства ограничен (всего около 10M) и в нем есть небольшие вариации. Однако это не работает с небольшими изменениями изображения, такими как обрезанные изображения. Например, исходное изображение вернуло точность 98% из IQDB, однако изображение, обрезанное на 20%, вернуло только точность 43%, и более того, оно не удалось.

Глубокое обучение и передача обучения на помощь

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

На этом этапе мы можем рассматривать каждое лицо 2D-персонажа как объект. Inception-v3, модель глубокого обучения, основанная на победителе ILSVRC, уже обучена на миллионах изображений и прошла боевые испытания для классификации изображений. Если вы заинтересованы в применении трансферного обучения к вашему набору данных, вы можете узнать больше здесь. Следующий эксперимент проводится с TensorFlow.

Для тестовых данных я также использовал те же тестовые данные со всеми предыдущими экспериментами выше: 7 изображений, которые должны иметь возможность получить соответствующую категорию, и 3 изображения, которые недоступны в существующей категории. Удивительно, но 8 из 10 правильно классифицируются с порогом › 0,94, 1 из 10 является ложноположительным, а еще 1 из 10 является ложноотрицательным. Обычно другие эксперименты приводили только к 4 из 10 правильных категоризаций с плохим числом порога, но с переносным обучением порог ясен и дает очень хорошее число точности. Поскольку данных для обучения очень мало, в этом эксперименте мы пытаемся сравнить только частоту ошибок первых 1, в то время как на самом деле мы можем показать несколько вероятностей (например, сходство первых 5).

После этого я попытался использовать трансферное обучение напрямую (те же изображения) без LBP Cascade и предварительной обработки изменения размера. Как предполагалось ранее, это просто не работает, поскольку количество признаков в полном изображении слишком мало.

Примечания

Это был интересный путь, и он еще далек от завершения. С этого момента пришло время увеличить количество тренировочных сетов и посмотреть, как будет развиваться результат. Если результат многообещающий, есть несколько идей для расширения: создать веб-сайт для распознавания загруженного изображения, создать веб-сайт для помощи в маркировке наборов данных, автоматически сортировать загруженные 2D-изображения аниме-персонажей и так далее. Спасибо за чтение!

Обновление (11 ноября 2017 г.): Опубликовано больше результатов! https://github.com/freedomofkeima/transfer-learning-anime

Обновление (3 декабря 2017 г.): проверьте https://freedomofkeima.com/moeflow/ для быстрой демонстрации со 100 классами, обученными с ‹ 50 изображениями в каждой категории. В настоящее время точность составляет 70%.

Искандар Сетиади
Гитхаб Freedomofkeima

Первоначально опубликовано на сайте freedomofkeima.com (7 октября 2017 г.).