Ansigtsgenkendelse ved hjælp af OpenCV i Java

Lige siden kunstig intelligens-boom begyndte - eller iPhone X-reklamen med ansigtslåsning-funktionen ramte tv-skærme - har jeg ønsket at prøve denne teknologi. Men når jeg først begyndte at google om det, fandt jeg typisk kun kodeeksempler i Python. Og da jeg var Java-entusiast i syv år, blev jeg demotiveret, da jeg så det. Derfor besluttede jeg endelig at jage efter Java open source-biblioteker til dette.

I øjeblikket er der forskellige Java-biblioteker derude. Men den mest populære, jeg fandt, var OpenCV.

OpenCV er et open source-computersynsbibliotek, der har masser af moduler som genstandsdetektion, ansigtsgenkendelse og augmented reality. Selvom dette bibliotek er skrevet i C ++, tilbyder det også kamptestede Java-bindinger.

Der er dog et problem. Som en del af sin softwareudgivelse tilbyder den kun et par moduler (med Java-bindinger) ud af kassen - og ansigtsgenkendelse er ikke en af ​​dem. Derfor skal du manuelt bygge det for at bruge det.

Vente! Hvad? Hvorfor?

Ja - årsagen til OpenCV-samfundet er, at modulerne ikke er helt stabile. Derfor er de ikke samlet sammen med standardudgivelsen. Derfor vedligeholder de dem i et separat arkiv her.

Hvis du ikke har nogen eller meget lidt C ++ erfaring (som mig), skal du allerede være begyndt at blive svimmel over at bygge et C ++ bibliotek selv. Men rolig, jeg er her for at holde din hånd og lede dig gennem denne kedelige proces. Så lad os begynde, skal vi?

Opbygning af OpenCV til Java fra bunden

Du kan finde forskellige ressourcer til trinvise instruktioner som denne, denne og denne. Imidlertid fungerede ingen af ​​dem perfekt for mig, da en eller anden ting manglede. Det tætteste jeg fandt, som hjalp mig, er denne. Du behøver dog ikke henvise til det. Du kan følge nedenstående trin, og du vil være god.

Først skal du have nedenstående software på din pc. Her bygger jeg en 64-bit version af biblioteket, da jeg ejer en 64 bit pc. Men du kan også bygge det til 32-bit.

Den nødvendige software er:

  1. Cmake (jeg brugte 3.6.0 RC-4 version).
  2. Myr (bruges internt til bygning af JAR)
  3. MinGW - W64 GCC-8.1.0
  4. 64 bit JDK 1.8

Et ord om MinGW: For at opbygge dette bibliotek har vi brug for C ++ - kompilatorer. Du kan bruge Visual Studio-værktøjer (VS), hvilket er langt bedre. Dog havde jeg ikke den luksus at gøre det, da jeg byggede den på min kontor-bærbare computer, og VS er licenseret software, der ikke er tilgængelig for Java-folk her. Derfor var jeg nødt til at bruge open source-værktøjer, og den bedste er MinGW (Minimalistisk GNU til Windows).

Det er også meget vigtigt at bruge den korrekte version af MinGW. Download version x86_64-posix-seh, da der er trådstøtte i denne version. Jeg har ikke prøvet alle andre versioner. Men version x86_64-win32-sjlj fungerer slet ikke.

For at give noget mere perspektiv udføres bygningen af ​​værktøjet kaldet make, der kommer som en del af MinGW (bin / mingw32-make.exe). make er en task runner til C ++ ligesom “Ant” er til Java. Men C ++ - kode og lave scripts er meget platformafhængige. Derfor bruges værktøjet CMake til at gøre distribuerbare platformuafhængige . CMake genererer platformafhængige fabrikationsscripts.

Genererer build-konfigurationer ved hjælp af CMake

Trin 1: Download kildekodens zip-kode for både opencv og opencv_contrib, og udpakk dem i en mappe. Opret desuden en mappe kaldet "build" i samme bibliotek (jeg oprettede "build_posix" som synlig i skærmbillederne).

Trin 2: Åbn CMake. Peg "hvor er kildekoden" til den opencv-udpakkede mappe. Peg desuden "hvor skal du oprette binærfiler" til "build" -mappen, du oprettede.

Trin 3: Føj 64 bit JDK 1.8 bin-mappen, MinGW-bin-mappen og Ant bin-mappen til miljøvariablerne "PATH". Dette er vigtigt, da CMake vil se i miljøvariablerne for konfiguration. Hvis dette ikke er gjort, bliver vi nødt til at konfigurere CMake manuelt i trin 5.

Hvis du har flere JDK'er i dit system, og du allerede har nogle forskellige JDK i "PATH", og du ikke vil tilføje JDK 1.8 i "PATH", kan du springe dette over. Men konfigurer det manuelt i trin 5.

Trin 4: Tryk på knappen "Konfigurer", og vælg "MinGw Makefiles" og "finish". Herefter begynder CMake at konfigurere dit projekt. Det tager et stykke tid, og når konfigurationen er afsluttet, viser den de aktuelle tilgængelige konfigurationer.

Hvis du spekulerer på, om de konfigurationer, der er genereret til dig, er korrekte, kan du henvise til de logfiler, der blev genereret til mig her, og sammenligne.

Trin 5: Nu kommer den vigtigste del - ændring af konfigurationer. Klik først på afkrydsningsfelterne "Grupperet" og "Avanceret" for at organisere konfigurationerne.

  • Kontroller, at ANT_EXECUTABLE (søg "ANT_EXECUTABLE" i søgefeltet) og alle fem "JAVA" -konfigurationer peger på 64-bit JDK 1.8. Hvis trin 3 blev udført korrekt, vil dette være korrekt. Ellers skal du rette dem.
  • Fjern markeringen af ​​Python (søg "Python") relaterede afkrydsningsfelter under "BUILD" og "INSTALL" grupper, da vi ikke har brug for Python builds.
  • Deaktiver "WITH_MSMF" og "WITH_IPP & WITH_TBB". Disse libs er kun tilgængelige for VS.
  • Rediger "OPENCV_EXTRA_MODULES_PATH" under "OPENCV" -gruppen, og indstil den til "moduler" -mappen under "opencv_contrib" -kildemappen, du ekstraherede tidligere.

Efter dette skal du trykke på “Konfigurer” -knappen igen. Dette gør de endelige konfigurationer. Du kan henvise til de logfiler, der blev genereret til mig her.

Bemærk : Sørg for at sammenligne dine "Konfigurer" -logfiler, der er genereret med den, jeg delte i pastebin ovenfor. Hvis du finder nogle store forskelle, skal du først prøve at rette dine konfigurationer og trykke på "Konfigurer" igen. Ellers er der chancer for, at din build mislykkes, og at det bliver sværere at debugge.

Trin 6: Herefter skal du trykke på "Generer". Det tager nogle sekunder og derefter lukke CMake.

Kompilering af OpenCV

Hvis alle de konfigurationer, der genereres ovenfor, er korrekte, vil denne opgave være en brise (på 2-3 timer!). Bare åbn kommandoprompten, gå til "build" -mappen, og udfør kommandoen nedenfor.

mingw32-make.exe -j5 > buildLogs.txt

Her -j5tilføjes, som instruerer fabrikationsværktøjet til at køre fem job parallelt. Dette vil gøre din opbygning hurtigere, i det mindste teoretisk.

Glem ikke at skubbe logfilerne til en tekstfil. Disse kan blive for store, i hvilket tilfælde dit kommandopromptvindue muligvis afkortes. Du har brug for dem, hvis kompilering mislykkes. Du kan se de kompilationslogfiler, der er genereret i mit tilfælde her.

Bemærk : Rækkefølgen af ​​logsætninger er muligvis ikke den samme for dig, da bygningen sker i fem parallelle tråde.

Når build er afsluttet, kan du kontrollere "bin" og "lib" mapperne inde i din "build" mappe. Inde i "bin" vil du have alle dine opencv * .exe's og libopencv * .dll'er og din kompilerede JAR. Yderligere vil "lib" have din hoved-dll (libopencv_javaxxx.dll) sammen med nogle mere afhængige filer.

Hands on med OpenCV ansigtsgenkendelses-API

Nu hvor du har bygget biblioteket, skal du først konfigurere miljøvariablerne såvel som brugerbiblioteket i Eclipse.

  1. Opret en variabel OPENCV_JAVA_BIN, og peg den mod mappen "bin", der er genereret i din "build" -mappe.
  2. Opret OPENCV_JAVA_LIB og peg den mod mappen “lib”, der er genereret i din “build” -mappe.
  3. Føj begge ovenstående variabler til "PATH" -variablen.
  4. Åbn din formørkelse, og opret et nyt brugerbibliotek, som du vil bruge til dit ansigtsgenkendelsesprojekt. Gå til ”Window”> ”Preferenc es ”. Naviger under menuen under "Java"> "Byg sti"> "Brugerbiblioteker" og vælg "Ny ...". Indtast et navn til biblioteket - for eksempel opencv - og vælg det nyoprettede brugerbibliotek. Vælg "Tilføj eksterne JAR'er ...", og gennemse for at vælge "opencv-3xx.jar" fra din computer.

Efter dette er der ikke behov for at linke det oprindelige bibliotek, da dette blev føjet til dine "sti" -variabler i trin 3.

Når du er færdig med denne opsætning, kan du klone mit Git-lager herfra og importere projektet til dit Eclipse-arbejdsområde. Desuden skal du tilføje JDK 1.8 samt opencv-brugerbiblioteket (netop oprettet ovenfor) til dette projekt. Når du er færdig, er du klar til at teste dit nybyggede OpenCV-bibliotek.

I skrivende stund er der tre programmer i dette projekt.

  • HelloWorld : Du kan køre dette for at teste, om din OpenCV-biblioteksopsætning er ok. Hvis dette ikke virker ordentligt, skal du sortere dette først . De eneste problemer, du vil støde på på dette tidspunkt, er relateret til systemmiljøvariabler eller opsætning af brugerbiblioteket.
  • FaceDetection : Du kan bruge dette til at teste ansigtsgenkendelsesmodulet. Det er et andet modul end ansigtsgenkendelse. Dette er et modul, der sendes sammen med standardudgivelsen af ​​OpenCV. I skrivende stund kan vi give et billede som input til programmet, og det registrerer alle ansigterne inde i billedet. Outputbilledet har grønne rektangler tegnet på alle de registrerede ansigter.
  • FaceRecognition: OpenCV facerec-modulet indeholder tre algoritmer:
  1. Eigenfaces
  2. Fisherfaces
  3. Lokale binære mønstre Histogrammer.

For tekniske detaljer om alle disse algoritmer kan du henvise til denne officielle artikel. Til demonstrationsformål vil jeg vise dig, hvordan du bruger Eigenfaces-algoritmen.

Først skal du downloade træningsdata fra ansigtsdatabasen. Disse data indeholder ti forskellige billeder for hver af 40 forskellige motiver (400 billeder). For nogle motiver blev billederne taget på forskellige tidspunkter, varierende belysning, ansigtsudtryk (åbne / lukkede øjne, smilende / ikke smilende) og ansigtsdetaljer (briller / ingen briller). Når du har ekstraheret dem på din computer, skal du forberede en .csv-fil, der indeholder stien til hvert billede sammen med deres tilsvarende etiket.

For at gøre det nemt har jeg en TrainingData.txt i mit Git-arkiv. Du skal dog redigere filen og ændre stierne for billeder i henhold til din computers biblioteksplacering.

Bemærk : Den downloadede ansigtsdatabase indeholder billeder i .pgm-format. Dette format understøttes ikke af Windows. For faktisk at konvertere dem til .jpg, tilføjede jeg PGMToJPGConverter til mit arkiv. Du kan bruge dette til at konvertere billederne og se et faktisk kig på træningsdataene.

Efter dette kan du køre ansigtsgenkendelsesprogrammet. Nedenfor er trinene udført i programmet:

  1. OpenCV-biblioteket indlæses som normalt.
  2. .Csv-filen læses, og to ArrayList (er) oprettes. En til billedmatricen og en til deres tilsvarende etiketter.
  3. Ud af de 400 inputbilleder fjernes den sidste post i listedatastrukturen og gemmes for senere at teste den uddannede model.
  4. Derefter bruges de resterende 399 billeder til træning af Eigenfaces-algoritmen.
  5. Når træningen er afsluttet, bliver modellen bedt om at forudsige etiketten på det billede, vi fjernede i trin 3.

Her kan vi observere, at algoritmen er i stand til at forudsige etiketten på vores testperson med en konfidensværdi på 1807. Jo lavere værdi, jo bedre forudsigelse. På samme måde kan du udføre denne øvelse med to andre algoritmer. C ++ - koden kan downloades herfra og her.

Opdatering (27. december 2018) : Hvis du finder det smertefuldt at opbygge openCV-Java-bindingerne, har jeg en god nyhed til dig. For nylig har jeg fundet en nemmere måde at få alle openCV-afhængighederne til java på. For komplette detaljer henvises til min anden artikel.

Tillykke !! ? Du klarede det til slutningen. Og hvis du kunne lide? Denne artikel, skal du trykke på den klappeknap nedenfor?. Det betyder meget for mig, og det hjælper andre mennesker med at se historien.