Как мы все знаем, распознавание лиц — это метод идентификации или подтверждения личности человека по его лицу. В настоящее время распознавание лиц используется для того, чтобы сделать мир безопаснее, умнее и удобнее. Существует множество вариантов использования, например: блокировка телефона, идентификация людей в социальных сетях, посещаемость школы и многое другое.
Существуют разные способы распознавать лица с помощью LBPH (гистограммы локального бинарного паттерна), который является одним из старейших подходов. Также мы можем распознавать с помощью концепций трансферного обучения и тонкой настройки.

Что такое группа визуальной геометрии VGG?

Существует множество предварительно обученных моделей или архитектур глубокого обучения для CNN для обучения моделей с использованием огромных наборов данных, поэтому с помощью этих архитектур мы можем обучать нашу модель вместо того, чтобы каждый раз создавать новую архитектуру. Она разработана для крупномасштабного распознавания изображений с использованием Наборы данных ImageNet.
Эта архитектура VGG делится на две части:

  • VGG16 - имеет 13 CRP (свертка Relu Pooling) и 3 полностью связанных слоя.
  • VGG19- Он имеет 16 CRP (свертка Relu Pooling) и 3 полносвязных слоя.
    Здесь 16 и 19 относятся к количеству слоев.

Но эта модель требует слишком много времени для обучения и имеет очень большое количество параметров.

Поэтому, чтобы решить эту проблему, мы будем использовать трансферное обучение и точную настройку.

Как люди, мы чему-то учимся в одной ситуации и применяем это в другой связанной задаче или ситуации. Точно так же Передача обучения — это обучение, основанное на ранее изученной задаче. Это ускоряет обучение и повышает точность.< br /> Точная настройка: процесс удаления последнего слоя предварительно обученной сети и замены его нашими новыми соответствующими слоями для нашей собственной проблемы.

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

Сначала нам нужно импортировать библиотеки Cv2 и numpy, а затем для обнаружения лица мы используем файл haarcascade для лица. Затем мы конвертируем в оттенки серого, а затем обрезаем лица. Используя веб-камеру, мы делаем 100 изображений и сохраняем их в определенном каталоге. Программа прервется, когда соберется 100 семплов или мы нажмем Enter.

Здесь мы используем архитектуру VGG16, которая является предварительно обученной моделью в keras.

  • VGG16() загружает веса, предварительно обученные в ImageNet, с входной формой 224 x 224 . мы не включаем верхний уровень этой архитектуры.
  • Установка для layer.trainableзначения false означает «замораживание» слоев, т. е. замороженные слои не будут обновляться во время обучения. .
  • Затем печатаем все слои модели.
Using TensorFlow backend.
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5
58892288/58889256 [==============================] - 1s 0us/step
0 InputLayer False
1 Conv2D False
2 Conv2D False
3 MaxPooling2D False
4 Conv2D False
5 Conv2D False
6 MaxPooling2D False
7 Conv2D False
8 Conv2D False
9 Conv2D False
10 MaxPooling2D False
11 Conv2D False
12 Conv2D False
13 Conv2D False
14 MaxPooling2D False
15 Conv2D False
16 Conv2D False
17 Conv2D False
18 MaxPooling2D False

Теперь мы добавляем слои, которые мы хотим добавить поверх модели выше.

Во-первых, мы берем нижний слой нашей модели, затем добавляем объединяющий слой и плотные слои с функцией активации relu и softmax для многоклассовой классификации.

Импорт всех библиотек. Установка количества классов, т.е. папок, присутствующих в основном каталоге. А затем распечатать сводку модели.

Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 1024)              525312    
_________________________________________________________________
dense_2 (Dense)              (None, 1024)              1049600   
_________________________________________________________________
dense_3 (Dense)              (None, 512)               524800    
_________________________________________________________________
dense_4 (Dense)              (None, 3)                 1539      
=================================================================
Total params: 16,815,939
Trainable params: 2,101,251
Non-trainable params: 14,714,688
_________________________________________________________________
None

Перед обучением нашей модели мы должны выполнить обработку изображений, для этого мы используем модуль keras ImageDataGenerator, который может выполнять увеличение данных в реальном времени.

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

После выполнения предварительной обработки данные изображения готовы к обучению. Для этого мы импортируем оптимизатор RMSprop и ModelCheckpoint, EarlyStopping.
Ранняя остановка — это метод, который позволяет нам указать число периодов обучения и остановить обучение, как только производительность модели перестанет улучшаться в наборе данных проверки задержки.
Обратный вызовModelCheckpointпозволяет нам определить, где должна быть контрольная точка (промежуточная сброс весов и текущей скорости обучения, чтобы он мог возобновить обучение с этой точки, когда это необходимо) вес модели, как должен называться файл и при каких обстоятельствах делать контрольную точку модели.

Затем компилируем модель.

Epoch 1/5
3/3 [==============================] - 58s 19s/step - loss: 3.4623 - accuracy: 0.5556 - val_loss: 0.6191 - val_accuracy: 0.5521

Epoch 00001: val_loss improved from inf to 0.61905, saving model to face_vgg.h5
Epoch 2/5
3/3 [==============================] - 62s 21s/step - loss: 1.2125 - accuracy: 0.3958 - val_loss: 0.7584 - val_accuracy: 0.5312

Epoch 00002: val_loss did not improve from 0.61905
Epoch 3/5
3/3 [==============================] - 58s 19s/step - loss: 0.5591 - accuracy: 0.6979 - val_loss: 0.1608 - val_accuracy: 1.0000

Epoch 00003: val_loss improved from 0.61905 to 0.16076, saving model to face_vgg.h5
Epoch 4/5
3/3 [==============================] - 54s 18s/step - loss: 0.3722 - accuracy: 0.8611 - val_loss: 0.1729 - val_accuracy: 1.0000

Epoch 00004: val_loss did not improve from 0.16076
Epoch 5/5
3/3 [==============================] - 57s 19s/step - loss: 0.1325 - accuracy: 0.9688 - val_loss: 0.0119 - val_accuracy: 1.0000

Epoch 00005: val_loss improved from 0.16076 to 0.01186, saving model to face_vgg.h5

После обучения мы загружаем нашу модель для тестирования.

Для тестирования мы импортируем некоторые библиотеки, а затем передаем аргументы для записи текста на изображение в putText().

Теперь мы берем изображение для тестирования, а затем оно предсказывает и идентифицирует лицо.

Наконец, он дает правильный вывод:

Ссылка на GitHub: https://github.com/mansi-dadheech/face_recognition.git

Спасибо, что прочитали!!