В последнем посте Bear ©hipsterizer мы говорили об использовании примера программы Dlib Toolkit Dog Hipsterizer для поиска морд медведя и его ориентиров. В примере программы использовался детектор лиц на основе CNN, обученный для собак, mmod_dog_hipsterizer.dat, который работал и для медведей. Мы использовали обнаружение лиц и ориентиры из сети, чтобы переориентировать, выровнять и обрезать морду медведя. Затем мы записали чип лица размером 150x150 пикселей для каждой морды медведя. К этому моменту мы завершили первые два этапа конвейера идентификации медведя: этап 1 (найти лицо) и этап 2 (переориентация каждого лица). Мы создали программу под названием bearchip, которая берет набор входных изображений и выводит чипы ориентированных лиц. Выполняем так:

./bearchip mmod_dog_hipsterizer.dat <image_dir>

Осталось еще два этапа: этап 3 (кодирование лица) и этап 4 (сопоставление лица).

Кодировать лицо

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

В очередной раз у dlib есть отличный пример, который описан в статье Высококачественное распознавание лиц с глубоким метрическим обучением. Мы начали с набора из более чем 1000 изображений, состоящих из 28 отдельных бурых медведей из района Брукс-Фолс. Мы использовали программу bearchip для поиска медведей и создания фишек лиц. Мы вручную отфильтровали плохие чипы и в итоге получили набор из примерно 800. Мы разделили данные на обучающий набор и тестовый набор. Следуя примеру dlib, мы обучили встраивающую сеть на обучающем наборе.

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

./bearembed -train <face_chip_dir>

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

./bearembed -test <face_chip_dir>

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

Наконец, с помощью этой команды мы можем сгенерировать вложения для каждого чипа с мордочкой медведя (где face_chip_dir — это каталог, содержащий всех медведей, которых мы хотим встроить, а embed_dir — это каталог, в котором хранятся вложения):

./bearembed -embed <embedded_dir> <face_chip_dir>

Данные для встраивания записываются с помощью функции serialize dlib. Структура каталогов соответствует структуре каталога лицевых чипов.

Сопоставьте лицо

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

Используя подпрограммы SVM dlib, мы создали мультиклассовый классификатор SVM, используя линейное ядро ​​и методологию редукции один против одного (OvO). Наша программа bearsvm считывает все вложения, чтобы создать набор образцов и меток, а затем обучает классификатор OvO SVM. Программа запускает кросс-валидацию (хотя мы пока не разделяли встраивания на обучающие и тестовые данные) и сохраняет обученный SVM. Выполняем программу так:

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

Собираем все вместе

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

  1. Найдите лицо: прочтите изображение и примените сеть обнаружения лиц (от хипстеризатора собак), чтобы найти каждого медведя.
  2. Переориентация каждого лица: для каждого обнаруженного лица используйте обнаруженные ориентиры, чтобы изменить ориентацию, масштабировать и обрезать лицо, чтобы сделать фрагмент лица.
  3. Закодируйте лицо: пропустите каждый чип лица через сеть встраивания, которую мы обучили с помощью bearembed, чтобы сгенерировать встраивание лица 128-D.
  4. Сопоставьте лицо: пропустите каждое встраивание лица через OvO SVM, который мы обучили в bearsvm, чтобы получить идентификацию.

Запускаем программу так:

./bearid <image_file>

Оно работает! Ну, в основном. Все части работают, но, как вы понимаете, каждая из них вносит некоторое количество ошибок. Программа bearid довольно хорошо справляется с идентификацией медведей на изображениях, которые есть в наших обучающих и тестовых наборах, поэтому мы взволнованно загрузили несколько дополнительных изображений медведей из Брукс-Фолс. Результаты с использованием ранее не виденных изображений были далеко не блестящими. Это не слишком удивительно. Состояние сетей распознавания человеческих лиц обучено миллионам лиц. Мы использовали только около 800.

Следующие шаги

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

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

  • Этап 1. Обучаем наш собственный детектор лиц и ориентиров вместо использования сети хипстеров для собак. Для этого потребуется не только гораздо больше данных, но и много ручной маркировки.
  • Этап 2. Попробуйте улучшить выравнивание лица и/или отфильтровать лица, которые не совпадают.
  • Этап 3: тренируйтесь с гораздо большим количеством фишек лица (и убедитесь, что фишки хорошо выровнены)!
  • Этап 4: точно настройте нашу SVM или рассмотрите возможность использования другой методологии.

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

Первоначально опубликовано на hypraptive.github.io 30 марта 2017 г.