Rekognition бедняков - GitHub Repo, PMR-Web - GitHub Repo

Итак, мой второй GSoC подошел к концу, и пора еще раз вспомнить, что было сделано этим летом. В этом посте я расскажу обо всех своих достижениях и проблемах, с которыми я столкнулся, работая над Poor Man’s Rekognition в CCExtractor Development.

Если вы отметите мое первоначальное предложение, то увидите, что большинство целей достигнуто. Более того, я столкнулся и успешно справился с несколькими проблемами, которые изначально не предвидел. Остальное будет сделано после GSoC. А пока вспомним все моменты GSoC 2019.

Никогда не связывайтесь со структурой

Одной из первых проблем, с которыми я столкнулся, было постоянно растущее потребление памяти всякий раз, когда я начинал читать видеокадры. Я почти сразу понял, что это идеальный случай для использования генераторов вместо того, чтобы сначала читать фреймы и хранить их все в одном массиве. Тем не менее, были некоторые проблемы с тем, что TensorFlow не высвобождает память и pyav (библиотека для обработки видео).

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

Исходный пост - Выбор правильной структуры

GPL и распознавание лиц

Мне было довольно сложно выбрать лицензию, поскольку изначально я не был склонен к GPL. Однако после обсуждения этого вопроса с другими парнями и чтения о лицензиях я решил перейти на GPLv3. Он имеет ту же лицензию, что и CCExtractor, поэтому вы можете свободно использовать PMR!

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

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

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

Оригинальные сообщения - Выбор правильной лицензии, Работа над распознаванием лиц

Поиск похожих кадров

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

У средства поиска кадров подобия есть несколько методов - подобие на основе SSIM (требуется больше времени, хорошие результаты) и простое сравнение цветовой гистограммы с использованием различных показателей расстояния. Практически все время выбираю второй, он быстрый и дает хорошие результаты.

Я также добавил два разных бэкэнда для распознавания лиц (FaceNet и ArcFace) и для следующего этапа KNN (SciKit-Learn и FAISS). В настоящее время я в основном использую FaceNet и SciKit-Learn, поскольку другие серверные части требуют дополнительной настройки, которая будет выполнена в будущем.

Исходный пост - Распознавание лиц и первые оценки

Все о лицах

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

Увеличение изображения. Я использовал отличную библиотеку под названием albumentations, которая помогла мне создавать увеличенные изображения лиц. Увеличение производительности за счет этого небольшого шага составляет от 3% до 10%.

Отслеживание лица. Как я сказал в исходном посте, «было бы довольно глупо не использовать последовательную природу видео»! Таким образом, я решил искать одинаковые лица в кадрах в зависимости от положения лица. Как только мы нашли несколько таких лиц, мы можем распознавать лица / возраст / пол и даже эмоции на основе большинства голосов за одни и те же лица в кадрах.

Также на этом этапе я добавил модель распознавания возраста и пола и начал работать над веб-приложением.

Исходный пост - Полировка распознавания лиц

Работа над веб-приложением

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

Я потратил немало времени, чтобы изучить Tornado Python Web-Framework и освежить свои знания HTML, CSS и JS, чтобы придумать веб-приложение, которое могло бы предоставить всю мощь PMR удобным для пользователя способом.

В течение этого периода я добавил вход через Google и GitHub, придумал REST API, работал над пользовательским интерфейсом и добавил поддержку MongoDB, где я храню все данные распознавания. Веб-приложение явно далеко от совершенства, но необходимая основа есть.

Исходные сообщения - Веб-приложение, Продолжение работы над веб-приложением

Финальная демонстрация

Хорошо, хватит разговоров, вот три коротких видео, демонстрирующих всю мощь PMR 🙂

Обратите внимание, насколько хорошо PMR справляется с неизвестными случаями. Весь процесс не идеален, но я по-прежнему доволен результатами. И это только начало!

Что нужно сделать

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

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

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

Вы можете запустить PMR, используя инструкции, представленные в репозитории GitHub. Инструкции для PMR-Web и документация для всего проекта скоро появятся!

Наконец, я хотел бы поблагодарить своего наставника Йоханнеса Лохтера за то, что он поверил в меня и все сообщество CCExtractor Development за то, что я действительно крутые ребята 🙂

Первоначально опубликовано на http://fedoskin.org 24 августа 2019 г.