Привет! Вы когда-нибудь задумывались о том, как начать свое путешествие в области машинного обучения/ИИ с помощью Python? Ну, не бойся! Вы можете начать с создания очень простого и легкого детектора лицевых эмоций с помощью python.
Схема
Это в основном план того, над чем мы будем работать!
В нашей программе мы попытаемся реализовать:
- Веб-камера (Примечание: я поместил стоковое изображение в схему в качестве заполнителя)
- Вывод, который был определен машиной и отображается в виде текста в окне
- Квадрат, следующий за лицом, которое находится в веб-камере
Теперь, когда у нас есть довольно четкое представление о том, что мы пытаемся сделать, давайте начнем!
Кодирование
А теперь время для веселой части! КОДИРОВАНИЕ 🔥🔥🔥!!!
Создайте новый каталог, в котором находится наш проект. Теперь, используя ваш любимый редактор кода (рекомендую 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()
Примечание. Если хотите, вы также можете изменить его, чтобы предсказать расу или пол! Может быть, даже все три! Я надеюсь, что вы попробуете это, и я надеюсь, что вам понравился этот пост! Спасибо, что дочитали до сюда!
ДО ВСТРЕЧИ В СЛЕДУЮЩИЙ РАЗ!