Быстрый прогресс в области машинного обучения и технологий искусственного интеллекта значительно улучшил компьютерное зрение для обнаружения и распознавания объектов. Однако создание системы, способной распознавать юмор и развлечение у людей, остается сложной задачей для программистов, поскольку комедия и развлечения субъективны и зависят от личных вкусов и культурного контекста. Таким образом, создание системы, точно определяющей, что люди находят смешным или приятным, является сложным.
Тем не менее, компьютерное зрение в области распознавания лиц и идентификации достигло значительных успехов, широко используется в различных приложениях, таких как безопасность, наблюдение и биометрия. Технология распознавания лиц в основном идентифицирует людей, анализируя и сравнивая их черты лица с базой данных известных лиц. Идентификация по лицу включает сопоставление лица человека с его личностью. Она использует алгоритмы для извлечения черт лица, таких как расстояние между глазами, кривизна носа и угол челюсти, чтобы создать уникальный образ лица.
Технологии распознавания и идентификации лиц
Существует несколько методов распознавания и идентификации лиц, но в этом учебнике будут рассмотрены три техники и их преимущества и недостатки.
1. Подход на основе шаблонов
Прежде всего, подход на основе шаблонов сравнивает черты лица цели с теми, что присутствуют в шаблоне или эталонном изображении. Шаблонное изображение включает в себя несколько черт лица, таких как положение глаз, носа, рта и расстояния между ними. Затем техника сравнивает лицо цели с шаблонным изображением для определения соответствия. Eigenfaces является одним из наиболее распространенных шаблонных методов, который использует анализ основных компонентов (PCA) для уменьшения размерности изображений лиц и извлечения наиболее значимых характеристик.
Преимущества
- Очень точны с высококачественными шаблонами
- Обрабатывает вариации в освещении и выражениях лица
Недостатки
- Требует высококачественных шаблонов для точных результатов
- Может быть вычислительно затратным
2. Подход на основе характеристик
Во-вторых, техника на основе характеристик извлекает черты лица, такие как форма глаз, расстояние между бровями и кривизна губ. Затем подход сравнивает эти характеристики с теми, что находятся в базе данных известных лиц, для идентификации лица цели. Примеры типичных методов на основе характеристик включают Local Binary Pattern (LBP) и Scale-Invariant Feature Transform (SIFT).
Преимущества
- Достаточно быстрый и эффективный
- Работает с изображениями низкого разрешения
Недостатки
- Может не работать хорошо при изменении условий освещения
- Может быть не устойчив к изменениям выражений лица или поз
3. Глубокое обучение на основе подхода
В заключение, подход на основе глубокого обучения использует глубокие нейронные сети для непосредственного изучения признаков из изображений лиц. Сети обучаются на больших наборах данных изображений лиц для идентификации шаблонов и признаков, релевантных для распознавания лиц. Примеры типичных методов на основе глубокого обучения включают Сверточные Нейронные Сети (CNN) и Сиамские Сети.
Преимущества
- Достигает высокой точности с большими наборами данных
- Обрабатывает вариации в мимике и позах
Недостатки
- Требует большого количества обучающих данных
- Вычислительно затратный
ПРИМЕЧАНИЕ: Существует несколько техник для распознавания и идентификации лиц.
Распознавание и идентификация лиц с использованием Python и OpenCV
С наличием мощных библиотек, таких как OpenCV, и прогрессом в алгоритмах машинного обучения, стало проще, чем когда-либо, разрабатывать системы распознавания и идентификации лиц с использованием Python. OpenCV предоставляет богатый набор функций и инструментов для обработки изображений, особенно полезных в задачах распознавания лиц, таких как обнаружение лиц, извлечение признаков и сопоставление. Он также имеет готовые модели, такие как классификатор Haar Cascades для обнаружения лиц и VGG или ResNet для обозначения обнаруженных лиц.
OpenCV предоставляет различные модели для меток лица, такие как Eigenfaces, Fisherfaces и Гистограммы Локальных Бинарных Паттернов (LBPH). Мы обучаем эти модели для идентификации конкретных лиц, предъявляя им изображения лиц, которых мы хотим распознать. Eigenfaces использует Анализ Главных Компонент (PCA) для построения изображения лица из меньших частей, в то время как Fisherfaces использует Линейную Дискриминантную Анализ (LDA) для различения лиц. LBPH сравнивает текстуру лиц с известными лицами.
Идентификация Лиц
Импорт Зависимостей
Импортируйте необходимые библиотеки.
import numpy as np
import cv2
import matplotlib.pyplot as plt
from IPython.display import Image
from google.colab import drive
drive.mount('/content/drive')
Загрузка Предобученных Моделей и Изображения
OpenCV предоставляет набор предобученных `классификаторов Haar Cascade` для обнаружения различных объектов, включая лица. `cv2.CascadeClassifier` — это класс, представляющий классификатор Haar Cascade. Путь cv2.data.haarcascades — это директория, содержащая предобученные модели. `haarcascade_frontalface_default.xml` — это файл, содержащий предобученную модель обнаружения лиц. Модель доступна для бесплатного скачивания на GitHub.
# Загрузка предобученной модели обнаружения лиц
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
Загрузите входное изображение `image1.jpg`, которое может быть изображением по вашему выбору, с помощью функции `imread()` библиотеки OpenCV. Затем преобразуйте изображение в оттенки серого с помощью функции `cvtColor()` библиотеки OpenCV. Серый образ требуется для алгоритма обнаружения лиц.
# Загрузить изображение и преобразовать его в градации серого
img = cv2.imread('/content/drive/MyDrive/Face Detection/image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Показать изображение
plt.imshow(gray)
Следующая строка обнаруживает лица на изображении в градациях серого с помощью метода detectMultiScale() класса CascadeClassifier. Метод detectMultiScale() принимает следующие аргументы:
`gray`: изображение в градациях серого
`scaleFactor`: параметр, указывающий, насколько уменьшается размер изображения на каждой итерации масштабирования. Значение 1.3 означает, что изображение уменьшается на 30% на каждом масштабе.
`minNeighbors`: параметр, указывающий, сколько соседей должен иметь каждый кандидатский прямоугольник, чтобы его сохранить, более высокое значение приводит к меньшему количеству обнаружений, но с более высокой уверенностью.
Метод detectMultiScale() возвращает список прямоугольников, где обнаружены лица. Каждый прямоугольник представляет собой кортеж из четырех целых чисел `(x,y,w,h)`, представляющих координаты верхнего левого угла `(x,y)` прямоугольника и его ширину `w` и высоту `h`.
# Обнаружить лица на изображении в градациях серого
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
Нарисовать прямоугольник на области лица
Давайте создадим цикл, который рисует прямоугольники вокруг обнаруженных лиц на исходном изображении. Функция cv2.rectangle() принимает следующие аргументы:
`img`: исходное изображение.
`(x,y)`: координаты верхнего левого угла прямоугольника.
`(x+w,y+h)`: координаты нижнего правого угла прямоугольника.
`(255,0,0)`: представляет бинарный цвет прямоугольника, нарисованного в формате RGB. (255,0,0) представляет синий цвет.
`5`: толщина границы прямоугольника в пикселях.
# Нарисовать прямоугольники вокруг обнаруженных лиц
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)
#Показать изображение после построения прямоугольника.
# Отобразить изображение с обнаруженными лицами
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
# Сохранить обнаруженное изображение по имени
cv2.imwrite('detected_image.jpg', img)
#Подтвердить наличие сохраненного изображения.
detected_image=cv2.imread("detected_image.jpg", 1)
gray_channels_reversed = detected_image[:, :, ::-1]
plt.imshow(gray_channels_reversed)
Распознавание лиц
Мы не будем вдаваться в объяснение, подобного выше, но используем сохраненное обнаруженное изображение, чтобы подтвердить, работает ли модель для идентификации, предоставляя различные изображения для обнаружения.
Импортировать зависимости
import numpy as np
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity
Загрузить модель обнаружения лиц и детектор лицевых признаков
Функция `dlib.get_frontal_face_detector()` возвращает предварительно обученную модель обнаружения лиц, способную обнаруживать человеческие лица на изображениях. Для получения дополнительной информации проверьте функции dlib.net. Также загрузите детектор лицевых признаков.
# Загрузить модель обнаружения лиц и детектор лицевых признаков
face_detector = dlib.get_frontal_face_detector()
landmark_detector = dlib.shape_predictor('/content/drive/MyDrive/Face Detection/shape_predictor_68_face_landmarks_GTX.dat')
# Загрузить обнаруженное изображение
img1 = cv2.imread('/content/drive/MyDrive/Face Detection/detected_image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# Обнаружить лицо и лицевые признаки изображения
rects1 = face_detector(gray1, 1)
landmarks1 = landmark_detector(gray1, rects1[0])
landmarks1 = face_utils.shape_to_np(landmarks1)
# Загрузить другое изображение для сравнения с ранее загруженным
img2 = cv2.imread('/content/drive/MyDrive/Face Detection/001_d3323f3c.jpg')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
### Установить параметры модели
# Обнаружить лицо и лицевые метки второго изображения
rects2 = face_detector(gray2, 1)
landmarks2 = landmark_detector(gray2, rects2[0])
landmarks2 = face_utils.shape_to_np(landmarks2)
# Извлечь признаки двух изображений, вычислив евклидовы расстояния между лицевыми метками
features1 = np.zeros(68)
features2 = np.zeros(68)
for i in range(68):
features1[i] = np.linalg.norm(landmarks1[i] - landmarks1[0])
features2[i] = np.linalg.norm(landmarks2[i] - landmarks2[0])
#### Обучить на сходствах
# Вычислить косинусное сходство между двумя векторами признаков
score = cosine(features1, features2)
# Проверить, если оценка ниже определенного порога (например, 0.5), чтобы определить, соответствуют ли два лица
if score < 0.5:
print("The model did not recognize Joseph in one or both of the images..")
else:
print("The model recognized Joseph in both images.")
Заключение
В этом уроке вы узнали о распознавании и идентификации лиц с использованием Python OpenCV, как это работает, его применение и как его можно реализовать. Код для этого проекта можно получить из репозитория на GitHub.
Source:
https://dzone.com/articles/facial-recognition-and-identification-in-computer