Rozpoznávanie tváre pomocou OpenCV v Jave

Odkedy začal boom umelej inteligencie - alebo sa na televíznych obrazovkách objavila reklama na iPhone X s funkciou odomykania tvárou -, chcel som túto technológiu vyskúšať. Len čo som to však začal googliť, zvyčajne som našiel iba príklady kódov v Pythone. A keďže som sedem rokov nadšencom jazyka Java, dostal som demotiváciu, keď som to videl. Preto som sa nakoniec rozhodol pre toto poľovať na Java open source knižnice.

V súčasnosti existujú rôzne knižnice Java. Ale najpopulárnejší, ktorý som našiel, bol OpenCV.

OpenCV je knižnica počítačového videnia s otvoreným zdrojom, ktorá má veľa modulov, ako sú detekcia objektov, rozpoznávanie tváre a rozšírená realita. Aj keď je táto knižnica napísaná v jazyku C ++, ponúka aj bitovo testované väzby Java.

Je tu však jeden problém. V rámci svojho vydania softvéru ponúka iba niekoľko modulov (s väzbami Java), ktoré sú súčasťou balenia - a rozpoznávanie tváre nie je jedným z nich. Ak ho chcete použiť, musíte ho vytvoriť ručne.

Počkaj! Čo? Prečo?

Áno - dôvod citovaný komunitou OpenCV je ten, že moduly nie sú úplne stabilné. Preto nie sú súčasťou štandardného vydania. Preto ich tu udržiavajú v samostatnom úložisku.

Ak nemáte žiadne alebo len veľmi malé skúsenosti s C ++ (ako ja), určite vám už začalo byť závratné z toho, že ste si sami vytvorili knižnicu C ++. Ale nebojte sa, som tu, aby som vás chytil za ruku a sprevádzal vás týmto zdĺhavým procesom. Takže začnime, však?

Budovanie OpenCV pre Javu od nuly

Nájdete rôzne zdroje podrobných pokynov, ako je tento, tento a tento. Ani jeden mi však nepracoval ideálne, pretože chýbala jedna alebo druhá vec. Najbližšie, čo som našiel, čo mi pomohlo, je tento. Nemusíte sa na to však odvolávať. Môžete postupovať podľa nasledujúcich krokov a budete dobrí.

Najskôr musíte mať v počítači nainštalovaný softvér uvedený nižšie. Tu budujem 64-bitovú verziu knižnice, pretože vlastním 64-bitový počítač. Môžete ho však vytvoriť aj pre 32-bitové verzie.

Požadovaný softvér je:

  1. Cmake (použil som verziu 3.6.0 rc-4).
  2. Mravenec (používaný interne pri vytváraní súboru JAR)
  3. MinGW - W64 GCC-8.1.0
  4. 64-bit JDK 1.8

Slovo o MinGW: Na vytvorenie tejto knižnice potrebujeme kompilátory C ++. Môžete použiť nástroje Visual Studio (VS), ktoré sú oveľa lepšie. Nemal som však na to luxus, pretože som ho postavil na svojom kancelárskom notebooku a VS je licencovaný softvér, ktorý tu nie je k dispozícii pre obyvateľov Java. Preto som musel použiť open source nástroje a najlepší je MinGW (Minimalist GNU pre Windows).

Je tiež veľmi dôležité používať správnu verziu programu MinGW. Stiahnite si verziu x86_64-posix-seh, pretože v tejto verzii je podpora vlákien. Neskúšal som všetky ostatné verzie. Verzia x86_64-win32-sjlj ale vôbec nefunguje.

Pre lepšiu perspektívu sa na zostavenie stará utilita s názvom make, ktorá je súčasťou MinGW (bin / mingw32-make.exe). make je bežca úloh pre C ++, napríklad „Ant“ je pre Java. Ale kódovanie C ++ a vytváranie skriptov je veľmi závislé od platformy. Preto, aby sa distribuovateľné komponenty stali nezávislými na platforme, sa používa obslužný program CMake . CMake generuje skripty vytvárania závislé na platforme.

Generovanie konfigurácií zostavy pomocou CMake

Krok 1: Stiahnite si zip zdrojového kódu opencv aj opencv_contrib a rozbaľte ich do adresára. Ďalej vytvorte priečinok s názvom „build“ v rovnakom adresári (vytvoril som „build_posix“, ako je viditeľné na snímkach obrazovky).

Krok 2: Otvorte CMake. Ukážte „kde je zdrojový kód“ do priečinka extrahovaného opencv. Ďalej nasmerujte „kde vytvoriť binárne súbory“ do priečinka „build“, ktorý ste vytvorili.

Krok 3: Pridajte 64-bitový priečinok JDK 1.8, priečinok MinGW a priečinok Ant do premenných prostredia „PATH“. To je dôležité, pretože CMake bude hľadať v premenných prostredia konfiguráciu. Pokiaľ sa tak nestane, budeme musieť v kroku 5 nakonfigurovať CMake manuálne.

Ak máte vo svojom systéme viac JDK a už máte nejaké iné JDK v „PATH“ a nechcete pridať JDK 1.8 do „PATH“, môžete to preskočiť. Nakonfigurujte ho však manuálne v kroku 5.

Krok 4: Stlačte tlačidlo „Konfigurovať“, vyberte „MinGw Makefiles“ a „dokončiť“. Potom CMake začne konfigurovať váš projekt. Bude to chvíľu trvať a po dokončení konfigurácie sa zobrazí aktuálne dostupné konfigurácie.

Ak vás zaujíma, či sú konfigurácie vygenerované pre vás správne, môžete sa obrátiť na protokoly, ktoré sa tu vygenerovali, a porovnať ich.

Krok 5: Teraz prichádza najdôležitejšia časť - zmena konfigurácií. Najskôr kliknutím na začiarkavacie políčka „Zoskupené“ a „Pokročilé“ usporiadajte konfigurácie.

  • Overte, či ANT_EXECUTABLE (hľadajte „ANT_EXECUTABLE“ vo vyhľadávacom poli) a všetkých päť konfigurácií „JAVA“ smeruje k 64-bitovej JDK 1.8. Ak bol krok 3 vykonaný správne, bude to správne. V opačnom prípade ich opravte.
  • Zrušte začiarknutie políčok súvisiacich s Pythonom (hľadajte „Python“) v skupinách „BUILD“ a „INSTALL“, pretože nepotrebujeme zostavenia Pythonu.
  • Zakážte možnosti „WITH_MSMF“ a „WITH_IPP & WITH_TBB“. Tieto knižnice sú k dispozícii iba pre VS.
  • Upravte súbor „OPENCV_EXTRA_MODULES_PATH“ v skupine „OPENCV“ a nastavte ho do priečinka „modules“ v zdrojovom priečinku „opencv_contrib“, ktorý ste predtým extrahovali.

Potom stlačte znovu tlačidlo „Konfigurovať“. Týmto sa urobia konečné konfigurácie. Tu si môžete pozrieť protokoly, ktoré sa pre mňa vygenerovali.

Poznámka : Nezabudnite porovnať svoje protokoly „Konfigurovať“ vygenerované s tým, ktorý som zdieľal v pastebine vyššie. Ak zistíte zásadný rozdiel, skúste najskôr opraviť svoje konfigurácie a znova stlačte tlačidlo „Konfigurovať“. V opačnom prípade existuje šanca, že vaše zostavenie zlyhá a ladenie bude náročnejšie.

Krok 6: Potom stlačte „Generovať“. Bude to trvať niekoľko sekúnd a potom zatvorte CMake.

Kompilácia OpenCV

Ak sú teraz správne všetky konfigurácie vygenerované vyššie, bude táto úloha hračkou (2–3 hodiny!). Stačí otvoriť príkazový riadok, prejsť do priečinka „build“ a vykonať príkaz uvedený nižšie.

mingw32-make.exe -j5 > buildLogs.txt

Tu -j5je pridaný príkaz, ktorý dáva príkazu make pomôcke, aby paralelne spustila päť úloh. Vďaka tomu bude vaša stavba aspoň teoreticky rýchlejšia.

Ďalej nezabudnite protokoly pretlačiť do textového súboru. Môžu byť príliš veľké. V takom prípade by ich mohlo okno príkazového riadku skrátiť. Potrebujete ich pre prípad, že kompilácia zlyhá. Tu sa môžete obrátiť na protokoly kompilácie vygenerované v mojom prípade.

Poznámka : Poradie výpisov z denníka nemusí byť pre vás rovnaké, pretože zostavenie sa deje v piatich paralelných vláknach.

Po dokončení zostavenia môžete skontrolovať priečinky „bin“ a „lib“ vo vašom adresári „build“. V priečinku „bin“ budete mať všetky svoje súbory opencv * .exe a libopencv * .dll a váš skompilovaný súbor JAR. Ďalej „lib“ bude mať vašu hlavnú dll (libopencv_javaxxx.dll) spolu s niekoľkými závislejšími súbormi.

Ručné práce s rozhraním API na rozpoznávanie tváre OpenCV

Teraz, keď ste vytvorili knižnicu, musíte najskôr v Eclipse nastaviť premenné prostredia a knižnicu používateľov.

  1. Vytvorte premennú OPENCV_JAVA_BIN a nasmerujte ju do priečinka „bin“ vygenerovaného vo vašom adresári „build“.
  2. Vytvorte OPENCV_JAVA_LIB a nasmerujte ho do priečinka „lib“ vygenerovaného vo vašom adresári „build“.
  3. Pripojte obidve vyššie uvedené premenné k premennej „PATH“.
  4. Otvorte Eclipse a vytvorte novú knižnicu používateľov, ktorú budete používať pre svoj projekt rozpoznávania tváre. Choď na "Window"> "Preferencie es ". V ponuke prejdite do časti „Java“> „Cesta zostavenia“> „Knižnice používateľa“ a vyberte „Nový…“. Zadajte názov knižnice - napríklad opencv - a vyberte novovytvorenú knižnicu používateľov. Vyberte možnosť „Pridať externé súbory JAR ...“ a vo svojom počítači vyhľadajte položku „opencv-3xx.jar“.

Potom už nie je potrebné prepojiť natívnu knižnicu, pretože táto bola pridaná k vašim premenným cesty v kroku 3.

Po dokončení tohto nastavenia môžete odtiaľ klonovať moje úložisko Git a importovať projekt do vášho pracovného priestoru Eclipse. Ďalej budete do tohto projektu musieť pridať JDK 1.8 a tiež používateľskú knižnicu opencv (práve vytvorenú vyššie). Po dokončení budete pripravení otestovať svoju novo vytvorenú knižnicu OpenCV.

V čase písania tohto projektu sú v tomto projekte tri programy.

  • HelloWorld : môžete to spustiť a otestovať, či je nastavenie knižnice OpenCV v poriadku. Ak to nebude fungovať správne, treba to vyriešiť ako prvý . Jediné problémy, s ktorými sa v tomto okamihu stretnete, budú súvisieť s premennými systémového prostredia alebo nastavením užívateľskej knižnice.
  • FaceDetection : pomocou tohto môžete otestovať modul detekcie tváre. Je to iný modul ako rozpoznávanie tváre. Toto je modul, ktorý sa dodáva spolu so štandardným vydaním OpenCV. Od tohto písania môžeme poskytnúť obrázok ako vstup do programu a bude detekovať všetky tváre vo vnútri obrázka. Výstupný obrázok má na všetkých detekovaných tvárach nakreslené zelené obdĺžniky.
  • FaceRecognition: modul OpenCV facerec obsahuje tri algoritmy:
  1. Vlastné plochy
  2. Fisherfaces
  3. Histogramy miestnych binárnych vzorov.

Technické podrobnosti o všetkých týchto algoritmoch nájdete v tomto oficiálnom článku. Na demonštračné účely vám ukážem, ako používať algoritmus Eigenfaces.

Najskôr si musíte stiahnuť údaje o tréningu z databázy tvárí. Tieto údaje obsahujú desať rôznych obrázkov pre každý zo 40 rôznych objektov (400 obrázkov). U niektorých subjektov boli snímky nasnímané v rôznom čase, pričom sa menilo osvetlenie, výraz tváre (otvorené / zatvorené oči, usmievavý / neusmievajúci sa) a detaily tváre (okuliare / žiadne okuliare). Po ich rozbalení v počítači musíte pripraviť súbor .csv obsahujúci cestu každého obrázka spolu s príslušným štítkom.

Na uľahčenie mám vo svojom úložisku Git jeden súbor TrainingData.txt. Musíte však súbor upraviť a zmeniť cesty obrázkov podľa umiestnenia adresára v počítači.

Poznámka : Stiahnutá databáza tvárí obsahuje obrázky vo formáte .pgm. Windows tento formát nepodporujú . Aby som ich skutočne previedol na .jpg, pridal som do svojho úložiska PGMToJPGConverter. Môžete to použiť na prevod obrázkov a skutočný pohľad na údaje o tréningu.

Potom môžete spustiť program rozpoznávania tváre. Ďalej sú uvedené kroky vykonané v programe:

  1. Knižnica OpenCV sa načítava ako obvykle.
  2. Načíta sa súbor .csv a vytvoria sa dva zoznamy ArrayList. Jeden pre maticu obrázkov a druhý pre príslušné štítky.
  3. Zo 400 vstupných obrázkov je posledný záznam v dátovej štruktúre zoznamu odstránený a uložený na neskoršie otestovanie trénovaného modelu.
  4. Potom sa zvyšných 399 obrázkov použije na školenie algoritmu Eigenfaces.
  5. Po dokončení tréningu je model vyzvaný, aby predpovedal štítok obrázka, ktorý sme odstránili v kroku 3.

Tu môžeme pozorovať, že algoritmus je schopný predpovedať značku nášho testovaného subjektu s hodnotou spoľahlivosti 1807. Čím nižšia je hodnota, tým lepšia je predpoveď. Podobne môžete toto cvičenie vykonať pomocou dvoch ďalších algoritmov. Kód C ++ je možné stiahnuť tu a tu.

Aktualizácia (27. decembra 2018) : V prípade, že je pre vás vytváranie väzieb Java OpenCV bolestivé, mám pre vás dobrú správu. Nedávno som našiel ľahší spôsob, ako získať všetky závislosti openCV pre javu. Úplné informácie nájdete v mojom ďalšom článku.

Gratulujem !! ? Dotiahli ste to do konca. A ak sa vám páčil tento článok, stlačte tlačidlo klepnutia nižšie?. Znamená to pre mňa veľa a pomáha ostatným ľuďom vidieť ten príbeh.