de Manish Bansal

Recunoaștere facială folosind OpenCV în Java

Recunoastere faciala folosind OpenCV in Java
sursă: https://statescoop.com

De când a început boom-ul de Inteligență Artificială – sau reclama iPhone X cu caracteristica de deblocare a feței a ajuns pe ecranele TV – am vrut să încerc această tehnologie. Cu toate acestea, odată ce am început să caut Google, am găsit de obicei doar exemple de cod în Python. Și fiind un entuziast Java de șapte ani, m-am demotivat văzând asta. Prin urmare, am decis în cele din urmă să vânez biblioteci open source Java pentru acest lucru.

În prezent, există diverse biblioteci Java acolo. Dar cel mai popular pe care l-am găsit a fost OpenCV.

OpenCV este o bibliotecă open source de viziune computerizată care are tone de module precum detectarea obiectelor, recunoașterea feței și realitatea augmentată. Deși această bibliotecă este scrisă în C ++, oferă și legături Java testate în luptă.

Cu toate acestea, există o problemă. Ca parte a lansării software-ului, acesta oferă doar câteva module (cu legături Java) din cutie – iar recunoașterea facială nu este una dintre ele. Prin urmare, pentru ao utiliza, trebuie să-l construiți manual.

ad-banner

Aștepta! Ce? De ce?

Da – motivul citat de comunitatea OpenCV este că modulele nu sunt complet stabile. Prin urmare, acestea nu sunt incluse împreună cu versiunea standard. Prin urmare, le mențin într-un depozit separat aici.

Dacă nu aveți sau foarte puțină experiență C ++ (ca mine), trebuie să fi început deja să vă simțiți amețit când construiți singuri o bibliotecă C ++. Dar nu vă faceți griji, sunt aici să vă țin de mână și să vă ghidez prin acest proces obositor. Deci, să începem, nu-i așa?

Construirea OpenCV pentru Java de la zero

1611653470 625 Recunoastere faciala folosind OpenCV in Java
„Păsări care zboară în jurul unei clădiri și a unui șantier construit pe jumătate” de 贝莉 儿 NG pe Unsplash

Puteți găsi diverse resurse pentru instrucțiuni pas cu pas, cum ar fi acest, acest, și acest. Cu toate acestea, niciunul dintre ei nu a funcționat perfect pentru mine, întrucât lipsea un lucru sau altul. Cea mai apropiată pe care am găsit-o, care m-a ajutat, este acest unu. Cu toate acestea, nu trebuie să vă referiți la acesta. Puteți urma pașii de mai jos și veți fi buni.

În primul rând, trebuie să aveți software-ul de mai jos pe computer. Aici, construiesc o versiune pe 64 de biți a bibliotecii, deoarece dețin un computer pe 64 de biți. Dar îl puteți construi și pe 32 de biți.

Software-ul necesar este:

  1. Cmake (Am folosit versiunea 3.6.0 rc-4).
  2. Furnică (folosit intern pentru construirea JAR)
  3. MinGW – W64 GCC-8.1.0
  4. 64 de biți JDK 1.8

Un cuvânt despre MinGW: Aici, pentru a construi această bibliotecă, avem nevoie de compilatoare C ++. Puteți utiliza instrumentele Visual Studio (VS), ceea ce este mult mai bun. Cu toate acestea, nu am avut luxul să fac asta, deoarece l-am construit pe laptopul meu de birou și VS este un software licențiat indisponibil pentru persoanele Java de aici. Prin urmare, a trebuit să folosesc instrumente open source, iar cel mai bun este MinGW (Minimalist GNU pentru Windows).

De asemenea, este foarte important să utilizați versiunea corectă a MinGW. Descărcați versiunea x86_64-posix-seh, deoarece există suport pentru fire în această versiune. Nu am încercat toate celelalte versiuni. Dar versiunea x86_64-win32-sjlj nu funcționează deloc.

Pentru a oferi o perspectivă suplimentară, construirea este realizată de utilitarul numit face care vine ca parte a MinGW (bin / mingw32-make.exe). make este un runner de sarcini pentru C ++, precum „Ant” este pentru Java. Dar codul C ++ și scripturile make depind de platformă. Prin urmare, pentru a face distribuibilul independent de platformă, utilitatea CMake este folosit. CMake generează scripturi make-dependente de platformă.

Generarea configurațiilor de construire folosind CMake

Pasul 1: Descărcați codul sursă zip pentru ambele opencv și opencv_contrib, și extrageți-le într-un director. Mai mult, creați un folder numit „build” în același director (am creat „build_posix” așa cum este vizibil în capturile de ecran).

Pasul 2: Deschide CMake. Indicați „unde este codul sursă” către folderul extras opencv. Mai departe, indicați „unde să creați binare” în folderul „compilare” pe care l-ați creat.

1611653470 782 Recunoastere faciala folosind OpenCV in Java

Pasul 3: Adăugați folderul JDK 1.8 bin 64 de biți, folderul bin MinGW și folderul bin Ant la variabilele de mediu „PATH”. Acest lucru este important, deoarece CMake va căuta în variabilele de mediu pentru configurare. Dacă acest lucru nu se face, atunci va trebui să configurăm manual CMake la pasul 5.

În cazul în care aveți mai multe JDK-uri în sistemul dvs. și aveți deja unele JDK diferite în „PATH” și nu doriți să adăugați JDK 1.8 în „PATH”, puteți sări peste acest lucru. Dar configurați-l manual la pasul 5.

Pasul 4: Apăsați butonul „Configurare” și selectați „MinGw Makefiles” și „finish”. După aceasta, CMake va începe să vă configureze proiectul. Va dura ceva timp și, după ce termină configurarea, va afișa configurațiile disponibile curent.

În cazul în care vă întrebați dacă configurațiile generate pentru dvs. sunt corecte, puteți consulta jurnalele care au fost generate pentru mine aici și compară.

1611653470 572 Recunoastere faciala folosind OpenCV in Java

Pasul 5: Acum vine partea cea mai importantă – schimbarea configurațiilor. Mai întâi, faceți clic pe casetele de selectare „Grupate” și „Avansate” pentru a organiza configurațiile.

1611653470 512 Recunoastere faciala folosind OpenCV in Java
  • Verificați dacă ANT_EXECUTABLE (căutați „ANT_EXECUTABLE” în ​​caseta de căutare) și toate cele cinci configurații „JAVA” indică JDK 1.8 pe 64 de biți. Dacă Pasul 3 a fost realizat corect, atunci acest lucru va fi corect. În caz contrar, corectați-le.
1611653470 610 Recunoastere faciala folosind OpenCV in Java
  • Debifați casetele de selectare legate de Python (căutați „Python”) sub grupurile „BUILD” și „INSTALL”, deoarece nu avem nevoie de versiuni Python.
1611653470 455 Recunoastere faciala folosind OpenCV in Java
  • Dezactivați „WITH_MSMF” și „WITH_IPP & WITH_TBB”. Aceste libs sunt disponibile numai pentru VS.
  • Editați „OPENCV_EXTRA_MODULES_PATH” în grupul „OPENCV” și setați-l în folderul „module” din folderul sursă „opencv_contrib” pe care l-ați extras anterior.
1611653470 116 Recunoastere faciala folosind OpenCV in Java

După aceasta, apăsați din nou butonul „Configurare”. Aceasta va face configurațiile finale. Puteți consulta jurnalele care au fost generate pentru mine aici.

Notă: Asigurați-vă că comparați jurnalele „Configurați” generate cu cel pe care l-am distribuit în pastebin de mai sus. Dacă găsiți unele major diferență, apoi mai întâi încercați să vă corectați configurațiile și apăsați din nou pe „Configurare”. În caz contrar, există șanse ca versiunea dvs. să eșueze și să fie mai dificil de depanat.

Pasul 6: După aceasta, apăsați „Generați”. Va dura câteva secunde și apoi va închide CMake.

Compilarea OpenCV

Acum, dacă toate configurațiile generate mai sus sunt corecte, această sarcină va fi o briză (de 2-3 ore!). Deschideți promptul de comandă, mergeți la folderul „build” și executați comanda de mai jos.

mingw32-make.exe  -j5 > buildLogs.txt

Aici, -j5 este adăugat, care instruiește utilitarul make să ruleze cinci joburi în paralel. Acest lucru vă va face construcția mai rapidă, cel puțin teoretic.

Mai mult, nu uitați să împingeți jurnalele într-un fișier text. Acestea ar putea deveni prea mari, caz în care fereastra promptului de comandă ar putea să o trunchieze. Aveți nevoie de ele în cazul în care compilarea eșuează. Puteți consulta jurnalele de compilare generate în cazul meu aici.

Notă: Ordinea instrucțiunilor de jurnal ar putea să nu fie aceeași pentru dvs., deoarece compilarea are loc în cinci fire paralele.

Odată ce construirea s-a terminat, puteți verifica folderele „bin” și „lib” din directorul „build”. În „bin”, veți avea toate opencv * .exe și libopencv * .dll și JAR compilat. Mai mult, „lib” va avea dll-ul principal (libopencv_javaxxx.dll) împreună cu câteva fișiere mai dependente.

1611653470 295 Recunoastere faciala folosind OpenCV in Java
Dosarul „bin” după compilarea cu succes
1611653470 711 Recunoastere faciala folosind OpenCV in Java
Dosarul „lib” după compilarea cu succes

Mâini pe mâna cu API de recunoaștere a feței OpenCV

1611653470 698 Recunoastere faciala folosind OpenCV in Java
Fotografie de rawpixel pe Unsplash

Acum că ați construit biblioteca, trebuie mai întâi să configurați variabilele de mediu, precum și biblioteca utilizatorului, în Eclipse.

  1. Creați o variabilă OPENCV_JAVA_BIN și indicați-o către folderul „bin” generat în directorul „build”.
  2. Creați OPENCV_JAVA_LIB și indicați-l către folderul „lib” generat în directorul „build”.
  3. Adăugați ambele variabile de mai sus la variabila „PATH”.
  4. Deschideți Eclipse și creați o nouă bibliotecă de utilizator pe care o veți folosi pentru proiectul dvs. de recunoaștere a feței. Mergeți la „Window”> „Preferences”. Din meniu, navigați sub „Java”> „Construiți calea”> „Biblioteci de utilizatori” și alegeți „Nou …”. Introduceți un nume pentru bibliotecă – de exemplu, opencv – și selectați biblioteca de utilizator nou creată. Alegeți „Adăugați JAR-uri externe…” și navigați pentru a selecta „opencv-3xx.jar” de pe computer.

După aceasta, există nu este nevoie pentru a lega biblioteca nativă, deoarece aceasta a fost adăugată la variabilele „cale” la pasul 3.

Odată ce ați terminat cu această configurare, puteți clona depozitul meu Git din aici și importați proiectul în spațiul de lucru Eclipse. Mai mult, va trebui să adăugați JDK 1.8, precum și biblioteca de utilizator opencv (tocmai creată mai sus) la acest proiect. După ce ați terminat, veți fi gata să testați noua bibliotecă OpenCV construită.

Începând cu această scriere, există trei programe în acest proiect.

  • Salut Lume: puteți rula acest lucru pentru a testa dacă configurarea bibliotecii OpenCV este ok. Dacă acest lucru nu funcționează corect, trebuie să le rezolvați primul. Singurele probleme pe care le veți întâlni în acest moment vor fi legate de variabilele de mediu ale sistemului sau de configurarea bibliotecii utilizatorului.
  • Detectare facială: puteți utiliza acest lucru pentru a testa modulul de detectare a feței. Este un modul diferit de recunoașterea feței. Acesta este un modul care este livrat împreună cu versiunea standard a OpenCV. Începând cu această scriere, putem oferi o imagine ca intrare în program și va detecta toate fețele din interiorul imaginii. Imaginea de ieșire are dreptunghiuri verzi desenate pe toate fețele detectate.
1611653470 145 Recunoastere faciala folosind OpenCV in Java
Imagine de intrare pentru programul Face Detection
1611653470 201 Recunoastere faciala folosind OpenCV in Java
Imagine de ieșire a programului de detectare a feței
  • Recunoaștere facială: modulul OpenCV facerec include trei algoritmi:
  1. Fețe proprii
  2. Fisherfaces
  3. Histograme cu modele binare locale.

Pentru detalii tehnice despre toți acești algoritmi, puteți consulta acest articol oficial. În scop demonstrativ, vă voi arăta cum să utilizați algoritmul Eigenfaces.

Mai întâi, trebuie Descarca date de instruire din baza de date a feței. Aceste date conțin zece imagini diferite pentru fiecare dintre cele 40 de subiecte distincte (400 de imagini). Pentru unii subiecți, imaginile au fost realizate în momente diferite, variind iluminarea, expresiile faciale (ochi deschiși / închiși, zâmbind / fără zâmbet) și detaliile feței (ochelari / fără ochelari). După ce le extrageți pe computer, trebuie să pregătiți un fișier .csv conținând calea fiecărei imagini, împreună cu eticheta corespunzătoare.

Pentru a fi mai ușor, am un TrainingData.txt în depozitul meu Git. Cu toate acestea, trebuie să editați fișierul și să modificați căile imaginilor conform locației din directorul computerului.

Notă: baza de date a feței descărcate conține imagini în format .pgm. Acest format este nu sunt acceptate de Windows. Pentru a le converti efectiv în .jpg, am adăugat PGMToJPGConverter în depozitul meu. Puteți utiliza acest lucru pentru a converti imaginile și a arunca o privire reală asupra datelor de antrenament.

După aceasta, puteți rula programul de recunoaștere a feței. Mai jos sunt pașii efectuați în program:

  1. Biblioteca OpenCV este încărcat ca de obicei.
  2. Fișierul .csv este citit și sunt două ArrayList creată. Una pentru matricea imaginilor și alta pentru etichetele corespunzătoare.
  3. Din cele 400 de imagini de intrare, ultima intrare din structura datelor din listă este eliminat și salvat pentru testarea modelului instruit ulterior.
  4. După aceea, cele 399 de imagini rămase sunt utilizate pentru Instruire algoritmul Eigenfaces.
  5. Odată ce antrenamentul este complet, modelul este rugat prezice eticheta imaginii pe care am eliminat-o la pasul 3.
1611653471 177 Recunoastere faciala folosind OpenCV in Java
Rezultatul programului de recunoaștere a feței

Aici, putem observa că algoritmul este capabil să prezică eticheta subiectului nostru de testare cu o valoare de încredere de 1807. Cu cât valoarea este mai mică, cu atât predicția este mai bună. În mod similar, puteți efectua acest exercițiu cu alți doi algoritmi. Codul C ++ poate fi descărcat de la aici și aici.

Actualizare (27 decembrie 2018): În cazul în care considerați că construirea legăturilor java openCV este dureroasă, atunci am o veste bună pentru dvs. Recent, am găsit o modalitate mai ușoară de a obține toate dependențele openCV pentru java. Pentru detalii complete, vă rugăm să consultați un alt articol.

Felicitări!! ? Ai ajuns până la capăt. Și dacă ți-a plăcut? Acest articol, apasă butonul de batere de mai jos?. Înseamnă mult pentru mine și îi ajută pe ceilalți să vadă povestea.