Наша история проста: можем ли мы научить машину успешно распознавать и создавать новые лица животных?

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

Тем из вас, кто не знаком с концепцией GAN, мы настоятельно рекомендуем прочитать DL4J, чтобы получить легко усваиваемое руководство по их работе (прочтите время 10–15 минут). Но, если у вас нет времени, вот быстрое и грязное объяснение: представьте, если бы машина могла рисовать, раскрашивать и сочинять музыку в некоторых случаях до такой степени, что вы не можете различить настоящее произведение искусства. из подделки, сгенерированной? В этом сила GAN, и вот как они работают:

GAN - это модель машинного обучения, в которой используются две нейронные сети (одна Генератор и одна Дискриминатор) для

  1. Используя Генератор, сгенерируйте новые экземпляры данных [в нашем случае изображение кота]
  2. Используя дискриминатор, оцените подлинность сгенерированных изображений [это настоящие или поддельные?]
  3. Повышение способности сетей генерировать и распознавать поддельные данные с помощью «состязательного обучения».

Кредит: DL4J

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

Вернемся к кошкам.

Сбор данных

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

Очистка данных

Нашей следующей задачей было изолировать и выделить лица каждой кошки, чтобы передать в машину согласованные и чистые данные. Если бы в GAN были загружены изображения с разными ориентациями кошек или другими объектами на заднем плане, он попытался бы узнать об этих нежелательных функциях и сгенерировать их. Это может привести к созданию изображений с разными частями «кота» и «фона», которые не сочетаются друг с другом, чтобы сформировать правдоподобный образ. Чтобы предоставить GAN наилучшие возможности для создания правдоподобных изображений, изображения должны быть как можно более единообразными.

«Тренироваться на хороших данных легко; трудно преобразовать плохие данные в хорошие ». - (да, это мы придумали)

Мы использовали OpenCV, библиотеку компьютерного зрения, чтобы изолировать и выделить морды кошек на наших изображениях с помощью каскада классификаторов Хаара. Этот метод:

  1. Создание копии изображений в оттенках серого
  2. Передайте изображения в оттенках серого в предварительно обученный каскад классификаторов Хаара.
  3. Обрежьте исходное изображение в рамку вокруг лица, найденного Каскадом Хаара.
  4. Масштабирование до единого размера (100x100)

Каскад классификаторов Хаара конструирует на основе изображений признаки Хаара и использует их для распознавания пиксельных паттернов, указывающих на высокую вероятность лица. Элементы типа Хаара - это шаблоны, которые можно использовать для идентификации частей изображения как кромок, линий, точек, диагоналей и т. Д. Эти шаблоны извлекаются путем взятия частей изображения и определения разницы в количестве пикселей в разных разделах. текущей области оценки (показано ниже).

Кредит: OpenCV

Модель организована в соответствии с алгоритмом AdaBoost, где слабые ученики - это маленькие деревья. Поскольку это каскад классификаторов, на каждом этапе учитываются только определенные функции. Если предложенный регион выйдет из строя на ранней стадии, остальные классификаторы не будут запущены в этом регионе. Это означает, что время прогноза невелико, несмотря на большое количество функций.

Основное преимущество использования каскада классификаторов Хаара заключается в том, что OpenCV API поддерживает этот метод распознавания изображений. Кроме того, мы смогли легко найти предварительно обученную модель, которая могла распознавать морды кошек в репозитории OpenCV на Github. Это означает, что все, что нам нужно было сделать, это передать изображения кошек из набора данных через указанный выше конвейер и позволить ему работать. Теперь у нас было около 6000 (в основном) кошачьих мордашек. Помимо кошачьих морд, у нас были и другие ложные срабатывания, такие как человеческие лица, кошачьи окурки, человеческие окурки и другие разные предметы.

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

Архитектура модели, обучение и результаты

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

30 000 эпох обучения заняли менее 10 минут на графическом процессоре GTX 1080 TI. Результаты были следующими:

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

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

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

  1. Полносвязные сверточные слои
  2. Пакетная нормализация для стабилизации обучения
  3. Выбор активации

Для интересующихся подробности можно найти в статье Radford, Metz and Chintala. Мы ввели те же данные и позволили модели обучиться в течение ночи для получения следующих результатов:

Вывод

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

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

Будущая работа

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

Спасибо за чтение!

Члены команды: Райан Рок, Мариус Фукс, Ник Эдельман, Шаяан Джагтап, Алек Баргас.