Распознавание лиц с использованием открытого резюме и трансферного обучения

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

Итак, я пишу эту статью, которая связана с использованием Transfer Learning и создания системы распознавания лиц с использованием методов openCV и Transfer Learning.

Предпосылки для понимания работы, проделанной в этом проекте:

Keras. Как мы все знаем, Keras - это завершающая библиотека, а также более удобная для пользователя, чем Tensorflow, поэтому я использую Keras для выполнения этой задачи.

openCV - это еще одна более важная библиотека, которую мы используем для визуальной обработки в машинном обучении.

Трансферное обучение - это метод, при котором модель нейронной сети сначала обучается на проблеме, аналогичной решаемой. Затем один или несколько слоев обученной модели используются в новой модели, обученной интересующей проблеме.

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

  • VGG net - это сеть, которую мы можем использовать для решения этой проблемы. Он имеет два вкуса (например, VGG16 и VGG19). Цифры представляют количество уровней, присутствующих в сети. Эти модели обучаются на основе данных изображений из наборов данных appprox 1000 для обнаружения объектов.
  • ResNet - ResNet - это еще одна сеть, в которой есть различные уровни свертки и объединения, обученные на наборе данных imagenet.
  • MobileNet - это еще одна сеть с той же целью.

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

Набор данных. Чтобы использовать вышеуказанные модели, нам необходимо импортировать набор данных imagenet, поскольку эти модели обучаются только на этих данных.

Итак, приступим ..!

СБОР ОБРАЗЦА

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

Итак, мы используем модуль import cv2 и другую важную библиотеку (например, numpy) для увеличения данных.
Затем мы загружаем алгоритм обнаружения фронтальных объектов HaarCascade для обнаружения лиц. .

Теперь мы определяем функцию face_extractor, которая обнаруживает лица на изображении и возвращает обрезанные изображения.
Затем мы инициализируем веб-камеру с помощью функции VideoCapture () и с помощью цикла while собираем изображения в качестве входных. и сохраните изображения в локальном хранилище, указав путь, куда мы хотим. Я также написал несколько опций для подсчета изображений во время записи в реальном времени.

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

НАБОР ДАННЫХ

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

Так что в основном у меня здесь два класса. Один состоит из моих образцов, а другой ... (ну, это не очень важно знать: p)

СОЗДАНИЕ МОДЕЛИ

Двигаясь дальше, теперь нам нужно создать модель и понять ее.

Здесь мы сначала импортируем важные библиотеки Keras, необходимые для создания модели (например, слои, оптимизаторы, модели и т. Д.). Также для передачи обучения используется сеть vgg16 (вы можете использовать ту, которая вам нужна, как объяснялось ранее).

Затем мы изменяем размер всех изображений до размера 224x224. Этот размер представляет собой размер изображений, с которыми они предварительно обрабатываются перед подачей на входной слой.

После этого мы добавляем предварительно обученную сеть vgg, и она берет веса из предоставленного нами изображения. Также следует отметить ключевое слово include_top, которое здесь неверно. Это связано с тем, что мы удаляем самый верхний слой сети, потому что, если вы установите include_top = True , он повторно инициализирует плотный слой с предварительно обученным весом, иначе, если вы установите include_top = False , результат предыдущего уровня, прошедший через GlobalAveragePooling2D (), извлекающий наиболее важные функции.

Еще одна вещь, которую следует извлечь из этого, - аргумент формы ввода имеет IMAGE_SIZE + [3]. [3] - это канал RGB, который мы собираемся использовать.

Следующее, что мы не хотим переобучать предварительно обученные веса, поэтому мы снова делаем его false.
Теперь мы используем глобальную функцию python для получить классы, присутствующие в наборе данных. Но помните, что мы должны предоставить модели только набор данных поезда, поэтому мы указываем только путь к папке поезда.

Итак, двигаясь дальше, мы должны добавить к модели слой Flatten, а также вы можете добавить дополнительные слои Dense в соответствии с вашими требованиями. Но чтобы избежать переобучения, я попытался сделать модель небольшой, а также добавил слой Dropout, чтобы отбросить около 50% элементов.

Затем нам нужно добавить выходной слой и использовать функцию активации как softmax, поскольку у нас есть требование для классификации (да или нет).
Наконец, мы создаем модель и визуализируйте модель с помощью функции summary.

Теперь мы компилируем модель с помощью оптимизатора RMSProp с очень небольшой скоростью обучения 0,001 и оцениваем потери с помощью binary_crossentropy. функционируют, поскольку у нас есть две категории.

Теперь мы дополнительно выполняем увеличение данных с помощью функции ImageDataGenerator (), используя различные ключевые слова для данных поезда, но для тестовых данных мы масштабируем только конкретное изображение между 0 и 1.

Теперь функция flow_from_directory просто считывает все изображения, присутствующие в наборе данных Train & Test.

Теперь мы используем fit _generator () и предоставляем набор данных для обучения и проверки или тестирования вместе с эпохами и размерами пакетов. Как только мы нажимаем Enter, эта функция начинает выполнение нашей модели.

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

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

ТЕСТИРОВАНИЕ

В этом разделе я собираюсь показать вам, как наша модель работала, когда я снова пытался протестировать ее вживую, используя opencv.

По сути, этот набор кода похож на наше внешнее приложение, которое использует Haarcascade для фронтального распознавания лиц. И здесь мы будем снимать кадры.

Итак, как только мы захватим кадры, снова с помощью VideoCapture (). Мы вызываем модель, которую мы загрузили в предыдущем разделе. Итак, мы инициализируем ту же модель и, как и model.predict, для прогнозирования на обученной модели, и передаваемые нами значения равны [0] [0]. Здесь следует отметить, что если мы дадим значения [0] [1], то это может быть предсказано на основе другого класса, который мы создали.

Итак, в основном, со всем объяснением, я хотел бы поделиться с вами результатами, которые я получил от своего тестирования.

Так что это с моей стороны, ребята. Попробуйте сами, так как это действительно отличный вариант использования как OpenCV, так и Transfer Learning.

Наконец, я хотел бы оставить ссылку на репозиторий Github для вашей справки, в которой есть соответствующие коды.



Спасибо за прочитанное, ребята! До скорого :)