Pyradox - это библиотека Python, которая помогает вам реализовать различные современные нейронные сети полностью настраиваемым образом с помощью TensorFlow 2.

Что такое ключевые моменты для лица?

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

Приближение к обнаружению ключевых точек

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

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

Получение данных

Для этой задачи мы будем использовать данные конкурса Kaggle Определение ключевых точек лица.

Набор данных для этого конкурса любезно предоставлен доктором Йошуа Бенжио из Монреальского университета. Джеймс Петтерсон.

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

Построение модели

Для построения модели нам потребуются тензорный поток и пирадокс, поэтому сначала давайте установим пирадокс:

!pip install git+https://github.com/Ritvik19/pyradox.git

После установки pyradox приступим к импорту

from tensorflow.keras import Input, layers, callbacks
from tensorflow.keras.models import Model
from pyradox import convnets

Приступим к построению модели, для нашей задачи воспользуемся Mobile Net V3 (small)

inputs = Input(shape=(96, 96, 1))
x = layers.Convolution2D(3, (1, 1), padding='same')(inputs)
x = layers.LeakyReLU(alpha = 0.1)(x)
x = convnets.MobileNetV3(config='small')(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.1)(x)
outputs = layers.Dense(30)(x)
model = Model(inputs=inputs, outputs=outputs)

Поскольку в нашем наборе данных есть изображения в градациях серого, форма входных данных будет 96x96x1, хотя нам придется преобразовать ее в трехцветное ченнелинговое изображение, прежде чем передавать его в мобильную сеть. Для решения этой задачи мы будем использовать 3 модуля свертки с размером ядра 1x1, активированным через Leaky ReLu (0.1)

Как только у нас будет наше трехканальное изображение, мы передадим его в Mobile Net. Чтобы получить окончательные результаты, то есть расположение ключевых точек на лице, мы будем использовать глобальный средний пул с последующим отключением выходных данных мобильной сети перед их загрузкой в ​​окончательный выходной слой.

Модельное обучение

Прежде чем передавать пакеты данных в нашу модель, давайте сначала настроим несколько обратных вызовов:

Мы будем использовать раннюю остановку, чтобы предотвратить переобучение

es = callbacks.EarlyStopping(
    monitor='loss', patience=30, verbose=1, mode='min', baseline=None, restore_best_weights=True
)

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

rlp = callbacks.ReduceLROnPlateau(
    monitor='val_loss', factor=0.5, patience=5, min_lr=1e-15, mode='min', verbose=1
)

Теперь скомпилируем модель и приступим к обучению.

model.compile(
    optimizer='adam', loss='mean_squared_error', metrics=['mae', 'acc']
)

history = model.fit(
    train_images, train_keypoints, epochs=150, batch_size=64, 
    validation_split=0.05, callbacks=[es, rlp]
)

Оценка модели на тестовом наборе

Наша модель отлично справилась с этой задачей !!!

Это было одно из различных применений пирадокса.

Для получения дополнительной информации ознакомьтесь с этим:

Конкурс Kaggle: https://www.kaggle.com/c/facial-keypoints-detection/

Блокнот Kaggle: https://www.kaggle.com/ritvik1909/facial-keypoint-detection-pyradox

Репозиторий: https://github.com/Ritvik19/pyradox