Обнаружение ключевых точек лица имеет множество приложений в области Интернета вещей и широко используется во многих задачах, связанных с приложениями для распознавания лиц, таких как распознавание лиц, обнаружение сонливости и многие другие. Распознавание лиц используется для проверки безопасности, а также имеет множество других приложений.
Содержание
- Введение в cAINvas
- Импорт набора данных
- Анализ данных
- Увеличение данных
- Обучение модели
- Введение в DeepC
- Компиляция с DeepC
- Распознавание лица
Введение в cAINvas
cAINvas — интегрированная платформа разработки для создания интеллектуальных периферийных устройств. Мы можем не только обучить нашу модель глубокого обучения с помощью Tensorflow, Keras или Pytorch, мы также можем скомпилировать нашу модель с помощью ее граничного компилятора под названием DeepC, чтобы развернуть нашу рабочую модель на периферийных устройствах для производства. Модель Key Facial Points Detection также является частью галереи cAINvas. Все зависимости, которые вам понадобятся для этого проекта, также предустановлены.
cAINvas также предлагает различные другие блокноты для глубокого обучения в своей галерее, которые можно использовать для справки или для получения информации о глубоком обучении. Он также имеет поддержку графического процессора, что делает его лучшим в своем роде.
Импорт набора данных
При работе над cAINvas одной из его ключевых особенностей является UseCases Gallary. При работе над любым из его вариантов использования вам не нужно искать данные вручную. Поскольку у них есть функция импорта набора данных в вашу рабочую область, когда вы работаете с ними. Чтобы загрузить данные, мы будем использовать библиотеку pandas и загружать набор данных csv, который включает координаты ключевых лицевых точек, а последний столбец содержит значения пикселей изображения. Нам просто нужно выполнить следующие команды:
Анализ данных
На этом этапе мы проанализируем наши данные. Наши данные csv состоят из 31 столбца. Первые 30 столбцов содержат координаты пятнадцати ключевых черт лица, а последний столбец содержит значения пикселей изображения людей. Поскольку значения пикселей для изображения задаются в виде строки, разделенной пробелами, мы преобразуем ее в массив numpy и преобразуем полученный одномерный массив в двумерный массив формы (96,96). Нарисованное изображение вместе с ключевыми точками лица выглядит так:
Увеличение данных
Для увеличения данных мы перевернем изображения по оси x и увеличим или уменьшим яркость изображения. Поскольку мы переворачиваем изображения по горизонтали, значения координаты y будут одинаковыми. Будут изменены только значения координаты X, все, что нам нужно сделать, это вычесть наши начальные значения координаты x из ширины изображения (96). Исходное изображение, перевернутое изображение и изображение с увеличенной яркостью выглядят так:
Затем мы передадим значения пикселей изображений в качестве входных данных для нашей модели и обучим нашу модель глубокого обучения прогнозировать координаты пятнадцати ключевых точек лица.
Обучение модели
После создания набора поездов и тестов следующим шагом будет передача наших данных обучения в нашу модель глубокого обучения, чтобы научиться предсказывать координаты ключевых точек лица. Используемая архитектура модели была:
Model: "functional_1" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 96, 96, 1)] 0 __________________________________________________________________________________________________ zero_padding2d (ZeroPadding2D) (None, 102, 102, 1) 0 input_1[0][0] __________________________________________________________________________________________________ conv1 (Conv2D) (None, 48, 48, 64) 3200 zero_padding2d[0][0] __________________________________________________________________________________________________ bn_conv1 (BatchNormalization) (None, 48, 48, 64) 256 conv1[0][0] __________________________________________________________________________________________________ activation (Activation) (None, 48, 48, 64) 0 bn_conv1[0][0] __________________________________________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 23, 23, 64) 0 activation[0][0] __________________________________________________________________________________________________ res_2_conv_a (Conv2D) (None, 23, 23, 64) 4160 max_pooling2d[0][0] __________________________________________________________________________________________________ max_pooling2d_1 (MaxPooling2D) (None, 11, 11, 64) 0 res_2_conv_a[0][0] __________________________________________________________________________________________________ bn_2_conv_a (BatchNormalization (None, 11, 11, 64) 256 max_pooling2d_1[0][0] __________________________________________________________________________________________________ activation_1 (Activation) (None, 11, 11, 64) 0 bn_2_conv_a[0][0] __________________________________________________________________________________________________ res_2_conv_b (Conv2D) (None, 11, 11, 64) 36928 activation_1[0][0] __________________________________________________________________________________________________ bn_2_conv_b (BatchNormalization (None, 11, 11, 64) 256 res_2_conv_b[0][0] __________________________________________________________________________________________________ activation_2 (Activation) (None, 11, 11, 64) 0 bn_2_conv_b[0][0] __________________________________________________________________________________________________ res_2_conv_copy (Conv2D) (None, 23, 23, 256) 16640 max_pooling2d[0][0] __________________________________________________________________________________________________ res_2_conv_c (Conv2D) (None, 11, 11, 256) 16640 activation_2[0][0] __________________________________________________________________________________________________ max_pooling2d_2 (MaxPooling2D) (None, 11, 11, 256) 0 res_2_conv_copy[0][0] __________________________________________________________________________________________________ bn_2_conv_c (BatchNormalization (None, 11, 11, 256) 1024 res_2_conv_c[0][0] __________________________________________________________________________________________________ bn_2_conv_copy (BatchNormalizat (None, 11, 11, 256) 1024 max_pooling2d_2[0][0] __________________________________________________________________________________________________ add (Add) (None, 11, 11, 256) 0 bn_2_conv_c[0][0] bn_2_conv_copy[0][0] __________________________________________________________________________________________________ activation_3 (Activation) (None, 11, 11, 256) 0 add[0][0] __________________________________________________________________________________________________ res_2_identity_1_a (Conv2D) (None, 11, 11, 64) 16448 activation_3[0][0] __________________________________________________________________________________________________ bn_2_identity_1_a (BatchNormali (None, 11, 11, 64) 256 res_2_identity_1_a[0][0] __________________________________________________________________________________________________ activation_4 (Activation) (None, 11, 11, 64) 0 bn_2_identity_1_a[0][0] __________________________________________________________________________________________________ res_2_identity_1_b (Conv2D) (None, 11, 11, 64) 36928 activation_4[0][0] __________________________________________________________________________________________________ bn_2_identity_1_b (BatchNormali (None, 11, 11, 64) 256 res_2_identity_1_b[0][0] __________________________________________________________________________________________________ activation_5 (Activation) (None, 11, 11, 64) 0 bn_2_identity_1_b[0][0] __________________________________________________________________________________________________ res_2_identity_1_c (Conv2D) (None, 11, 11, 256) 16640 activation_5[0][0] __________________________________________________________________________________________________ bn_2_identity_1_c (BatchNormali (None, 11, 11, 256) 1024 res_2_identity_1_c[0][0] __________________________________________________________________________________________________ add_1 (Add) (None, 11, 11, 256) 0 bn_2_identity_1_c[0][0] activation_3[0][0] __________________________________________________________________________________________________ activation_6 (Activation) (None, 11, 11, 256) 0 add_1[0][0] __________________________________________________________________________________________________ res_2_identity_2_a (Conv2D) (None, 11, 11, 64) 16448 activation_6[0][0] __________________________________________________________________________________________________ bn_2_identity_2_a (BatchNormali (None, 11, 11, 64) 256 res_2_identity_2_a[0][0] __________________________________________________________________________________________________ activation_7 (Activation) (None, 11, 11, 64) 0 bn_2_identity_2_a[0][0] __________________________________________________________________________________________________ res_2_identity_2_b (Conv2D) (None, 11, 11, 64) 36928 activation_7[0][0] __________________________________________________________________________________________________ bn_2_identity_2_b (BatchNormali (None, 11, 11, 64) 256 res_2_identity_2_b[0][0] __________________________________________________________________________________________________ activation_8 (Activation) (None, 11, 11, 64) 0 bn_2_identity_2_b[0][0] __________________________________________________________________________________________________ res_2_identity_2_c (Conv2D) (None, 11, 11, 256) 16640 activation_8[0][0] __________________________________________________________________________________________________ bn_2_identity_2_c (BatchNormali (None, 11, 11, 256) 1024 res_2_identity_2_c[0][0] __________________________________________________________________________________________________ add_2 (Add) (None, 11, 11, 256) 0 bn_2_identity_2_c[0][0] activation_6[0][0] __________________________________________________________________________________________________ activation_9 (Activation) (None, 11, 11, 256) 0 add_2[0][0] __________________________________________________________________________________________________ res_3_conv_a (Conv2D) (None, 11, 11, 128) 32896 activation_9[0][0] __________________________________________________________________________________________________ max_pooling2d_3 (MaxPooling2D) (None, 5, 5, 128) 0 res_3_conv_a[0][0] __________________________________________________________________________________________________ bn_3_conv_a (BatchNormalization (None, 5, 5, 128) 512 max_pooling2d_3[0][0] __________________________________________________________________________________________________ activation_10 (Activation) (None, 5, 5, 128) 0 bn_3_conv_a[0][0] __________________________________________________________________________________________________ res_3_conv_b (Conv2D) (None, 5, 5, 128) 147584 activation_10[0][0] __________________________________________________________________________________________________ bn_3_conv_b (BatchNormalization (None, 5, 5, 128) 512 res_3_conv_b[0][0] __________________________________________________________________________________________________ activation_11 (Activation) (None, 5, 5, 128) 0 bn_3_conv_b[0][0] __________________________________________________________________________________________________ res_3_conv_copy (Conv2D) (None, 11, 11, 512) 131584 activation_9[0][0] __________________________________________________________________________________________________ res_3_conv_c (Conv2D) (None, 5, 5, 512) 66048 activation_11[0][0] __________________________________________________________________________________________________ max_pooling2d_4 (MaxPooling2D) (None, 5, 5, 512) 0 res_3_conv_copy[0][0] __________________________________________________________________________________________________ bn_3_conv_c (BatchNormalization (None, 5, 5, 512) 2048 res_3_conv_c[0][0] __________________________________________________________________________________________________ bn_3_conv_copy (BatchNormalizat (None, 5, 5, 512) 2048 max_pooling2d_4[0][0] __________________________________________________________________________________________________ add_3 (Add) (None, 5, 5, 512) 0 bn_3_conv_c[0][0] bn_3_conv_copy[0][0] __________________________________________________________________________________________________ activation_12 (Activation) (None, 5, 5, 512) 0 add_3[0][0] __________________________________________________________________________________________________ res_3_identity_1_a (Conv2D) (None, 5, 5, 128) 65664 activation_12[0][0] __________________________________________________________________________________________________ bn_3_identity_1_a (BatchNormali (None, 5, 5, 128) 512 res_3_identity_1_a[0][0] __________________________________________________________________________________________________ activation_13 (Activation) (None, 5, 5, 128) 0 bn_3_identity_1_a[0][0] __________________________________________________________________________________________________ res_3_identity_1_b (Conv2D) (None, 5, 5, 128) 147584 activation_13[0][0] __________________________________________________________________________________________________ bn_3_identity_1_b (BatchNormali (None, 5, 5, 128) 512 res_3_identity_1_b[0][0] __________________________________________________________________________________________________ activation_14 (Activation) (None, 5, 5, 128) 0 bn_3_identity_1_b[0][0] __________________________________________________________________________________________________ res_3_identity_1_c (Conv2D) (None, 5, 5, 512) 66048 activation_14[0][0] __________________________________________________________________________________________________ bn_3_identity_1_c (BatchNormali (None, 5, 5, 512) 2048 res_3_identity_1_c[0][0] __________________________________________________________________________________________________ add_4 (Add) (None, 5, 5, 512) 0 bn_3_identity_1_c[0][0] activation_12[0][0] __________________________________________________________________________________________________ activation_15 (Activation) (None, 5, 5, 512) 0 add_4[0][0] __________________________________________________________________________________________________ res_3_identity_2_a (Conv2D) (None, 5, 5, 128) 65664 activation_15[0][0] __________________________________________________________________________________________________ bn_3_identity_2_a (BatchNormali (None, 5, 5, 128) 512 res_3_identity_2_a[0][0] __________________________________________________________________________________________________ activation_16 (Activation) (None, 5, 5, 128) 0 bn_3_identity_2_a[0][0] __________________________________________________________________________________________________ res_3_identity_2_b (Conv2D) (None, 5, 5, 128) 147584 activation_16[0][0] __________________________________________________________________________________________________ bn_3_identity_2_b (BatchNormali (None, 5, 5, 128) 512 res_3_identity_2_b[0][0] __________________________________________________________________________________________________ activation_17 (Activation) (None, 5, 5, 128) 0 bn_3_identity_2_b[0][0] __________________________________________________________________________________________________ res_3_identity_2_c (Conv2D) (None, 5, 5, 512) 66048 activation_17[0][0] __________________________________________________________________________________________________ bn_3_identity_2_c (BatchNormali (None, 5, 5, 512) 2048 res_3_identity_2_c[0][0] __________________________________________________________________________________________________ add_5 (Add) (None, 5, 5, 512) 0 bn_3_identity_2_c[0][0] activation_15[0][0] __________________________________________________________________________________________________ activation_18 (Activation) (None, 5, 5, 512) 0 add_5[0][0] __________________________________________________________________________________________________ Averagea_Pooling (AveragePoolin (None, 2, 2, 512) 0 activation_18[0][0] __________________________________________________________________________________________________ flatten (Flatten) (None, 2048) 0 Averagea_Pooling[0][0] __________________________________________________________________________________________________ dense (Dense) (None, 4096) 8392704 flatten[0][0] __________________________________________________________________________________________________ dropout (Dropout) (None, 4096) 0 dense[0][0] __________________________________________________________________________________________________ dense_1 (Dense) (None, 2048) 8390656 dropout[0][0] __________________________________________________________________________________________________ dropout_1 (Dropout) (None, 2048) 0 dense_1[0][0] __________________________________________________________________________________________________ dense_2 (Dense) (None, 30) 61470 dropout_1[0][0] ================================================================================================== Total params: 18,016,286 Trainable params: 18,007,710 Non-trainable params: 8,576 __________________________________________________________________________________________________
В качестве функции потерь использовалась «MSE», а в качестве оптимизатора использовался «Адам». Для обучения модели мы использовали Keras API с tensorflow на бэкенде. .Вот тренировочный график и некоторые результаты тестов:
Введение в DeepC
Компилятор DeepC и платформа логического вывода предназначены для включения и выполнения нейронных сетей глубокого обучения с упором на функции устройств малого форм-фактора, таких как микроконтроллеры, eFPGA, процессоры и другие встроенные устройства, такие как raspberry-pi, odroid, arduino, SparkFun Edge, risc. -V, мобильные телефоны, x86 и портативные компьютеры.
DeepC также предлагает заблаговременно компилятор, создающий оптимизированный исполняемый файл на основе цепочки инструментов компилятора LLVM, специализированной для глубоких нейронных сетей с ONNX в качестве внешнего интерфейса.
Компиляция с DeepC
После обучения модели она была сохранена в формате H5 с помощью Keras, так как он легко сохраняет веса и конфигурацию модели в одном файле.
После сохранения файла в формате H5 мы можем легко скомпилировать нашу модель с помощью компилятора DeepC, который входит в состав платформы cAInvas, чтобы он преобразовывал нашу сохраненную модель в формат, который можно легко развернуть на периферии. устройства. И все это можно сделать очень легко с помощью простой команды.
Вот и все, наша модель обнаружения ключевых точек на лице обучена и готова к развертыванию на периферийных устройствах.
Распознавание лица
Для распознавания лиц мы будем использовать библиотеку Python под названием DLIB. DLIB — это библиотека, которая содержит модели, обученные находить КЛЮЧЕВЫЕ ТОЧКИ ЛИЦА, используя очень большой набор данных и более сложную архитектуру нейронной сети. Он был обучен в течение достаточно долгого времени и может использоваться для различных приложений для распознавания лиц, таких как, например, распознавание лиц. Чтобы узнать, как использовать DLIB для распознавания лиц, вы можете посетить ссылку на блокнот cAINvas, указанную внизу.
Ссылка на блокнот cAInvas: https://cainvas.ai-tech.systems/use-cases/face-recognition-app/
Источник: Ашиш Арья