Mashinada o'rganish qiziqarli! 4-qism: chuqur o'rganish bilan zamonaviy yuzni tanish

Yangilanish: Ushbu maqola seriyaning bir qismi. To'liq seriyalarni ko'rib chiqing: 1 qism, 2 qism, 3 qism, 4 qism, 5 qism, 6 qism, 7 qism va 8 qism! Siz shuningdek ushbu maqolani 普通话, Russkiy, 한국어, Português, Tiếng Việt yoki Italiano tillarida o'qishingiz mumkin.

Devning yangilanishi: Men ushbu maqolalar asosida yangi kitob yozdim! Bu nafaqat mening barcha maqolalarimni kengaytiradi va yangilaydi, balki juda ko'p minglab yangi tarkibga va ko'plab kodlash loyihalariga ega. Hozir tekshirib ko'ring!

Facebook sizning suratlaringizdagi do'stlaringizni tanib olish qobiliyatini rivojlantirganini payqadingizmi? Eski kunlarda Facebook sizni do'stlaringizni fotosuratlarga bosish va ularning nomlarini yozib belgilash orqali belgilash uchun ishlatgan. Fotosuratni yuklaganingizdan so'ng, Facebook sizga sehr kabi hamma uchun yorliqlarni qo'yadi:

Siz avval qayd qilgan fotosuratlaringizdagi odamlarni Facebook avtomatik ravishda belgilaydi. Bu foydali yoki sirli ekanligiga ishonchim komil emas!

Ushbu texnologiya yuzni aniqlash deb ataladi. Facebook-ning algoritmlari do'stlaringizning yuzlarini bir necha marta tegizgandan keyin taniy oladi. Bu juda ajoyib texnologiya - Facebook yuzlarni 98% aniqlik bilan aniqlay oladi, bu odamlar qila oladigan darajada yaxshi!

Yuzni tanitishning zamonaviy usullari qanday ishlashini bilib olaylik! Faqat do'stlaringizni tanib olish juda oson bo'lar edi. Biz ushbu texnologiyani yanada qiyinroq muammoni hal qilish uchun cheklashimiz mumkin - Uill Ferrellga (taniqli aktyor) Chad Smitdan (mashhur rok musiqachisi) tashqari!

Ushbu odamlardan biri Uill Farrell. Ikkinchisi - Chad Smit. Qasam ichaman, ular har xil odamlar!

Mashinadan o'rganishni juda murakkab muammo bo'yicha qanday ishlatish

Hozircha 1, 2 va 3-qismlarda biz faqat bitta bosqichga ega bo'lgan uyning narxini aniqlash, mavjud ma'lumotlarga asoslangan yangi ma'lumotlar yaratish va rasmda biron bir ob'ekt mavjudligini aytib berishdan iborat bo'lgan yakka tartibdagi muammolarni hal qilishda kompyuterdan foydalanganmiz. Ushbu muammolarning barchasini bitta mashina o'rganish algoritmini tanlash, ma'lumotlarni uzatish va natijaga erishish orqali hal qilish mumkin.

Ammo yuzni aniqlash haqiqatan ham bir nechta bog'liq muammolar qatori:

  1. Avval rasmga qarang va undagi barcha yuzlarni toping
  2. Ikkinchidan, har bir yuzga e'tibor qarating va yuzingiz g'alati yo'nalishda yoki yomon yoritilgan bo'lsa ham, u baribir o'sha odam ekanligini anglab eting.
  3. Uchinchidan, yuzni boshqalarnikidan farqli ravishda aytib berishingiz mumkin bo'lgan yuzning o'ziga xos xususiyatlarini - ko'zlar qanchalik katta, yuzning uzunligi va hokazolarni.
  4. Va nihoyat, yuzning o'ziga xos xususiyatlarini odam ismini aniqlash uchun tanish bo'lgan barcha odamlar bilan taqqoslang.

Inson sifatida sizning miyangiz bularning barchasini avtomatik va zudlik bilan bajarish uchun simli bo'ladi. Aslida, odamlar yuzlarni tanib olishdan juda yaxshi, ular kundalik narsalarda yuzlarni ko'rishga qodir:

Kompyuterlar bunday yuqori darajadagi umumlashtirishga qodir emaslar (hech bo'lmaganda hali ...), shuning uchun biz ularga bu jarayonda har bir qadamni qanday qilib alohida qilishni o'rgatishimiz kerak.

Biz yuzni aniqlashning har bir bosqichini alohida hal qiladigan va hozirgi bosqich natijasini keyingi bosqichga o'tkazadigan quvur liniyasini qurishimiz kerak. Boshqacha qilib aytganda, biz bir nechta mashinalarni o'rganish algoritmlarini birlashtiramiz:

Yuzlarni aniqlash uchun asosiy quvur qanday ishlashi mumkin

Yuzni tanish - qadamma-qadam

Keling, bu muammoni bir qadam hal qilaylik. Har bir qadamda biz boshqa mashina o'rganish algoritmi haqida bilib olamiz. Buni kitobga aylanishiga yo'l qo'ymaslik uchun har bir algoritmni to'liq tushuntirib bermoqchi emasman, lekin har birining asosiy g'oyalarini o'rganasiz va Python-da OpenFace va undan foydalangan holda o'zingizning yuzingizni aniqlash tizimini qanday yaratishingiz mumkinligini bilib olasiz. dlib.

1-qadam: barcha yuzlarni topish

Bizning quvur liniyamizdagi birinchi qadam - bu yuzni aniqlash. Fotosuratda yuzlarni alohida-alohida aytib berishdan oldin ularni topishimiz kerak!

Agar so'nggi 10 yil ichida biron bir kameradan foydalansangiz, ehtimol siz yuzni aniqlashni amalda ko'rgansiz:

Yuzni aniqlash kameralar uchun ajoyib xususiyatdir. Kamera yuzlarni avtomatik ravishda tanlayotganda, suratga olishdan oldin barcha yuzlar diqqat markazida ekanligiga ishonch hosil qilishi mumkin. Ammo biz undan boshqa maqsadlarda foydalanamiz - bizning quvur liniyamizda keyingi bosqichga o'tmoqchi bo'lgan rasmning joylarini topish.

2000-yillarning boshlarida Pol Viola va Maykl Jons arzon kameralarda ishlaydigan etarlicha tez yuzlarni aniqlash usulini ixtiro qilganlarida yuzni aniqlash asosiy yo'nalishga aylandi. Biroq, hozirda ancha ishonchli echimlar mavjud. Biz 2005 yilda kashf etilgan Orientatsion Gradientlarning Gistogrammasi - yoki qisqagina HOG usulidan foydalanmoqchimiz.

Rasmda yuzlarni topish uchun biz rasmimizni oq va qora ranglardan boshlaymiz, chunki yuzlarni topish uchun rang ma'lumotlari kerak emas:

Keyin biz rasmimizdagi har bir pikselni birma-bir ko'rib chiqamiz. Har bir piksel uchun biz uni bevosita o'rab turgan piksellarni ko'rib chiqmoqchimiz:

Bizning maqsadimiz hozirgi pikselni to'g'ridan-to'g'ri o'rab turgan piksel bilan taqqoslash qanchalik aniqligini aniqlashdir. Keyin biz tasvir qaysi tomonga qorong'ilashayotganini ko'rsatadigan o'qni chizmoqchimiz:

Shunchaki bitta pikselga va unga tegib turgan piksellarga qarab, rasm yuqori o'ng tomonga qoraymoqda.

Agar siz ushbu jarayonni rasmdagi har bir piksel uchun takrorlasangiz, unda har bir piksel o'q bilan almashtiriladi. Ushbu strelkalar gradients deb ataladi va ular butun tasvir bo'ylab yorug'likdan qorong'igacha bo'lgan oqimni ko'rsatadi:

Bu tasodifiy bajariladigan narsa kabi ko'rinishi mumkin, ammo piksellarni gradientlar bilan almashtirish uchun juda yaxshi sabab bor. Agar biz piksellarni to'g'ridan-to'g'ri tahlil qilsak, haqiqatan ham qorong'i tasvirlar va haqiqatan ham bir xil odamning yorug'lik tasvirlari umuman boshqa piksel qiymatlariga ega bo'ladi. Ammo faqat yorqinlik o'zgarib boradigan yo'nalishni hisobga olsak, haqiqatan ham qorong'i tasvirlar, ham haqiqatan ham yorqin tasvirlar bir xil aniq tasvir bilan yakunlanadi. Bu muammoni hal qilishni ancha osonlashtiradi!

Ammo har bir piksel uchun gradyanni tejash bizga juda ko'p tafsilotlarni beradi. Daraxtlar uchun o'rmonni sog'inishimiz nihoyasiga etadi. Agar biz shunchaki yorug'lik / qorong'ulikning asosiy oqimini yuqoriroq darajada ko'rsak va tasvirning asosiy naqshini ko'ra olsak, yaxshi bo'lar edi.

Buning uchun biz rasmni har birining o'lchami 16x16 pikseldan iborat bo'lgan kichik kvadratchalarga ajratamiz. Har bir kvadratda biz har bir asosiy yo'nalishda qancha gradient ishora qilganligini hisoblaymiz (qancha ishora, yuqoriga, o'ngga va hokazo ...). Keyin biz rasmdagi maydonni eng kuchli bo'lgan strelkalar bilan almashtiramiz.

Natijada, biz asl qiyofani oddiy shaklda yuzning asosiy tuzilishini ushlab turadigan oddiy tasvirga aylantiramiz:

Asl tasvir HOG tasviriga aylantirildi, bu tasvirning yorqinligiga qaramay, uning asosiy xususiyatlarini o'zida aks ettiradi.

Ushbu HOG tasvirida yuzlarni topish uchun biz qilishimiz kerak bo'lgan narsa - bizning tasvirimizning boshqa mashq yuzlaridan olingan HOG naqshiga o'xshash o'xshash qismini topish:

Ushbu texnikadan foydalangan holda, biz har qanday tasvirdagi yuzlarni osongina topamiz:

Agar siz Python va dlib-dan foydalanib ushbu bosqichni o'zingiz sinab ko'rmoqchi bo'lsangiz, bu erda rasmlarning HOG tasvirlarini yaratish va ko'rish usullari ko'rsatilgan.

2-qadam: Yuzlarni aniqlash va loyihalash

Voy, biz suratimizdagi yuzlarni ajratib qo'ydik. Ammo endi biz turli xil yo'nalishlarda kompyuterga mutlaqo boshqacha qaragan muammolarga duch kelishimiz kerak:

Odamlar ikkala rasm ham Uill Ferrellning ekanligini osongina tan olishadi, ammo kompyuterlar bu rasmlarni mutlaqo boshqacha odam sifatida ko'rishadi.

Buni hisobga olish uchun har bir rasmni buzishga harakat qilamiz, shunda ko'zlar va lablar har doim rasmdagi namunaviy joyda bo'ladi. Bu keyingi bosqichlarda yuzlarni solishtirishni ancha osonlashtiradi.

Buni amalga oshirish uchun biz yuz belgisini baholash deb nomlangan algoritmdan foydalanmoqchimiz. Buning ko'p usullari mavjud, ammo biz Vahid Kazemi va Jozefin Sallivan tomonidan 2014 yilda kashf etilgan yondashuvdan foydalanmoqchimiz.

Asosiy g'oya shundan iboratki, biz har bir yuzda mavjud bo'lgan 68 ta aniq nuqtai nazarni (belgi deb nomlangan) - iyakning yuqori qismini, har bir ko'zning tashqi qirrasini, har bir qoshning ichki chetini va hokazolarni ishlab chiqamiz, shunda biz mashinani o'qitamiz. ushbu 68 alomatni istalgan yuzdan topishga o'rganish algoritmi:

Har bir yuzida biz topadigan 68 ta tarixiy yodgorlik. Ushbu rasmni OpenFace-da ishlaydigan CMU vakili Brandon Amos yaratgan.

Mana, bizning sinov rasmimizga 68 ta aniq joyni joylashtirish natijasi:

QO'ShIMChA: Siz xuddi shu texnikani Snapchat-ning real vaqtda 3d yuz filtrlarini o'z versiyasini amalga oshirishda ham ishlatishingiz mumkin!

Ko'zlar va og'iz borligini bilganimizdan so'ng, biz tasvirni shunchaki aylantiramiz, kattalashtiramiz va ko'zni va og'izni iloji boricha markazlashtiramiz. 3d burishlarni bajara olmaymiz, chunki bu tasvir buzilishiga olib kelishi mumkin. Biz faqat parallel chiziqlarni saqlaydigan aylanish va masshtab kabi asosiy tasvir o'zgarishlarini (afinaviy o'zgarishlar deb nomlaymiz) ishlatamiz:

Endi yuzni qanday burish kerakligidan qat'iy nazar, biz ko'zlar va og'izlarni markazda aylantirishimiz mumkin, rasmda deyarli bir xil holatda. Bu bizning keyingi qadamimizni yanada aniqroq qiladi.

Agar siz Python va dlib-dan foydalanib ushbu bosqichni o'zingiz sinab ko'rmoqchi bo'lsangiz, bu erda yuz belgilarni topish kodi va shu erdan foydalanib tasvirni o'zgartirish kodi.

3-qadam: Yuzlarni kodlash

Endi biz muammoning mohiyatiga tushmoqdamiz - aslida yuzlarni bir-biridan ajratish. Bu erda narsalar haqiqatan ham qiziqarli bo'ladi!

Yuzni aniqlashga eng oddiy yondoshish, biz 2-bosqichda topilgan noma'lum yuzni biz allaqachon yozilgan odamlarning rasmlari bilan to'g'ridan-to'g'ri taqqoslashdir. Oldindan belgilangan yuzni biz noma'lum yuzimizga juda o'xshash ko'rinishini topsak, u xuddi shu shaxs bo'lishi kerak. Juda yaxshi fikrga o'xshaydi, to'g'rimi?

Bunday yondashuvda aslida juda katta muammo mavjud. Milliardlab foydalanuvchilar va trillionlab fotosuratlarga ega Facebook singari sayt avvalgi yorliqlangan yuzlarni har bir yangi yuklangan rasm bilan taqqoslash uchun aylanib o'tolmaydi. Bu juda uzoq davom etishi kerak edi. Ular yuzlarni soatlab emas, balki millisekundlarda aniqlay olishlari kerak.

Bizga kerak bo'lgan narsa - har bir yuzdan bir nechta asosiy o'lchovlarni olish usuli. Keyin biz noma'lum yuzimizni xuddi shunday o'lchashimiz va eng yaqin o'lchovlar bilan tanilgan yuzni topishimiz mumkin edi. Masalan, har bir quloqning o'lchamini, ko'zlar orasidagi masofani, burun uzunligini va hokazolarni o'lchashimiz mumkin. Agar siz CSI kabi yomon jinoyatlar tomoshasini ko'rgan bo'lsangiz, nima haqida gapirayotganimni bilasiz:

Xuddi televizor kabi! Haqiqiy! #science

Yuzni o'lchashning eng ishonchli usuli

Xo'sh, bizning taniqli yuz ma'lumotlar bazamizni yaratish uchun har bir yuzdan qanday o'lchovlarni to'plashimiz kerak? Quloqning o'lchami? Burun uzunligi? Ko'z rangi? Boshqa bir narsa?

Aniqlanishicha, odamlar uchun bizga tushunarli bo'lgan o'lchovlar (ko'z rangi kabi) kompyuter uchun rasmdagi alohida piksellarni ko'rib chiqishda mantiqiy emas. Tadqiqotchilar eng to'g'ri yondashuv - bu kompyuterni o'zi to'plash uchun o'lchovlarni aniqlashga imkon berishdir. Chuqur o'rganish odamlarga qaraganda yuzning qaysi qismlarini o'lchash muhimligini aniqlashga qaraganda yaxshiroq ish qiladi.

Yechim chuqur konvolyutsion neyron tarmog'ini o'rgatishdir (xuddi biz 3-qismda bo'lgani kabi). Ammo tarmoqni biz o'tgan safargidek rasmlarni tanib olishga o'rgatishning o'rniga, biz har bir yuz uchun 128 o'lchovlarni yaratishga o'rgatmoqchimiz.

O'quv jarayoni bir vaqtning o'zida 3 ta rasmga qarab ishlaydi:

  1. Mashg'ulotga taniqli odamning rasmini yuklang
  2. Shu taniqli odamning boshqa rasmini yuklang
  3. Butunlay boshqa odamning rasmini yuklang

Keyin algoritm hozirgi vaqtda ushbu uchta rasmning har biri uchun yaratilayotgan o'lchovlarga qaraydi. Keyin u neyron tarmog'ini biroz burishadi, shunda u №1 va # 2 o'lchovlari biroz yaqinroq bo'lishiga ishonch hosil qiladi va # 2 va # 3 o'lchovlari bir oz bir-biridan uzoqda ekanligiga ishonch hosil qiladi:

Ushbu qadamni minglab turli xil odamlarning millionlab tasvirlari uchun million marta takrorlaganidan so'ng, neyron tarmog'i har bir kishi uchun 128 o'lchovlarni ishonchli ravishda yaratishni o'rganadi. Bitta odamning har qanday o'nta turli xil rasmlari taxminan bir xil o'lchovlarni berishi kerak.

Mashinani o'rganadigan odamlar har bir yuzning 128 o'lchovini ichki qism deb atashadi. Rasm kabi murakkab xom-ashyo ma'lumotlarini kompyuterda ishlab chiqarilgan raqamlar ro'yxatiga tushirish g'oyasi mashinani o'rganishda juda ko'p uchraydi (ayniqsa til tarjimasida). Biz foydalanadigan yuzlarga aniq yondashuv 2015 yilda Google tadqiqotchilari tomonidan ixtiro qilingan, ammo shunga o'xshash ko'plab yondashuvlar mavjud.

Yuzimiz rasmini kodlash

Yuzni ichki ko'rinishini chiqarish uchun konvulsion neyron tarmog'ini o'rgatish jarayoni juda ko'p ma'lumot va kompyuter quvvatini talab qiladi. NVidia Telsa-ning qimmatbaho video kartasi bo'lsa ham, yaxshi aniqlikni olish uchun 24 soat davom etadigan mashg'ulotlar talab etiladi.

Ammo tarmoq o'qitilgandan so'ng, u har qanday yuz uchun o'lchovlarni yaratishi mumkin, hatto u ilgari hech qachon ko'rmagan! Shunday qilib, bu qadamni faqat bir marta bajarish kerak. Bizga omad kulib boqdi, OpenFace-dagi yaxshi odamlar buni allaqachon qildilar va ular biz bevosita foydalanishimiz mumkin bo'lgan bir nechta o'qitilgan tarmoqlarni nashr etishdi. Brandon Amos va jamoaga rahmat!

Shunday qilib, biz o'zimiz qilishimiz kerak bo'lgan narsa - har bir yuz uchun 128 o'lchovni olish uchun oldindan tayyorlangan tarmog'i orqali yuz tasvirlarimizni boshqarish. Bizning sinov rasmimizning o'lchovlari quyidagicha:

Xo'sh, bu 128 raqam aniq o'lchov bilan yuzning qaysi qismlariga to'g'ri keladi? Ma'lum bo'lishicha, bizda hech qanday tasavvur yo'q. Bu biz uchun aslida ahamiyatga ega emas. Bizni qiziqtiradigan narsa shundaki, tarmoq bir odamning ikkita turli xil rasmlarini ko'rib chiqayotganda deyarli bir xil raqamlarni hosil qiladi.

Agar siz ushbu bosqichni o'zingiz sinab ko'rmoqchi bo'lsangiz, OpenFace lua skriptini taqdim etadi, bu papkadagi barcha rasmlarni joylashtiradigan va ularni csv fayliga yozishga imkon beradi. Siz uni shunday boshqarasiz.

4-qadam: kodlashdan odamning ismini topish

Ushbu oxirgi qadam aslida butun jarayonning eng oson bosqichidir. Biz qilishimiz kerak bo'lgan narsa bu bizning sinov rasmimizga eng yaqin o'lchovlarga ega bo'lgan taniqli odamlar to'g'risidagi ma'lumot bazasini topish.

Buni har qanday asosiy mashina o'rganish tasnifi algoritmidan foydalanib amalga oshirishingiz mumkin. Xayoliy chuqur o'rganish fokuslariga ehtiyoj yo'q. Biz oddiy chiziqli SVM tasniflagichidan foydalanamiz, ammo ko'plab tasniflash algoritmlari ishlashi mumkin.

Biz qilishimiz kerak bo'lgan narsa - bu yangi sinov rasmidagi o'lchovlarni oladigan va qaysi taniqli shaxs eng yaqin bo'lganligini aytib beradigan klassifikatorni tayyorlash. Ushbu klassifikatorni ishga tushirish millisekundlarni oladi. Tasniflagichning natijasi - bu odamning ismi!

Shunday qilib, tizimimizni sinab ko'raylik. Birinchidan, men Uil Ferrell, Chad Smit va Jimmi Falonning har biri 20 ga yaqin rasmlarni o'z ichiga olgan tasniflagichni o'rgandim:

Shirin, shirin mashg'ulot ma'lumotlari!

Keyin Uil Ferrell va Chad Smitning Jimmi Fellon shousida bir-birlarini ko'rsatgandek ko'rsatgan mashhur youtube videolarining har bir kadrida tasniflagichni ishlatdim:

Ishlamoqda! Va turli xil holatlarda yuzlar uchun qanchalik yaxshi ishlashiga qarang - hatto yon tomonlarda ham!

Buni o'zingiz bajaring

Keling, qanday qadamlar qo'yganimizni ko'rib chiqaylik.

  1. Tasvirning soddalashtirilgan versiyasini yaratish uchun HOG algoritmi yordamida rasmni kodlang. Ushbu soddalashtirilgan tasvirdan foydalanib, tasvirning yuzning umumiy HOG kodirovkasiga o'xshash qismini toping.
  2. Yuzning asosiy belgilarini topib, yuzning holatini aniqlang. Biz o'sha diqqatga sazovor joylarni topgandan so'ng, ularni tasvirni o'zgartirish uchun foydalaning, shunda ko'zlar va og'iz o'rtada bo'ladi.
  3. Yuzning markaziy tasvirini yuzning xususiyatlarini qanday o'lchashni biladigan neyron tarmoq orqali o'tkazing. Ushbu 128 o'lchovni saqlang.
  4. O'tmishda biz o'lchagan barcha yuzlarga nazar tashlab, qaysi odamning yuz o'lchovlariga eng yaqin o'lchovlarni ko'ring. Bu bizning o'yinimiz!

Endi siz bularning barchasi qanday ishlashini bilsangiz, o'zingizning kompyuteringizda yuzni aniqlash tarmog'ini qanday ishlashini boshidan oxirigacha ko'rsatmalar:

UPDATE 4/9/2017: siz hali ham OpenFace-dan foydalanish uchun quyidagi amallarni bajarishingiz mumkin. Shunga qaramay, men Python-ga asoslangan face_recognition deb nomlangan yuzni tanish kutubxonasini chiqardim, uni o'rnatish va ishlatish ancha oson. Shuning uchun men quyida davom ettirishdan avval yuz tanib olishni sinab ko'rishni maslahat beraman!

Men hatto oldindan tuzilgan virtual mashinani face_recognition, OpenCV, TensorFlow va boshqa ko'plab chuqur o'rganishga mo'ljallangan vositalarni birlashtirdim. Siz uni kompyuteringizga osongina yuklab olishingiz va ishga tushirishingiz mumkin. Agar siz ushbu barcha kutubxonalarni o'zingiz o'rnatishni xohlamasangiz, virtual mashinaga zarba bering!

OpenFace original ko'rsatmalari:

Agar sizga ushbu maqola yoqqan bo'lsa, iltimos, mening Machine Learning-ga yozilishni o'ylab ko'ring! axborot byulleteni:

Bundan tashqari, meni Twitter-da @ageitgey-da kuzatib borishingiz, to'g'ridan-to'g'ri elektron pochta orqali yuborishingiz yoki linkda topishingiz mumkin. Agar siz mashinangizni o'rganish bo'yicha sizga yoki jamoangizga yordam bera olsam, sizdan eshitishni istayman.

Endi "Machine Learning" uchun 5-qism qiziqarli!