Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android
Code

Isang introduksiyon sa Face Detection sa Android

by
Difficulty:IntermediateLength:LongLanguages:

Tagalog (Wikang Tagalog) translation by Anna Nelson (you can also view the original English article)

Ipinakilala sa Vision libraries sa Play Services 8.1, Ang Face Detection ay kayang mapadali ang trabaho ng isang debeloper na tulad mo sa pagsusuri ng isang bidyo o imahe para mabasa ang mga mukha ng tao. Sa sandaling may listahan ka na ng mga mukhang na-detect sa isang imahe, maaari ka nang makakuha ng impormasyon patungkol sa bawat mukha, tulad ng oryentasyon, posibilidad ng pag ngiti, kung bukas ba o sarado ang mata ng isang tao, at mga tukoy na palatandaan sa kanilang mukha.

Ang impormasyong ito ay kapaki-pakinabang para sa maraming mga aplikasyon, tulad ng isang app ng kamera na awtomatikong kumukuha ng larawan sa sandaling ang lahat ng tao na nasa frame ay nakangiti habang bukas ang kanilang mga mata, o para sa augmentasyon ng mga imahe na may nakakatuwang epekto, tulad ng mga sungay ng isang unicorn. Mahalagang tandaan na ang Face Detection ay hindi facial recognization. Samantalang ang mga impormasyon ay maaring makuha patungkol sa isang mukha, ang impormasyong iyon ay hindi ginagamit ng Vision library upang matukoy kung ang dalawang mukha ba ay nagmula sa parehong tao.

Ang tutorial na ito ay gagamit ng isang nakahintong imahe para patakbuhin ang Face Detection API at kukuha ng impormasyon patungkol sa mga tao sa larawan, isasalarawan din nito ang parehong impormasyon na may naka-overlay na grapiko. Ang lahat ng kodigo sa pagtuturong ito ay maaring makita sa GitHub.

Example of a silly effect adding a unicorn horn to a face

1. Setup ng Proyekto

Para maidagdag ang Vision library sa iyong proyekto, kailangan mong i-import ang Play Services 8.1 o mas mataas pa papunta sa iyong proyekto. Ang tutorial na ito ay nagpapakita lamang ng pag-i-import ng Play Services Vision library. Buksan ang build.gradle file ng iyong proyekto at idagdag ang mga sumusunod na compile line sa dependencies node.

Kapag nailagay mo na ang Play Services sa iyong proyekto, maaari mong nang isara ang build.gradle file ng iyong proyekto at buksan ang AndroidManifest.xml. Kailangan mong idagdag ang isang meta-data aytem na tumutukoy sa dependensya ng mukha sa ilalim ng application node ng iyong manifest. Sa paraang ito ay malalaman ng Vision library na plano mong makita ang mga mukha sa loob ng iyong aplikasyon.

Sa sandaling natapos mo na ang pag-set up ng AndroidManifest.xml, maaari ka nang magpatuloy at isara ito. Sunod, ay kailangan mong lumikha ng isang bagong class na may pangalan na FaceOverlayView.java. Ang class na ito ay nagpapalawak ng View at naglalaman ng lohika para sa pag-detect ng mga mukha sa proyekto, nagpapakita ng nasuring bitmap at mga pagguhit sa ibabaw ng imahe upang maisalarawan ang mga puntos.

Sa ngayon, magsimula sa pamamagitan ng pagdaragdag ng top of the class member variables at pagtutukoy ng mga constructors. Ang Bitmap object ay gagamitin upang i-imbak ang bitmap na susuriin samantalang ang SparseArray of Face object ay i-imbakin ang bawat mukha na matatagpuan sa bitmap.

Sunod, ay magdagdag ng isang bagong pamamaraan sa loob ng FaceOverlayView na tinatawag na setBitmap (Bitmap bitmap). Sa ngayon ay ise-save lamang nito ang bitmap na nai-pasa dito, gayunpaman ay gagamitin mo ang pamamaraang ito mamaya para sa pagsusuri ng imahe.

Sunod, ay kailangan mo ng isang bitmap. Naglagay ako ng isang sampol na proyekto sa GitHub, ngunit maaari mong gamitin ang anumang imaheng nais mong subukan sa Face Detection para makita kung ano ang gumagana at kung ano ang hindi. Kapag nakapili ka ng isang imahe, ilagay ito sa res/raw na directory. Ipagpapalagay ng tutorial na ito na ang imahe ay tinatawag na face.jpg.

Pagkatapos mong mailagay ang iyong imahe sa res/raw na directory, buksan ang res/layout/activity_main.xml. Ang layout na ito ay naglalaman ng isang reference sa FaceOverlayView upang ito ay maipakita sa MainActivity.

Sa tinukoy na layout, buksan ang MainActivity at i-set up ang FaceOverlayView mula sa onCreate(). Gawin mo ito sa pamamagitan ng pagkuha ng isang reference sa view, pagbabasa ng imaheng file na face.jpg mula sa raw directory bilang isang input stream, at pagko—convert nito sa isang bitmap. Sa sandaling mayroon ka ng bitmap, maaari kang tumawag sa setBitmap sa FaceOverlayView upang mai-pasa ang imahe sa iyong custom view.

2. Pag-detect ng mga Mukha

Ngayong ang iyong proyekto ay naka-set up na, oras na upang simulan ang Pagdi-detect ng mga mukha. Sa setBitmap (Bitmap bitmap) kailangan mong lumikha ng isang FaceDetector. Maari itong gawin gamit ang isang FaceDetector.Builder, na magbibigay-daan sa iyo upang tukuyin ang multiple parameters na nakaka-apekto sa kung gaano kabilis madi-detect ang mga mukha at kung ano pang ibang datos ang maaring ma-generate ng FaceDetector.

Ang mga setting na maari mong piliin ay depende sa sinusubukan mong gawin sa iyong aplikasyon. Kapag iyong pinagana ang paghahanap ng mga landmark, ang mga mukha ay mas mabagal na madi-detect. Tulad ng mga bagay sa pagpoprograma, lahat nang ito ay may mga trade-off. Para sa mga karagdagang kaalaman patungkol sa mga opsyon na maaaring magamit para sa FaceDetector.Builder, maaari mong hanapin ang opisyal na dokumentasyon na nasa websayt ng debeloper ng Android.

Kailangan mo ring magkaron ng pagsisiyasat upang malaman kung ang FaceDetector ay gumagana. Kapag ang isang user ay gumagamit ng pang-detect ng mukha sa kanilang device sa unang pagkakataon, ang Play Services ay kailangang lumabas at kumuha ng isang set of small native libraries upang maproseso ang iyong kahilingan sa application. Samantalang ito ay halos laging tapos na bago matapos ang paglulunsad ng iyong app, mahalagang mapangasiwaan din ang maaaring mangyari sakaling mabigo ito.

Kung ang FaceDetector ay gumagana, ay maaari mo nang i-convert ang iyong bitmap sa isang Frame object at ipasa ito sa detektor upang makatipon ng mga datos patungkol sa mga mukha na nasa imahe. Kapag tapos ka na, kailangan mong i-release ang detektor upang maiwasan ang isang memory leak. Pag natapos mo na ang pagdi-detect ng mga mukha, tawagan ang invalidate() upang ma-trigger ang redrawing ng view.

Ngayong na-detect mo na ang mga mukha sa iyong imahe, oras na para gamitin sila. Para sa halimbawang ito, guguhit ka ng berdeng kahon sa paligid ng bawat mukha. Dahil ang invalidate() ay natawagan matapos na ma-detect ang mga mukha, maaari kang mag-dagdag ng lahat ng kinakailangang lohikasa onDraw(Canvas canvas). Ang pamamaraang ito ay tinitiyak na ang bitmap at ang mga mukha ay naka-set na, pagkatapos ay dalhin ang bitmap papunta sa canvas, at gumuhit ng isang kahon sa paligid ng bawat mukha.

Samantalang iba-iba ang mga device na may iba't iba ring laki ng display, kailangan mo ring bantayan ang scaled size ng bitmap upang ang buong imahe ay laging nakikita sa device at ang lahat ng naka-overlay ay naaangkop.

Ang pamamaraang drawBitmap(Canvas canvas) ay dinadala ang  bitmap papunta sa canvas para sa angkop nitong sukat habang ibinabalik rin nito ang isang multiplier para sa tamang scaling ng iba mong pang mga dimensiyon.

Ang pamamaraang drawFaceBox(Canvas canvas, double scale) ay mas kawili-wili. Ang bawat mukha na na-detect at na-save ay may position value sa itaas at sa kaliwa ng bawat mukha. Ang pamamaraang ito ay kukunin ang posisyon na iyon at guguhit ng berdeng rektanggulo mula rito upang mapalibutan ang bawat mukha batay sa lapad at taas nito.

Kailangan mong tukuyin ang iyong Paint object at pagkatapos ay i-loop sa bawat Mukha sa iyong SparseArray upang mahanap ang posisyon nito, lapad, at taas, at iguhit ang rektanggulo sa canvas gamit ang impormasyong iyon.

Sa puntong ito, ay napatakbo mo na dapat ang iyong aplikasyon at nakikita ang iyong imahe na may parihaba sa paligid ng bawat mukha na na-detect. Mahalagang tandaan na ang Face Detection API ay medyo bago pa sa panahon na ito ay naisulat at maaaring hindi nito ma-detect ang bawat mukha. Maaari mong laruin ang ilan sa mga setting sa FaceDetector.Builder object upang sana ay makakakuha ng mas maraming datos, bagaman hindi ito garantisado.

Faces detected and bound by a drawn rectangle

3. Pag-unawa sa mga Landmark

Ang mga landmark ay ang mga point of interest sa isang mukha. Ang Face Detection API ay hindi ginagamit ang mga landmark upang ma-detect ang isang mukha, sa halip ay dini-detect nito ang isang mukha sa kabuuan nito bago ito maghanap ng mga landmark. Iyon ang dahilan kung bakit ang pagtuklas ng mga landmark ay isang opsyonal na setting na maaaring paganahin sa pamamagitan ng FaceDetector.Builder.

Maaari mong gamitin ang mga landmark na ito bilang karagdagang mapagkukunan ng impormasyon, tulad ng kung saan ang mga mata ng isang subject, upang ikaw ay maka-react nang naangkop sa loob ng iyong app. Mayroong labindalawang landmark na posibleng makita:

  • kaliwa at kanang mata
  • kaliwa at kanang tainga
  • tip ng kaliwa at kanang tainga
  • base ng ilong
  • kaliwa at kanang pisngi
  • kaliwa at kanang sulok ng bibig
  • base ng bibig

Ang mga landmark na magagamit ay depende sa anggulo ng mukha na na-detect. Halimbawa, ang isang tao na nakaharap patagilid ay magkakaroon lamang ng isang matang nakikita, ito ay nangangahulugan na ang isa pa nyang mata ay hindi madi-detect. Ang sumusunod na table ay bumabalangkas ng kung saan ang mga landmark ay kayang ma-detect batay sa Euler Y angle (kaliwa o kanang direksyon) ng mukha.

Euler Y Mga Nakikitang Landmark
< -36° kaliwang mata, kaliwang bibig, kaliwang tainga, base ng ilong, kaliwang pisngi
-36° sa -12° kaliwang bibig, base ng ilong, Ibabang bibig, kanang mata, kaliwang mata, kaliwang pisngi, tip ng kaliwang tainga
-12° sa 12° kanang mata, kaliwang mata, base ng ilong, kaliwang pisngi, kanang pisngi, kaliwang bibig, kanang bibig, ibabang bibig
12° sa 36° kanang bibig, base ng ilong, ibabang bibig, kaliwang mata, kanang mata, kanang pisngi, tip ng kanang tainga
> 36° kanang mata, bandang kanang bibig, kanang tainga, base ng ilong, kanang pisngi

Ang mga landmark ay sobrang dali ring gamitin sa iyong aplikasyon sapagkat isinama mo na sila sa panahon ng face detection. Kailangan mo lamang tawagan ang getLandmarks() sa isang Face object upang makakuha ng isang List of Landmark objects na maaari mong makatrabaho.

Sa tutoryal na ito, magpipinta ka ng isang maliit na bilog sa bawat landmark na na-detect sa pamamagitan ng pagtawag sa isang bagong pamamaraan, drawFaceLandmarks(Canvas canvas, double scale), mula sa onDraw (canvas canvas) sa halip na drawFaceBox(Canvas canvas, double scale). Ang pamamaraang ito ay kumukuha ng posisyon ng bawat landmark, ina-adjust ito para sa scale ng bitmap, at pagkatapos ay ipinapakita ang bilog na landmark indicator.

Matapos tawagan ang pamamaraang ito, dapat ay may makita kang mga maliliit na berdeng bilog na sumasaklaw sa mga na-detect na mukha gaya ng ipinapakita sa halimbawa sa ibaba.

Circles placed over detected facial landmarks

4. Karagdagang Datos ng Mukha

Habang ang posisyon ng isang mukha at mga landmark nito ay kapaki-pakinabang, maaari ka ring makakuha ng marami pang impormasyon tungkol sa bawat mukha na na-detect sa iyong app sa pamamagitan ng ilang mga built-in na pamamaraan mula sa Face object. Ang pamamaraang getIsSmilingProbability()getIsLeftEyeOpenProbability() at getIsRightEyeOpenProbability() ay sumusubok na matukoy kung ang mga mata ay bukas o kung ang taong na-detect ay nakangiti sa pamamagitan ng pagbabalik ng float mula 0.0 hanggang 1.0. Kung mas malapit sa 1.0, mas malamang na ang taong iyon ay nakangiti o nakabukas ang kanilang kaliwa o kanang mata.

Maaari mo ring mahanap ang anggulo ng mukha sa Y at Z axes ng isang imahe sa pamamagitan ng pagsuri ng mga Euler value nito. Ang value ng Z Euler ay laging maiuulat, gayunpaman, dapat mong gamitin ang tamang mode sa pagdi-detect ng mga mukha upang matanggap ang value ng X. Maaari mong makita ang isang halimbawa kung paano makakuha ng mga value na ito sa sumusunod na code snippet. Maaari mong makita ang isang halimbawa kung paano makakuha ng mga value na ito sa sumusunod na code snippet.

Konklusyon

Sa tutoryal na ito, ay natutunan mo ang tungkol sa isa sa mga pangunahing bahagi ng Play Services Vision library, ang Face Detection. Alam mo na ngayon kung paano mag-detect ng mga mukha sa isang nakahintong imahe, kung paano makatipon ng impormasyon, at makahanap ng mahahalagang landmark para sa bawat mukha.

Gamit ang natutunan mo, maaari ka nang makapagdagdag ng ilang mga mahuhusay na feature sa iyong sariling mga app para sa augmentasyon ng nakahintong mga imahe, pagsubaybay ng mga mukha sa isang video feed, o anumang iba pang bagay na maaari mong isipin.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.