Итак, в сегодняшнем блоге мы увидим, как мы можем выполнять распознавание лиц, используя 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, посетите мой блог.



Для дальнейшего объяснения кода и исходного кода посетите здесь



Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…