как можно автоматически делать селфи, проявляя улыбку

1656565096 kak mozhno avtomaticheski delat selfi proyavlyaya ulybku

автор Ришав Агарвал

7fgfNQytU7c8fe0xQzcAYX9NHEptBDxsdkOr
Оппо делает крутые вещи!

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

Я наткнулся на эту рекламу Oppo – телефон автоматически делает селфи, когда красивая актриса улыбается в камеру. Это казалось довольно легким вызовом, учитывая замечательное dlib библиотека из Python.

В этой публикации я расскажу о том, как можно создать подобное приложение, снимающее селфи с веб-камеры при обнаружении улыбки. Все в ~50 строках кода.

Обзор процесса

  1. Используйте детектор ориентиров лица в dlib, чтобы получить координаты рта
  2. Настройте порог улыбки, используя соотношение сторон (MAR)
  3. Доступ к веб-камере, чтобы настроить прямую трансляцию
  4. Зафиксируйте изображение
  5. Сохраните изображение
  6. Закройте подачу кулачков

Нужны библиотеки

  • Numpy: Используется для быстрых матричных вычислений и манипуляций.
  • dlib: Библиотека, содержащая ориентиры лица.
  • Cv2: библиотека Open CV, используемая для манипуляций с изображениями и их сохранения.
  • Scipy.пространственный : Используется для вычисления евклидового расстояния между точками лица.
  • Imutils: Библиотека для доступа к видеопотоку

Все библиотеки можно установить с помощью pip, кроме dlib. Для dlib мы должны установить CMake и усиление. Вот как их установить на macOS с помощью заварить.

Если у вас нет brew, вот как это установить Домашний.

Установите CMake

brew install cmake

Установите boost

brew install boostbrew install boost-python --with-python3

Вторая команда гарантирует, что boost можно использовать из Python 3.

Установите dlib

После этого мы можем установить dlib с помощью

pip install dlib

Совет: Мне нравится пользоваться анаконда, виртуальная среда для каждого отдельного проекта. Вот отличный блог о том, почему и как conda окружающая среда.

Импорт библиотек

from scipy.spatial import distance as distfrom imutils.video import VideoStream, FPSfrom imutils import face_utilsimport imutilsimport numpy as npimport timeimport dlibimport cv2

Детектор ориентиров на лице

Детектор ориентиров лица – это API, реализуемый внутри dlib. Это производит 68 x-y-координат отражающие конкретные структуры лица.

Это можно представить как:

x7Tv1rIkd4qoPU8ddffrT79ZhOPyNfSpQ8tk
Шаблон индекса ориентиров лица взят из PyImageSearch.com

Мы сосредоточимся на рту, к которому можно получить доступ через точечный диапазон. [49,…, 68]. Есть двадцать координат.

Используя dlib, мы можем получить эти функции, используя следующий код:

shape_predictor= “../shape_predictor_68_face_landmarks.dat”detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(shape_predictor)(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS[“mouth”]

(mStart, mEnd) получает первую и последнюю координаты для устья.

Вы можете скачать предварительно подготовленный файл ориентиров здесь или просто отправить мне электронное письмо, и я пришлю его вам. Не забудьте вытащить его.

Функция улыбки

На рисунке ниже показано только двадцать координат рта:

NeL2-TugkLgWxgvJTLb3qb1Y1PHINVo0yXpZ
Часть рта обрезана из PyImageSearch.com

Я создал соотношение сторон рта (MAR) по мотивам двух статей об определении моргания. Это обнаружение моргания в реальном времени с помощью ориентиров лица. и обнаружение моргания с помощью OpenCV, Python и dlib. Вторая статья расширяет первую. Оба обсуждают соотношение сторон, в этом случае для глаз (EAR):

SGhh5QLStuWyQp-wZbrrqyrMpO7MiSwIMs2J
Шесть ориентиров лица для глаз.

Формула EAR:

D = расстояние между p1 и p4

L= среднее расстояние между p2 и p6; p3 и p5

10jBkgyiCKZn78dtG0QmVfsa5PNSmh2FUDKJ
Уравнение EAR
EAR= L/D

В нашем случае MAR определяется просто как соотношение точек, показанных ниже

QwHmcIumrY-z-gEECt3U9QtfDqHRUdYwN0N4
Ротовая часть вытянута из рисунка выше

Мы вычисляем расстояние между p49 и p55 как D и усредняем расстояния между:

p51 и p59

p52 и p58

p53 и p57

Назовем это L, используя ту же структуру имен:

Uf9mPQOzmVvjepNh7lNmriCOO7c3unXHSlsP
Уравнение MAR
MAR = L/D

Вот функция для вычисления MAR.

def smile(mouth): A = dist.euclidean(mouth[3], mouth[9]) B = dist.euclidean(mouth[2], mouth[10]) C = dist.euclidean(mouth[4], mouth[8]) L = (A+B+C)/3 D = dist.euclidean(mouth[0], mouth[6]) mar=L/D return mar

Совет: Когда мы соединяем массив точки 49 становится первым элементом массива (0), а все остальные индексы корректируются соответственно:

Улыбка с закрытым ртом увеличивает расстояние между p49 и p55 и уменьшает расстояние между верхней и нижней точками. Следовательно, L снизится, а D увеличится.

Улыбка с открытым ртом приводит к уменьшению D и увеличению L.

Посмотрите, как меняется MAR, когда меняю форму рта:

jd5C0ikecDvdslCS9k3REIawOdi0-urNXZnv
MAR меняется с чертами лица

Исходя из этого, я поставил улыбку как MAR <.3 или &gt;.38. Я мог просто взять д поскольку D всегда увеличивается, когда человек улыбается. Но D не будет одинаковым для всех, поскольку у людей разная форма рта.

Это грубые оценки и могут включать другие эмоции, такие как «благ». Чтобы справиться с этим, можно создать более совершенную модель. Вы можете учесть больше черт лица или просто потренировать классификатор эмоций на основе резюме.

Теперь когда у нас есть функция улыбки, мы можем реализовать съемку видео.

Увлечения видео

Доступ к веб-камере

Мы можем получить доступ к веб-камере через библиотеку imutils с помощью следующей команды. cv2.namedWindow создает новое окно:

vs = VideoStream(src=0).start()fileStream = Falsetime.sleep(1.0)cv2.namedWindow('frame',cv2.WINDOW_NORMAL)

Распознавание лица

Теперь мы подходим к основному циклу, где происходит магия. Сначала мы фиксируем один кадр и превращаем его в градации серого для удобства вычислений. Мы используем это для обнаружения лица. cv2.convexHull(mouth) определяет очертания рта и cv2.drawContours рисует вокруг него зеленый контур.

while True: frame = vs.read() frame = imutils.resize(frame, width=450) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) rects = detector(gray, 0) for rect in rects:  shape = predictor(gray, rect)  shape = face_utils.shape_to_np(shape)  mouth= shape[mStart:mEnd]  mar= smile(mouth)  mouthHull = cv2.convexHull(mouth)  cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)

Совет: эта настройка может обнаружить множественные улыбки в одном кадре.

Автозахват

Далее мы устанавливаем условие автоматического захвата:

if mar <= .3 or mar > .38 : COUNTER += 1 else:  if COUNTER >= 15:   TOTAL += 1   frame = vs.read()   time.sleep(0.3)   img_name = “opencv_frame_{}.png”.format(TOTAL)   cv2.imwrite(img_name, frame)   print(“{} written!”.format(img_name))   cv2.destroyWindow(“test”)  COUNTER = 0

Здесь я считаю улыбку «достойной селфи», если человек держит ее полсекунды или 30 кадров.

Мы проверяем, есть ли MAR < .3 или &gt; .38 по крайней мере 15 кадров, а затем сохраните 16 кадров. Файл хранится в той же папке, что и код с названием opencv_frame_.png».

Я добавил несколько time.sleep функции для сглаживания опыта Телефоны обычно обходят эти аппаратные проблемы, используя такие приемы, как анимация или экраны загрузки.

Совет: Эта часть находится внутри цикла while.

Мы также печатаем MAR на рамке с помощью cv2.putText функция:

cv2.putText(frame, “MAR: {}”.format(mar), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

Совет: Мой Mac имеет камеру 30 кадров в секунду, поэтому я использовал 30 в качестве кадров. Вы можете изменить это. Самый простой способ найти кадры в секунду – это использовать функцию fps в imutils.

Выйти из потокового видео

Наконец, введите quit, которая останавливает потоковое видео при нажатии клавиши «q». Это достигается добавлением:

key2 = cv2.waitKey(1) & 0xFF if key2 == ord(‘q’): break

Наконец, мы разрушаем окно с помощью

cv2.destroyAllWindows()vs.stop()

и мы кончили!

Весь код в действии:

PCbadKbc66wwGKIaXBgHBNAIuhKnap6fwylR
Записан с помощью Quicktime

Вы можете найти весь код на моем GitHub.

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

Твитьте мне на тот случай, если вы в конечном итоге будете делать какие-нибудь крутые вещи с этим или найдете лучший детектор улыбки. Еще одна замечательная идея – сделать определенную постобработку отснятого изображения (как в рекламе), чтобы сделать изображение более красивым.

Спасибо, что прочли. Если вам понравилось то, что вы прочли, хлопайте и следите за мной. Это многое означало бы и побудило бы писать больше. Давайте также подключимся в Twitter и Linkedin 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *