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

Ўвядзенне ў Face Detection на Android

by
Difficulty:IntermediateLength:LongLanguages:

Belarusian (беларуская мова) translation by Alex Grigorovich (you can also view the original English article)

Уведзенае з бібліятэкамі Віжн ў Play Services 8.1, функцыя выяўленне асобы робіць яго лёгкім для вас як распрацоўніка для аналізу відэа ці малюнкаў, каб знайсці чалавечы твар.  Калі ў вас ёсць спіс асобаў, выяўленых на малюнку, вы можаце сабраць інфармацыю пра кожнага твары, напрыклад, арыентацыі, верагоднасць усміхаецца, ці мае хто-то іх вочы адкрытымі ці зачыненымі, а таксама канкрэтныя вехі на іх твары.

Гэтая інфармацыя можа быць карыснай для розных прыкладанняў, такіх як прыкладанне камеры, якая аўтаматычна робіць здымак, калі ўсе ў кадры усміхаецца з адкрытымі вачыма, або для павелічэння малюнкаў з дурнымі эфектамі, такімі як рог аднарога.  Важна адзначыць, што функцыя выяўлення асобы не распазнання асоб.  Хаця інфармацыя можа быць сабрана аб асобе, што інфармацыя не выкарыстоўваецца бібліятэкай Vision, каб вызначыць, калі два асобы з таго ж чалавека.

Гэты падручнік будзе выкарыстоўваць нерухомае малюнак для запуску API распазнання асоб і збіраць інфармацыю пра людзей на фота, а таксама які ілюструе гэтую інфармацыю з накладной графікай.  Увесь код для гэтага ўрока можна знайсці на GitHub.

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

1. Настройка праекта

Для таго, каб дадаць бібліятэку Бачанні ў свой праект, вам неабходна імпартаваць Play Services 8.1 або больш у ваш праект.  Гэты імпарт падручнік толькі Play Services Зрок бібліятэка.  Адкрыйце build.gradle файл вашага праекта і дадайце наступны радок кампіляцыі ў вузел dependencies.

Пасля таго, як вы ўключылі Play Services ў ваш праект, вы можаце зачыніць файл build.gradle вашага праекта і адкрыйце AndroidManifest.xml.  Вам трэба дадаць элемент meta-data, якія вызначаюць залежнасць асобы пад вузлом application вашага маніфесту.  Гэта дазваляе бібліятэцы Гледжання ведаць, што вы збіраецеся выявіць асобу ў вашым дадатку.

Пасля таго, як вы скончылі налады AndroidManifest.xml, вы можаце пайсці наперад і зачыніць яго.  Далей, вам трэба стварыць новы клас з імем FaceOverlayView.java.  Гэты клас пашырае View і ўтрымлівае логіку для выяўлення асобы ў праекце, адлюстроўваючы кропкавы малюнак, які быў прааналізаваны і малюнак на верхняй часткі выявы для таго, каб праілюстраваць кропкі.

У цяперашні час, пачніце з дадання зменных-членаў у верхняй частцы класа і вызначэння канструктараў.  Растравы Bitmap аб'ект будзе выкарыстоўвацца для захоўвання растравага малюнка, які будзе прааналізаваны SparseArray і разрэджаная масіў аб'ектаў Face будзе захоўваць кожны твар, знойдзенае ў бітавай карце.

Далей, дадаць новы метад ўнутры FaceOverlayView называецца setBitmap (Bitmap bitmap). Пакуль гэта будзе проста захаваць кропкавы малюнак, перададзены яму, аднак пазней вы будзеце выкарыстоўваць гэты метад для аналізу выявы.

Далей, вам трэба растравы малюнак.  Я уключыў адзін у прыкладзе праекта на GitHub, але вы можаце выкарыстоўваць любы малюнак, якое вы хацелі б, каб гуляць з функцыяй распазнання асоб і паглядзець, што працуе, а што няма.  Пасля таго як вы абралі малюнак, змесціце яго ў res/raw каталог.  Гэты падручнік будзе лічыць, што вобраз называецца face.jpg.

Пасля таго, як вы змясцілі выяву ў res/raw каталога, адкрыты res/layout/activity_main.xml.  Гэты макет ўтрымлівае спасылку на FaceOverlayView так, каб ён адлюстроўваўся ў MainActivity.

З пэўнай кампаноўкай, адкрытай MainActivity і наладзіць FaceOverlayView з OnCreate().  Вы можаце зрабіць гэта, атрымаўшы спасылку на прадстаўленне, чытанне файла малюнка face.jpg з зыходнага каталога ў якасці ўваходнага патоку і пераўтварэнні, якія ў растравы малюнак.  Калі ў вас ёсць растравы малюнак, вы можаце выклікаць setBitmap на FaceOverlayView перадаць малюнак на наладжвальнае ўяўленне.

2. Выяўленне асобы

Цяпер, калі ваш праект настроены, прыйшоў час, каб пачаць выяўляць твар.  У setBitmap (Bitmap bitmap), неабходна стварыць FaceDetector.  Гэта можа быць зроблена з дапамогай FaceDetector.Builder, што дазваляе вызначыць некалькі параметраў, якія ўплываюць як хутка асобы будуць выяўленыя і якія іншыя дадзеныя FaceDetector будзе генераваць.

Параметры, якія вы выбіраеце ў залежнасці ад таго, што вы спрабуеце зрабіць у вашым дадатку.  Калі ўключыць пошук арыенціраў, то асобы будуць выяўленыя больш павольна.  Як і большасць рэчаў у праграмаванні, усё мае свае кампрамісы.  Каб даведацца больш аб даступных варыянтах FaceDetector.Builder, вы можаце знайсці афіцыйную дакументацыю на вэб-сайце для распрацоўнікаў Android.

Акрамя таго, неабходна мець чэк, каб убачыць, калі FaceDetector знаходзіцца ў працоўным стане.  Калі карыстальнік выкарыстоўвае функцыю распазнання асоб у першы раз на прыладзе, Play Services павінен выйсці і атрымаць набор невялікіх уласных бібліятэк для апрацоўкі запыту прыкладання.  У той час як гэта амаль заўсёды будзе зроблена, перш чым ваша прыкладанне скончыла запуск, важна, каб справіцца з неспадзяваным, што гэта не ўдалося.

Калі FaceDetector знаходзіцца ў працоўным стане, то вы можаце пераўтварыць растравы малюнак у Frame аб'ект і перадаць яго на дэтэктар для збору дадзеных аб асобах ў малюнку.  Калі вы скончыце, вы павінны вызваліць дэтэктар, каб прадухіліць уцечку памяці.  Калі вы скончыце выяўлення асобы, выклік Invalidate (), каб выклікаць перамалёўкі выгляду.

Зараз, калі вы выявілі твар на малюнку, гэты час, каб выкарыстоўваць іх.  Для гэтага прыкладу, вы проста намаляваць зялёную рамку вакол кожнай грані.  Бо Invalidate () была выклікана пасля таго, як былі выяўленыя асобы, вы можаце дадаць ўсе неабходныя логікі ў OnDraw (Canvas canvas).  Гэты метад гарантуе, што растравы малюнак і асобы ўсталяваныя, а затым намаляваць растравы малюнак на палатно, а затым намаляваць скрынку вакол кожнай грані.

Паколькі розныя прылады маюць розныя памеры экрана, вы таксама сачыць за які маштабуецца памер растравага малюнка такім чынам, каб усе малюнак заўсёды адлюстроўваецца на прыладзе і ўсе овэрлэі малююцца адпаведным чынам.

Метад drawBitmap (Canvas canvas) звяртае растравы малюнак на палатно і памерамі яго адпаведным чынам, а таксама вяртае множнік для маштабавання правільна вашых іншых памераў.

DrawFaceBox (Canvas canvas, double scale) метад становіцца крыху больш цікавым.  Кожная асоба, якое было выяўлена і захавана мае значэнне пазіцыі вышэй і злева ад кожнай грані.  Гэты метад будзе прымаць гэтую пазіцыю і намаляваць зялёны прастакутнік з яго, каб ахапіць кожны твар на аснове яго шырыні і вышыні.

Вам трэба вызначыць свой аб'ект Paint, а затым пятлю праз кожную Face грань ў вашым SparseArray, каб знайсці сваё становішча, шырыню і вышыню, і намалюйце прастакутнік на палатне, выкарыстоўваючы гэтую інфармацыю.

На дадзены момант, вы павінны быць у стане запусціць прыкладанне і паглядзець малюнак з прастакутнікамі вакол кожнай асобы, якое было выяўлена.  Важна адзначыць, што функцыя выяўлення асобы API ўсё яшчэ даволі новае ў момант напісання гэтага артыкула, і ён не можа выявіць кожнае твар.  Вы можаце гуляць з некаторымі з параметраў аб'екта FaceDetector.Builder для таго, каб мы спадзяемся сабраць больш дадзеных, хоць гэта не гарантавана.

Faces detected and bound by a drawn rectangle

3. Разуменне Арыенціры

Арыенціры кропкі цікавасці на твары.  Face Detection API не выкарыстоўваюць арыенціры для выяўлення асобы, а хутчэй выяўляе твар ва ўсёй яго паўнаце, перш чым шукаць арыенціры.  Таму выяўленне арыенціраў неабавязковы параметр, які можа быць уключаны праз FaceDetector.Builder.

Вы можаце выкарыстоўваць гэтыя арыенціры ў якасці дадатковай крыніцы інфармацыі, напрыклад, калі вочы аб'екта з'яўляюцца, так што вы можаце рэагаваць адпаведным чынам у вашым дадатку.  Ёсць дванаццаць славутасцяў, якія можна знайсці:

  • левы і правы вачэй
  • левае і правае вуха
  • левы і правы кончык вуха
  • падстава носа
  • левая і правая шчака
  • левы і правы куток рота
  • падстава рота

Гэтыя арыенціры, якія даступныя ў залежнасці ад кута асобы, знойдзенага.  Напрыклад, хто-то сутыкнуўшыся тварам да баку будзе мець толькі адно вока бачнага, а гэта азначае, што іншы вачэй не будзе выяўлены.  У наступнай табліцы прыведзены арыенціры, якія павінны быць выяўленыя на аснове кута Эйлера Y (напрамак налева або направа) асоб.

Эйлер Y  Бачныя арыенціры
<-36°  левае вока, левы рот, левае вуха, падстава носа, левая шчака
-36 ° да -12 °  налева рота, нос падстава, ніжні рот, правае вока, левае вока, левая шчака, левы кончык вуха
-12 ° да 12 °  правага вока, левае вока, базавы нос, левая шчака, правая шчака, левы рот, прама рот, ніжні рот
12 ° да 36 °  направа рот, нос падставы, ніжні рот, левае вока, правае вока правай шчакі, правай кончык вуха
> 36 °  правага вока, роты направа, правае вуха, нос падстава, правая шчака

Арыенціры таксама неверагодна лёгка выкарыстоўваць у дадатку, як вы ўжо ўключылі іх у працэсе распазнання асобы.  Вам проста трэба патэлефанаваць getLandmarks () аб'екта Face, каб атрымаць List аб'ектаў Landmark, што вы можаце працаваць з.

У гэтым уроку, вы будзеце маляваць маленькі круг на кожнай выяўленай славутасцю, выклікаўшы новы метад, drawFaceLandmarks(Canvas canvas, double scale), ад onDraw(canvas canvas) замест drawFaceBox(Canvas canvas, double scale).  Гэты метад займае пазіцыю кожнага арыентыру, рэгулюе яго для маштабу растравага малюнка, а затым адлюстроўвае круг індыкатара арыентыру.

Пасля выкліку гэтага метаду, вы павінны ўбачыць маленькія зялёныя кругі, якія ахопліваюць выяўленыя твар, як паказана ў прыкладзе ніжэй.

Circles placed over detected facial landmarks

4. Дадатковыя дадзеныя асобы

Хоць становішча асобы і яго славутасцяў з'яўляюцца карысным, вы можаце таксама даведацца больш падрабязную інфармацыю пра кожнага твары, выяўленым у вашым дадатку праз некаторыя ўбудаваныя метады з аб'екта Face.  Метады getIsSmilingProbability (), getIsLeftEyeOpenProbability () і getIsRightEyeOpenProbability () паспрабаваць вызначыць, калі вочы адчыненыя або калі чалавек выяўлены усміхаецца, вяртаючы паплавок у дыяпазоне ад 0,0 да 1,0.  Чым бліжэй да 1,0, тым больш верагоднасць таго, што чалавек усміхаецца або мае іх левы ці правы вачэй адкрытым.

Вы можаце таксама знайсці кут асобы на Y і восі Z малюнка шляхам праверкі яго значэння Эйлера.  Значэнне Z Эйлера заўсёды паведамляюцца, аднак, вы павінны выкарыстоўваць дакладны рэжым пры выяўленні асобы, каб атрымаць значэнне X.  Вы можаце ўбачыць прыклад таго, як атрымаць гэтыя значэння ў наступным фрагменце кода.

выснову

У гэтым уроку вы даведаліся аб адным з асноўных кампанентаў бібліятэкі Play Services Vision, а функцыя выяўлення асобы.  Цяпер вы ведаеце, як выявіць твар ў нерухомым малюнку, як збіраць інфармацыю, і знайсці важныя арыенціры для кожнага асобы.

Выкарыстоўваючы тое, што вы даведаліся, вы павінны быць у стане дадаць некаторыя вялікія магчымасці для вашых уласных прыкладанняў для павелічэння нерухомых малюнкаў, адсочваючы твар у відэасуправаджэнне, або што-небудзь яшчэ вы можаце сабе ўявіць.

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.