Распознавание лиц: Face Recognition
Переводчик:
Данный проект face_recognition представляет собой мощный, простой и удобный в использовании открытый проект по распознаванию лиц с полной документацией по разработке и примерами применения, особенно совместимый с Raspberry Pi.
Чтобы облегчить изучение и разработку распознавания лиц китайскими разработчиками программного обеспечения и их вклад в исходный код, я перевёл файл README на упрощённый китайский язык.
Приветствую всех участников этого проекта.
Переводчик: Tommy из Ассоциации открытого исходного кода Университета Тунцзи 子豪兄Tommy
Этот проект является самым простым в мире набором инструментов для распознавания лиц. Вы можете использовать Python и инструменты командной строки для извлечения, распознавания и обработки лиц.
Распознавание лиц в этом проекте основано на передовой модели глубокого обучения из открытой библиотеки C++ dlib, которая была протестирована на наборе данных «Labeled Faces in the Wild» (http://vis-www.cs.umass.edu/lfw/) и имеет точность до 99,38%. Однако точность распознавания детских и азиатских лиц ещё предстоит улучшить.
[Labeled Faces in the Wild] — это набор данных о лицах, созданный Университетом Массачусетса в Амхерсте (University of Massachusetts Amherst), который содержит более 13 000 изображений лиц.
Проект предоставляет простой инструмент командной строки face_recognition, который можно использовать для обработки всего содержимого папки с изображениями.
Определение местоположения всех лиц на изображении:
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
Распознавание ключевых точек лица, включая глаза, нос, рот и подбородок.
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
Распознавание ключевых точек лица может быть полезно во многих областях, но вы также можете использовать эту функцию для развлечения, например, автоматизированный макияж в этом проекте digital make-up (как в приложении Meitu).
import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
Вы также можете комбинировать его с другими библиотеками Python (например, opencv) для реализации обнаружения лиц в реальном времени:
Посмотрите пример обнаружения лиц в реальном времени.
Сначала убедитесь, что у вас уже установлен dlib с привязками Python:
Затем установите этот модуль из pypi с помощью pip3 (или pip2 для Python 2):
pip3 install face_recognition
Если вы столкнулись с проблемами, вы можете установить этот проект на виртуальной машине Ubuntu, следуя этому руководству. Как использовать виртуальную машину, предоставленную Adam Geitgey, для настройки виртуальной машины. Этот проект уже включён в образ. face_recognition может автоматически помочь вам установить различные зависимости, включая dlib. Однако при установке dlib могут возникнуть проблемы, поскольку dlib требует компиляции, и обычно возникают проблемы с версиями gcc или g++. Поэтому перед использованием pip install face_recognition, вы можете указать расположение ваших gcc и g++ в командной строке:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
Это временно изменит переменные среды текущего терминала. /usr/local/bin/gcc должен указывать на каталог, где находится ваш gcc или g++.
Хотя этот проект официально не поддерживается для Windows, некоторые эксперты нашли способ запустить проект на этой платформе:
Этот проект уже включён в образ виртуальной машины Ubuntu:
После установки проекта вы можете использовать две команды командной строки:
Команда face_recognition позволяет распознавать лица на одной фотографии или в папке с фотографиями. Сначала у вас должна быть папка с известными лицами, где каждая фотография соответствует определённому человеку:
Затем вам нужна вторая папка с фотографиями, которые вы хотите распознать:
В командной строке перейдите в папки с фотографиями и используйте команду face_recognition. Она выведет имена людей на неизвестных фотографиях:
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/
/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
Если результат содержит unknown_person, это означает, что лицо на фотографии не соответствует ни одному известному лицу.
Команда face_detection определяет местоположение лица на одной фотографии или в папке с фотографиями (выводит координаты пикселей). В командной строке используйте face_detection, чтобы найти местоположение лица:
$ face_detection ./folder_with_pictures/
examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792
Каждая строка вывода соответствует одной фотографии и содержит координаты верхнего левого, нижнего правого углов лица.
Если программа распознаёт несколько лиц на одной фотографии, это может означать, что лица похожи друг на друга (например, дети или азиаты). Вы можете снизить уровень толерантности, чтобы повысить точность распознавания. Для этого используйте параметр --tolerance со значением от 0 до 1 (по умолчанию 0.6):
$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/
/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
Чтобы увидеть числовое значение соответствия, используйте параметр --show-distance true:
$ face_recognition --show-distance true ./pictures_of_people_i_known/ ./unknown_pictures/
/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
Если вам не важны имена фотографий, вы можете просто узнать, кто есть на фотографиях, используя следующую команду:
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2
Barack Obama
unknown_person
Если у вашего процессора несколько ядер, вы можете ускорить распознавание, используя параллельные вычисления. Например, если у вас четырёхъядерный процессор, вы можете увеличить скорость примерно в четыре раза. Если вы используете Python 3.4 или более позднюю версию, вы можете передать параметр --cpus 4 для использования всех доступных ядер:
$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/
Вы также можете использовать --cpus -1 для вызова всех ядер.
Примечание от автора: на Raspberry Pi 3B есть четыре ядра, и использование параметра --cpus может значительно ускорить распознавание изображений (проверено на практике).
В Python вы можете импортировать модуль face_recognition и использовать его API для лёгкого управления функциями распознавания лиц. Документация API доступна здесь: https://face-recognition.readthedocs.io.
Пример кода для определения местоположения лица:
import face_recognition
image = face_recongnition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)
# face_locations теперь является массивом координат каждого лица!
Смотрите пример: Определение местоположения лица Барака Обамы.
Также можно использовать глубокое обучение для более точного определения местоположения лица. Обратите внимание, что этот метод требует GPU для ускорения (через CUDA библиотеки NVIDIA), и вам также нужно включить поддержку CUDA при компиляции dlib. face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image, model="cnn")
Посмотрите пример использования свёрточной нейронной сети для определения местоположения лица Билла Гейтса.
https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture_cnn.py
Если у вас есть много изображений, которые нужно распознать, и у вас также есть графический процессор, вы можете обратиться к этому примеру:
Пример использования свёрточной нейронной сети для пакетного распознавания лиц на изображениях.
https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_batches.py
import face_recognition
image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
# face_landmarks_list is now an array with the locations of each facial feature in each face.
# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.
Посмотрите этот пример:
Извлечение ключевых точек на лицах Барака Обамы и Билла Гейтса.
**Распознавание человека по изображению**
```python
import face_recognition
picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]
# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!
unknown_picture = face_recongition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]
# Now we can see the two face encodings are of the same person with `compare_faces`!
results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)
if results[0] == True:
print("It's a picture of me!")
else:
print("It's not a picture of me!")
Посмотрите этот пример:
Это Барак Обама или Билл Гейтс?
Все примеры можно найти в этой ссылке:
Также в папке examples.
* **Распознавание лиц:**
* Пример определения местоположения лица Билла Гейтса.
* Пример использования свёрточной нейронной сети для определения местоположения лица Билла Гейтса.
* Пример использования свёрточной нейонной сети для пакетного распознавания лиц на изображениях.
* Пример размытия лиц на видео с веб-камеры (требуется установка OpenCV).
* **Определение ключевых точек лица:**
* Извлечение ключевых точек на лицах Барака Обамы и Билла Гейтса.
* Пример нанесения макияжа на лицо Билла Гейтса с помощью компьютерного зрения.
* **Распознование лиц:**
* Это Барак Обама или Билл Гейтс?
* Пример рисования рамок вокруг лиц и подписи имён на исходном изображении после распознавания.
* Сравнение двух лиц с разной точностью для определения, принадлежат ли они одному человеку.
* Распознавание лиц с веб-камеры — более медленная версия (требуется установка OpenCV).
* Распознавание лиц с веб-камеры — быстрая версия (требуется установка OpenCV).
* Распознавание лиц из видеофайла и вывод результатов в новый видеофайл (требуется установка OpenCV).
* Подсчёт количества лиц с помощью веб-камеры Raspberry Pi и распознавание их личностей.
* Доступ к распознаванию лиц через HTTP-запрос к сетевому серверу (требуется установить бэкенд-фреймворк Flask).
* Распознавание лиц на основе алгоритма классификации K ближайших соседей KNN. **Изучение**
- Основное содержание: базовые алгоритмы и принципы.
*Распознавание лиц с помощью OpenCV, Python и глубокого обучения* от Адриана Роузброка
- Основное содержание: как использовать этот проект на практике.
*Распознавание лиц на Raspberry Pi* от Адриана Роузброка
- Основное содержание: использование этого проекта на Raspberry Pi.
*Кластеризация лиц с помощью Python* от Адриана Роузброка
- Основное содержание: реализация кластеризации лиц на изображениях с использованием алгоритмов неконтролируемого обучения.
## Принципы распознавания лиц
Если вы хотите глубже понять принцип работы чёрного ящика под названием «распознавание лиц», прочитайте эту статью.
> *Комментарий Сяо Гохао:* обязательно прочтите эту статью, она интересная и информативная.
## Предупреждения
— Модель распознавания лиц в этом проекте основана на взрослых людях, и результаты могут быть менее точными для детей. Если на изображении есть дети, рекомендуется установить пороговое значение равным 0,6.
— Результаты распознавания лиц могут различаться для разных рас. Подробнее см. на странице wiki на GitHub.
## Развёртывание проекта на облачном сервере (Heroku, AWS и т. д.)
Этот проект основан на C++ библиотеке dlib, поэтому развёртывание его на облачных серверах Heroku или AWS является разумным решением.
Чтобы упростить этот процесс, существует пример Dockerfile, который показывает, как упаковать приложение face_recognition в контейнер Docker. Вы можете развернуть этот контейнер на любом облачном сервисе, поддерживающем образы Docker.
## Проблемы?
Прежде чем создавать проблему на Github, пожалуйста, ознакомьтесь со списком распространённых ошибок.
## Благодарности
— Большое спасибо Дэвису Кингу (@nulhom) за создание библиотеки dlib, которая предоставляет модели для обнаружения ключевых точек лица и кодирования лиц. Дополнительную информацию о ResNet можно найти на этой веб-странице.
— Спасибо всем участникам соответствующих модулей Python (включая numpy, scipy, scikit-image, pillow и др.).
— Благодарим проекты Cookiecutter и audreyr/cookiecutter-pypackage за шаблоны проектов, которые упрощают процесс упаковки Python-приложений.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )