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

Представляем FaceDetectorKernel

В моем последнем посте я представил Kernel - класс, который используется для инкапсуляции всего кода, связанного с машинным обучением, и его запуска в изолированной среде как отдельного процесса. С FaceDetectorKernel логику ML можно инкапсулировать еще лучше.

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

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

Вместо этого, если ваша модель делает то же самое, что и уже доступные модели в PMR, вы должны просто выбрать соответствующий подкласс Kernel (например, FaceDetectorKernel) и реализовать только 2 абстрактные функции - load_model и inference. load_model, как следует из названия, инициализирует модель, развертывая ее в памяти. inference вызывается в FaceDetectorKernel.predict в цикле, который перебирает все кадры, предоставленные средством чтения VideoFrames кадров.

С FaceDetectorKernel добавить новую модель для распознавания лиц очень просто. Я уже добавил еще 2 модели обнаружения лиц, и весь процесс был действительно простым, так как процедуры загрузки модели и вывода уже были даны, и все, что мне нужно было сделать, это поместить код модели в соответствующий каталог и импортировать его во вновь созданный подкласс FaceDetectorKernel , в котором реализованы все необходимые функции. Этот подход будет использоваться для других задач, таких как распознавание лиц, распознавание речи и многих других типов алгоритмов, которые в конечном итоге появятся в PMR!

Другие изменения в API

Препроцессоры в VideoFrame

VideoFrames теперь поддерживает препроцессоры, которые, как следует из названия, используются для предварительной обработки изображений и видеокадров. Чтобы создать собственный препроцессор, вам нужно создать подкласс Preprocessor и реализовать свою логику предварительной обработки в process. Каждый раз, когда вы читаете новый фрейм через VideoFrames, он сначала обрабатывается всеми препроцессорами, которые вы передали VideoHandlerElem (в том же порядке), а затем выводит фрейм.

Передача параметров в конвейер

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

Раньше вам приходилось определять новый Pipeline для каждого нового файла, который вы хотели обработать. Теперь вы объявляете Pipeline и передаете словарь с параметрами в вызов run. Он следует той же логике, что и в Keras и TensorFlow - объявить один раз, использовать несколько раз. Пользователь также имеет возможность передавать параметры не в виде словаря, а в виде списка, эффективно уменьшая количество кода, необходимого для создания и запуска Pipeline.

Растущий модельный зоопарк

Как я сказал в своем предложении, PMR имеет 2 разные категории моделей - «Средняя производительность, лучшая скорость», которые предполагается запускать на ЦП, и «Современные». - настоящие звери, которым требуется графический процессор для разумного времени вывода. Модельный зоопарк PMR продолжает расти, и в каждой категории уже есть 2 модели - MobileNetSSD и MTCNN для быстрого вывода и такие звери, как YOLOv3 и DSFD, для вывода с помощью графического процессора.

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

MobileNetSSD, YOLOv3

Обе эти модели существуют со времен PoC, и на этой неделе я обновил их, чтобы они работали как FaceDetectorKernels. YOLOv3 был перенесен из dnn OpenCV (который не поддерживает CUDA и, как следствие, довольно медленный вывод) на Keras, и теперь его можно использовать с графическим процессором.

MobileNetSSD расшифровывается как MobileNet Single Shot Detector. MobileNet - это модель нейронных сетей, разработанная в Google для быстрого вывода на мобильных и других устройствах с низкой производительностью, а SSD - это сеть, используемая для быстрого обнаружения и классификации объектов. В совокупности они могут дать очень хорошие результаты распознавания лиц с разумным временем вывода.

YOLOv3 - один из лучших детекторов объектов, который, к сожалению, должен запускаться только через графический процессор. Как предполагает оригинальный сайт YOLOv3, запуск его на центральном процессоре занимает примерно 6–12 секунд на изображение (sic!), Что делает эту модель самой современной.

DSFD

Еще одна новая современная модель, которая, согласно PapersWithCode.com, является текущим SOTA по тесту набора данных для обнаружения лиц. DSFD означает Детектор лиц с двойным выстрелом, и он был разработан учеными из нескольких организаций, среди которых есть лаборатория Youtu Lab компании Tencent.

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

MTCNN

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

Эта модель попадает в категорию «Средняя производительность, лучшая скорость». Текущая реализация MTCNN основана на TensorFlow, но я рассматриваю возможность переноса ее на серверную часть на основе MXNet, поскольку последняя предлагает оптимизацию для процессоров Intel.

Знакомство с тестами

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

Маркировка мини-набора для тестов

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

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

Для этого я использовал отличный инструмент под названием Computer Vision Annotation Tool (CVAT), который недавно был открыт Intel и теперь является частью OpenCV. CVAT предлагает интуитивно понятный веб-интерфейс и набор функций, которые значительно упрощают процесс маркировки видео. Используя его режим разметки с интерполяцией, можно указать только положение блока в n-м и n + 10-м кадрах, и блок будет плавно переходить в кадрах между n и n + 10.

Мой мини-тест на распознавание лиц состоит из 5 видеороликов, каждое из которых представляет определенный тип видео:

  1. Шоу« Друзья » (первые 2 минуты) - содержит одновременно несколько лиц.
  2. Русское интервью-шоу« Познер » - Всего 2 лица, которые легко распознать.
  3. Лица со всего мира - множество лиц разного типа, пола и возраста.
  4. Frozen II Trailer - Множество человеческих лиц, хотя это мультик.
  5. Падение ангела - трейлер боевика с быстро меняющейся обстановкой.

Процедура тестирования

Пока что я закончил размечать только 3 видео из тестового мини-набора (видео 1,2,3), поэтому в тестах использовались только они. Процедура проверки проста:

  1. Принимаются только прогнозы с доверительной вероятностью выше 0,6.
  2. В нашем случае точность указывает, сколько из предсказанных лиц оказалось истинными лицами, а отзыв показывает, сколько лиц наша модель может предсказать из всех лиц, существующих в видео. Таким образом, мы хотели бы максимизировать оба показателя, чтобы иметь точную модель, которая способна обнаруживать все лица в видео.
  3. Размер каждого видео изменяется до 640 × 480 пикселей.
  4. MobileNetSSD и MTCNN запускаются на CPU, а YOLOv3 использует GPU.
  5. DSFD не был протестирован из-за ограничений по времени, вызванных оборудованием во время теста.
  6. Тест проводился на ноутбуке Dell XPS 15 9570. ЦП - i7–8750H, графический процессор - GTX 1050Ti 4 ГБ, ОЗУ - 16 ГБ

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

Результаты тестов

Российское интервью-шоу "Познер"

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

Следует отметить, что MobileNetSSD намного быстрее, чем MTCNN, если мы запускаем оба алгоритма с графическим процессором, особенно для изображений с высоким разрешением.

Шоу «Друзья»

Эта сцена из «Друзья» - отличный пример распознавания нескольких лиц, поскольку в ней задействовано несколько актеров с разными полами и чертами лица. Кроме того, Рэйчел носит корону, хотя это не помешало YOLOv3 показывать хорошие результаты.

Как видите, и MobileNetSSD, и MTCNN здесь явные аутсайдеры, причем MobileNetSSD имеет наихудший отзыв. И снова YOLOv3 отлично справился со своей задачей, распознавая почти все лица, присутствующие на видео.

Лица со всего мира

Это была самая сложная задача для наших моделей из-за огромного разнообразия лиц разного пола, возраста и т. Д.

Учитывая разницу в отзыве, я могу сказать, что YOLOv3 снова является лидером, поскольку высокая точность без значимого значения отзыва не так уж и полезна. Интересно, что MobileNetSSD имеет более высокую запоминаемость, чем MTCNN, а это означает, что он смог уловить разнообразие лиц немного лучше, чем его аналог.

Промежуточный вывод

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

Оптимизация производительности

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

Мне приходят в голову разные методы оптимизации - от простого t-теста для измерения разницы между значениями RGB в 2 кадрах до более сложного извлечения функций. Однако следует иметь в виду стоимость операции измерения подобия. Если для этого требуется много времени, может быть проще сделать вывод для каждого кадра.

Планы на следующие 2 недели

Примерно через 2 недели у нас есть первые оценки GSoC, и это список вещей, которые я надеюсь сделать в эти сроки:

  1. Добавьте методы оптимизации, чтобы повысить скорость вывода. Один из способов сделать это - пометить похожие кадры перед обнаружением / распознаванием лиц, чтобы другие элементы конвейера просто обрабатывали группу кадров как один и тот же кадр.
  2. Внедрите эффективную поисковую систему по большому набору данных с лицами знаменитостей для распознавания лиц. Эта статья предлагает метод эффективного поиска в наборе данных MS-Celeb-1M, и я планирую попробовать ту же стратегию.
  3. Завершите маркировку оставшихся видео и добавьте еще видео, чтобы проверить распознавание лиц. В то же время я перейду к более сложным методам измерения точности моделей распознавания лиц и проведу тест DSFD.
  4. Протестируйте еще один алгоритм распознавания лиц под названием ArcFace. Если он будет работать лучше FaceNet, я добавлю его в PMR.

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

Благодарю вас!

Это еще один длинный пост, и я прошу прощения за то, что заставил вас так много читать! В то же время я очень благодарен вам за то, что вы сделали это так далеко! Как обычно, я буду более чем счастлив услышать ваш отзыв. Будьте на связи! 😎

Первоначально опубликовано на http://fedoskin.org 13 июня 2019 г.