опенцв

Препознавање лица ОпенЦВ

Препознавање лица ОпенЦВ

Препознавање лица са ОпенЦВ

Сложеност машина се повећавала током година и рачунари нису изузетак. Рачунари су човечанству помогли да реши мноштво проблема и изврши пуно тешких задатака. Прошла су времена када су сви рачунари радили једноставне аритметичке операције, рачунари сада покрећу свет.

Рачунари су постали толико сложени, да су обучени да размишљају попут људи.
да!

Учинићемо нешто од те природе у овом чланку. Као људи, препознавање лица других људи једноставан је задатак и упркос способностима данашњих рачунара, рачунару није тако лако па га морамо оспособити да би могао да ради исто.

Много чланака које бисте тамо видели зауставиће се на једноставном откривању лица, али овај чланак не би обухватио само препознавање лица већ и препознавање лица.

То значи да ако се на рачунару представе две моје слике, он не само да препозна који је део слике моје лице, већ би препознао и да сам ја тај на обе слике.

За почетак бисмо прво морали инсталирати опенцв на наше машине, што се може учинити само ако имате инсталиран Питхон. Инсталација Питхона није циљ овог чланка, па ако га већ немате на својој машини, можете да инсталирате Питхон са веб локације Питхон.

Да бисмо инсталирали Опен ЦВ, то можемо учинити помоћу наредбе пип.

пип инсталирајте опенцв-питхон

Такође ћемо користити пакет нумпи у овом чланку, који треба да се инсталира заједно са ОпенЦВ-ом помоћу горње команде.

Ако се нумпи није инсталирао, то можете лако учинити помоћу наредбе испод:

пип инсталл нумпи

Да бисте потврдили да је ваш ОпенЦВ инсталиран, покушајте да га активирате када активирате Питхоново интерактивно окружење користећи:

увоз цв2

Ако не добијете грешку, можете наставити.

Да бисмо извршили препознавање лица, написали бисмо три сценарија. Један за стварање скупа података, други за обуку тих слика, а затим последњи за препознавање лица на основу резултата обуке кроз коју рачунар пролази.

Требала би нам Хаар Цасцаде коју пружа Опен ЦВ. Ову датотеку можете добити из директоријума опенцв који је цв2 / дата / хаарцасцаде_фронталфаце_дефаулт.кмл на мојој машини требало би да буде исто и на вашој машини. Копирајте датотеку у фасциклу у којој желите да препознате лице.

Сада ћемо ући у густину ствари.
Покушали бисмо да дођемо до наше веб камере како бисмо добили слике потребне за скуп података.

увоз цв2
вид_цам = цв2.ВидеоЦаптуре (0)
детектор лица = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_фронталфаце_дефаулт.кмл ')
фаце_ид = 1
цоунт = 0
вхиле (вид_цам.исОпенед ()):
рет, имаге_фраме = вид_цам.читати()
сива = цв2.цвтЦолор (имаге_фраме, цв2.ЦОЛОР_БГР2ГРЕИ)
лица = лице_детектора.детецтМултиСцале (сива, 1.3, 5)
за (к, и, в, х) у лицима:
цв2.правоугаоник (оквир_ слике, (к, и), (к + в, и + х), (255,0,0), 2)
цоунт + = 1
цв2.имврите ("скуп података / корисник."+ стр (фаце_ид) + '.'+ стр (цоунт) + ".јпг ", сива [и: и + х, к: к + в])
цв2.имсхов ('фраме', имаге_фраме)
ако је цв2.ваитКеи (100) & 0кФФ == орд ('к'):
пауза
елиф цоунт> 100:
пауза
вид_цам.издање()
цв2.уништитиАллВиндовс ()

Па да објаснимо шта ради сваки ред кода:

увоз цв2

Ево наредбе која каже питхону да укључи екстерну библиотеку која ће се користити у овом коду, у овом случају то је Опен ЦВ.

вид_цам = цв2.ВидеоЦаптуре (0)

Овај код позива увезену библиотеку Опен ЦВ да започне са снимањем и веб камера је покренута у овом тренутку. Ако Опен ЦВ не подржава вашу веб камеру, код овде неће успети.

детектор лица = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_фронталфаце_дефаулт.кмл ')

Да бисмо могли да извршимо откривање слика, потребан нам је овај код. Отворени ЦВ користи 'хаарцасцаде_фронталфаце_дефаулт.кмл 'за каскадну класификацију. Добијени објекат се затим чува у променљивој фаце_детецтор.

фаце_ид = 1

Ево случаја постављања ИД броја лица, тако да прво лице добија ИД 1.

цоунт = 0

Направићемо неколико слика јер Опен ЦВ треба да обучи слике да би могле да препознају лица, променљива цоунт служи као број слика.

вхиле (вид_цам.исОпенед ()):

Ово омогућава наставак следећих операција под условом да је видео камера отворена. Метода исОпенед () враћа Труе или Фалсе.

рет, имаге_фраме = вид_цам.читати()

Ево, вид_цам.реад () прегледава видео снимање, а затим снима кадар који је сачуван у променљивој имаге_фраме, ако је операција успешна, враћа се логичка вредност Труе и чува се у променљивој рет

сива = цв2.цвтЦолор (имаге_фраме, цв2.ЦОЛОР_БГР2ГРЕИ)

Метода цвтЦолор () користи се за претварање оквира слике у жељени тип боје. У овом случају смо га претворили у сиве тонове.

лица = лице_детектора.детецтМултиСцале (сива, 1.3, 5)

Ово проверава оквире различитих величина и покушава да их подеси на скалирање, ово се примењује на променљиву на коју је примењена Хаар каскада.

за (к, и, в, х) у лицима:

Овде пролазимо кроз лица и његове димензије, где к и и представљају координате, а в и х ширину и висину.

цв2.правоугаоник (оквир_одлике, (к, и), (к + в, и + х), (255,0,0), 2)

Имајте на уму да још увек радимо са видео камером, а видео камера затим одрезује део слике у складу са горе наведеним димензијама.

цоунт + = 1

Одмах то заврши, променљива бројача која стоји као бројач се затим увећава.

цв2.имврите ("скуп података / корисник."+ стр (фаце_ид) + '.'+ стр (цоунт) + ".јпг ", сива [и: и + х, к: к + в])

Исечена слика се чува са именом Корисник (фаце_ид).(цоунт).јпг и ставите у фасциклу која се зове скуп података.

цв2.имсхов ('фраме', имаге_фраме)

Након чувања, овај код осигурава да се слика видео оквира приказује правоугаоником на лицу особе након што је извршена детекција лица.

ако је цв2.ваитКеи (100) & 0кФФ == орд ('к'):
пауза

Након сваке слике, кориснику је дозвољено да заустави програм да снима више слика, што се може учинити притиском на тастер 'к' на тастатури најмање 100мс.

елиф цоунт> 100:
пауза

Овај код чини да заустави рад видео записа чим је снимљено 100 слика, без обзира да ли корисник жели да направи више или не.

вид_цам.издање()

Овде је веб камера затворена и није само заустављена у сликању.

цв2.уништитиАллВиндовс ()

Тада су уништени сви прозори ОпенЦВ-а и код се завршава.

Сад кад смо завршили с тим, можемо да обучимо скуп слика:

увоз цв2, ос
увоз нумпи као нп
из ПИЛ импорт Имаге
препознавач = цв2.лице.цреатеЛБПХФацеРецогнизер ()
детектор = цв2.ЦасцадеЦлассифиер ("хаарцасцаде_фронталфаце_дефаулт.кмл ");
деф гетИмагесАндЛабелс (путања):
имагеПатхс = [ос.пут.јоин (патх, ф) фор ф ин ос.листдир (путања)]
фацеСамплес = []
идс = []
за имагеПатх у имагеПатхс:
ПИЛ_имг = Слика.отворен (имагеПатх).претвори ('Л')
имг_нумпи = нп.низ (ПИЛ_имг, 'уинт8')
ид = инт (ос.пут.сплит (имагеПатх) [- 1].разделити(".") [1])
лица = детектор.идентифиМултиСцале (имг_нумпи)
за (к, и, в, х) у лицима:
фацеСамплес.додати (имг_нумпи [и: и + х, к: к + в])
идс.додати (ид)
ретурн фацеСамплес, идс
лица, идс = гетИмагесАндЛабелс ('скуп података')
препознавач.воз (лица, нп.низ (идс))
препознавач.саве ('тренер / тренер.имл ')

Хајде да објаснимо и овај код:

увоз цв2, ос

Баш као и други код, овде увозимо ОпенЦВ и ос који би нам требали за путању до датотеке.

увоз нумпи као нп

Такође увозимо нумпи библиотеку која би се користила за израчунавање матрице (матрица је само распоред низова).

из ПИЛ импорт Имаге

Увозимо Питхон библиотеку слика, а затим из ње добијамо библиотеку слика и из овог пакета.

препознавач = цв2.лице.цреатеЛБПХФацеРецогнизер ()

Ово што ради је примена методе цреатеЛБПХФацеРецогнизер () на цв2.објект лица, ово би помогло да се препознавање лица учини лакшим јер не морамо да смислимо сопствени сет алгоритама.

детектор = цв2.ЦасцадеЦлассифиер ("хаарцасцаде_фронталфаце_дефаулт.кмл ");

Ако сте пратили туторијал, већ сте раније наилазили на ово. Помаже у откривању лица помоћу функције „хаарцасцаде_фронталфаце_дефаулт“.кмл ”за каскадну класификацију.

деф гетИмагесАндЛабелс (путања):

Сада ћемо започети правилан тренинг слика, па креирамо функцију.

имагеПатхс = [ос.пут.јоин (патх, ф) фор ф ин ос.листдир (путања)]

Овај код проверава тренутни директоријум датотеке и проверава датотеке слика, а затим их додаје на ову листу.

фацеСамплес = []

Овим се иницијализира листа узорака, у овом тренутку је празна, али лица ће се додавати како се код изводи.

идс = []

Иницијализујте листу ИД-ова која је у почетку празна.

за имагеПатх у имагеПатхс:

Запамтите код који је проверавао датотеке слика у директоријуму? да? Сада ћемо проћи кроз сваку од тих датотека и извршити операције над њима.

ПИЛ_имг = Слика.отворен (имагеПатх).претвори ('Л')

Сада прво што радимо на слици је да је претворимо у сиве тонове, а овај код то ради.

имг_нумпи = нп.низ (ПИЛ_имг, 'уинт8')

Слика у сивој скали је само низ бројева на једном месту, па од њих креирамо нумпи низ и додељујемо их променљивој.

ид = инт (ос.пут.сплит (имагеПатх) [- 1].разделити(".") [1])

Ако се сетите датотеке која добија слике, сећате се да смо датотекама дали име Корисник (фаце_ид).рачунати.јпг. Дакле, овде делимо имена са „.”, А затим издвајамо фаце_ид и додељујемо променљивој овде. Требао би нам ИД за препознавање.

лица = детектор.идентифиМултиСцале (имг_нумпи)

Из нумпи низа, метода идентифиМултиСцале () покушаће да открије лица из обрасца који пронађе у нумпи низу. Затим додељује вредности променљивој лица.

за (к, и, в, х) у лицима:

Овде пролазимо кроз вредности додељене променљивој. Овде су вредности к и и координате које бисмо могли узети као исходиште, а затим в и х, односно ширина и висина.

фацеСамплес.додати (имг_нумпи [и: и + х, к: к + в])

Раније смо направили листу узорака лица, али она је била празна. Овде морамо додати лица на ту листу, а и додајемо х да бисмо добили две вредности и координата и исто се ради са к.

идс.додати (ид)

Сада имамо лице на листи узорака лица, па добијамо његов ИД и такође га додајемо на листу ИД-ова.

ретурн фацеСамплес, идс

Затим након свега, враћамо листу узорака лица и листу ИД-ова.

лица, идс = гетИмагесАндЛабелс ('скуп података')

Запамтите да је гетИмагесАндЛабелс () само функција. Дакле, овде морамо позвати функцију, а повратне вредности се чувају у варијаблама лица и ид-а.

препознавач.воз (лица, нп.низ (идс))

Овде се дешава прави тренинг. Применили смо методу цреатеЛБПХФацеРецогнизер () нешто раније и доделили променљиву препознавача. Време је за тренинг!

препознавач.саве ('тренер / тренер.имл ')

После тренинга морамо сачувати резултате тренинга.
Након покретања кода креира датотеку названу тренер.имл који би затим користио код за препознавање лица.

Ево кода за препознавање лица:

увоз цв2
увоз нумпи као нп
препознавач = цв2.лице.цреатеЛБПХФацеРецогнизер ()
препознавач.лоад ('тренер / тренер.имл ')
цасцадеПатх = "хаарцасцаде_фронталфаце_дефаулт.кмл "
фацеЦасцаде = цв2.ЦасцадеЦлассифиер (цасцадеПатх)
фонт = цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС
цам = цв2.ВидеоЦаптуре (0)
вхиле Труе:
рет, им = цам.читати()
сива = цв2.цвтЦолор (им, цв2.ЦОЛОР_БГР2ГРЕИ)
лица = фацеЦасцаде.детецтМултиСцале (сива, 1.2,5)
за (к, и, в, х) у лицима:
цв2.правоугаоник (им, (к-20, и-20), (к + в + 20, и + х + 20), (0,255,0), 4)
Ид = препознавач.предвидети (сиво [и: и + х, к: к + в])
иф (Ид == 1):
Ид = "Назми"
иначе:
Ид = "Непознато"
цв2.правоугаоник (им, (к-22, и-90), (к + в + 22, и-22), (0,255,0), -1)
цв2.путТект (им, стр (Ид), (к, и-40), фонт, 2, (255,255,255), 3)
цв2.имсхов ('им', им)
ако је цв2.ваитКеи (10) & 0кФФ == орд ('к'):
пауза
цам.издање()
цв2.уништитиАллВиндовс ()

Ако сте чланак пратили од почетка, то смо радили и раније. Ако то нисте учинили љубазно.

препознавач.лоад ('тренер / тренер.имл ')

Запамтите да смо обучили препознавач и сачували датотеку? да? Учитавамо ту датотеку сада.

цасцадеПатх = "хаарцасцаде_фронталфаце_дефаулт.кмл "

Радили бисмо са датотеком хаарцасцаде, а овде смо име датотеке доделили променљивој.

# Направите класификатор из унапред изграђеног модела
фацеЦасцаде = цв2.ЦасцадеЦлассифиер (цасцадеПатх)

Овде ћемо извршити каскадну класификацију на хаарцасцаде датотеци.

фонт = цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС

Поставили смо тип фонта који ће се користити када код препозна лице на слици и прикаже име.

цам = цв2.ВидеоЦаптуре (0)

Били смо овде и раније, али овог пута је време да препознамо лица. Ако не знате шта овај код ради, он покреће веб камеру.

вхиле Труе:
рет, им = цам.читати()
сива = цв2.цвтЦолор (им, цв2.ЦОЛОР_БГР2ГРЕИ)
лица = фацеЦасцаде.детецтМултиСцале (сива, 1.2,5)
за (к, и, в, х) у лицима:

Све ово је већ учињено, љубазно проверите код који је коришћен за чување слика ако не знате шта код ради.

цв2.правоугаоник (им, (к-20, и-20), (к + в + 20, и + х + 20), (0,255,0), 4)

Дакле, ово помаже веб камери да открије где су лица и постави правоугаоник да означи лице.

Ид = препознавач.предвидети (сиво [и: и + х, к: к + в])

Већ смо учитали датотеку воза у препознавач, тако да је сада у стању да препозна лице.

иф (Ид == 1):
Ид = "Себе"
иначе:
Ид = "Непознато"

Након покушаја да препозна које је лице, проверава да ли постоји и види да ли постоји. Овде би вредност Ид било име онога ко је био у поседу и суочио се са таквим ИД-ом приликом креирања скупа слика.

цв2.правоугаоник (им, (к-22, и-90), (к + в + 22, и-22), (0,255,0), -1)
цв2.путТект (им, стр (Ид), (к, и-40), фонт, 2, (255,255,255), 3)

Код након проналаска власника идентитета црта правоугаоник око лица и ставља име власника лица. Лице препознато!

цв2.имсхов ('им', им)

Овде се видео оквир приказује са ограниченим правоугаоником.

ако је цв2.ваитКеи (10) & 0кФФ == орд ('к'):
пауза
цам.издање()
цв2.уништитиАллВиндовс ()

Дакле, када завршите, програм можете зауставити притиском на тастер „к“, а он зауставља и затвара веб камеру.

Ето, ваша веб камера сада може да препозна лица и можете је користити кад год желите. Поред коришћења веб камере, можете да учитате и слику, међутим за то су потребни неки други кораци од оних предузетих у овом чланку.

Изворни код који се користи налази се у његовом гитхуб репо-у. Такође нам твитните ако имате коментаре или желите да разговарате о @линукхинт

Најбољи Линук Дистрос за игре у 2021
Линук оперативни систем далеко је превалио свој изворни, једноставни изглед заснован на серверима. Овај ОС се изузетно побољшао последњих година и сад...
Како снимити и стримовати своју играћу сесију на Линук-у
У прошлости се играње игара сматрало само хобијем, али с временом је играчка индустрија забележила огроман раст у погледу технологије и броја играча. ...
Најбоље игре за ручно праћење
Оцулус Куест је недавно представио сјајну идеју ручног праћења без контролера. Са све већим бројем игара и активности које извршавају подршку формално...