de Rishav Agarwal

Smilefie: cum puteți captura automat selfie-uri prin detectarea unui zâmbet

Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Opuneți-vă să faceți niște lucruri interesante!

Zece secunde de luat: folosiți Python și OpenCV pentru a crea o aplicație care captează automat un selfie la detectarea unui zâmbet. Acum hai să intrăm în asta. 🙂

Am dat peste asta publicitate pentru Oppo – telefonul surprinde automat un selfie atunci când frumoasa actriță îi zâmbește camerei. Aceasta părea o provocare destul de ușoară, având în vedere minunatul dlib bibliotecă din Python.

În această postare, voi vorbi despre modul în care puteți crea o aplicație similară care captează un selfie de pe o cameră web la detectarea unui zâmbet. Toate în ~ 50 de linii de cod.

Prezentare generală a procesului

  1. Utilizați detectorul de reper facial în dlib pentru a obține coordonatele gurii
  2. Configurați un prag de zâmbet, utilizând un raport de aspect gură (MAR)
  3. Accesați camera web pentru a configura un flux live
  4. Capturați imaginea
  5. Salvați imaginea
  6. Închideți alimentarea cu came

Biblioteci necesare

  • Numpy: Folosit pentru calcule și manipulări rapide ale matricei.
  • dlib: Biblioteca care conține reperele faciale.
  • Cv2: Biblioteca Open CV utilizată pentru manipularea și salvarea imaginilor.
  • Scipy.spatial : Folosit pentru a calcula distanța euclidiană între punctele feței.
  • Imutile: Biblioteca pentru a accesa fluxul video.

Toate bibliotecile pot fi instalate folosind pip, cu exceptia dlib. Pentru dlib trebuie să instalăm CMake și impuls. Iată cum să le instalați pe macOS folosind preparare.

Dacă nu aveți bere, iată cum se instalează Homebrew.

Instalați CMake

brew install cmake

Instalați boost

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

A doua comandă se asigură că boost-ul este utilizabil cu Python 3.

Instalați dlib

După aceasta, putem instala dlib folosind

pip install dlib

Bacsis: Îmi place să folosesc Anaconda, un mediu virtual pentru fiecare proiect separat. Aici este un blog minunat despre motivele și motivele pentru care conda mediu inconjurator.

Importul bibliotecilor

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

Detector de reper facial

Detectorul de reper facial este un API implementat în interiorul dlib. Produce 68 coordonate x- y care mapează structurile faciale specifice.

Acest lucru poate fi vizualizat ca:

Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Șablon de index de repere faciale preluat din PyImageSearch.com

Ne vom concentra asupra gurii care poate fi accesată prin gama de puncte [49,…, 68]. Există douăzeci de coordonate.

Folosind dlib, putem obține aceste caracteristici folosind următorul cod:

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) ne primește prima și ultima coordonate pentru gură.

Puteți descărca fișierul reper pre-instruit aici sau pur și simplu trimiteți-mi un e-mail și vi-l trimit. Nu uitați să-l extrageți.

Funcția de zâmbet

Imaginea de mai jos arată doar cele douăzeci de coordonate ale gurii:

Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Partea gurii tăiată din PyImageSearch.com

Am creat un raport de aspect gură (MAR) inspirat din două articole despre detectarea clipirii. Acestea sunt Detectare clipire ochi în timp real folosind repere faciale. și Detectarea clipirii ochilor cu OpenCV, Python și dlib. Al doilea articol se extinde pe primul. Ambele discută un raport de aspect, în acest caz pentru ochi (EAR):

1611478028 280 Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Cele șase repere faciale pentru ochi.

Formula pentru EAR este:

D = distanța dintre p1 și p4

L = media distanței dintre p2 și p6; p3 și p5

1611478028 435 Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Ecuația EAR
EAR= L/D

În cazul nostru, MAR este definit pur și simplu ca relația punctelor prezentate mai jos

1611478029 901 Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Partea gurii extrasă din figura de mai sus

Calculăm distanța dintre p49 și p55 ca D și calculăm distanțele dintre:

p51 și p59

p52 și p58

p53 și p57

Să-i spunem L, folosind aceeași structură de denumire:

1611478029 181 Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Ecuația MAR
MAR = L/D

Iată funcția de calcul al 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

Bacsis: Când împărțim matricea punctul 49 devine primul element al matricei (0) și toți ceilalți indici sunt ajustați în consecință:

Zâmbind cu gura închisă crește distanța dintre p49 și p55 și scade distanța dintre punctele de sus și de jos. Deci, L va scădea și D va crește.

Zâmbetul cu gura deschisă duce la scăderea D și la creșterea L.

Vedeți cum se schimbă MAR când schimb forma de gură:

1611478029 450 Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
MAR se schimbă cu trăsăturile feței

Pe baza acestui fapt, am pus un zâmbet să fiu un MAR al <.3 sau &gt; .38. Aș fi putut lua doar D deoarece D va crește întotdeauna când cineva zâmbește. Dar D nu va fi același pentru toți, deoarece oamenii au forme de gură diferite.

Acestea sunt estimări grosolane și pot include alte emoții precum „uimire”. Pentru a depăși acest lucru, puteți crea un model mai avansat. Ați putea lua în considerare mai multe trăsături faciale sau pur și simplu să antrenați un clasificator al emoțiilor bazat pe CV.

Acum, că avem o funcție de zâmbet, putem implementa captura video.

Captură video

Accesați camera web

Putem accesa camera web prin biblioteca imutils folosind următoarea comandă. cv2.namedWindow creează o fereastră nouă:

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

Detectare facială

Acum ajungem la bucla principală unde se întâmplă magia. Mai întâi capturăm un singur cadru și îl convertim în tonuri de gri pentru calcul ușor. Folosim acest lucru pentru a detecta fața. cv2.convexHull(mouth) detectează conturul gurii și cv2.drawContours desenează un contur verde în jurul său.

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)

Bacsis: această configurare poate detecta multiplu zâmbește într-un singur cadru.

Captură automată

Apoi stabilim condiția de captură automată:

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

Aici, consider că un zâmbet este „demn de selfie” dacă persoana îl ține o jumătate de secundă sau 30 de cadre.

Verificăm dacă MAR este <.3 sau & gt; .38 pentru cel puțin 15 cadre și apoi salvați al 16-lea cadru. Fișierul este salvat în același folder cu codul cu numele „opencv_frame_ .png”.

Am adăugat câteva time.sleep funcții pentru a netezi experiența. Telefoanele rezolvă de obicei aceste probleme hardware folosind trucuri precum animații sau încărcarea ecranelor.

Bacsis: Această parte se află în bucla while.

De asemenea, imprimăm MAR-ul pe cadru cu cv2.putText funcţie:

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

Bacsis: Mac-ul meu are o cameră de 30 fps, așa că am folosit 30 ca număr de cadre. Puteți schimba acest lucru în consecință. O modalitate mai ușoară este de a găsi fps-ul prin utilizarea funcției fps în imutils.

Închideți fluxul video

În cele din urmă, puneți o comandă de oprire care oprește transmisia video atunci când este apăsată tasta „q”. Acest lucru se realizează prin adăugarea:

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

În cele din urmă, distrugem fereastra folosind

cv2.destroyAllWindows()vs.stop()

și am terminat!

Întregul cod în acțiune:

1611478030 534 Smilefie cum puteti captura automat selfie uri prin detectarea unui zambet
Înregistrat folosind Quicktime

Puteți găsi întregul cod pe GitHub.

Aceasta a fost o aplicație de bază a uimitoarei biblioteci dlib. De aici, puteți continua să creați lucruri precum ale dvs. filtre Snapchat, supraveghere acasă de înaltă tehnologie sisteme, sau chiar un detector de fericire post-orwellian.

Tweet la mine în cazul în care veți ajunge să faceți mai multe lucruri interesante cu asta sau să găsiți un detector de zâmbet mai bun. O altă idee interesantă este să faceți o post-procesare a imaginii capturate (ca în reclama) pentru a face imaginea mai frumoasă.

Mulțumesc pentru lectură. Dacă ți-a plăcut ceea ce ai citit, bate din palme și urmărește-mă. Ar însemna mult și m-ar încuraja să scriu mai mult. Să ne conectăm Stare de nervozitate și Linkedin de asemenea 🙂