Analys av fotgängare och fordonstrafik i vägkorsningar med hjälp av övervakningskameror

  • baycgis
  • september 06, 2021
  • Inga kommentarer
Introduktion

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 cGIS-plattformens funktionalitet.

Ingångsdata

Vi tog data från övervakningskameror som tillhandahåller videoströmmar från flera korsningar i staden.

Varje kamera ger:

  • HLS stream med 1920×1080 (Full HD) upplösning;
  • Videobitar med en längd på 4 sekunder;
  • En bildfrekvens på 25 FPS.
Problembeskrivning

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:

  1. Att välja en algoritm, optimal i fråga om hastighet och kvalitet för att upptäcka objekt på bilder i realtid.
  2. Att implementera en algoritm för identifiering av objekt baserat på de erkända delarna av bilden i varje bildruta och tilldela varje objekt en unik identifierare.
  3. Bestämma hur man projicerar objektens rörelsebana på kartan.
Behandling av uppgifter

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:

  1. En videoström delas upp i skivor om 100 bilder.
  2. Varje bild reduceras till en storlek på 860×680 för att minska arbetsbelastningen för följande bearbetningsalgoritm. Den angivna storleken valdes experimentellt för att uppnå den erforderliga hastigheten för bildbehandlingen.
  3. Färgkanalernas ordning i bilden ändras från RGB till BGR för ytterligare bildbehandling med hjälp av OpenCV-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.

Val av modellarkitektur

För att lösa detektionsproblemet beslutades det att använda modellen för YOLO-versionerna. Modellerna av denna typ visade sig vara bra för objektdetektering i realtid i VOC, ImageNet Classification Challenge och många andra tävlingar.
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.

Figur 1. Avståndet mellan objekt beräknas med hjälp av centroider.

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.


Figur 2: Arkitektur för det neurala nätverk som omvandlar bilden till en semantisk vektor.

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.

Figur 3. Exempel på bilder från Market-1501 data.

Eftersom vi också måste spåra bilar har vi lagt till uppgiften att träna kodaren för objekt i klassen bilar.

Beskrivning av fordonsdatasetet

För att träna kodaren att omvandla bilder med fordon använde vi VeRi-dataset som innehåller bildpar (X - Y), där

  • X är en bild med en bil;
  • Y är en bild med en bil som liknar bilen från bild X i färg, form och textur, men som till exempel har ett annat perspektiv.

Totalt 40 000 bilder, där det för varje bild finns minst ett bildpar.

Figur 4. Exempel från VeRi dataset. Utbildning och resultat.
Utbildning och resultat

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.

Figur 5. Principen för utbildning i distansmätning.

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:

  • Antal epoker - 100
  • Storlek på partierna - 8
  • Gradientsteg - 0,1
  • Adam-optimering
  • Xavier viktinitialisering
  • Förlustfunktion - Trippelförlust

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:

MetricValue
Precision@10.69
Precision@50.91
Precision@100.94
Precision@200.98

Tabell 1. Resultat av distansmetrisk träning för bilder med transport.

Figur 6: Grafer för rangordning av mätvärden

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).

Figur 7. Semantiskt utrymme för bilar projicerat i 3D med hjälp av T-sNe-algoritmen.

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).

Figur 8. Videoström som behandlas av det neurala nätverket.
Upprättande av koordinater

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).

Figur 9. Markering av kantpunkterna på bilden för vidare projektion.

Efter att ha markerat pixlarna hittade vi de landmärken som var knutna till dem på kartan och bestämde deras geografiska koordinater i formatet "latitud/longitud".

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).

Figur 10. Perspektivisk omvandling av två plan.

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.

Figur 11. Värmekarta över fotgängarnas rörelser i förhållande till terrängkoordinater.
Figur 12. Histogram över antalet fotgängare i en korsning per månad och timme.
Figur 13. Histogram över antalet bilar som visas i en korsning per månad och timme.
Optimering av modellen

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öksnummerAntal videoströmmarAntal virtuella trådar (vCPU)
FPS
14220
24435
34840
48218
58422
68825
716210
816412
916815
Tabell 2. Testresultat för olika utrustningskonfigurationer

Figur. 14. FPS-grafer för olika maskinvarukonfigurationer.

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.

Slutsats

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.

sv_SE