- Компоненте потребне
- ИОЛО
- Инсталирање ОпенЦВ-а у Распберри Пи
- Инсталирање осталих потребних пакета у Распберри Пи
- Објашњење програма
- Тестирање пројекта Детектор социјалне удаљености
У време Цовид-19, социјално удаљавање је ефикасан начин за успоравање преноса заразног вируса. Људима се саветује да минимализују међусобне контакте како би умањили ризик од преношења болести директним контактом. Одржавање безбедне удаљености изазов је за многа места попут фабрика, банака, аутобуса или железничких станица итд.
Дакле, у наставку наших претходних Цорона пројеката заштите попут аутоматског уређаја за дезинфекцију и бесконтактног надзора температуре, овде ћемо изградити систем за социјално удаљавање помоћу ОпенЦВ и Распберри Пи. Користићемо тежине алгоритма за откривање објеката ИОЛО в3 са модулом Дееп Неурал Нетворк.
Распберри Пи је увек добар избор за пројекте обраде слика јер има више меморије и брзине од осталих контролера. Раније смо користили Распберри Пи за неке сложене пројекте обраде слика попут откривања оријентира на лицу и апликације за препознавање лица.
Компоненте потребне
- Распберри Пи 4
Овде нам треба само РПи 4 са инсталираним ОпенЦВ-ом. ОпенЦВ се овде користи за дигиталну обраду слике. Најчешћа примена дигиталне обраде слика су откривање предмета, препознавање лица и бројач људи.
ИОЛО
ИОЛО (Само погледате једном) паметна је неуронска мрежа Цонволутион (ЦНН) за откривање објеката у стварном времену. ИОЛОв3, најновија варијанта алгоритма за откривање објеката, ИОЛО може да препозна 80 различитих објеката на сликама и видео записима, изузетно је брз и има одличну тачност. Алгоритам примењује једну неуронску мрежу на целу слику, а затим раздваја слику на регионе и израчунава гранична поља и вероватноће за свако подручје. Основни модел ИОЛО може обрађивати слике у реалном времену брзином од 45 кадрова у секунди. ИОЛО модел надмашује све остале методе откривања попут ССД-а и Р-ЦНН-а.
Модел ИОЛОВ3 који ћемо користити у овом пројекту можете преузети овде.
Инсталирање ОпенЦВ-а у Распберри Пи
Пре инсталирања ОпенЦВ-а и других зависности, Распберри Пи мора бити у потпуности ажуриран. Користите наредбе у наставку да бисте ажурирали Распберри Пи на најновију верзију:
судо апт-гет упдате
Затим користите следеће наредбе за инсталирање потребних зависности за инсталирање ОпенЦВ-а на ваш Распберри Пи.
судо апт-гет инсталл либхдф5-дев -и судо апт-гет инсталл либхдф5-сериал-дев -и судо апт-гет инсталл либатлас-басе-дев -и судо апт-гет инсталл либјаспер-дев -и судо апт-гет инсталл либктгуи4 –И судо апт-гет инсталл либкт4-тест –и
На крају, инсталирајте ОпенЦВ на Распберри Пи користећи наредбе у наставку.
пип3 инсталирај опенцв-цонтриб-питхон == 4.1.0.25
Ако сте нови у ОпенЦВ-у, погледајте наше претходне водиче за ОпенЦВ са Распберри пи:
- Инсталирање ОпенЦВ-а на Распберри Пи помоћу ЦМаке-а
- Препознавање лица у стварном времену помоћу Распберри Пи и ОпенЦВ
- Препознавање регистарске таблице помоћу Распберри Пи и ОпенЦВ
- Процена величине гужве помоћу ОпенЦВ-а и Распберри Пи-а
Такође смо креирали серију водича за ОпенЦВ почевши од почетничког нивоа.
Инсталирање осталих потребних пакета у Распберри Пи
Пре програмирања Распберри Пи за Социал детектор даљине, хајде да инсталирамо остале потребне пакете.
Инсталирање имутилс-а: имутилс се користи за олакшавање основних функција обраде слика као што су превођење, ротација, промена величине, скелетонизација и приказивање Матплотлиб слика помоћу ОпенЦВ-а. Користите доњу наредбу за инсталирање имутилс-а:
пип3 инсталирати имутилс
Објашњење програма
Комплетни код је дат на крају странице. Овде објашњавамо важне одељке кода ради бољег објашњења.
Дакле, на почетку кода увезите све потребне библиотеке које ће се користити у овом пројекту.
импорт нумпи ас нп импорт цв2 импорт имутилс импорт ос импорт тиме
Функција Цхецк () се користи за израчунавање удаљености између два објекта или две тачке у оквиру видео записа. Тачке а и б означавају два објекта у оквиру. Ове две тачке се користе за израчунавање Еуклидове удаљености између објеката.
деф Провери (а, б): дист = ((а - б) ** 2 + 550 / ((а + б) / 2) * (а - б) ** 2) ** 0,5 калибрација = (а + б) / 2 ако је 0 <дист <0,25 * калибрација: ретурн Труе елсе: ретурн Фалсе
Функција подешавања користи се за постављање путања за ИОЛО тежине, цфг датотеку, датотеку имена ЦОЦО. модул ос.патх користи се за уобичајену манипулацију именом путање. ос.патх.јоин () модул је подмодул ос.патх- а и користи се за интелигентно спајање једне или више компоненти путање. За учитавање сачуваних пондера у мрежу користи се метода цв2.днн.реадНетФромДаркнет () . Након учитавања пондера, извуците листу свих слојева који се користе у мрежи помоћу модела нет.гетЛаиерНамес .
деф Сетуп (иоло): глобал неурал_нет, лн, ЛАБЕЛС тежине = ос.патх.сеп.јоин () цонфиг = ос.патх.сеп.јоин () лабелсПатх = ос.патх.сеп.јоин () ЛАБЕЛС = опен (лабелсПатх).реад (). стрип (). сплит ("\ н") неурал_нет = цв2.днн.реадНетФромДаркнет (цонфиг, веигхтс) лн = неурал_нет.гетЛаиерНамес () лн = - 1] фор и ин неурал_нет.гетУнцоннецтедОутЛаиерс ()]
Унутар функције обраде слике, снимамо један кадар видео записа, а затим га обрађујемо за откривање социјалног дистанцирања између сваке особе у гомили. У прва два реда функције у почетку смо поставили димензије видео оквира (В, Х) као (Ноне, Ноне). У следећем реду користили смо методу цв2.днн.блобФромИмаге () за учитавање оквира у пакету и њихово покретање кроз мрежу. Блоб функција врши средње одузимање, скалирање и замену канала на оквиру.
(Х, В) = (Ноне, Ноне) фраме = имаге.цопи () ако је В Ноне или Х није Ноне: (Х, В) = фраме.схапе блоб = цв2.днн.блобФромИмаге (фраме, 1 / 255.0, (416, 416), свапРБ = Тачно, обрезивање = Нетачно) неурал_нет.сетИнпут (блоб) старттиме = тиме.тиме () лаиерОутпутс = неурал_нет.форвард (лн)
Излази слоја из ИОЛО састоје се од скупа вредности. Те вредности нам помажу да дефинишемо који објекат припада којој класи . Премотавамо сваки излаз у ЛаиОутпутс и док откривамо људе, ознаку класе постављамо као „персон“. Из сваког откривања добијамо гранични оквир који нам даје Кс центар, И центар, ширину и висину оквира за откривање у излазу:
резултати = откривање маки_цласс = нп.аргмак (резултати) поузданост = оцене ако су ЛАБЕЛС == "персон": ако је поузданост> 0,5: бок = детецтион * нп.арраи () (центерКс, центерИ, видтх, хеигхт) = бок.астипе ("инт") к = инт (центерКс - (видтх / 2)) и = инт (центерИ - (хеигхт / 2)) оутлине.аппенд () цонфиденцес.аппенд (флоат (поузданост))
Након тога, израчунајте растојање између средишта тренутног оквира са свим осталим откривеним кутијама. Ако су гранични оквири близу, промените статус на тачно.
за и у опсегу (лен (средина)): за ј у опсегу (лен (средина)): цлосе = Провери (центар, центар) ако је близу: паир.аппенд (, центер]) статус = Труе статус = Труе индек = 0
У следећим редовима нацртајте правоугаоник око особе користећи димензије кутије које смо добили од модела, а затим проверите да ли је кутија сигурна или небезбедна. Ако је растојање између кутија близу, боја кутије ће бити обојена црвеном бојом, иначе ће кутија бити обојена зеленом бојом.
(к, и) = (контура, контура) (в, х) = (контура, контура) ако је статус == Труе: цв2.рецтангле (оквир, (к, и), (к + в, и + х), (0, 0, 150), 2) елиф статус == Фалсе: цв2.рецтангле (фраме, (к, и), (к + в, и + х), (0, 255, 0), 2)
Сада унутар функције петље читамо сваки кадар видео записа, а затим обрађујемо сваки кадар да бисмо израчунали удаљеност између особа.
рет, фраме = цап.реад () ако није рет: бреак цуррент_имг = фраме.цопи () цуррент_имг = имутилс.ресизе (цуррент_имг, видтх = 480) видео = цуррент_имг.схапе фрамено + = 1 иф (фрамено% 2 == 0 или фрамено == 1): Постављање (иоло) ИмагеПроцесс (цуррент_имг) Фраме = процессингИмг
У следећим редовима користите функцију цв2.ВидеоВритер () за чување излазног видео записа на месту наведеном опнаме које смо раније дефинисали.
ако је цреате Ноне: фоурцц = цв2.ВидеоВритер_фоурцц (* 'КСВИД') цреате = цв2.ВидеоВритер (опнаме, фоурцц, 30, (Фраме.схапе, Фраме.схапе), Труе) цреате.врите (Фраме)
Тестирање пројекта Детектор социјалне удаљености
Једном када је ваш код спреман, отворите Пи терминал и идите до директорија пројекта. Код, Иоло модел и демо видео треба да буду у истој фасцикли као што је приказано доле.
Овде можете преузети ИолоВ3 директоријум, видео записе са Пекела и копирати Питхон код дат у наставку и ставити их у исти директоријум као што је приказано горе.
Када се нађете у директоријуму пројекта, извршите следећу наредбу за покретање кода:
питхон3 детецтор.пи
Испробао сам овај код на видео примеру који је добијен од Пекелс-а. За мене је ФПС био врло спор и требало је око 10 до 11 минута да обрадим цео видео.
Уместо да користите видео, можете чак и да тестирате овај код помоћу Распберри Пи камере заменом цв2.ВидеоЦаптуре (улаз) са цв2.ВидеоЦаптуре (0) у 98. реду кода. Сазнајте више о коришћењу ПиЦамере са Распберри Пи пратећи везу.
На овај начин можете да користите ОпенЦВ са Распберри Пи за откривање кршења социјалних дистанцирања. Излазни видео и код дати су у наставку: