Проект виртуального помощника

Система Smart Face Lock

Построение высокоточной модели распознавания лиц

Безопасность - одна из самых больших проблем современности. Чрезвычайно важно удостовериться, что доступ к устройству предоставляется только правильному человеку. Это одна из основных причин, по которой наши смартфоны часто не имеют двухступенчатой ​​системы безопасности. Это сделано для того, чтобы обеспечить конфиденциальность и доступ к своему устройству только подлинному владельцу. Технология интеллектуальной блокировки лица на основе распознавания лиц является одной из таких мер безопасности, и мы рассмотрим, как мы можем создать нашу собственную систему распознавания лиц, которая будет работать с максимальной точностью с нуля, используя глубокое обучение и трансферное обучение с VGG-16.

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

Вступление:

В этом разделе будет рассказано о том, что именно будет выполнять построенная модель. Модель распознавания лиц, которую мы строим, сможет определять лицо авторизованного владельца и отклонять любое другое лицо. Модель издаст голосовой ответ, если к лицу будет предоставлен доступ или в доступе будет отказано. У пользователя будет 3 попытки проверить то же самое. Если третья попытка не удалась, вся система отключится, что обеспечит безопасность. Если распознается правильное лицо, то доступ предоставляется, и пользователь может перейти к управлению устройством. Весь код будет предоставлен в конце статьи со ссылкой на репозиторий GitHub.

Подход:

Во-первых, мы рассмотрим, как мы можем собрать изображения законного владельца, для которых модель распознавания лиц даст разрешение. Затем мы создадим дополнительную папку, если мы хотим добавить больше людей, которые могут иметь доступ к нашей системе. Нашим следующим шагом будет изменение размера изображения до формы (224, 224, 3), чтобы мы могли передать его через архитектуру VGG-16. Обратите внимание, что архитектура VGG-16 предварительно обучена на весах нетто изображения, которые имеют вышеупомянутую форму. Затем мы создадим варианты изображений, выполнив увеличение данных изображения в наборах данных. После этого мы можем создать нашу собственную модель поверх архитектуры VGG-16, исключив верхний слой. За этим следует компиляция, обучение и подгонка моделей в соответствии с необходимыми обратными вызовами. Наконец, мы завершим работу с окончательной моделью, которая может загружать веса модели и выполнять интеллектуальную блокировку лица на основе распознавания лиц.

Примечание. В этой статье я выполнил всю задачу только с каталогом поездов. Вы можете разделить программу на каталоги обучения и проверки. Я также проделал то же самое с поездом и каталогом проверки, и я включу график графика в конце.

Коллекция изображений:

На этом этапе мы напишем простой код Python для сбора изображений одним нажатием кнопки пробела. Мы можем нажать кнопку «q», чтобы выйти из графического окна. Сбор изображений - важный шаг, и мы будем собирать изображения только для тех людей, которым вы хотите предоставить доступ к вашему выборочному устройству. Давайте посмотрим на код, который мы будем использовать для выполнения следующих действий.

Мы импортируем необходимые библиотеки и соответственно инициализируем переменные в приведенном выше блоке кода.

Импорт модуля opencv для компьютерного зрения и захвата изображений.

Импорт модуля os для доступа к локальной системе.

Мы собираемся «включить» нашу веб-камеру по умолчанию, а затем приступить к захвату изображений наших лиц, которые необходимы для набора данных. Это делается командой VideoCapture. Затем мы создадим путь к нашему конкретному каталогу и инициализируем count равным 0. Эта переменная count будет использоваться для обозначения наших изображений от 0 до общего количества фотографий, которые мы нажимаем.

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

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

Мы следим за тем, чтобы код запускался только тогда, когда веб-камера захвачена и активирована. Затем мы захватим видео и вернем кадр. Затем мы назначим переменную «key» для принятия команды, нажатой на кнопку. Это нажатие клавиши дает нам два варианта. Для этого мы обратимся к таблице ASCII -

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

  1. Щелкните изображение, когда мы нажимаем кнопку пробела на клавиатуре.
  2. Выйти из программы при нажатии ‘q’

После выхода из программы мы освободим захват видео с нашей веб-камеры и уничтожим графическое окно cv2.

Изменение размера изображений:

В следующем блоке кода мы соответствующим образом изменим размер изображений. Мы хотим изменить наши изображения, которые мы собрали, до размера, подходящего для прохождения через архитектуру VGG-16, которая предварительно обучена весам изображений. Давайте посмотрим на код для выполнения этой задачи.

Импорт модуля opencv для компьютерного зрения и захвата изображений.

Импорт модуля os для доступа к локальной системе.

Мы масштабируем все наши изображения, снятые с размера кадра по умолчанию, до (224, 224) пикселей, потому что это лучший вариант, если мы хотим опробовать модели обучения с переносом, такие как VGG-16. Мы уже снимали изображения в формате RGB. Таким образом, у нас уже есть 3 канала, и нам не нужно это указывать. Требуемое количество каналов для VGG-16 - 3, а архитектура имеет идеальную форму (224, 224, 3).

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

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

Увеличение данных изображения:

Мы собрали и изменили наши изображения. Следующим шагом является выполнение увеличения данных изображения в наборе данных для репликации копий и увеличения размера набора данных. Мы можем сделать это с помощью следующего блока кода.

ImageDataGenerator используется для увеличения данных изображений.
Мы будем реплицировать и делать копии преобразований исходных
изображений. Генератор данных Keras будет использовать копии, а
не оригинальные. Это будет полезно для тренировок в каждую эпоху.

Мы изменим масштаб изображения и обновим все параметры в соответствии с нашей моделью. Это следующие параметры:
1. rescale = масштабирование на 1./255 для нормализации каждого из значений пикселей
2. Диапазон_ вращения = указывает случайный диапазон поворота
3. shear_range = Определяет интенсивность каждого угла в диапазоне против часовой стрелки.
4. zoom_range = Определяет диапазон масштабирования.
5. width_shift_range = укажите ширину расширения.
6. height_shift_range = укажите высоту расширения.
7. horizontal_flip = Отразите изображения по горизонтали.
8. fill_mode = Заливка в соответствии с ближайшими границами.

train_datagen.flow_from_directory Принимает путь к каталогу и генерирует пакеты расширенных данных. Вызываемые свойства следующие:
1. train dir = указывает каталог, в котором мы сохранили данные изображения.
2. color_mode = Важно функция, в которой нам нужно указать, как наши изображения классифицируются, то есть в оттенках серого или в формате RGB. По умолчанию используется RGB.
3. target_size = размеры изображения.
4. batch_size = количество пакетов данных для потока.
5. class_mode = Определяет тип возвращаемых массивов меток.
«категориальный» - это 2D-метки с горячим кодированием.
6. shuffle = shuffle: следует ли перемешивать данные (по умолчанию: True)
Если установлено значение False, данные сортируются в алфавитно-цифровом порядке.

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

В следующем блоке кода мы импортируем модель VGG-16 в переменную VGG16_MODEL и проверяем, что вводим модель без верхнего уровня.
Используя архитектуру VGG-16 без верхнего уровня, теперь мы можем добавить нашу пользовательские слои. Чтобы избежать тренировки слоев VGG-16, мы даем команду ниже:
Layers.trainable = False.

Мы также распечатаем эти слои и убедимся, что их обучение установлено как False.

Давайте теперь приступим к созданию нашей пользовательской модели на основе архитектуры VGG-16. Это будет похоже на модель жеста пальцами в одной из моих статей, с которой вы можете ознакомиться здесь.

Модель распознавания лиц, которую мы создаем, будет обучаться с помощью
трансферного обучения. Мы будем использовать модель VGG-16 без верхнего слоя.
Мы будем добавлять пользовательские слои к верхнему уровню модели VGG-16
, а затем мы будем использовать эту модель обучения передачи для прогнозирования, если это лицо авторизованного владельца или нет.
Пользовательский слой состоит из входного слоя, который, в основном,
является выходом модели VGG-16. Мы добавляем сверточный слой с 32 фильтрами,
размер ядра (3,3) и шаги по умолчанию (1,1), и мы используем активацию
в качестве relu с he_normal в качестве инициализатора.
Мы будем использовать объединяющий слой для субдискретизации слоев из
сверточного слоя.
Два полностью связанных слоя используются с активацией как связующее звено, то есть
плотная архитектура после прохождения образца сплющенный
слой.
У выходного слоя есть активация softmax с num_classes is 2, которая
предсказывает вероятности для num_classes, а именно авторизованного владельца или дополнительного участника или отклоненного лица.
Последняя модель принимает входные данные как начало модели VGG-16
и выводит как окончательный выходной слой.

Обратные вызовы:

В следующем блоке кода мы рассмотрим необходимые обратные вызовы для нашей задачи распознавания лиц.

Мы будем импортировать 3 необходимых обратных вызова для обучения нашей модели. Три важных обратных вызова - это ModelCheckpoint, ReduceLROnPlateau и Tensorboard. Давайте посмотрим, какую задачу выполняет каждый из этих индивидуальных обратных вызовов.

  1. ModelCheckpoint - этот обратный вызов используется для хранения весов нашей модели после обучения. Мы сохраняем только лучшие веса нашей модели, указав save_best_only = True. Мы будем отслеживать наши тренировки, используя метрику точности.
  2. ReduceLROnPlateau - этот обратный вызов используется для уменьшения скорости обучения оптимизатора после указанного количества эпох. Здесь мы указали терпение как 10. Если точность не улучшится через 10 эпох, то скорость обучения соответственно снижается в 0,2 раза. Метрика, используемая здесь для мониторинга, - это также точность.
  3. Tensorboard - обратный вызов tenorboard используется для построения визуализации графиков, а именно графиков для точности и потерь.

Скомпилируйте и подогнайте модель:

На последнем этапе мы составляем и настраиваем нашу модель. Здесь мы обучаем модель и сохраняем лучшие веса в face_rec.h5, чтобы нам не приходилось повторно обучать модель повторно, и мы могли использовать нашу сохраненную модель при необходимости. Здесь я тренировался только на тренировочных данных. Однако вы можете выбрать обучение как с данными обучения, так и с данными проверки. Используемая нами потеря - это category_crossentropy, которая вычисляет потерю кросс-энтропии между метками и прогнозами. Оптимизатор, который мы будем использовать, - это Адам со скоростью обучения 0,001, и мы скомпилируем нашу модель с метрической точностью. Подгоним данные на расширенные обучающие образы. После этапа подгонки мы можем достичь этих результатов по потерям поездов и точности.

Графики:

График данных поезда -

График данных поезда и валидации -

Наблюдение:

Мы можем разработать архитектуру лица VGG-16 на основе трансферного обучения, которая обеспечивает чрезвычайно высокую точность и очень низкие потери. В целом разработанная нами модель очень эффективна и работает очень хорошо. С помощью графиков мы можем наблюдать, что хорошо работает только график поездов, а также график с графиками обучения и проверки.

На этом наша модель распознавания лиц завершена. Если вы хотите запустить и протестировать модель самостоятельно, то код будет предоставлен в репозитории GitHub. Вы можете проверить ссылку на весь код, а также на код для загрузки весов и окончательной модели прогона здесь. Для этого потребуется дополнительный файл haarcascade_frontalface_default.xml, который используется для определения лиц. Даже это будет указано в ссылке GitHub. Я надеюсь, что всем вам понравилась эта статья. Это первая часть проекта виртуального помощника. Следите за новостями о предстоящих частях проекта виртуального помощника, и я желаю всем вам прекрасного дня!