Vi står inför uppgiften att analysera fotgängares och fordons rörelser för att automatiskt få fram olika data baserat på analysen av bildsekvenser från övervakningskameror i realtid eller arkiverade poster. För detta ändamål använde vi en särskild programvara som gör det möjligt för oss att kontrollera och analysera data i automatiskt läge. I vårt fall utvecklade vi ett system för övervakning av fordons- och fotgängartrafik på vägarna för att bedöma trafikstockningar och efterföljande optimering av trafikflödet genom GIZMOre/cGIS-plattformens funktionalitet.
Vi tog data från övervakningskameror som tillhandahåller videoströmmar från flera korsningar i staden.
Varje kamera ger:
För att analysera trafiken är det nödvändigt att få fram uppgifter om människors och fordons rörelser inom det område som täcks av kamerorna och att bygga upp statistik som bygger på att räkna antalet förekomster av en viss typ av objekt.
Men det räcker inte att bara räkna förekomsten av objekt för att göra en objektiv bedömning av trafikstockningar. Det är nödvändigt att förstå den rumsliga fördelningen av sådana, dvs. vilka vägsträckor som är överbelastade i termer av geografiska koordinater.
Med hjälp av trafikens och människornas rörelsemönster blir det möjligt att skapa ”värmekartor” över trafikstockningar för att visualisera dem på den elektroniska kartan.
För uppgiften måste vi alltså lösa följande deluppgifter:
Parallell behandling av data från flera kameror beslutades ske med hjälp av Apache Kafka, som gör det möjligt att skapa en kö av ramar för varje övervakningskamera. Bilderna från varje kamera behandlas av ffmpeg-biblioteket:
Det är värt att notera att användningen av ffmpeg för storyboarding motiveras av det faktum att OpenCV inte har någon funktionalitet för behandling av byte-meddelanden från RAM.
Для решения задачи детектирования было решено использовать модель семейства YOLO. Модели данного семейства хорошо показали себя для решения задач обнаружения объектов в реальном времени в соревнованиях VOC, ImageNet Classification Challenge и многих других.
När den här artikeln skrivs är den mest optimala modellen YOLOv3 och dess varianter. Två arkitekturer kommer att diskuteras härnäst: YOLOv3 och Tiny YOLOv3. Den andra arkitekturen är en förenklad implementering av YOLOv3-modellen för att snabba upp prestandan och få fler bilder per sekund (FPS).
För att lösa problemet med objektspårning och identifiering valde vi mellan algoritmerna SORT och DeepSORT.
Kärnan i SORT-algoritmen är att använda ett Kalman-filter för att driva spårningen. Den grundläggande idén med Kalman-filtret är att detektorn, oavsett hur bra kvalitet den har på valideringsprovet, vid något tillfälle kanske inte upptäcker ett objekt på grund av ocklusioner, dålig synlighet eller avlägset läge. Ändå kan varje objekts rörelse uppskattas med hjälp av en kinematisk modell som bygger på tidigare uppskattningar. Därför får vi först den mest sannolika uppskattningen av objektets position och förfinar denna sedan när uppskattningarna från vår detektor dyker upp.
Problemet i det här fallet är fortfarande objektidentifiering, dvs. att fastställa att det var samma objekt i den föregående bilden.
Detta uppnås vanligtvis genom att mäta avståndet mellan mittpunkterna i de rektangulära ramar som erhålls av detektorn (figur 1). Vi utgår från att samma objekt kommer att ligga på ett minsta avstånd mellan de närmaste ramarna, men detta fungerar inte i alla fall.
Om t.ex. två personer går mot varandra och efter att de korsats i bilden kan identifieringarna av dessa objekt blandas ihop, vilket leder till fel.
För detta ändamål modifieras SORT-algoritmen genom att lägga till ett separat neuralt nätverk som omvandlar en del av bilden i den ram som förutses av detektorn till en vektor med fast längd som beskriver bildens semantiska innebörd med egenskapen avstånd, det vill säga att avståndet mellan två sådana vektorer anger graden av likhet mellan objekten i bilden.
Detta uppnås genom att det neurala nätverket tränas i distansmåttet och genom att visa liknande och olikartade par i träningen. Resultatet är ett neuralt nätverk som omvandlar bilden till en vektor med distansegenskapen.
Vi får DeepSORT-algoritmen, som inte jämför avståndet mellan centroiderna av rektangulära ramar på olika sådana, utan i stället deras semantiska beskrivningar. På så sätt blir objektidentifieringen mer robust mot fel av typen falskt positiva.
Problemet med detta tillvägagångssätt är att det neurala nätverk som konstruerar semantiska vektorer måste göra det för en viss klass av objekt, till exempel för människor, bilar, lastbilar. För att spåra både bilar och människor i samma bild behöver vi därför två tränade kodare (ett neuralt nätverk som omvandlar bilden till en semantisk vektor) för människor och fordon.
För att lösa vårt problem använde vi färdiga vikter för YOLOv3-detektorn, som känner igen 80 klasser från VOC-datasetet. För standardkodaren använde vi viktningskoefficienter som förtränats för att koda semantiska vektorer för människor i datasetet Market-1501.
Eftersom vi också måste spåra bilar har vi lagt till uppgiften att träna kodaren för objekt i klassen bilar.
För att träna kodaren att omvandla bilder med fordon använde vi VeRi-dataset som innehåller bildpar (X - Y), där
Totalt 40 000 bilder, där det för varje bild finns minst ett bildpar.
På grundval av de tillgängliga paren konstrueras tripletter, dvs. för paret (X - Y) (ankare - positivt) väljs bild Z (negativt) som innehåller ett objekt som inte liknar de objekt som ingår i paret (X - Y). På så sätt bildas en förlustfunktion för tripletter för att träna vektorer av liknande objekt som är nära och olika objekt som är långt ifrån varandra.
För att koda bilder till en semantisk vektor använde vi ett litet konvolutionellt neuralt nätverk som består av tre konvolutionella lager och poolinglager mellan dem. I slutet fanns det ett fullt sammankopplat lager med en storlek på 128.
Träningen utfördes med hjälp av TensorFlow ramverk för maskininlärning på ett Nvidia GeForce 1660 TI 6 GB grafikkort:
Kvaliteten utvärderades med hjälp av kvalitetsmåttet Precision@k. Detta mått används för att bedöma kvaliteten på sökmotorer. Om man söker efter en viss bild ger Precision@k-metrinet sannolikheten för att det önskade objektet finns med i urvalet av k bilder i sökningen.
Vi fick följande resultat:
Metric | Value |
Precision@1 | 0.69 |
Precision@5 | 0.91 |
Precision@10 | 0.94 |
Precision@20 | 0.98 |
Om vi använder algoritmer för vektordimensionalitetsreduktion (t.ex. t-SNE) som beräknats för alla 40 000 bilder kan vi visa alla bilar i ett semantiskt 3D-utrymme, där de mest likartade objekten ligger närmast varandra (figur 7).
Resultatet blev ett lättviktigt neuralt nätverk som kan omvandla bilden till en vektor som har egenskapen avstånd. Ju mindre avståndet mellan vektorerna är, desto mer liknar objekten i bilden varandra.
Genom att införliva detta neurala nätverk i spårningsalgoritmen kunde vi upptäcka trafiken av många objekt av olika klasser, nämligen människor och fordon (figur 8).
När vi väl har algoritmen för att spåra objekt i videoströmmen stod vi inför uppgiften att lära oss hur vi ska visa objektens banor på kartan för att vidare beräkna trafikvolymen och graden av trängsel under ett visst tidsintervall.
Till att börja med tillämpade vi en perspektivtransformation. Det vill säga, på varje intressant kamera markerade vi kantpixlar i varje hörn av bilden på villkor att vi kan hitta objekt som är knutna till dessa pixlar på kartan. Detta gör det möjligt för oss att överföra objekten i kameraplanet till jordytans plan genom att matcha punkterna på kameraplanet med motsvarande punkter på jordytan (figur 9).
Genom att markera pixlarna hittade vi de landmärken som är kopplade till dem på kartan och fastställde deras geografiska koordinater i latitud/longitud-format.
Därefter omvandlades pixlarna på kameran till punkter på kartan genom perspektivtransformation, och de erhållna objektens banor överfördes därefter till jordplanet (figur 10).
På grundval av de erhållna banorna och frekvensen av objektens utseende byggde vi värmekartor över objektens rörelse och histogram över objektens utseende i en eller annan del av staden, där kamerorna var installerade.
Nästa uppgift var att optimera spårningsalgoritmerna för användning i realtid. Eftersom vi måste bearbeta flera kameror med minsta möjliga mängd resurser måste vi använda alla möjliga verktyg för att snabba upp de neurala nätverken.
I den första iterationen, när modellen kördes, översteg antalet bilder per sekund för en kamera inte 11 FPS, det vill säga modellen i sin ursprungliga form var för tung och kunde inte användas för arbete i realtid.
Till en början försökte vi behandla endast var fjärde bild i videoströmmen, vilket gav en linjär ökning av prestandan. Det vill säga, genom att minska antalet ramar med n gånger fick vi en n-faldig prestandaökning i modellen. Algoritmen började fungera med en bildfrekvens på 40-45 FPS. Men detta var fortfarande inte tillräckligt, eftersom det faktum att lägga till fler och fler kameror minskade hastigheten på samma sätt, vilket gjorde att denna förbättring reducerades till att behandla endast två kameror på en server.
Då bestämde vi oss för att ändra arkitekturen för detektorn, men behålla dess grundidé genom att tillämpa Tiny YOLOv3-modellen.
Tiny YOLOv3 förbättrade avsevärt hastigheten på videoströmbehandlingen, så att vi kunde behandla 8 kameror vid 30 FPS.
Efterföljande förbättringar var redan relaterade till kostnadsoptimering. Det är känt att det är en extremt dyr tjänst att använda hyrda servrar med videokort, så vi bestämde oss för att titta på befintliga optimeringsverktyg för detekteringsalgoritmer på Intel-processorer.
Vi betraktade Intels OpenVino Toolkit-ramverk som ett optimeringsverktyg. Med hjälp av detta verktyg optimerade vi vår modell för Intel-processorer och experimenterade med olika konfigurationer.
Försöksnummer | Antal videoströmmar | Antal virtuella trådar (vCPU) | FPS |
1 | 4 | 2 | 20 |
2 | 4 | 4 | 35 |
3 | 4 | 8 | 40 |
4 | 8 | 2 | 18 |
5 | 8 | 4 | 22 |
6 | 8 | 8 | 25 |
7 | 16 | 2 | 10 |
8 | 16 | 4 | 12 |
9 | 16 | 8 | 15 |
På grundval av våra experiment har vi valt en stabil konfiguration för behandling av videoströmmar från åtta kameror på åtta vCPU:er, vilket gjorde det möjligt för oss att skala lösningen med en optimal serverarkitektur när det gäller budgeten.
Den här artikeln beskriver forsknings- och utvecklingscykeln för lösningen vad gäller att analysera videoströmmar från övervakningskameror och erhålla trafik- och fotgängaranalyser. Den utvecklade teknikstacken gjorde det möjligt för oss att ytterligare skapa andra lösningar inom detta område med hjälp av modern teknik inom området artificiell intelligens.