Как мы все знаем, распознавание лиц — это метод идентификации или подтверждения личности человека по его лицу. В настоящее время распознавание лиц используется для того, чтобы сделать мир безопаснее, умнее и удобнее. Существует множество вариантов использования, например: блокировка телефона, идентификация людей в социальных сетях, посещаемость школы и многое другое.
Существуют разные способы распознавать лица с помощью 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
Спасибо, что прочитали!!