Veido atpažinimas naudojant „Java“ „OpenCV“

Nuo tada, kai prasidėjo dirbtinio intelekto bumas - arba „iPhone X“ reklama su veido atrakinimo funkcija pasirodė televizoriaus ekranuose, norėjau išbandyti šią technologiją. Tačiau kai tik pradėjau apie tai ieškoti „Google“, paprastai „Python“ radau tik kodų pavyzdžių. Būdamas „Java“ entuziastas septynerius metus, tai pamačiau. Todėl galiausiai nusprendžiau tam medžioti „Java“ atvirojo kodo bibliotekas.

Šiuo metu yra įvairių „Java“ bibliotekų. Bet pats populiariausias, kurį radau, buvo „OpenCV“.

„OpenCV“ yra atviro kodo kompiuterinė vizijos biblioteka, kurioje yra daugybė modulių, tokių kaip objektų aptikimas, veido atpažinimas ir išplėstoji realybė. Nors ši biblioteka yra parašyta C ++, ji taip pat siūlo mūšyje patikrintus „Java“ susiejimus.

Tačiau yra vienas klausimas. Kaip savo programinės įrangos leidimo dalį, jis siūlo tik kelis modulius (su „Java“ apkaustais) iš dėžutės - ir veido atpažinimas nėra vienas iš jų. Todėl, norėdami jį naudoti, turite sukurti rankiniu būdu.

Laukti! Ką? Kodėl?

Taip - „OpenCV“ bendruomenės nurodyta priežastis yra ta, kad moduliai nėra visiškai stabilūs. Todėl jie nėra komplektuojami kartu su standartiniu leidimu. Taigi jie čia juos tvarko atskiroje saugykloje.

Jei neturite C ++ patirties arba jos turite labai mažai (pvz., Aš), jau turėjote pradėti svaigti galvą, kai patys sukūrėte C ++ biblioteką. Bet nesijaudinkite, aš esu čia, kad laikyčiausi už rankos ir padaryčiau jus per šį varginantį procesą. Taigi pradėkime, ar ne?

„Java“ „OpenCV“ kūrimas nuo nulio

Galite rasti įvairių šaltinių, pateikiamų nuoseklioms instrukcijoms, tokioms, šioms ir šioms. Tačiau nė vienas iš jų man netiko idealiai, nes trūko vieno ar kito dalyko. Artimiausias, kurį radau, kuris man padėjo, yra šis. Tačiau jums nereikia į tai kreiptis. Galite atlikti toliau nurodytus veiksmus ir jums bus gera.

Pirma, savo kompiuteryje turite turėti žemiau pateiktą programinę įrangą. Čia kuriu 64 bitų bibliotekos versiją, nes turiu 64 bitų kompiuterį. Bet jūs galite sukurti ir 32 bitų.

Reikalinga programinė įranga yra:

  1. „Cmake“ (naudojau 3.6.0 rc-4 versiją).
  2. Skruzdė (naudojama JAR statybai)
  3. „MinGW - W64 GCC-8.1.0“
  4. 64 bitų JDK 1.8

Žodis apie „MinGW“: Čia, norint sukurti šią biblioteką, mums reikia C ++ kompiliatorių. Galite naudoti „Visual Studio“ įrankius (VS), kurie yra kur kas geresni. Tačiau neturėjau prabangos tai padaryti, nes sukūriau jį savo biuro nešiojamajame kompiuteryje, o „VS“ yra licencijuota programinė įranga, kurios „Java“ žmonės čia nepasiekia. Todėl turėjau naudoti atvirojo kodo įrankius, o geriausias yra „MinGW“ („Minimalist GNU for Windows“).

Be to, labai svarbu naudoti teisingą „MinGW“ versiją. Atsisiųskite x86_64-posix-seh versiją, nes šioje versijoje yra siūlų palaikymas. Aš neišbandžiau visų kitų versijų. Bet x86_64-win32-sjlj versija visiškai neveikia.

Norint suteikti daugiau perspektyvos, kūrimą atlieka naudingoji programa, vadinama make, kuri yra „MinGW“ dalis (bin / mingw32-make.exe). „make“ yra „C ++“ užduočių vykdytojas, pvz., „Ant“ yra „Java“. Tačiau C ++ kodas ir scenarijai labai priklauso nuo platformos. Taigi, norint, kad platinamosios programos būtų nepriklausomos nuo platformos, naudojamas „ CMake“ įrankis . „CMake“ sukuria nuo platformos priklausančius scenarijus.

Sukurti konfigūracijos konfigūracijas naudojant „CMake“

1 veiksmas: atsisiųskite tiek „opencv“, tiek „opencv_contrib“ šaltinio kodo ZIP ir ištraukite juos į katalogą. Tame pačiame kataloge sukurkite aplanką „build“ (aš sukūriau „build_posix“, kaip matoma ekrano kopijose).

2 žingsnis: Atidarykite „CMake“. Nukreipkite „kur yra šaltinio kodas“ į atidarytą „OpenCTV“ aplanką. Toliau nurodykite „kur sukurti dvejetainius failus“ į sukurtą aplanką „build“.

3 žingsnis: Pridėkite 64 bitų JDK 1.8 šiukšliadėžės aplanką, „MinGW bin“ aplanką ir „Ant bin“ aplanką prie aplinkos kintamųjų „PATH“. Tai svarbu, nes „CMake“ ieškos aplinkos kintamųjų konfigūracijos. Jei tai nebus padaryta, 5 veiksme turėsime rankiniu būdu sukonfigūruoti „CMake“.

Jei jūsų sistemoje yra keli JDK ir „PATH“ jau turite keletą skirtingų JDK ir nenorite pridėti „JDK 1.8“ į „PATH“, galite tai praleisti. Bet atlikite 5 veiksmą rankiniu būdu.

4 žingsnis: Paspauskite mygtuką „Konfigūruoti“ ir pasirinkite „MinGw Makefiles“ ir „pabaigti“. Po to CMake pradės konfigūruoti jūsų projektą. Tai užtruks šiek tiek laiko, o baigus konfigūruoti, bus rodomos esamos galimos konfigūracijos.

Jei jums kyla klausimas, ar jums sugeneruotos konfigūracijos yra teisingos, galite kreiptis į čia sugeneruotus žurnalus ir palyginti.

5 žingsnis: Dabar ateina svarbiausia dalis - konfigūracijų keitimas. Pirmiausia spustelėkite žymimuosius langelius „Sugrupuota“ ir „Išplėstinė“, kad sutvarkytumėte konfigūracijas.

  • Patikrinkite, ar ANT_EXECUTABLE (paieškos laukelyje ieškokite „ANT_EXECUTABLE“) ir visos penkios „JAVA“ konfigūracijos rodo 64 bitų JDK 1.8. Jei 3 žingsnis buvo atliktas tinkamai, tai bus teisinga. Priešingu atveju pataisykite juos.
  • Panaikinkite „Python“ (ieškokite „Python“) susijusių žymimųjų langelių žymėjimą grupėse „BUILD“ ir „INSTALL“, nes mums nereikia „Python“ kūrimo.
  • Išjunkite „WITH_MSMF“ ir „WITH_IPP & WITH_TBB“. Šie libai galimi tik VS.
  • Redaguokite „OPENCV_EXTRA_MODULES_PATH“ grupėje „OPENCV“ ir nustatykite jį į aplanką „moduliai“, esantį anksčiau išgautame šaltinio aplanke „opencv_contrib“.

Po to dar kartą paspauskite mygtuką „Konfigūruoti“. Tai atliks paskutines konfigūracijas. Čia galite peržiūrėti man sugeneruotus žurnalus.

Pastaba : būtinai palyginkite „Konfigūruoti“ žurnalus, sugeneruotus su tuo, kurį bendrinau aukščiau esančiame „pastebin“. Jei radote svarbų skirtumą, pirmiausia pabandykite ištaisyti savo konfigūracijas ir dar kartą paspauskite „Konfigūruoti“. Priešingu atveju yra tikimybė, kad jūsų sukūrimas nepavyks ir kad bus sunkiau derinti.

6 žingsnis: Po to paspauskite „Generuoti“. Tai užtruks kelias sekundes, tada uždarysi „CMake“.

„OpenCV“ sudarymas

Dabar, jei visos aukščiau sukurtos konfigūracijos yra teisingos, ši užduotis bus vėjuota (2-3 valandas!). Tiesiog atidarykite komandų eilutę, eikite į aplanką „build“ ir vykdykite toliau pateiktą komandą.

mingw32-make.exe -j5 > buildLogs.txt

Čia -j5pridedamas, kuris nurodo „make utility“ paleisti penkis darbus lygiagrečiai. Tai padarys jūsų kūrimą greitesnį, bent jau teoriškai.

Nepamirškite žurnalų perkelti į tekstinį failą. Jie gali būti per dideli, tokiu atveju jūsų komandų eilutės langas gali jį sutrumpinti. Jums jų reikia tuo atveju, jei kompiliacija nepavyksta. Čia galite kreiptis į mano atveju sugeneruotus kompiliacijos žurnalus.

Pastaba : Žurnalo sakinių tvarka jums gali būti ne tokia pati, nes komponavimas vyksta penkiose lygiagrečiose gijose.

Baigę kurti, galite patikrinti aplankus „bin“ ir „lib“, esančius „build“ kataloge. „Dėžutės“ viduje turėsite visus savo „opencv * .exe“ ir „libopencv * .dll“ bei savo kompiliuotus JAR. Be to, „lib“ turės pagrindinį dll (libopencv_javaxxx.dll) kartu su keletu kitų priklausomų failų.

Rankos su „OpenCV“ veido atpažinimo API

Dabar, sukūrę biblioteką, pirmiausia turite nustatyti aplinkos kintamuosius ir vartotojo biblioteką „Eclipse“.

  1. Sukurkite kintamąjį OPENCV_JAVA_BIN ir nukreipkite jį į aplanką „bin“, sugeneruotą „build“ kataloge.
  2. Sukurkite OPENCV_JAVA_LIB ir nukreipkite jį į aplanką „lib“, sugeneruotą „build“ kataloge.
  3. Pridėkite abu anksčiau nurodytus kintamuosius prie „PATH“ kintamojo.
  4. Atidarykite „Eclipse“ ir sukurkite naują vartotojo biblioteką, kurią naudosite savo veido atpažinimo projektui. Eikite į „Window“> „Preferenc es “. Meniu eikite į skiltį „Java“> „Sukurti kelią“> „Vartotojo bibliotekos“ ir pasirinkite „Nauja…“. Įveskite bibliotekos pavadinimą, pavyzdžiui, „opencv“, ir pasirinkite naujai sukurtą vartotojo biblioteką. Pasirinkite „Pridėti išorinius JAR ...“ ir naršydami pasirinkite „opencv-3xx.jar“ iš savo kompiuterio.

Po to nereikia susieti gimtosios bibliotekos, nes ji buvo įtraukta į jūsų kelio kintamuosius 3 veiksme.

Baigę šią sąranką, galite čia klonuoti mano „Git“ saugyklą ir importuoti projektą į „Eclipse“ darbo sritį. Be to, prie šio projekto turėsite pridėti JDK 1.8, taip pat „opencv“ vartotojo biblioteką (ką tik sukurtą aukščiau). Baigę būsite pasirengę išbandyti naujai sukurtą „OpenCV“ biblioteką.

Šiuo metu šiame projekte yra trys programos.

  • HelloWorld : galite tai paleisti, kad patikrintumėte, ar jūsų „OpenCV“ bibliotekos sąranka yra tinkama. Jei tai neveikia tinkamai, jums reikia rūšiuoti tai atlikti pirmą . Vienintelės problemos, su kuriomis susidursite, bus susijusios su sistemos aplinkos kintamaisiais ar vartotojo bibliotekos sąranka.
  • „FaceDetection“ : galite tai naudoti, norėdami išbandyti veido aptikimo modulį. Tai skiriasi nuo veido atpažinimo modulio. Tai modulis, kuris pristatomas kartu su standartiniu „OpenCV“ leidimu. Nuo šio rašymo mes galime pateikti vaizdą kaip įvestį programai, ir jis aptiks visus vaizdo viduje esančius veidus. Išvesties vaizde yra žalių stačiakampių, nupieštų ant visų aptiktų veidų.
  • „FaceRecognition“: „OpenCV facerec“ modulyje yra trys algoritmai:
  1. Savieji veidai
  2. Fisherfaces
  3. Vietinių dvejetainių modelių histogramos.

Norėdami gauti techninės informacijos apie visus šiuos algoritmus, galite peržiūrėti šį oficialų straipsnį. Parodymo tikslais aš jums parodysiu, kaip naudoti „Eigenfaces“ algoritmą.

Pirmiausia turite atsisiųsti treniruočių duomenis iš veido duomenų bazės. Šiuose duomenyse yra dešimt skirtingų vaizdų kiekvienam iš 40 skirtingų objektų (400 vaizdų). Kai kurių objektų vaizdai buvo daromi skirtingu metu, keičiant apšvietimą, veido išraišką (atviros / užmerktos akys, šypsosi / nesišypso) ir veido detales (akiniai / be akinių). Ištraukę juos į savo kompiuterį, turite paruošti .csv failą, kuriame yra kiekvieno paveikslėlio kelias kartu su atitinkama etikete.

Kad tai būtų lengva, „Git“ saugykloje turiu vieną „TrainingData.txt“. Tačiau turite redaguoti failą ir pakeisti vaizdų kelius pagal savo kompiuterio katalogo vietą.

Pastaba : atsisiųstoje veidų duomenų bazėje yra vaizdų .pgm formatu. Šio formato nepalaiko „Windows“. Norėdami iš tikrųjų juos konvertuoti į .jpg, pridėjau PGMToJPGConverter į savo saugyklą. Galite tai naudoti norėdami konvertuoti vaizdus ir iš tikrųjų pažvelgti į treniruotės duomenis.

Po to galite paleisti veido atpažinimo programą. Toliau pateikiami programos veiksmai:

  1. „OpenCV“ biblioteka įkeliama kaip įprasta.
  2. Perskaitomas .csv failas ir sukuriami du „ArrayList“. Viena skirta vaizdų matricai, kita - atitinkamoms etiketėms.
  3. Iš 400 įvesties vaizdų paskutinis sąrašo duomenų struktūros įrašas pašalinamas ir išsaugomas, kad vėliau būtų galima išbandyti apmokytą modelį.
  4. Po to likę 399 vaizdai naudojami „Eigenfaces“ algoritmo mokymui.
  5. Baigus mokymą, modelio paprašoma numatyti atvaizdo, kurį pašalinome atlikdami 3 veiksmą, etiketę.

Čia galime pastebėti, kad algoritmas sugeba numatyti mūsų tiriamojo etiketę, kurios patikimumo reikšmė yra 1807. Kuo mažesnė vertė, tuo geresnė prognozė. Panašiai galite atlikti šį pratimą su dviem kitais algoritmais. C ++ kodą galima atsisiųsti iš čia ir čia.

Atnaujinimas (2018 m. Gruodžio 27 d.) : Jei jums atrodo, kad „openCV“ „Java“ apkaustų kūrimas yra skausmingas, turiu jums gerų žinių. Neseniai radau paprastesnį būdą gauti visas „Java“ priklausomas „openCV“ priklausomybes. Norėdami gauti išsamią informaciją, skaitykite mano kitą straipsnį.

Sveikiname !! ? Jūs padarėte tai iki galo. Ir jei jums patiko šis straipsnis, paspauskite apačioje esantį mygtuką. Tai man reiškia daug ir padeda kitiems žmonėms pamatyti istoriją.