Привет! Вы когда-нибудь задумывались о том, как начать свое путешествие в области машинного обучения/ИИ с помощью Python? Ну, не бойся! Вы можете начать с создания очень простого и легкого детектора лицевых эмоций с помощью python.

Схема

Это в основном план того, над чем мы будем работать!

В нашей программе мы попытаемся реализовать:

  1. Веб-камера (Примечание: я поместил стоковое изображение в схему в качестве заполнителя)
  2. Вывод, который был определен машиной и отображается в виде текста в окне
  3. Квадрат, следующий за лицом, которое находится в веб-камере

Теперь, когда у нас есть довольно четкое представление о том, что мы пытаемся сделать, давайте начнем!

Кодирование

А теперь время для веселой части! КОДИРОВАНИЕ 🔥🔥🔥!!!

Создайте новый каталог, в котором находится наш проект. Теперь, используя ваш любимый редактор кода (рекомендую Visual Studio Code), создайте новый файл с именем main.py. Здесь вы будете вводить весь свой код, и это будет тот же файл, который вы будете выполнять.

Сначала мы начнем с импорта важных модулей Python и загрузки предварительно обученных данных.

Модули:

Данные:

Чтобы установить модули, вы можете просто запустить эту команду в каталоге, где находится ваш проект.

pip install opencv-python dlib deepface

Если это не сработало, убедитесь, что вы установили pip в среду PATH! Если у вас установлены и python2, и python3, и эта команда не сработала, используйте pip3 install opencv-python dlib deepface .

Теперь установите файл данных по ссылке выше и добавьте его в каталог, в котором размещен ваш проект.

Теперь пора приступить к кодированию! Откройте файл main.py, который вы создали ранее, и добавьте в него эти строки кода.

import cv2
import dlib
from deepface import DeepFace

cap = cv2.VideoCapture(0)

hog_face_detector = dlib.get_frontal_face_detector()

dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

Первые три строки в основном просто импортируют модули, которые вы загрузили ранее, в файл, чтобы вы могли их использовать.

cap = cv2.VideoCapture(0)

⬆️ В основном запускает веб-камеру при выполнении файла, и вам может потребоваться разрешить определенные разрешения на вашем компьютере перед его выполнением. Должно появиться всплывающее окно с сообщением «Разрешить этому приложению записывать видео?», и вы должны нажать «Да».

hog_face_detector = dlib.get_frontal_face_detector()

⬆️ Инициализирует детектор лиц в вашей программе, чтобы вы могли анализировать любой ввод, который вы получаете.

dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

⬆️ Загружает предварительно обученные данные, которые мы установили ранее, и эти данные помогают нам распознавать эмоции, определенные лицевые ориентиры/точки на лице и многое другое.

Теперь вы можете начать добавлять этот длинный фрагмент кода в свой файл, который на первый взгляд может показаться немного запутанным:

while True:
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = hog_face_detector(gray)
    for face in faces:
        x = face.left()
        y = face.top()
        w = face.width()
        h = face.height()

        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    emotion = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
    dominant_emotion = emotion[0]['dominant_emotion']

    emotion_text = cv2.putText(frame, dominant_emotion, (100, 200), cv2.FONT_HERSHEY_COMPLEX, 3, (50, 205, 50), 2, cv2.LINE_AA)

    cv2.imshow("Facial Emotion Detector", frame)

    key = cv2.waitKey(1)
    if key == 27:
        break

Первые три строки инициируют бесконечный цикл, а также инициируют кадр. Это означает, что он генерирует изображения с веб-камеры, которые в основном представляют собой видео. Он также преобразует кадры в оттенки серого, потому что компьютеру намного проще обрабатывать ввод и давать лучший результат.

faces = hog_face_detector(gray)

⬆️ Этот фрагмент кода в основном обрабатывает и анализирует данный кадр.

for face in faces:
        x = face.left()
        y = face.top()
        w = face.width()
        h = face.height()
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

⬆️ Этот цикл for в основном создает прямоугольник вокруг лица, которое он обнаруживает. x, y, w, and h — это стороны прямоугольника, а cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) рисует его.

emotion = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
dominant_emotion = emotion[0]['dominant_emotion']

⬆️ В этом фрагменте лежит наш вывод! Поскольку DeepFace обычно выдает такой вывод:

[{'emotion': {'angry': 0.0003611648480728036, 'disgust': 9.961692759477125e-13, 'fear': 0.04854781145695597, 'happy': 6.235278515731579e-07, 'sad': 85.9003484249115, 'surprise': 4.40607162455838e-17, 'neutral': 14.050744473934174}, 'dominant_emotion': 'sad', 'region': {'x': 0, 'y': 0, 'w': 1280, 'h': 720}}]

Что крайне некрасиво! 🤮 Обычно мы пытаемся отформатировать его, чтобы отображались только dominant_emotion, которые являются основной эмоцией, которую он вычисляет! Это то, что делает dominant_emotion = emotion[0]['dominant_emotion'].

emotion_text = cv2.putText(frame, dominant_emotion, (100, 200), cv2.FONT_HERSHEY_COMPLEX, 3, (50, 205, 50), 2, cv2.LINE_AA)

⬆️ Код выше просто отображает его в окне!

cv2.imshow("Facial Emotion Detector", frame)

⬆️ Это создает новое окно и показывает его пользователю после выполнения программы!

key = cv2.waitKey(1)
if key == 27:
    break

⬆️ И, наконец, этот бит просто гарантирует, что если нажата клавиша Esc., программа завершится. Но, если он не завершается, просто зайдите в терминал и выполните Ctrl+C . (даже для пользователей Mac 😉) Теперь, вне этого вечного цикла, мы добавляем этот бит:

cap.release()
cv2.destroyAllWindows()

Этот бит также просто завершает работу приложения!

УРА! Вы прошли курс! У-у-у! Похлопайте себя по спине! 🙌. Теперь не забудьте запустить свою программу и посмотреть, как она начнет действовать!

Если у вас все еще есть какие-либо вопросы, не стесняйтесь обращаться ко мне в разделе комментариев!

Окончательный код:

import cv2
import dlib
from deepface import DeepFace

cap = cv2.VideoCapture(0)

hog_face_detector = dlib.get_frontal_face_detector()

dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

while True:
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = hog_face_detector(gray)
    for face in faces:
        x = face.left()
        y = face.top()
        w = face.width()
        h = face.height()

        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    emotion = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
    dominant_emotion = emotion[0]['dominant_emotion']

    emotion_text = cv2.putText(frame, dominant_emotion, (100, 200), cv2.FONT_HERSHEY_COMPLEX, 3, (50, 205, 50), 2, cv2.LINE_AA)

    cv2.imshow("Facial Emotion Detector", frame)

    key = cv2.waitKey(1)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

Примечание. Если хотите, вы также можете изменить его, чтобы предсказать расу или пол! Может быть, даже все три! Я надеюсь, что вы попробуете это, и я надеюсь, что вам понравился этот пост! Спасибо, что дочитали до сюда!

ДО ВСТРЕЧИ В СЛЕДУЮЩИЙ РАЗ!