Budapesti Műszaki Főiskola Neumann János Informatikai Kar Informatikai és Automatizált Rendszerek szakirány Közúti Forgalomfigyelő Rendszer (A1Build4) Dokumentáció Kun Attila József Konzulens: Vámossy Zoltán 2008
1. Célkitűzés Egy olyan gépi látás alapú valós idejű forgalomfigyelő rendszert szeretnék megvalósítani, amelynek főbb képességei a következők: valamilyen videó forrásból (rögzítő eszköz, vagy fájl) érkező képfolyamon detektálja a járműveket, képes forgalomszámlálásra, a járműveket osztályozza méretük alapján, ezzel különböző kimutatások végezhetők adott hely forgalmáról, leolvassa a rendszámokat és azokat eltárolja. 2. A megvalósításhoz használt eszközök-modulok A projekt nagy része Microsoft Visual C# fejlesztőkörnyezetben készül, használatával egyszerűen és gyorsan megvalósítható a grafikus felület és a legtöbb programrész. A videók kezelésére Microsoft DirectShow-t használok, a NETMaster(Thomas Scheidegger) által kifejlesztett DShowNet wrapperen keresztül, valamint az általam kifejlesztett DSVideo modulon keresztül, mely ugyanazt a kényelmes felhasználást biztosítja a fájlból és a rögzítő eszközről történő feldolgozáshoz. A képfeldolgozáshoz a rendszer az Intel OpenCV könyvtárát használja Nagy Attila, szakirányos kollégám DirectCV nevű wrapperén keresztül, valamint Microsoft Visual C++ környezetben készítettem egy külön DLL-t, ami egyelőre BG kódnéven fut, egyetlen feladata van egy az OpenCV-ben megvalósított, háttér szegmentációhoz kapcsolódó típushoz, és függvényekhez való hozzáférés biztosítása. 3. A rendszer felépítése A rendszer a következő alrendszerekből épül fel (narancssárga = nincs még megvalósítva): 1. ábra Alrendszerek 2
3.1 Videó alrendszer 2. ábra - A Videó alrendszer felépítése A program videó forrásként rögzítő eszközt, illetve fájlt kínál fel: 3. ábra - Videó forrás kiválasztása 3
A 3. ábrán, balról jobbra, fentről lefele sorrendben: az első képen a forrás kiválasztása történik a fájl menüből; a második képen, ha a rögzítő eszközt választottuk, akkor egy ablakban ezek megjelennek számunkra, ha több eszközünk van; majd a harmadik képen látható ablakban a képfolyam különböző paraméterei állíthatók be; ha a fájlmenüből fájlt választottunk forrásként, akkor utolsó képen lévő fájlmegnyitó ablak jelenik meg. A bejövő képkockát egy eseménytől kapjuk meg, valójában nem is magát a képkockát csak az aktuális képkocka kezdőcímét a memóriában, majd ezt alakítom át OpenCV-s képformátumra. Utóbbi képkockát lemásolom és eltárolom későbbi feldolgozás céljából, melyet majd a Rendszámfelismerő alrendszer dolgoz fel. Mielőtt továbbítanám a bejövő képet a Mozgásérzékelő alrendszernek, az eredeti képkocka felbontását 320x240-es felbontásra interpolálom a gyorsabb feldolgozás érdekében. 3.2 Mozgásérzékelő alrendszer 4. ábra - Mozgásérzékelő alrendszer vázlatos felépítése Ez az alrendszer megkapja a Videó alrendszertől az aktuális képkockát, azt kezdetben egy inicializáló rész dolgozza fel majd később utóbbit felváltja a detektáló rész, ezután tovább lehet küldeni a Megjelenítésért felelős alrendszernek. Mielőtt leírnám bővebben, hogy hogyan is működik ez az alrendszer, kitérnék a mozgás detektálás módszerére, hogy értsük az Inicializálás és Detektálás jelentését. Mozgást detektálni sokféleképpen lehet, minden módszernek megvan a maga előnye és hátránya. Én a mozgásdetektáláshoz statisztikai alapú módszert használok, ezek közül is a Gauss-féle keverési modellt (S. Nadimi, B. Bhau: PAMI Vol. 26, August 2004, Physical Models for Moving Shadow and Object Detection in Video) alkalmazom a háttér szegmentálására, ezzel dinamikus hátteret kialakítva. Ez a módszer minden pixelt külön folyamatként kezel, egy képpont közelmúltbeli értékeit természetesen minden színcsatornára külön-külön g db normális eloszlású függvény keverékeként ábrázolja. A háttérszegmentáló módszer azon alapul, hogy megnézi, hogy mennyi a valószínűsége annak, hogy adott pixel háttér pixel, ezt a következő képlettel lehet felírni: A képletben jelöli a normális eloszlású függvényt, melynek paraméterei: az aktuális pixel, jelöli az átlagértéket, pedig a kovarianciát. Ezután -t súlyozzuk valamilyen -vel. A módszer implementálva van az OpenCV CVAux részében, ezért magát a technikát nem kellett megírni, csak a BG.dll wrapper könyvtárat. Mivel ezek a számítások nagyon időigényesek ezért nem lehet őket minden képkockára használni, valamint nem is célszerű, mert az egyéb mellékhatásokkal jár, pl. dugók esetén elkezdenek az autók is a háttérhez tartozni. Ez az egyik ok, amiért szükség van az. 4
Inicializálás részre, a másik ok pedig a hardver miatt van kell egy kis idő, amíg a kamera a fényerősséget beállítja. A háttér szegmentáció azt eredményezi, hogy egyszerűen eltűnnek a mozgó objektumok a képről csak a statikus háttér marad. 3.2.1 Inicializálás Ebben a részben a Mozgásérzékelő alrendszer Inicializálás részét fejteném ki. 5. ábra - Mozgásérzékelés/Inicializálás Konstans 100 képkocka kamera fényerősség beállítási időt választottam, ekkor a rendszer gyakorlatilag csak megjeleníti az aktuális képkockákat. Miután letelt a 100 képkockányi idő a 101. képkocka fogja inicializálni a háttérmodellt, az ezt követő képkockák csak frissítik azt, mindaddig, amíg a le nem telik még 99 képkocka, innentől a felhasználó amint megnyomja a detektálás gombot, véget ér az Inicializálás fázis. 6. ábra - Háttérmodell inicializálása/frissítésének folyamata A háttérmodelltől a BG.dll-n keresztül lekérdezem a háttérképet, innentől az bekerül a rendszerbe. A sebesség érdekében, csak mutatókkal dolgozok. 3.2.2 Detektálás A Mozgásérzékelő alrendszer Detektálás fázisa sokkal összetettebb, mint az Inicializálás. Ebben a részben a rendszer csak időnként frissíti a hátteret, plusz emellett elvégzi a mozgások detektálását (8. ábra). A következő ábra a beállítások ablakot mutatja be, mellyel ez a fázis paraméterezhető. 5
7. ábra - Beállítások ablak 8. ábra - Mozgásérzékelés/Detektálás Mivel az árnyék eltávolító rész még nincs megírva, így az aktuális képkockából vonom ki a háttérképet, ezzel megkapom a háttértől való eltérést. A kivonás eredményét szürkeárnyalatos képpé konvertálom, majd ezt küszöbölöm (zajszint beállítások ablakban állítható). Minél zajosabb a kép annál nagyobbra kell állítani a küszöböt. Ezután végrehajt egy Opening és egy Closeing morfológiai szűrőt, ezzel is csökkentve a még megmaradt kisebb zajokat és az esetleges szétvágásokat összenöveszti. 9. ábra - Morfológiai szűrők után A morfológiai szűrők után már meg lehet határozni az egyes objektumokat, ehhez a Firorio Összefüggő komponens kereső algoritmus módosított változatát használom, mely Union-Find 6
adatstruktúrát, valamint döntési fát használ a sebesség növelése érdekében (Kesheng Wu, Ekow Otoo, Kenji Suzuki: http://crd.lbl.gov/~kewu/ps/lbnl-59102.pdf). Ebbe az algoritmusba beágyaztam egy méret szűrőt, ezzel ki lehet szűrni pl. az embereket, egyéb kisebb mozgó objektumokat (minimális objektumméret), és ugyanez végzi az egyes objektumok behatárolását (bal-felső és jobbalsó sarok), ezzel információt szolgáltatva a mozgó járművek téglalapokkal való jelölésére. További lehetősége a programnak, hogy maszkolható az a terület, ahol érzékelni szeretnénk a mozgást, így csak ott fut le az utóbbi algoritmus. 3.3 Megjelenítésért felelős alrendszer Ez az alrendszer felelős a felhasználói felületért és az egyes alrendszerek által feldolgozott képek és egyéb információk megjelenítéséért. 10. ábra - Megjelenítésért felelős alrendszer Mivel eddig csak a Mozgásérzékelő alrendszer készült el csak ennek az eredményét tudja megjeleníteni az alrendszer. 11. ábra - Eredmény kép 7
3.3.1 GUI 12. ábra Főablak A főablak menüvel rendelkezik, ez egyelőre három menüpontot jelent a Fájl, Nézet, Eszközök menüpontokat. A legnagyobb területet az eredménykép foglalja el, alatta található a Detektálás gomb, mely a 200 képkocka után válik aktívvá. Van még egy Szünet gomb is, ez fájlok esetén alkalmazható csak - szüneteltetni lehet vele a feldolgozást. Alul a státusz sorban megjelenítem a videó forrását, hogy Inicializálás vagy Detektálás fázis van-e folyamatban, az eddig feldolgozott képkockák számát és a képkocka feldolgozási idejét milliszekundumban. A Fájl menüben a fentebb ismertetett módon lehet betölteni a videót. A program három nézetet különböztet meg, melyeket a Nézet menüpontból lehet kiválasztani: Háttér, Binarizált, Maszk. 13. ábra - Nézetek 8
A Háttér nézet megmutatja az aktuális szegmentált hátteret a felhasználónak, segítségével el lehet dönteni Inicializálás fázisban, hogy elég jó-e már a háttér, segít a paraméterezésben. A Binarizált nézet csak a Detektálás fázisban működik, a rajta látható objektumokat keretezi be a szoftver az eredeti képen, segítséget nyújt a beállítások finomhangolásában. A Maszk nézet tulajdonképpen nem egy egyszerű nézet, mert ebben lehet megadni azt a területet, ahol a Mozgásérzékelő alrendszer érzékeli a mozgásokat. Egyszerűen, ha rákattintunk a képre, megjelenik egy piros telített négyzet, a négyzetek segítségével kifeszítünk egy poligont, melynek belsejében vesszük csak figyelembe a mozgásokat. Ez azért jó, nekünk, mert pl. ha nem szeretnénk figyelembe venni a másik irányból jövő autókat, ha egy folyó is látható a képen, esetleg az út széle tele van fákkal, ezek, ha benne maradnának az érzékelési területben hibás mozgásdetektáláshoz vezetnének. A négyzetek elhelyezkedésének megváltoztatása ugyanolya egyszerű, mint az lerakásuk, újból rájuk kattintva törlődnek és máris máshova tehetünk egy újat. 14. ábra - Nézetek balról jobbra: Háttér, Binarizált, Maszk Az Eszközök menüben finomhangolni lehet a rögzítő eszközt ebben az esetben az eszköz tulajdonságlapja jelenik meg csak akkor aktív, ha rögzítő eszközt választottunk videó forrásként a Beállítások menüpontban pedig a program paraméterein változtathatunk. 15. ábra - Eszközök menü 9
16. ábra - Eszközök menüpontból megnyitható ablakok: Rögzítő eszköz beállításai (bal), Beállítások (Jobb) 4. Problémák Mivel a szoftver aktuális verziója egy köztes verzió, a fent említett alrendszerek hiánya mellett, csak bizonyos megkötések mellett, illetve problémákkal együtt használható. Főbb problémák: Mivel nincs még megoldva az árnyékok leszedése, azok miatt összenövések keletkezhetnek. A háttérmodell nem boldogul az erősen tükröződő felületekkel, pl. esős időben vizes út. Ha a megvilágítás hirtelen változik, az megint csak problémához vezethet. Gyengébb teljesítményű gépek esetén problémát jelenthet a háttér frissítése. A nézetek aktiválása, többlet processzor időt igényel. Nagy objektumszám lassabb feldolgozási időt eredményez. A fenti problémákon kívül, azonban pozitívumként lehet említeni a működés során megfigyelt stabil memória, illetve processzorhasználatot. 5. Tesztelés A teszteléshez a Notebookomat használtam (Acer Aspire 5310), melynek főbb paraméterei: Intel Celeron M processor 530 (1,73 GHz, 533 MHz FSB, 1MB L2 cache) Intel Graphics Media Accelerator 950 2 GB DDR2 10
A tesztelést nagyrészt videó fájlokon végeztem, melyeket az internetről töltöttem le, illetve én rögzítettem őket. Eredmények: Videó Felbontás/fps t I t D Problémák 320x240 15 fps 43,37 ms 8,97 ms összenövések árnyék 640x480 30 fps 44,53 ms 9,30 ms - 1280x1024 15 fps 45,11 ms 14,20 ms árnyék t I : Átlagos Inicializálási idő/képkocka t D : Átlagos Detektálási idő/képkocka Külső helyszínen is végeztem egy tesztet ekkor a rendszert több mint 20 percig teszteltem, melysorán tökéletesen működött, kisebb hibáktól eltekintve. A program és a tesztvideók letölthetők a project honlapjáról: http://bmfnik.hu/iar/2007_2008/kffr/. 11
Tartalom 1. Célkitűzés... 2 2. A megvalósításhoz használt eszközök-modulok... 2 3. A rendszer felépítése... 2 3.1 Videó alrendszer... 3 3.2 Mozgásérzékelő alrendszer... 4 3.2.1 Inicializálás... 5 3.2.2 Detektálás... 5 3.3 Megjelenítésért felelős alrendszer...7 3.3.1 GUI... 8 4. Problémák...10 5. Tesztelés...10 12