Компьютерное зрение для игры «Угадай, кто», включая объяснения глубокого обучения

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

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

Для контекста, это руководство является продолжением проекта, который мы, как Data Science Lab, сделали для Big Data Expo 2018. Для этой экспозиции возник вопрос, сможем ли мы создать интерактивную персонализированную игру в течение 4 недель. Результатом этого мозгового штурма стало воссоздание игры «Угадай, кто», известной по крайней мере большинству голландцев с детства.

Напомню: цель игры «Угадай, кто» — угадать, кто персонаж вашего оппонента, задавая вопросы «да» или «нет» (например, ваш персонаж мужчина?). Требования к этой задаче были обусловлены установленными обстоятельствами, что модели будут готовы через 4 недели (поскольку мы ограничены во времени для выставки) и что будет достаточно ярлыков для игры (т.е. пол должен быть распознан и, следовательно, потенциальный вопрос). Что касается количества меток, мы пришли к минимуму 6, поскольку игра обычно заканчивается просто угадыванием персонажа вашего оппонента после 4-5 вопросов.

Чтобы справиться с этой задачей, мы разделили ее на две части: (А) создать работающую игру и (Б) иметь возможность играть в игру своим собственным персонажем. Суть в том, чтобы заставить компьютер распознавать черты лица человека, чтобы можно было задавать настоящие вопросы, например, является ли ваш персонаж мужчиной. Кроме того, в этом посте мы надеемся прояснить, как можно создавать такие модели, и показать вам, как можно использовать трансферное обучение, чтобы сэкономить много времени и ресурсов. Часть B будет обсуждаться здесь, а часть A — в другом посте.

Определение нашей проблемы

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

  • Пол
  • Длина волос
  • Тип волос
  • Цвет волос
  • Очки
  • Галстук
  • Волосы на лице
  • Шапка

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

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

Исследование

Поскольку более ранние исследования указывали на модели глубокого обучения, мы быстро сосредоточились на использовании таких методов. Кроме того, чтобы сэкономить время, мы стремились использовать трансферное обучение. В трансферном обучении вы стремитесь использовать предыдущие хорошо работающие решения и расширять их, чтобы они работали для решения ваших собственных задач. Довольно легко мы смогли найти руководство, которое изменило руководство по Tensorflow (предоставленное командой Tensorflow). Подробное руководство можно найти здесь). Идея состоит в том, чтобы использовать предварительно обученную сеть Inception-V3 и изменить ее, чтобы решить нашу собственную проблему классификации изображений. Обратите внимание, что руководство, указанное выше, относится к руководству по созданию классификатора с несколькими метками (маркировка классов, которые могут быть не связаны между собой). Мы использовали эту структуру и снова отредактировали ее, чтобы она стала эксклюзивным классификатором (т. е. вы можете носить только очки или нет, а не где-то посередине). Мы решили продолжить работу с этим репозиторием, потому что он предлагал простую структуру, которая позволяла нам легко и быстро создавать пользовательские модели. Подробнее об этом позже.

Поэтому мы заменили

final_tensor = tf.nn.sigmoid(logits, name=final_tensor_name)

с участием:

final_tensor = tf.nn.softmax(logits, name=final_tensor_name)

и аналогично для энтропии:

cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits,ground_truth_input)

с участием:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=ground_truth_input)

Сила этого решения заключается в использовании предварительно обученной модели, в данном случае сети Inception-V3, чтобы получить преимущество в обучении модели распознаванию чего-либо на изображении. Обратите внимание, что это не всегда путь к наилучшему потенциальному решению, но в целом хороший способ начать. Идея состоит в том, чтобы использовать показанную ниже сеть, обученную распознаванию 1000 различных объектов, и вместо того, чтобы переобучать ее полностью, переобучить только классификатор Softmax на верхнем слое (2048-мерный вектор). Не пугайтесь этих терминов, это всего лишь означает, что вместо переобучения миллионов параметров мы переобучаем только n+n*2048 (порядка тысяч). Как вы могли догадаться, это экономит много вычислительного времени! Примеры других, разделяющих этот подход, нацелены, например, на распознавание продуктов.

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

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

  • Скорость обучения (насколько быстро обучается модель)
  • Итерации обучения (как долго мы позволяем ему учиться)

Также мы могли бы выполнить увеличение изображения (изменение входных изображений для уменьшения шума):

  • Случайная обрезка: уменьшение размера
  • Случайное переворачивание: (по горизонтали/вертикали) переворачивание изображения
  • Яркость: умножение значений входных пикселей
  • Случайное масштабирование: увеличение размера изображения

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

Сбор данных

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

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

У нас были модели, которые начинали показывать «хорошую» производительность (70–80%) при 100 изображениях на категорию (!), а в наших более поздних запусках мы использовали примерно 1000 изображений на категорию (например, 1000 мужчин против 1000 женщин при прогнозировании пола). Общие результаты зависели от того, что мы стремились предсказать, но результаты показаны позже на рис. 4, если вы хотите пропустить вперед.

Создание точных предикторов

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

  1. Создайте папки с указанными именами ярлыков внутри нашего каталога изображений (например, мужские и женские) и убедитесь, что в каждой папке есть правильные фотографии. Например, при создании модели шляп у нас есть (см. Блок кода) ниже структура папок и фотографии в указанной папке.
  2. Создайте ярлыки для наших изображений через эти имена папок. (ссылка на git-код)
  3. Переобучите нашу модель (либо на необработанных изображениях, либо на кадрированных, что предпочтительнее!)
  4. Используйте функцию label_image.py для создания прогнозов!
- image_files: (used for labelling) 
  - hat: all the images of people with a hat
  - none: images of people without a hat
- image_labels_dir: contains all the labels per above image
- images: (used for training)
  - multi-label: contains all images in one folder
** optional ** 
- images-cropped:
  - multi-label: contains cropped images in one folder for training

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

Очевидно, что большую часть времени здесь занимает этап 1, где сначала необходимо собрать данные. Разметка (шаг 2) выполнялась скриптом, обучение (3) тоже не заняло много времени (наши последние модели были закончены за ± 10 минут на 2,3 ГГц Intel Core i5 с 8 ГБ памяти Macbook Pro!).

Что касается настройки гиперпараметров и результатов, вот наши выводы из этого проекта:

  • Скорость обучения была установлена ​​по умолчанию (0,01), а другие значения не так сильно влияли на конечные результаты или переоснащение.
  • Шаги: несмотря на то, что максимальная точность была достигнута относительно быстро, потери продолжали уменьшаться в течение более длительного периода времени, и поэтому мы в качестве ориентира установили количество шагов равным 3000.
  • Увеличение изображения: несмотря на то, что этот метод считался очень многообещающим, наши результаты не показали этого. Кроме того, функции, представленные в коде для увеличения изображений, были очень медленными и оказались серьезным узким местом при тестировании. Мы испытали снижение скорости обучения более чем в 100 раз! Если бы целью была дальнейшая оптимизация моделей, это, однако, могло бы быть потенциально хорошим вариантом. Поэтому для моделей, представленных на выставке, аугментация не использовалась.

Результаты модели

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

Глядя на наши 8 моделей и их соответствующие точности, мы можем сгруппировать их в три категории:

Те, которые показали очень хорошие результаты (85%+):

  • Шапка
  • Пол
  • Галстук
  • Длина волос

Те, которые показали «хорошо» (75–85%):

  • Волосы на лице
  • Очки

Те, которые в большинстве случаев были правильными (65–75%):

  • Тип волос
  • Цвет волос

К нашей радости, все модели работали более или менее в соответствии с ожиданиями, учитывая относительно небольшое количество образцов (n = 37). Поскольку наши используемые модели сопоставляют входные пиксели с прогнозируемым выходом (т. е. мужчиной или женщиной) и учитывая большое количество шума в наших данных (фотографии из Интернета), мы стремились выяснить, как наши модели делают прогнозы. Действительно ли они научились распознавать очки или просто обнаружили скрытые корреляции (т. е. взгляд в сторону как показатель того, что у них есть очки)?

Так наши модели на самом деле обманывали нас?

Глубокое обучение долгое время считалось методом черного ящика. Информация поступает, в нашем случае в виде изображения, а на выходе формируется прогностическая оценка. Что бы ни происходило внутри сети, часто остается загадкой. Значения пикселей анализируются, информация добавляется или удаляется, а также изучается некоторое пространство признаков. Сеть найдет способы связать вход (пиксели нашего изображения) с выходом (кто-то носит или не носит очки). Открытие определенных узлов в сети привело к некоторым интересным областям исследований, таким как перенос стиля.

Другой подход, который использовали мы, используют создатели Лаймового проекта. В этом проекте авторы предлагают проанализировать, как изменение значений пикселей меняет вывод нашей прогнозирующей функции. Пиксели случайным образом переставляются (см. рис. 5) для соответствующего анализа того, какие пиксели больше всего влияют на наш прогноз. После этого наиболее важные пиксели можно нанести в виде маски. Изображения масок см. на рисунках 6 и 7.

Интересно, что этот метод может показать нам, на что ориентируются наши модели при прогнозировании. Мы можем проверить, действительно ли наши модели научились предсказывать очки, глядя на область вокруг глаз людей или просто находя скрытые связи и обманывая нас, простых людей. Для этой демонстрации мы взяли двух человек, которых не было в наших тренировочных наборах. Две голландские легенды: наш король Виллем Александр и олимпийская спортсменка Дафне Шипперс (извините, Максима, но вы уже были в нашем тренировочном наборе). Что касается настроек параметров, мы создали 10 тысяч образцов и визуализировали только 10 лучших признаков с минимальным весом 0,03.

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

Интересно, что мы можем сравнить это с нашими собственными (человеческими) ожиданиями. Как мы классифицируем, есть ли у кого-то очки, шляпа или галстук, легко. Классифицировать, когда у кого-то вьющиеся или прямые волосы, светлые или темные, если уж на то пошло, сложнее. Объяснить, как мы классифицируем, является ли кто-то мужчиной или женщиной, на самом деле довольно сложно! Смотрим ли мы на пропорции лица, волосы, растительность на лице, линию подбородка? Волосы на лице можно рассматривать как мужскую черту, но мужчины без них существуют. Если на то пошло, существуют и женщины с мужскими чертами лица (сильный подбородок, короткие волосы и т. д.). По меньшей мере, эти изображения дают интересное представление о том, как модель учится сопоставлять пиксели с классификацией.

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

Забрать

С текущими доступными библиотеками стало намного проще создавать модели глубокого обучения. Мы показали, как всего за пару недель и даже с зашумленным набором данных, созданным самостоятельно, можно достичь довольно хорошей точности. Кроме того, мы показали, как можно использовать относительно новые методы, такие как проект Lime, для визуализации того, почему модели делают определенные прогнозы. Эти идеи могут подсказать, как вы можете отслеживать предвзятость в своих прогностических моделях и как вы можете еще больше улучшить результаты и обобщаемость. Поэтому неудивительно, что эта часть исследования является одной из главных тенденций саммита ИИ 2018 года.

Я надеюсь, что вы узнали что-то новое из этого поста, и если у вас есть какие-либо отзывы, предложения или вопросы, не стесняйтесь обращаться ко мне. Также следите за постом Б. В этом посте мы представим обзор того, как создать веб-приложение в Dash, которое может использовать и размещать созданные модели!

Почта
LinkedIn
Веб-сайт (примечание: это на голландском языке)