Итак, в сегодняшнем блоге мы увидим, как мы можем выполнять распознавание лиц, используя KNN (алгоритм K-ближайших соседей) и каскады Хаара. Каскады Хаара работают очень быстро по сравнению с другими способами обнаружения лиц (такими как MTCNN), но с компромиссом в точности. Его точность немного меньше по сравнению с такими большими мальчиками, как MTCNN.
Полную статью с исходным кодом читайте здесь —https://machinelearningprojects.net/face-recognition-using-knn/
В сегодняшнем блоге мы увидим 2 скрипта:
- Первый предназначен для добавления нового лица.
- Второй предназначен для распознавания лиц в реальном времени с использованием KNN.
Давай сделаем это…
Прежде чем продолжить, пожалуйста прочитайте мой предыдущий пост: САМЫЙ ПРОСТОЙ СПОСОБ ВЫПОЛНИТЬ ОБНАРУЖЕНИЕ ЛИЦ И ГЛАЗ В PYTHON С ИСПОЛЬЗОВАНИЕМ HAARCASCADES И OPENCV
Код для добавления нового лица…
import cv2
import numpy as np
import os
import pickle
face_data = []
i = 0
cam = cv2.VideoCapture(0)
facec = cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')
name = input('Enter your name --> ')
ret = True
# Face Recognition using KNN
while(ret):
ret, frame = cam.read()
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face_coordinates = facec.detectMultiScale(gray, 1.3, 4)
for (x, y, w, h) in face_coordinates:
faces = frame[y:y+h, x:x+w, :]
resized_faces = cv2.resize(faces, (50, 50))
if i % 10 == 0 and len(face_data) < 10:
face_data.append(resized_faces)
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
i += 1
cv2.imshow('frames', frame)
if cv2.waitKey(1) == 27 or len(face_data) >= 10:
break
else:
print('error')
break
cv2.destroyAllWindows()
cam.release()
face_data = np.asarray(face_data)
face_data = face_data.reshape(10, -1)
if 'names.pkl' not in os.listdir('data/'):
names = [name]*10
with open('data/names.pkl', 'wb') as f:
pickle.dump(names, f)
else:
with open('data/names.pkl', 'rb') as f:
names = pickle.load(f)
names = names + [name]*10
with open('data/names.pkl', 'wb') as f:
pickle.dump(names, f)
if 'faces.pkl' not in os.listdir('data/'):
with open('data/faces.pkl', 'wb') as w:
pickle.dump(face_data, w)
else:
with open('data/faces.pkl', 'rb') as w:
faces = pickle.load(w)
faces = np.append(faces, face_data, axis=0)
with open('data/faces.pkl', 'wb') as w:
pickle.dump(faces, w)
Построчное объяснение…
- Строка 1–4 — Импорт библиотек, необходимых для распознавания лиц с помощью KNN.
- Строка 6–7 — Инициализация переменных.
- Строка 9 — Создание объекта VideoCapture для доступа к веб-камере. Аргумент 0 передается, когда мы хотим использовать встроенную веб-камеру ПК/ноутбука, используйте 1, если вы хотите использовать внешнюю камеру.
- Строка 11 — В этой строке мы создаем объект Haarcascade для обнаружения лиц в кадре.
- Строка 13 — Мы спрашиваем имя человека, который добавляет свое лицо.
- Строка 14. Установим ret=True (просто формальность для запуска бесконечного цикла).
- Давайте запустим цикл для выполнения распознавания лиц с помощью KNN…
- Строка 18 — мы используем cam.read() для чтения текущего кадра с веб-камеры.
- Строка 19 — Это выражение if говорит, что если мы получаем кадры с веб-камеры без ошибок, то продолжаем дальше, потому что в этом случае ret будет True.
- Строка 20 — преобразование изображения из BGR в оттенки серого, поскольку каскады Хаара эффективно обнаруживают лица на изображениях в градациях серого.
- Строка 22 — Давайте обнаружим лица, используя detectMultiscale. Теперь у нас есть координаты нашего лица как (x, y, w, h), где (x, y) — координаты верхнего левого прямоугольника вокруг лица, w - ширина, а h - высота прямоугольника.
- Строка 24 — Пройдемся по лицам.
- Строка 25 — Давайте извлечем лицо из кадра и изменим его размер до 50X50.
- Строка 28–29 — мы сохраняем лица в массиве face_data. Нам просто нужно 10 лиц, поэтому мы проверяем условие len(face_data) ‹ 10 и сохраняем лица через каждые 10 кадров, чтобы мы могли получить несколько разных изображений, а не изображения одного типа/ поза. Мы делаем это, чтобы сделать нашу модель более надежной.
- Строка 30 — мы рисуем прямоугольник вокруг лица, чтобы показать его в строке 33.
- Строка 31 — Простое увеличение значения i, которое отслеживает номер кадра.
- Строка 33 — наконец, показываем нашу рамку с прямоугольником вокруг обнаруженного лица.
- Строка 35–36. Если кто-то нажмет клавишу ESC или число сохраненных изображений равно 10, сломайте код и выйдите.

- Строка 37–39. В противном случае сломайте код сообщением Error.
- Строка 42–43 — Немного формальностей, уничтожьте все открытые окна изображения и освободите объект камеры.
- Строка 46–47. У нас есть 10 изображений 50X50 в face_data, давайте преобразуем их в массив и придадим ему правильную форму. После этого шага у нас будет массив face_data формы 10X7500 (10 строк, каждая строка отображает одно изображение), где 10 — это количество изображений, а 7500 — само сглаженное изображение (50X50X3) (структура показана ниже).
- Строка 49–52. Если у нас до сих пор нет файла ‘names.pkl’ в нашей папке с данными, это означает, что это первое лицо, которое мы добавляем. Поэтому создайте файл ‘names.pkl’, который будет содержать одно и то же имя 10 раз (потому что мы также сохраняем по 10 изображений каждого человека).
- Строка 53–59. В противном случае означает, что у нас есть 'names.pkl', означает, что это не первая добавляемая грань, поэтому просто загрузите 'names.pkl' добавьте 10 записей нашего текущего имени лица и сохраните его как 'names.pkl'.

- Строка 62–71 — то же самое, что мы сделали выше для имен, здесь мы делаем это для face_data.
- В строке 69 говорится о добавлении данных лица построчно.

Код для распознавания лиц в реальном времени с использованием KNN…
import cv2
import numpy as np
import pickle
from sklearn.neighbors import KNeighborsClassifier
with open('data/faces.pkl', 'rb') as w:
faces = pickle.load(w)
with open('data/names.pkl', 'rb') as f:
labels = pickle.load(f)
facec = cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')
cam = cv2.VideoCapture(0)
print('Shape of Faces matrix --> ', faces.shape)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(faces,labels)
# Face Recognition using KNN
while True:
ret, fr = cam.read()
if ret == True:
gray = cv2.cvtColor(fr, cv2.COLOR_BGR2GRAY)
face_coordinates = facec.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in face_coordinates:
fc = fr[y:y + h, x:x + w, :]
r = cv2.resize(fc, (50, 50)).flatten().reshape(1,-1)
text = knn.predict(r)
cv2.putText(fr, text[0], (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)
cv2.rectangle(fr, (x, y), (x + w, y + w), (0, 0, 255), 2)
cv2.imshow('livetime face recognition', fr)
if cv2.waitKey(1) == 27:
break
else:
print("error")
break
cv2.destroyAllWindows()
- Строка 1–4 — Импорт необходимых библиотек.
- Строка 6–7 — Загрузка данных лиц (X_train).
- Строка 9–10 — Загрузка данных имен/меток (y_train).
- Строки 12-14 — мы обсуждали выше.
- Строка 16 — Давайте проверим форму данных/матрицы лиц.

- Это 20X7500, потому что на момент написания этого блога в нем были лица всего 2 человек (по 10 фото каждого).
- Строка 17–18 — Мы объявили объект knn класса KNeighborsClassifier() с n_neighbors=5, что означает, что он будет проверять только 5 ближайших соседей для получения результатов.
- Строка 21–29 — мы обсуждали это ранее. Мы просто просматриваем кадры, обнаруживая в них лица и изменяя их размер.
- Строка 30. Мы делаем прогнозы, используя knn.predict(r), где r — измененное и сглаженное изображение/массив из 7500 точек.
- Строка 31–32 — Рисуем прямоугольник вокруг лица и имени на финальном окне.
- Строка 34 — Отображение наших результатов.
- Строка 35–36. Если мы нажмем клавишу ESC, сломаем код.
Давайте посмотрим на результаты распознавания лиц с помощью KNN…
- Я добавил лица двух человек, Шахрукх Кхана и Салмана Кхана.
ПРИМЕЧАНИЕ. Распознавание лиц с использованием алгоритма KNN и метода Haarcascades выполняется быстро, но не очень точно. В следующих блогах мы также обсудим лучшие методы распознавания лиц.
Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог.
Для дальнейшего объяснения кода и исходного кода посетите здесь —
Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…