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