Примечание . Это библиотека отслеживания, а не отдельная программа для управления аватарами. Я также работаю над VSeeFace, который позволяет анимировать 3D-модели VRM и VSFAvatar с помощью отслеживания OpenSeeFace. VTube Studio использует OpenSeeFace для отслеживания с помощью веб-камеры для анимации моделей Live2D. Рендерер для движка Godot можно найти здесь.
В этом проекте реализована модель обнаружения ориентиров лица на основе MobileNetV3.
Поскольку скорость вывода процессора Pytorch 1.3 в Windows очень низкая, модель была преобразована в формат ONNX. Используя onnxruntime, он может работать со скоростью 30–60 кадров в секунду, отслеживая одно лицо. Существует четыре модели с разной скоростью отслеживания компромиссов в качестве.
Если кому-то интересно, это имя — глупый каламбур, посвященный открытому морю и видящим лицам. Никакого более глубокого смысла.
Здесь можно найти обновленный образец видео, показывающий производительность модели отслеживания по умолчанию при различных уровнях шума и освещенности.
Поскольку ориентиры, используемые OpenSeeFace, немного отличаются от тех, которые используются в других подходах (они близки к iBUG 68, с двумя меньшими точками в углах рта и квази-3D контурами лица вместо контуров лица, которые следуют видимому контуру), это трудно численно сравнить его точность с точностью других подходов, обычно встречающихся в научной литературе. Производительность отслеживания также более оптимизирована для создания ориентиров, полезных для анимации аватара, чем для точного соответствия изображению лица. Например, пока ориентиры на глазах показывают, открыты или закрыты глаза, даже если их расположение несколько смещено, они все равно могут быть полезны для этой цели.
По общим наблюдениям, OpenSeeFace хорошо работает в неблагоприятных условиях (низкая освещенность, высокий уровень шума, низкое разрешение) и отслеживает лица в очень широком диапазоне поз головы с относительно высокой стабильностью положения ориентиров. По сравнению с MediaPipe, ориентиры OpenSeeFace остаются более стабильными в сложных условиях и точно отображают более широкий диапазон поз рта. Однако отслеживание области глаз может быть менее точным.
Я запустил OpenSeeFace на примере видеопрезентации «3D-реконструкция лица с плотными ориентирами» Вуда и др. чтобы сравнить его с MediaPipe и их подходом. Результат можно посмотреть здесь.
Пример проекта Unity для анимации аватара на основе VRM можно найти здесь.
Само отслеживание лица выполняется скриптом facetracker.py
Python 3.7. Это программа с командной строкой, поэтому вам следует запустить ее вручную из cmd или написать пакетный файл для ее запуска. Если вы загрузили выпуск и используете Windows, вы можете запустить facetracker.exe
в папке Binary
без установки Python. Вы также можете использовать run.bat
в папке Binary
для базовой демонстрации трекера.
Скрипт будет выполнять отслеживание входных данных веб-камеры или видеофайла и отправлять данные отслеживания по UDP. Такая конструкция также позволяет осуществлять отслеживание на отдельном ПК от того, кто использует информацию отслеживания. Это может быть полезно для повышения производительности и во избежание случайного раскрытия видеозаписи с камеры.
Предоставленный компонент OpenSee
Unity может получать эти UDP-пакеты и предоставляет полученную информацию через общедоступное поле, называемое trackingData
. Компонент OpenSeeShowPoints
может визуализировать ориентиры обнаруженного лица. Это также служит примером. Пожалуйста, просмотрите его, чтобы узнать, как правильно использовать компонент OpenSee
. Дополнительные примеры включены в папку Examples
. Пакеты UDP принимаются в отдельном потоке, поэтому любые компоненты, использующие поле trackingData
компонента OpenSee
, должны сначала скопировать это поле и получить доступ к этой копии, поскольку в противном случае информация может быть перезаписана во время обработки. Такая конструкция также означает, что поле будет продолжать обновляться, даже если компонент OpenSee
отключен.
Запустите скрипт Python с --help
, чтобы узнать о возможных параметрах, которые вы можете установить.
python facetracker.py --help
Простую демонстрацию можно выполнить, создав новую сцену в Unity, добавив к ней пустой игровой объект и компоненты OpenSee
и OpenSeeShowPoints
. Во время воспроизведения сцены запустите трекер лица на видеофайле:
python facetracker.py --visualize 3 --pnp-points 1 --max-threads 4 -c video.mp4
Примечание . Если зависимости были установлены с помощью поэтического выполнения, команды должны выполняться из poetry shell
или иметь префикс poetry run
.
Таким образом, скрипт отслеживания выведет собственную визуализацию отслеживания, а также продемонстрирует передачу данных отслеживания в Unity.
Включенный компонент OpenSeeLauncher
позволяет запустить программу отслеживания лиц из Unity. Он предназначен для работы с исполняемым файлом, созданным pyinstaller и распространяемым в двоичных пакетах выпуска. Он предоставляет три общедоступные функции API:
public string[] ListCameras()
возвращает имена доступных камер. Индекс камеры в массиве соответствует ее идентификатору в поле cameraIndex
. Установка cameraIndex
значения -1
отключит захват веб-камеры.public bool StartTracker()
запустит трекер. Если он уже запущен, он завершит работающий экземпляр и запустит новый с текущими настройками.public void StopTracker()
остановит трекер. Трекер останавливается автоматически при завершении работы приложения или уничтожении объекта OpenSeeLauncher
. Компонент OpenSeeLauncher
использует объекты заданий WinAPI, чтобы гарантировать завершение дочернего процесса трекера в случае сбоя или закрытия приложения без предварительного завершения процесса трекера.
Дополнительные пользовательские аргументы командной строки следует добавлять один за другим в элементы массива commandlineArguments
. Например, -v 1
следует добавлять как два элемента: один элемент, содержащий -v
, и другой, содержащий 1
, а не один, содержащий обе части.
Включенный компонент OpenSeeIKTarget
можно использовать вместе с FinalIK или другими решениями IK для анимации движения головы.
Компонент OpenSeeExpression
можно добавить к тому же компоненту, что и компонент OpenSeeFace
для обнаружения определенных выражений лица. Его необходимо калибровать индивидуально для каждого пользователя. Им можно управлять либо с помощью флажков в редакторе Unity, либо с помощью эквивалентных общедоступных методов, которые можно найти в его исходном коде.
Чтобы откалибровать эту систему, вам необходимо собрать примеры данных для каждого выражения. Если процесс захвата идет слишком быстро, вы можете использовать опцию recordingSkip
чтобы замедлить его.
Общий процесс выглядит следующим образом:
Чтобы удалить захваченные данные для выражения, введите его имя и установите флажок «Очистить».
Чтобы сохранить как обученную модель, так и собранные обучающие данные, введите имя файла, включая его полный путь, в поле «Имя файла» и установите флажок «Сохранить». Чтобы загрузить его, введите имя файла и установите флажок «Загрузить».
--model 3
, самая быстрая модель с самым низким качеством отслеживания --model 0
.--scan-every
кадр. Это может замедлить работу, поэтому постарайтесь установить --faces
не больше, чем фактическое количество отслеживаемых лиц. Включены четыре предварительно обученные модели ориентиров лица. С помощью переключателя --model
можно выбрать их для отслеживания. Указанные значения кадров в секунду предназначены для запуска модели на видео с одним лицом на одном ядре ЦП. Снижение частоты кадров снизит загрузку ЦП на соответствующую степень.
Измерения FPS получены при работе на одном ядре моего процессора.
Веса Pytorch для использования с model.py
можно найти здесь. Некоторые неоптимизированные модели ONNX можно найти здесь.
Дополнительные образцы:Result3.png,Result4.png.
Модель ориентиров достаточно устойчива к размеру и ориентации лиц, поэтому пользовательская модель обнаружения лиц обходится более грубыми ограничивающими рамками, чем другие подходы. Он имеет благоприятное соотношение скорости и точности для целей этого проекта.
Сборки в разделе выпуска этого репозитория содержат файл facetracker.exe
в Binary
папке, созданной с помощью pyinstaller
и содержащей все необходимые зависимости.
Чтобы запустить его, как минимум папка models
должна быть помещена в ту же папку, что и facetracker.exe
. Размещение его в общей родительской папке тоже должно работать.
При его распространении вам также следует распространять вместе с ним папку Licenses
, чтобы убедиться, что вы соответствуете требованиям, установленным некоторыми сторонними библиотеками. Неиспользуемые модели можно без проблем удалить из распространяемых пакетов.
Сборки выпуска содержат специальную сборку среды выполнения ONNX без телеметрии.
Необходимые библиотеки можно установить с помощью pip:
pip install onnxruntime opencv-python pillow numpy
В качестве альтернативы поэтику можно использовать для установки всех зависимостей для этого проекта в отдельном виртуальном окружении:
poetry install
Необходимые библиотеки можно установить с помощью pip:
pip install onnxruntime opencv-python pillow numpy
Модель была обучена на 66-точечной версии набора данных LS3D-W.
@inproceedings{bulat2017far,
title={How far are we from solving the 2D & 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks)},
author={Bulat, Adrian and Tzimiropoulos, Georgios},
booktitle={International Conference on Computer Vision},
year={2017}
}
Дополнительное обучение было проведено на наборе данных WFLW после сокращения его до 66 точек и замены контурных точек и кончика носа точками, предсказанными моделью, обученной до этого момента. Эта дополнительная тренировка проводится для улучшения прилегания глаз и бровей.
@inproceedings{wayne2018lab,
author = {Wu, Wayne and Qian, Chen and Yang, Shuo and Wang, Quan and Cai, Yici and Zhou, Qiang},
title = {Look at Boundary: A Boundary-Aware Face Alignment Algorithm},
booktitle = {CVPR},
month = June,
year = {2018}
}
Для обучения модели обнаружения взгляда и моргания использовался набор данных MPIIGaze. Кроме того, во время обучения было использовано около 125 000 синтетических глаз, созданных с помощью UnityEyes.
Следует отметить, что в процессе обучения также использовались дополнительные пользовательские данные и что опорные ориентиры из исходных наборов данных были определенным образом изменены для решения различных проблем. Вероятно, невозможно воспроизвести эти модели только с использованием исходных наборов данных LS3D-W и WFLW, однако дополнительные данные не подлежат распространению.
Модель распознавания лиц на основе регрессии тепловых карт была обучена на случайных кадрах размером 224x224 из набора данных WIDER FACE.
@inproceedings{yang2016wider,
Author = {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou},
Booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
Title = {WIDER FACE: A Face Detection Benchmark},
Year = {2016}
}
Алгоритм основан на:
Код MobileNetV3 был взят отсюда.
Для всех тренировок использовалась модифицированная версия Adaptive Wing Loss.
Для обнаружения выражений используется LIBSVM.
Обнаружение лиц осуществляется с использованием специальной модели обнаружения лиц на основе регрессии тепловой карты или RetinaFace.
@inproceedings{deng2019retinaface,
title={RetinaFace: Single-stage Dense Face Localisation in the Wild},
author={Deng, Jiankang and Guo, Jia and Yuxiang, Zhou and Jinke Yu and Irene Kotsia and Zafeiriou, Stefanos},
booktitle={arxiv},
year={2019}
}
Обнаружение RetinaFace основано на этой реализации. Предварительно обученная модель была модифицирована для удаления ненужного обнаружения ориентиров и преобразована в формат ONNX для разрешения 640x640.
Большое спасибо всем, кто помогал мне тестировать!
Код и модели распространяются по лицензии BSD с двумя пунктами.
Лицензии сторонних библиотек, используемых для бинарных сборок, вы можете найти в папке Licenses
.