Bezdepbonusu7Программирование: статьи и ответы

КАК СДЕЛАТЬ РАСПОЗНАВАНИЕ ЛИЦ ИСПОЛЬЗОВАНИЕМ KNN - С ИСХОДНЫМ КОДОМ - ИНТЕРЕСНЫЙ ПРОЕКТ

Архив Bezdepbonusu77 мин чтения

Итак, в сегодняшнем блоге мы увидим, как мы можем выполнять распознавание лиц, используя KNN (алгоритм K-ближайших соседей) и каскады Хаара. Каскады Хаара работают очень быстро по сравнению с другими способами обнаружения лиц (такими как MTCNN), но с компромиссом в точности. Его точность немного меньше по сравнению с такими большими мальчиками, как MTCNN.

Полную статью с исходным кодом читайте здесь -https://machinelearningprojects.net/face-recognition-using-knn/

В сегодняшнем блоге мы увидим 2 скрипта:

  • Первый предназначен для добавления нового лица.
  • Второй предназначен для распознавания лиц в реальном времени с использованием KNN.
loading="lazy" referrerpolicy="strict-origin-when-cross-origin">

Давай сделаем это...

Прежде чем продолжить, пожалуйста прочитайте мой предыдущий пост: САМЫЙ ПРОСТОЙ СПОСОБ ВЫПОЛНИТЬ ОБНАРУЖЕНИЕ ЛИЦ И ГЛАЗ В 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'em> добавьте 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...

  • Я добавил лица двух человек, Шахрукх Кхана и Салмана Кхана.
loading="lazy" referrerpolicy="strict-origin-when-cross-origin">

ПРИМЕЧАНИЕ. Распознавание лиц с использованием алгоритма KNN и метода Haarcascades выполняется быстро, но не очень точно. В следующих блогах мы также обсудим лучшие методы распознавания лиц.

Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог.



Главная - Проекты машинного обучения
Машинное обучение (МО) - это изучение компьютерных алгоритмов, которые автоматически улучшаются благодаря опыту и использованию...machinelearningprojects.net



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



Как выполнить распознавание лиц с помощью KNN - с исходным кодом - интересный проект - 2021 - Машина...
Итак, в сегодняшнем блоге мы увидим, как мы можем выполнить распознавание лиц с помощью KNN (алгоритм поиска ближайших соседей) и...machinelearningprojects.net



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

Machine LearningDeep LearningComputer VisionArtificial Intelligence

Похожие материалы

Статья из архива сайта: перевод и редактура материала сообщества разработчиков. Версии библиотек и инструментов могли измениться, сверяйтесь с официальной документацией.