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

Facebook - самая заметная социальная сеть в настоящее время, представленная в этой области. Его алгоритм распознавания лиц может распознавать лица людей с точностью 97,35%, и 2 миллиарда пользователей в месяц загружают 350 миллионов фотографий каждый день, что, как объявил Марк Цукерберг, предоставляет Facebook бесконечный источник данных.

Давайте узнаем, как это сделать! Существует несколько способов создания модели распознавания лиц, начиная с использования API обнаружения объектов Tensorflow и библиотеки OpenCV. Однако я хотел бы дать вам более простой, но эффективный метод, использующий библиотеку face_recognition для извлечения дескрипторов лиц
и K-Nearest Neighbours (KNN) для обучения вашего собственного классификатора. Отдельное спасибо Адаму Гейтгей за отличную работу.

Библиотека распознавания лиц

Так как this дает очень подробные инструкции за кулисами. Я кратко представлю идеи OpenFace с использованием Дональда Трампа (президента США).

Шаг 1: Как определить лицо?

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

Шаг 2: набрать 68 очков и скорректировать лицо.

  • 2A: Алгоритм оценки ориентиров лица будет использоваться для определения 68 конкретных точек, которые существуют на каждом лице.

  • 2B: Из найденных ориентиров аффинное преобразование OpenCV будет использовать некоторые базовые преобразования изображения, такие как поворот, масштаб и сдвиг, чтобы глаза и губа всегда отображались в одном и том же месте на каждом изображении.

Шаг 3. Получите 128 измерений

  • Центрированные изображения лиц проходят через нейронную сеть глубокой свертки для получения 128 измерений, что составляет 128 единиц измерения гиперсферы.

Шаг 4. Примените алгоритм машинного обучения

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

Поскольку для обучения классификатора мы используем метод K-Nearest Neighbor, я представлю основные концепции этого алгоритма.

K-ближайший сосед

Алгоритм KNN является одним из самых простых алгоритмов регрессии и классификации в контролируемом обучении.
KNN не является параметрическим, что означает, что он не делает никаких предположений, а основывается на структуре модели, созданной на основе данных.
KNN называется обучением на основе памяти или ленивым обучением, потому что способ его обучения - это просто сохранение представлений обучающих примеров.
Объект классифицируется на основе большинства голосов его соседей (обучающей выборки). Новый объект примера будет присвоен классу с наиболее похожими k ближайшими соседями.

Пришло время для реализации.

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

1. Подготовьте набор данных:

Захват нескольких изображений людей, которых вы хотите узнать по лицам, или собрать их из Интернета (1-2–2 должно быть достаточно, но чем больше, тем лучше).
Поместите снятые фотографии в подпапки, имя которой соответствует названию папки. имя каждого класса и поместите эти папки в папку "train".
Поместите изображения, которые вы хотите протестировать, в папку "test".

2. Обучить набор данных:

Я не хочу, чтобы этот пост был полон исходного кода. Я просто придумываю некоторые коды, которые следует здесь заметить:

Мы получаем местоположение, рисуя ограничивающую рамку вокруг лица и используя функцию face_encodings () для получения 128 измерений.

face_bounding_boxes = face_recognition.face_locations(image)
face_encodings = face_recognition.face_encodings(image, known_face_locations=face_bounding_boxes)

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

classifier = train(“knn_examples/train”, model_save_path=”trained_knn_model.clf”, n_neighbors=2)

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

closest_distances = knn_clf.kneighbors(faces_encodings, n_neighbors=2)
are_matches = [min(closest_distances[0][i][0],closest_distances[0][i][1]) <= distance_threshold for i in range(len(X_face_locations))]

3. Протестируйте наш классификатор:

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

predictions = predict(full_file_path, model_path=”trained_knn_model.clf”)

Нарисуйте ограничивающие рамки с метками для каждой грани.

show_prediction_labels_on_image(count,os.path.join(“knn_examples/test”, image_file), predictions)

Требования

Python 3.6.0 | Anaconda 4.3.1

Windows 10

Установите библиотеку с помощью следующей команды.

pip install face_recognition

Проблемы, которые нужно заметить

1. Интенсивность изображения

Это изображение используется сначала. Однако функция face_location () не может извлекать какие-либо лица.

В этом случае есть 2 варианта, которые вы можете использовать для улучшения ситуации:

Измените интенсивность фильтра изображения.

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

Преобразовать в шкалу серого.

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

2. Азиатские лица

С порогом оценки 0,6 для выборок данных об азиатских лицах классификатор будет распознавать разных людей с одним и тем же ярлыком.
Я получаю лучший результат, установив distance_threshold = 0,4

Ссылки

Машинное обучение - это весело! Часть 4: Современное распознавание лиц с глубоким обучением: https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78

Открытое лицо: https://cmusatyalab.github.io/openface/

Вот ссылка на мой полный исходный код. Надеюсь, вам понравится!