Хотя я определенно не на том уровне, чтобы говорить обо всех этих вещах профессионально, статистика, большие данные и машинное обучение всегда были моим «любовным» хобби.

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

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

Присоединяйтесь к моему путешествию, чтобы узнать, сможем ли мы каким-то образом использовать машинное обучение, чтобы переложить на компьютеры более кропотливую работу по анализу аниме.

Установка стоек ворот

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

К счастью, это была самая легкая часть.

В течение некоторого времени я хотел составить исчерпывающий каталог точно в каких эпизодах появляются определенные персонажи (главные и второстепенные) для данного аниме-сериала. В частности, в Pretty Guardian Sailor Moon (美少女戦士セーラームーン).

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

Человек и машина: Power Xtreme

Итак, что же можно выгрузить на компьютеры?

Хороший вопрос, мой гипотетический читатель. Я рад, что вы спросили!

Самый простой способ решить эту проблему — запустить программу для каждого эпизода и просто пометить, какие персонажи появляются. После этого мы просто помещаем их в таблицу, и, по словам великого Эмерила Лагассе, БАМ! у нас есть список.

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

Именно здесь (я отчаянно надеюсь) машинное обучение может по-настоящему проявить себя.

Но прежде чем мы сможем научить компьютер кое-чему о мультфильмах, нам нужно…

Ввод, нужно больше ввода

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

Похоже, нам просто нужно самим создать набор обучающих данных.

Сколько данных нам нужно?

К сожалению, нет реального ответа на вопрос, сколько обучающих данных вам потребуется для машинного обучения. Самое близкое, что я нашел (хотя и нерешительная попытка) в Google, было то, что «чем больше, тем лучше».

Я решил просто использовать весь первый сезон (все его 46 эпизодов), поскольку 1) я действительно не хотел иметь дело с хлопотами, связанными с необходимостью возвращаться позже если мой набор данных был слишком мал; и 2) в любом случае у меня уже было огромное количество скриншотов.

Единственная проблема в том, что нам нужно…

Сделайте данные снова пригодными для использования

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

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

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

Что-то выигрываешь, что-то теряешь.

Веселье начинается…

Я решил использовать lbpcascade_animeface (от nagadomi; github) для этого проекта, так как это было быстро, просто и делало почти все, что мне было нужно. Код использует OpenCV для сканирования изображения в поисках лиц, обрезает все найденные лица и затем выводит их в другой каталог. Идеально.

Написав быстрый скрипт на Python, я переместил все скриншоты с сетевого диска на ПК с медиацентром (чтобы избежать избыточной записи в NAS) и нажал «Выполнить», позволив маленькому апплету который мог бы пройти через 19 736 png-файлов.

И пыхтение это сделало. В течение добрых 37 минут процессор работает на 100%. Я знаю, что это всего лишь компьютер, но мне было почти жаль моего бедного маленького приятеля.

…и возникают проблемы

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

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

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

Наша вторая проблема заключается в том, что сериалу Сейлор Мун более 25 лет, и я работал с DVD-мастерами, а это означает, что все скриншоты были размером 540*480 пикселей. Даже когда код успешно находил символ, получающееся лицо часто было слишком маленьким, чтобы его можно было использовать в учебных целях.

Я решил удалить все изображения размером менее 90*90 пикселей (абсолютно произвольное число), в результате чего мне нужно было отсортировать папку с 2674 изображениями.

Причуды и придирки

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

Я думаю, что это как-то связано с тем, как был написан код lbpcascade_animeface и как он определяет, что такое «лицо аниме-персонажа», но по той или иной причине он лишь изредка попадал в мужские персонажей и точно экспортировали их лица.

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

Дорога вперед

Так куда же мы пойдем отсюда?

Ну, во-первых, мне нужно будет вручную пройтись по всем лицам и разделить их по символам. На данный момент я буду сохранять набор данных простым и ограничиваться только пятью главными персонажами: Усаги, Ами, Рей, Макото и Минако. Эта работа будет не то чтобы сложной, но, безусловно, утомительной.

После этого начинается самое интересное: обучение программы распознавания изображений с помощью наших недавно созданных наборов данных. Я еще не совсем определился с тем, какой фреймворк для распознавания изображений буду использовать (TensorFlow, может быть? Chainer?), но, очевидно, это повлияет на то, как я подготовлю свои данные.

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

Продолжение следует

Надеюсь, вам было интересно! Если да, или если у вас есть какие-либо вопросы о некоторых решениях, которые я сделал в процессе, или о том, как я собрал все это воедино, не стесняйтесь оставлять комментарии.

Скоро выйдет вторая часть, так что ждите!

Хотите увидеть больше подобного контента? Почему бы не заглянуть в другой мой блог, Tuxedo Unmasked, или подписаться на меня в социальных сетях @t_unmasked в Twitter и TuxedoUnmasked в Facebook!