Задача состоит в отделении людей с нарушениями мимики от условно здоровых по видеозаписям мимических упражнений
setup.py
is planned, for now manual installation
For usage:
- install miniconda (or
virtualenv
although not tested) - create
mimics
env (see.python-version
for version) - install building tools:
sudo apt update && sudo apt install -y build-essential
cmake
:sudo snap install cmake --classic
works for ubuntu (this is needed fordlib
, instructions for macos)- seems like this is needed for OpenCV to work on Ubuntu:
sudo apt install -y libsm6 libxext6 libxrender-dev
- install
ffmpeg
:sudo apt install -y ffmpeg
- load
dlib
weights withmimics/load_weights.sh
(run it from its parent directory) - For usage just
pip install -r requirements.txt
For development:
- install
dvc
- install
pre-commit
(I prefer to install it separately) - run
pip install -r requirements-dev.txt
- run
pre-commint install
- run
dvc pull
to get all datasets and models (may take a few dozens of minutes)
Available through commands.py
where each function exposes and experiment. Experiment
either logs results to mlflow
or writes artifact files to data/tmp
- brows (alpha)
- low: 0.45, high: 5.0
- smile (alpha)
- low: 0.65, high: 7.0
- Feature extraction: для каждого кадра видео выделение положения лица (предобученные сетки)
- Preprocessing: сглаживание во времени, центрирование, проективная нормализация
- Classification and analysis: обучение статистической модели на подготовленных данных, а также выделение высокоуровневых семантичных фичей, которые могут быть проанализированы врачом визуально
Существует множество вариантов выделения очертаний лица. В секции Sources рассмотрены основные списки, далее вкрадце описаны наиболее доступные и современные рассмотрены методы.
Очертания лица(shape) как правило определяются для каждого кадра отдельно (единицы работ посвящённх именно видео см. Supervision-by-Registration), что влечёт за собой особенности типа случайного шума на последовательных кадрах.
Эти способы реализованы в виде sklearn-style трансформеров в файле extractors.py
У некоторых детекторов есть 2 режима работы: определение 68 точек, либо 21 точки. Это вызвано тем, что есть 2 типа разметки датасетов: 300W-like и AFLW-like.
Points are reffered "left" and "right" always from person's point of view.
Обширный лист решений для детекции очертаний. Он несколько не структурирован, местами ссыли устарели, но можно надеяться на большой recall. Кажется, он даже дополняется и как-то поддерживается. Тут же есть пачка датасетов.
Также хорошим источником является paperswithcode, там указаны СОТЫ. Этот раздел ещё не проанализирован полностью https://paperswithcode.com/task/face-alignment
Используется библиотека dlib Порядок действий:
- производится определение положения лица функцией
get_frontal_face_detector
- далее на основе этого функцией
shape_predictor
и параметровshape_predictor_68_face_landmarks
выделяется 68 точек, являющихся очертаниями лица человека
Плюсы:
- работает локально на CPU
- легодоступна, интегрирована в нашу систему
- стабильна (относительно программной совместимости)
Минусы:
- очень слабо работает с движениями бровей/губ, сильно шумит при мимических движениях, постоянно сбивается
https://github.com/1adrianb/face-alignment
https://arxiv.org/pdf/1803.04108v4.pdf
Вроде бы имеет несколько методов определения очертаний (AAM, LBF), но пишут, что под них сложно найти предобученные сети.
link - ссылки на статьи, где описаны методы, вроде бы даже есть предобученные модели, всё на плюсах
link -
https://github.com/ageitgey/face_recognition
Very hard to install and get to work (on Ubuntu)
https://github.com/CMU-Perceptual-Computing-Lab/openpose
https://github.com/facebookresearch/supervision-by-registration
https://github.com/deepinsight/insightface#third-party-re-implementation
https://github.com/protossw512/AdaptiveWingLoss
https://arxiv.org/pdf/1908.01070v1.pdf Многообещающая статья, но без реализации
Технология определения активных частей лица на видео. не выделяет точек непосредственно, но может быть использованна косвенно для извлечения фичей/активаций. Использует optical flow для анализа видео, можно позаимстовать реализацию.
Dataet+Challenge - https://arxiv.org/pdf/1702.04174.pdf
AUNets - https://arxiv.org/pdf/1704.07863v2.pdf Использует optical flow видео для предсказаний. Очень громоздкая. Не увидел pretrained
AU R-CNN - https://arxiv.org/pdf/1812.05788v2.pdf Эта сетка может предсказывать активации регионов лица по одной фотографии, То есть по каждому кадру. Таким образом можно получить временной ряд активаий интересующего нас региона или по крайней мере эмбэддинги таких активаций (можно барть активации предпоследнего слоя перед классификационным). Может быть получится такие цифры легче и точнее агрегировать.
В файле transformers.py
содержатся все имеющиеся варианты трансформеров.
Текущая оптимальная схема выдаётся в функции get_preprocessing
Ideas:
- augment time series (flip, multiplication, etc) as well as videos before extracting points
- statsmodels.tsa.seasonal.seasonal_decompose - apply to mean of all channels plot detected frequency and try to split by it
- scipy findpeaks -
- fft analysis
- лин. модели как бейзлайн
- леса над семантическими фичами
- сетки: автоэнкодер + FC predictor