- Откривање предмета помоћу СИФТ-а
- Откривање предмета помоћу ОРБ-а
- Хистограм оријентисаних градијената (ХОГ)
- Хистограм оријентисаних градијената (ХОГ), корак по корак:
- ХААР каскадни класификатори
- Откривање лица и очију
- Детекција лица и очију уживо
- Подешавање каскадних класификатора
- Откривање аутомобила и пешака у видео записима
Почели смо са инсталирањем питхон ОпенЦВ-а на прозоре и до сада смо извршили неке основне обраде слика, сегментацију слика и откривање објеката помоћу Питхона, који су описани у доњим водичима:
- Први кораци са Питхон ОпенЦВ: Инсталација и основна обрада слика
- Манипулације сликама у Питхон ОпенЦВ-у (1. део)
- Манипулације сликама у ОпенЦВ-у (2. део)
- Сегментација слике помоћу ОпенЦВ - Издвајање одређених подручја слике
Такође смо научили о различитим методама и алгоритмима за откривање објеката где су неке кључне тачке идентификоване за сваки објекат користећи различите алгоритме. У овом упутству ћемо користити те алгоритме за откривање објеката из стварног живота, овде бисмо за откривање користили СИФТ и ОРБ.
Откривање предмета помоћу СИФТ-а
Овде ће се откривање објеката вршити помоћу стреама веб камере уживо, па ако препозна објекат, споменут ће пронађени објет. У коду главни део игра функција која се назива СИФТ детектор, већину обраде врши ова функција.
А у другој половини кода започињемо са отварањем тока веб камере, а затим учитавамо предложак слике, односно референтну слику, односно програм заправо гледа кроз ток веб камере.
Затим, континуирано хватање слике из Веб камере потока уз помоћ бесконачних вхиле петље, а затим хватање висину одговарајуће и ширину вебцам оквира, а после тога дефинише параметре региона од интереса (РОИ) кутија у којој наш објект се може уклопити узимајући одговарајућу висину и ширину оквира веб камере. А затим цртамо правоугаоник из параметара РОИ које смо претходно дефинисали. Затим коначно изрежите правоугаоник и унесите га у СВИФТ детекторски део кода.
Сада СИФТ детектор у основи има два улаза, један је изрезана слика, а други је предложак слике који смо претходно дефинисали, а затим нам даје нека подударања, тако да су подударања у основи број објеката или кључних тачака који су слични на обрезаној слици и циљна слика. Затим дефинишемо вредност прага за подударања, ако је вредност подударања већа од прага, на наш екран стављамо слику пронађену зеленом бојом правоугаоника РОИ.
Сада се вратимо на главни део кода, функцију која се назива СИФТ детектор, узима улаз као две слике једна је слика на којој се тражи објекат, а друга је објект са којим покушавамо да се подударамо до (предложак слике). Затим сиво умерите прву слику и дефинишите образац слике као другу слику. Затим креирамо објекат СИФТ детектора и покрећемо функцију откривања и израчунавања ОпенЦВ СИФТ, тако да откривамо кључне тачке и израчунавамо дескрипторе, у основи су дескриптори вектори који чувају информације о кључним тачкама, и то је заиста важно док радимо подударање између дескриптора слика.
А онда дефинишите подударање засновано на ФЛАНН-у, не улазимо у математичку теорију подударања иза њега, али лако можете о томе Гоогле- увати. Прво, дефинишите индекс кдтрее на нулу, а затим поставимо параметре индекса и претраге у формату речника, само дефинишемо алгоритам који ћемо користити, а то је КДТРЕЕ, и број стабала која ћемо користити, то више дрвећа користимо сложеније и спорије. А у параметру претраживања дефинишите број провера, што је у основи број поклапања која ће завршити.
А онда створите наш објект подударања заснован на ФЛАНН-у учитавањем параметра који смо претходно дефинисали, а то су параметри индекса и параметри претраге и на основу тога креирајте наш подударац заснован на ФЛАНН-у, који је КНН подударање, где је КНН најближи сусед, у основи то је начин на који тражимо најближе подударање и дескрипторе и вршимо подударање са константом иницијализације к. Сада ово подударање засновано на ФЛАНН-у враћа број подударности које смо добили.
Подударање засновано на ФЛАНН-у је само апроксимација, па да бисмо повећали тачност подударања заснованог на ФЛАНН-у, изводимо тест Лове-овог односа и оно што он ради је да тражи подударања из кнн-овог подударања на основу флана и дефинишемо неке матричне параметре који су овде удаљеност, за коју је удаљеност функција нумпи, а након што испуни критеријуме, подудара се са добрим подударањима и враћа пронађена добра подударања, тако да видео пренос уживо приказује број пронађених подударања у углу екрана.
Сада погледајмо код за горњи опис:
импорт цв2 импорт нумпи ас нп деф сифт_детецтор (нев_имаге, имаге_темплате): # Функција која упоређује улазну слику са шаблоном # Затим враћа број СИФТ подударања између њих имаге1 = цв2.цвтЦолор (нев_имаге, цв2.ЦОЛОР_БГР2ГРАИ) имаге2 = имаге_темплате # Цреате Објект СИФТ детектора # сифт = цв2.СИФТ () сифт = цв2.кфеатурес2д.СИФТ_цреате () # Добијање кључних тачака и дескриптора помоћу СИФТ кеипоинтс_1, десцрипторс_1 = сифт.детецтАндЦомпуте (имаге1, Ноне) кеипоинтс_2, десцрипторс_2 = сифт.детете2 Ниједан) # Дефинишите параметре за наш Фланн Матцхер ФЛАНН_ИНДЕКС_КДТРЕЕ = 0 индек_парамс = дицт (алгоритам = ФЛАНН_ИНДЕКС_КДТРЕЕ, стабла = 3) сеарцх_парамс = дицт (провере = 100) # Направите објекат Фланн Матцхер фланн = цв2.ФланнБаседМатцхер (индек_парамс, сеарцх_парамс) # Добијте подударања користећи К-Најближи суседски метод # резултат 'матцхс' је број сличних подударања пронађених на обе подударности слика = фланн.кннМатцх (десцрипторс_1, десцрипторс_2, к = 2) # Складиштење добрих подударања помоћу Лове-овог теста односа гоод_матцхес = за м, н у подударањима: ако је м.дистанце <0,7 * н.дистанце: гоод_матцхес.аппенд (м) ретурн лен (гоод_матцхес) цап = цв2.ВидеоЦаптуре (0) # Учитајте наш образац слике, ово је наша референтна слика имаге_темплате = цв2.имреад ('пхоне.јпг', 0), док је Труе: # Набавите слике са веб камере рет, фраме = цап.реад () # Добијте висину и ширину висине оквира веб камере , видтх = фраме.схапе # Дефинишите димензије РОИ оквира топ_лефт_к = инт (видтх / 3) топ_лефт_и = инт ((хеигхт / 2) + (хеигхт / 4)) боттом_ригхт_к = инт ((видтх / 3) * 2) боттом_ригхт_и = инт ((хеигхт / 2) - (хеигхт / 4)) # Нацртајте правоугаони прозор за подручје које нас занима цв2.рецтангле (фраме, (топ_лефт_к, топ_лефт_и), (боттом_ригхт_к, боттом_ригхт_и), 255, 3) # Обрежите прозор посматрања који смо дефинисали горе цроппед = фраме # Флип фраме хоризонтал хоризонталли фраме = цв2.флип (фраме, 1) # Добијте број СИФТ подударања = сифт_детецтор (цроппед, имаге_темплате) # Прикажи статусни низ који приказује тренутни бр. подударања цв2.путТект (фраме, стр (матцх), (450,450), цв2.ФОНТ_ХЕРСХЕИ_ЦОМПЛЕКС, 2, (0,255,0), 1) # Наш праг за указивање на откривање објекта # Користимо 10, јер СИФТ детектор враћа мале лажне позиције праг = 10 # Ако подударања премашују наш праг, онда је објекат откривен ако се подудара> праг: цв2.рецтангле (оквир, (топ_лефт_к, топ_лефт_и), (боттом_ригхт_к, боттом_ригхт_и), (0,255,0), 3) цв2.путТект (фраме), 'Објект пронађен', (50,50), цв2.ФОНТ_ХЕРСХЕИ_ЦОМПЛЕКС, 2, (0,255,0), 2) цв2.имсхов ('Објецт Детецтор усинг СИФТ', фраме) иф цв2.ваитКеи (1) == 13: # 13 је Ентер Кеи бреак цап.релеасе () цв2.дестроиАллВиндовс ()
Откривање предмета помоћу ОРБ-а
Откривање предмета коришћењем СИФТ-а прилично је кул и тачно, јер генерише много тачног броја подударања на основу кључних тачака, међутим патентирано је и што отежава његово коришћење у комерцијалне апликације, други излаз за то је ОРБ алгоритам за откривање предмета.
Слично методи откривања објеката помоћу СИФТ-а, у којој смо програм поделили на два дела, овде ће се следити исти.
Прво, дефинишемо функцију ОРБ_детецтор која узима два улаза један је слика преноса уживо која долази са веб камере, а друга је предложак слике на основу које ћемо ускладити нашу слику. Потом слику наше веб камере подешавамо у сивим скалама, а затим иницијализујемо ОРБ детектор и постављамо је овде на 1000 кључних тачака и параметре скалирања од 1,2. можете се лако поиграти са овим параметрима, а затим открити кључне тачке (кп) и дескрипторе (дес) за обе слике, а други параметар који дефинишемо у функцији детецтАНДЦомпуте је НОНЕ, тражи употребу маске слике или не и ми то овде негирамо.
Затим пређите на детектор, раније смо користили подударање засновано на ФЛАНН-у, али овде ћемо користити БФМатцхер, а унутар БФМатцхер-а дефинишемо два параметра, један је НОРМ_ХАММИНГ, а други је унакрсна провера чија је вредност ТРУЕ.
Затим израчунајте подударања подударности између те две слике користећи горе дефинисане дескрипторе, што у свему даје број подударања, јер та подударања нису апроксимација, па стога нема потребе за тестом Лове-овог односа, уместо тога сортирамо подударања на основу удаљености, најмање је веће растојање што је боље (овде удаљеност значи растојање између тачака), а на крају враћамо број подударности помоћу функције дужине.
А у главној функцији смо поставили праг на много већу вредност, јер детектор кугле генерише много буке.
Сада погледајмо код за откривање засновано на ОРБ-у
импорт цв2 импорт нумпи ас нп деф ОРБ_детецтор (нев_имаге, имаге_темплате): # Функција која упоређује улазну слику са предлошком # Затим враћа број ОРБ подударања имаге1 = цв2.цвтЦолор (нев_имаге, цв2.ЦОЛОР_БГР2ГРЕИ) # Направи ОРБ детектор помоћу 1000 кључних тачака са фактором пирамиде скалирања од 1,2 орб = цв2.ОРБ_цреате (1000, 1.2) # Откривање кључних тачака оригиналне слике (кп1, дес1) = орб.детецтАндЦомпуте (имаге1, Ноне) # Откривање тачака ротиране слике (кп2, дес2) = орб.детецтАндЦомпуте (имаге_темплате, Ноне) # Направи подударање # Имајте на уму да више не користимо подударање на основу Фланнбф = цв2.БФМатцхер (цв2.НОРМ_ХАММИНГ, цроссЦхецк = Труе) # Учините подударање подударања = бф.матцх (дес1, дес2) # Сортирајте подударања на основу удаљености. Најмање растојање # је боље утакмице = поредани (шибице, кључ = Ламбда Вал: вал.дистанце) повратак лен (утакмице) капа = цв2.ВидеоЦаптуре (0) # Лоад нашу слику шаблон, ово је наша референтна слика имаге_темплате = цв2.имреад ('пхоне.јпг', 0) # имаге_темплате = цв2.имреад ('имагес / киткат.јпг', 0) вхиле Труе: # Набавите слике веб камере рет, фраме = цап.реад () # Добијте висину и ширину висине оквира веб камере , видтх = фраме.схапе # Дефинишите димензије РОИ оквира (имајте на уму да неке од ових ствари треба да буду изван петље) топ_лефт_к = инт (видтх / 3) топ_лефт_и = инт ((висина / 2) + (висина / 4)) боттом_ригхт_к = инт ((ширина / 3) * 2) боттом_ригхт_и = инт ((висина / 2) - (висина / 4)) # Нацртајте правоугаони прозор за наш област интереса цв2.рецтангле (фраме, (топ_лефт_к, топ_лефт_и), (боттом_ригхт_к, боттом_ригхт_и), 255, 3) # Исеци прозор посматрања који смо дефинисали горе цроппед = фраме # Окрени оквир хоризонтално хоризонтално фраме = цв2.флип (фраме, 1) # Добијте број подударања ОРБ-а = ОРБ_детецтор (цроппед, имаге_темплате) # Прикажи статусни низ који приказује тренутни бр. резултата оутпут_стринг = "Матцхес =" + стр (матцх) цв2.путТект (фраме, оутпут_стринг, (50,450), цв2.ФОНТ_ХЕРСХЕИ_ЦОМПЛЕКС, 2, (250,0,150), 2) # Наш праг за указивање на откривање објекта # За нове слике или услове осветљења можда ћете требати мало експериментисати. # Напомена: ОРБ детектор да би добио првих 1000 подударања, 350 је у суштини минимални праг подударања од 35% = 250 # Ако подударања премашују наше праг онда је објекат откривен ако се подудара> праг: цв2.рецтангле (оквир, (топ_лефт_к, топ_лефт_и), (боттом_ригхт_к, боттом_ригхт_и), (0,255,0), 3) цв2.путТект (оквир, 'Објекат пронађен', (50, 50), цв2.ФОНТ_ХЕРСХЕИ_ЦОМПЛЕКС, 2, (0,255,0), 2) цв2.имсхов ('објекта детектор помоћу ОРБ', рам) ако цв2.ваитКеи (1) == 13: # 13 је Ентер Кеи бреак капу.релеасе () цв2.дестроиАллВиндовс ()
Хистограм оријентисаних градијената (ХОГ)
Хајде сада да разговарамо о другом опису који је хистограм оријентисаних градијената (ХОГ).
ХОГ-ови су прилично кул и корисни дескриптори и они се широко и успешно користе за откривање објеката, као што се раније видело, дескриптори слика попут СИФТ и ОРБ где морамо да израчунамо кључне тачке, а затим морамо да израчунамо дескрипторе из тих кључних тачака, а ХОГ-ови то раде другачије. Она представља објекте као један играни вектор насупрот скуп вектора, где свака представља сегмент слике. То значи да имамо јединствену векторску карактеристику за целу слику.
Израчунава се помоћу клизног детектора прозора преко слике, где се ХОГ дескриптор израчунава за сваку позицију. А онда се свака позиција комбинује за један вектор обележја.
Као и СИФТ, скала слике се подешава пирамидирањем.
Раније смо користили подударања попут ФЛАНН-а и БФМатцхер-а, али ХОГ-ови то раде другачије уз помоћ СВМ (суппорт вецтор мацхине) класификатора, где се сваки ХОГ-дескриптор који се израчунава шаље у СВМ-класификатор да би утврдио да ли је објекат пронађен или није.
Ево везе до великог чланка компаније Далал & Триггс о коришћењу ХОГ-ова за откривање људи:
хттпс ://леар.инриалпес.фр/пеопле/триггс/пубс/Далал-цвпр05.пдф
Хистограм оријентисаних градијената (ХОГ), корак по корак:
Разумевање ХОГ-а могло би бити прилично сложено, али овде ћемо се бавити само теоријом ХОГ-а, а да не улазимо дубље у математику која је с тим повезана.
Дакле, узмимо ову слику, мало је пикселирано, а на горњем углу је овде оквир од 8к8 пиксела, па у овом оквиру израчунавамо вектор градијента или оријентације ивица на сваком пикселу. Дакле, значи да у овом пољу израчунавамо вектор градијента слике пиксела унутар оквира (они су нека врста смера или протока самог интензитета слике), а то генерише 64 (8 к 8) вектора градијента који су затим представљени као хистограм. Дакле, замислите хистограм који представља сваки вектор градијента. Дакле, ако би све тачке или интензитети лежали у једном правцу, хистограм за тај правац рецимо 45 степени, хистограм би имао врхунац на 45 степени.
Дакле, оно што сада радимо је да сваку ћелију поделимо на угаоне канте, где свака канта одговара смеру градијента (нпр. Кс, и). У раду Далал и Триггс користили су 9 канти0-180 ° (по 20 ° свака). Ово ефикасно смањује 64 вектора на само 9 вредности. Дакле, оно што смо урадили је смањење величине, али задржавање свих кључних информација које су потребне.
Следећи корак у израчунавању свиња је нормализација, нормализујемо градијенте како бисмо осигурали непроменљивост промена осветљења, тј. Осветљеност и контраст.
На овој слици су вредности интензитета приказане у квадрату у складу са одговарајућим смером и све имају међусобну разлику од 50
∆ Х = 50, ∆ в = 50; │∆│ = √50 2 +50 = 70,72, 70,72 / 100 = 0,707
Векторе делимо с градијентним величинама и добијамо 0,707 за све, ово је нормализација.
Слично томе, ако променимо интензитет или променимо контраст, добићемо следеће вредности.
∆ Х = 50, ∆ в = 50; │∆│ = √50 2 +50 = 70,72, 70,72 / 100 = 0,707; ∆ Х = 100, ∆ в = 100; │∆│ = √100 2 +100 = 141,42, 141,42 / 100 = 1,41
Нормализација се не одвија на нивоу ћелије, већ се одвија на нивоу блока, тако да су овде блокови у основи група од 4 ћелије, ово узима у обзир суседне блокове, па се нормализује узимајући у обзир веће сегменте слике.
Сада погледајмо код
импорт нумпи ас нп импорт цв2 импорт матплотлиб.пиплот ас плт # Учитај слику, затим сиву слику = цв2.имреад ('елепхант.јпг') греи = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ) # Прикажи оригиналну слику цв2.имсхов (' Улазна слика ', слика) цв2.ваитКеи (0) #дефинисање параметара, величине ћелије и величине блока # хкв у пикселима целл_сизе = (8, 8) # хкв у ћелијама блоцк_сизе = (2, 2) # број оријентационих канти нбинс = 9 # Коришћење ОпенЦВ-овог ХОГ Десцриптор-а # винСизе је величина слике изрезане у вишекратник величине ћелије хог = цв2.ХОГДесцриптор (_винСизе = (греи.схапе // целл_сизе * целл_сизе, греи.схапе // целл_сизе * целл_сизе), _блоцкСизе = (блоцк_сизе * целл_сизе, блоцк_сизе * целл_сизе), _блоцкСтриде = (целл_сизе, целл_сизе), _целлСизе = (целл_сизе, целл_сизе), _нбинс = нбинс) # Направимо нумпи матрични облик који креирамо помоћу нумпи арраи схапе за стварање хог_феатурес н_целлс = (греи.схапе // сизе_сизе, греи.схапе // целл_сизе) # Прво индексирамо блокове по редовима. # хог_феатс сада садржи амплитуде градијента за сваки правац, # за сваку ћелију своје групе за сваку групу. Индексирање се врши по редовима, а затим по колонама. хог_феатс = хог.цомпуте (сиво).ресхапе (н_целлс - блоцк_сизе + 1, н_целлс - блоцк_сизе + 1, блоцк_сизе, блоцк_сизе, нбинс).транспосе ((1, 0, 2, 3, 4)) # Направите нашу матрицу градијената са нбин димензијама за чување градијентних оријентација градиентс = нп.зерос ((н_целлс, н_целлс, нбинс)) # Креирајте низ димензија целл_цоунт = нп.фулл ((н_целлс, н_целлс, 1), 0, дтипе = инт) # Нормализација блока за офф_и у опсегу (блоцк_сизе): за офф_к у опсегу (блоцк_сизе): градијенти - блоцк_сизе + офф_и + 1, офф_к: н_целлс - блоцк_сизе + офф_к + 1] + = \ хог_феатс целл_цоунт - блоцк_сизе + офф_и + 1, офф_к: н_целлс - блоцк_сизе + офф_к + 1] + = 1 # Просечни градијенти нагиба / = цоунт_цоунт # Зацртајте ХОГ-ове користећи Матплотлиб # угао је 360 / нбинс * правац цолор_бинс = 5 плт.пцолор (градијенти) плт.гца (). инверт_иакис () плт.гца (). сет_аспецт ('једнак', подесив = 'оквир') плт.цолорбар () плт.схов () цв2.дестроиАллВиндовс ()
Слика приказује како је улазна слика представљена као ХОГ репрезентација.
ХААР каскадни класификатори
Као што је претходно речено, можемо издвојити обележја са слике и користити их за класификацију или откривање објеката.
Шта су ХААР каскадни класификатори?
Метода откривања објеката која уноси Хаар-ове карактеристике у низ класификатора (каскада) за идентификацију објеката на слици. Они су обучени да идентификују једну врсту предмета, међутим, можемо користити неколико њих паралелно, нпр. Откривање очију и лица заједно.
ХААР класификатори Објашњено:
ХААР класификатори се обучавају користећи пуно позитивних слика (тј. Слика са присутним објектом) и
негативних слика (тј. Слика без присутног објекта).
Једном када добијемо те слике, онда издвајамо карактеристике помоћу клизних прозора правоугаоних блокова. Ове карактеристике (карактеристике ХААР-а) имају једну вредност и израчунавају се одузимањем збира интензитета пиксела испод белих правоугаоника од црних правоугаоника.
Међутим, ово је смешан број прорачуна, чак и за основни прозор од 24 к 24 пиксела (180.000 генерисаних карактеристика).
Тако су истраживачи осмислили методу названу Интеграл Имагес која је то израчунала са четири референце низа. Међутим, и даље су имали 180.000 карактеристика и већина њих није додала стварну вредност.
Појачавање је затим коришћено за одређивање најинформативнијих карактеристика, уз Фреунд & Сцхапире-ов АдаБоост и пронашао је најинформативније карактеристике на слици. Појачавање је процес којим користимо слабе класификаторе за изградњу јаких класификатора, једноставно додељивањем тежих пондерисаних казни за нетачне класификације. Смањење 180.000 карактеристика на 6000, што је још увек прилично мало.
У тих 6000 карактеристика неке ће бити информативније од других. Дакле, ако смо користили најинформативније функције да бисмо прво проверили да ли регион потенцијално може имати лице (лажни позитивни резултати неће бити велика ствар). То уклања потребу за израчунавањем свих 6000 карактеристика одједном. Овај концепт назива се Каскада класификатора - за откривање лица, метода Виоле Јонес користила је 38 фаза.
Откривање лица и очију
Дакле, након што смо стекли неко теоријско знање о ХААР каскадама, коначно ћемо га применити, како бисмо ствари учинили прилично јаснима, делит ћемо лекције по деловима, прво бисмо открили фронтално лице, а затим бисмо прешли на откривање фронталног лица са очију и на крају бисмо направили детекцију лица и очију уживо путем веб камере.
Дакле, за ово ћемо користити унапред обучене класификаторе које је ОпенЦВ обезбедио као.кмл датотеке, кмл је скраћеница за прошириви језик за означавање, овај језик се користи за складиштење велике количине података, на њему можете чак и да направите базу података.
Приступ овим класификаторима можете имати на овој вези .
Детекција лица
Покушајмо са фронталним откривањем лица, овде можете имати приступ каскади фронталног детектора лица. Само извуците зип датотеку да бисте добили кмл датотеку.
импорт нумпи као нп импорт цв2 # Усмеримо ОпенЦВ-ову функцију ЦасцадеЦлассифиер на место где је ускладиштен наш # класификатор (КСМЛ формат датотеке), имајте на уму да код и класификатор држите у истој фасцикли фаце_цасцаде = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_фронталфаце_дефаулт.кмл') # Лоад наша слика га затим претвори у сиву вредност имаге = цв2.имреад ('Трумп.јпг') греи = цв2.цвтЦолор (имаге, цв2.ЦОЛОР_БГР2ГРАИ) # Наш класификатор враћа РОИ детектованог лица у облику корпе # Чува горњи леви део координата и доња десна координата # враћа листу спискова на којима се налазе различита откривена лица. лица = фаце_цасцаде.детецтМултиСцале (сива, 1.3, 5) # Када није откривено ниједно лице, враћа се фаце_цлассифиер и празан корпус ако је фаце (): принт ("Није пронађено лице") # Прелиставамо низ наших лица и цртамо правоугаоник # преко сваког лица у лицима за (к, и, в, х) у лицима: цв2.рецтангле (слика, (к, и), (к + в, и + х), (127,0,255), 2) цв2.имсхов ('Откривање лица', слика) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Хајде сада да комбинујемо откривање лица и ока заједно, у истој зип датотеци можете имати приступ каскади детектора ока.
импорт нумпи ас нп импорт цв2 фаце_цлассифиер = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_фронталфаце_дефаулт.кмл') еие_цлассифиер = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_еие.кмл') имг = цв2.имреад ('Трумп.јпг') граи = цв2.цвтЦолор (имг, цв2.ЦОЛОР_БГР2ГРАИ) фаце = фаце_цлассифиер.детецтМултиСцале (сива, 1.3, 5) # Када није откривено ниједно лице, фаце_цлассифиер се враћа и празан корпус ако је фаце (): принт ("Није пронађено лице") за (к, и, в, х) у лицима: цв2.рецтангле (имг, (к, и), (к + в, и + х), (127,0,255), 2) цв2.имсхов ('имг', имг) рои_граи = греи рои_цолор = имг еиес = еие_цлассифиер.детецтМултиСцале (рои_граи) цв2.ваитКеи (0) за (ек, еи, ев, ех) у очима: цв2.рецтангле (рои_цолор, (ек, еи), (ек + ев, еи + ех), (255,255,0), 2) цв2.имсхов ('имг', имг) цв2.ваитКеи (0) цв2.дестроиАллВиндовс () цв2.ваитКеи (0)
Дакле, ово код је исто онолико колико је шифра за детекцију лица, али овде смо додали каскаде ока и начин да их открије, као што можете видети да смо изабрали Сиви умањена верзија на лицу као параметар за детецтМултиСцале за очију, што нас доводи до смањења израчунавања, јер ћемо очи открити само у том подручју.
Детекција лица и очију уживо
Дакле, до сада смо радили на откривању лица и очију, сада ћемо применити исто са видео преносом уживо са веб камере. У овоме ћемо урадити исто откривање лица и очију, али овај пут ћемо то учинити за пренос уживо са веб камере. У већини апликација нашли бисте своје лице истакнуто оквиром око њега, али овде смо учинили нешто другачије да бисте пронашли своје лице изрезано и да би се очи препознале само у томе.
Дакле, овде увозимо класификатор лица и очију и дефинисали смо функцију за обављање свих обрада за откривање лица и очију. А након тога покренуо је ток веб камере и позвао функцију детектора лица за откривање лица и очију. Параметар који дефинишемо у функцији детектора лица су непрекидне слике из директног тока веб камере
импорт цв2 импорт нумпи ас нп фаце_цлассифиер = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_фронталфаце_дефаулт.кмл') еие_цлассифиер = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_еие.кмл') деф фаце_детецтор (имг, сизе = 0.5): # Претвори слику у цв у граца2.ца (имг, цв2.ЦОЛОР_БГР2ГРАИ) лица = фаце_цлассифиер.детецтМултиСцале (сива, 1.3, 5) ако је лица (): врати имг за (к, и, в, х) у лица: к = к - 50 в = в + 50 и = и - 50 х = х + 50 цв2.правокутник (имг, (к, и), (к + в, и + х), (255,0,0), 2) рои_граи = сиви рои_цолор = имг еиес = еие_цлассифиер.детецтМултиСцале (рои_граи) за (ек, еи, ев, ех) у очима: цв2.рецтангле (рои_цолор, (ек, еи), (ек + ев, еи + ех), (0,0,255), 2) рои_цолор = цв2.флип (рои_цолор, 1) ретурн рои_цолор цап = цв2.ВидеоЦаптуре (0) вхиле Труе: рет, фраме = цап.реад () цв2.имсхов ('Наш екстрактор лица', фаце_детецтор (фраме)) ако је цв2.ваитКеи (1) == 13: # 13 је Ентер Кеи бреак цап.релеасе () цв2.дестроиАллВиндовс ()
Подешавање каскадних класификатора
Параметри дефинисани унутар детецтМултиСцале, осим улазне слике, имају следећи значај
оурЦлассифиер. детецтМултиСцале (улазна слика, фактор скале, мин. суседи)
- Фактор скале Одређује колико смањујемо величину слике сваки пут када се скалирамо. Нпр. У препознавању лица обично користимо 1.3. То значи да смањујемо слику за 30% сваки пут када се смањи. Израчунавање мањих вредности, попут 1,05, трајаће дуже, али ће повећати брзину откривања.
- Мин Неигхбоурс Наводи број суседа који би сваки потенцијални прозор требао имати да би га сматрао позитивним откривањем. Типично се поставља између 3-6. Делује као подешавање осетљивости, ниске вредности ће понекад открити више лица на једном лицу. Високе вредности ће осигурати мање лажних позитивних резултата, али можда ћете пропустити нека лица.
Откривање аутомобила и пешака у видео записима
Сада ћемо детектовати пешаке и аутомобиле у видео записима помоћу ХААР каскада, али у случају да се ниједан видео не учитава и код се компајлира без грешке, морате следити следеће кораке:
Ако се ниједан видео не учита након покретања кода, можда ћете морати копирати наш опенцв_ффмпег.дл из : опенцв \ соурцес \ 3рдпарти \ ффмпег да бисте га налепили тамо где је инсталиран ваш питхон, нпр. Ц: \ Анацонда2
Једном када се копира, датотеку ћете морати преименовати према верзији ОпенЦВ-а коју користите. Нпр. Ако користите ОпенЦВ 2.4.13, а затим датотеку преименујте у: опенцв_ффмпег2413_64.длл или опенцв_ффмпег2413.длл (ако сте користећи Кс86 машину) опенцв_ффмпег310_64.длл или опенцв_ффмпег310.длл (ако користите Кс86 машину)
Да бисте сазнали где је инсталиран питхон.еке, само покрените ове две линије кода, исписаће се локација на којој је инсталиран питхон.
импорт сис принт (сис.екецутабле)
Ако сте успешно урадили ове кораке, пређимо на код за откривање пешака, Можете добити каскаду за откривање пешака и из зип датотеке овде у прилогу.
импорт цв2 импорт нумпи ас нп # Креирајте наш класификатор тела боди_цлассифиер = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_фуллбоди.кмл') # Покрените снимање видео записа за видео датотеку, овде користимо видео датотеку у којој би пешаци били откривени цап = цв2.ВидеоЦаптуре ('валкинг.ави') # Петља након што се видео успешно учита док је цап.исОпенед (): # Читање сваког кадра видео ретка, фраме = цап.реад () # овде мењамо величину оквира на половину његове величине, радимо на томе да убрзамо класификацију # јер веће слике имају много више прозора за превлачење, па у целини смањујемо резолуцију # видео записа на пола то је оно што означава 0,5, а такође користимо бржи метод интерполације који је #интерлинеар фраме = цв2.ресизе (фраме, Ноне, фк = 0,5, фи = 0,5, интерполатион = цв2.ИНТЕР_ЛИНЕАР) греи = цв2. цвтЦолор (фраме, цв2.ЦОЛОР_БГР2ГРАИ) # Прослеђивање оквира нашим класификаторима тела боди = боди_цлассифиер.детецтМултиСцале (сиво, 1.2, 3) # Издвојити ограничавајућа поља за било која тела идентификована за (к, и, в, х) у телима: цв2. правоугаоник (оквир, (к, и), (к + в, и + х), (0, 255, 255), 2) цв2.имсхов ('Пешаци', оквир) ако је цв2.ваитКеи (1) == 13: # 13 је Ентер Кеи бреак цап.релеасе () цв2.дестроиАллВиндовс ()
Након успешног откривања пешака у видеу, пређимо на шифру за откривање аутомобила, Одавде можете имати каскаду за откривање пешака.
импорт цв2 импорт импорт импорт нумпи ас нп # Направите наш класификатор тела цар_цлассифиер = цв2.ЦасцадеЦлассифиер ('хаарцасцаде_цар.кмл') # Покрените снимање видео записа за видео датотеку цап = цв2.ВидеоЦаптуре ('царс.ави') # Лооп након што видео успешно заврши учитава се док је цап.исОпенед (): тиме.слееп (.05) # Прочитајте први кадар рет, фраме = цап.реад () греи = цв2.цвтЦолор (фраме, цв2.ЦОЛОР_БГР2ГРЕИ) # Проследите оквир у нашу класификацију аутомобила царс = цар_цлассифиер.детецтМултиСцале (сива, 1.4, 2) # Издвојити граничне кутије за било која тела идентификована за (к, и, в, х) у аутомобилима: цв2.рецтангле (фраме, (к, и), (к + в, и + х), (0, 255, 255), 2) цв2.имсхов ('Аутомобили', оквир) ако је цв2.ваитКеи (1) == 13: # 13 је Ентер Кеи бреак бреак.релеасе () цв2.дестроиАллВиндовс ()
Приметили сте да смо додали тиме.слееп (.05) , то је само кашњење брзине кадрова, тако да можете потврдити да су сви аутомобили тачно идентификовани или га можете једноставно уклонити додавањем ознаке коментара.
Овај чланак је упућен са Мастер Цомпутер Висион ™ ОпенЦВ4 у Питхону са курсом за дубинско учење на Удеми-у, који је креирао Рајеев Ратан, претплатите се да бисте сазнали више о Цомпутер Висион-у и Питхону.