Videotracking: Difference between revisions

From Control Systems Technology Group
Jump to navigation Jump to search
No edit summary
 
(33 intermediate revisions by 4 users not shown)
Line 1: Line 1:
== Video Tracking ==
== Introductie ==
 
=== Introductie ===


Video tracking is het volgen van objecten per frame van een video. In geval van een stilstaande camera wordt meestal één beginframe vergeleken met alle frames die erna komen. Het verschil tussen frame 1 en frame x zijn vervolgens alle bewegende objecten. <br>
Video tracking is het volgen van objecten per frame van een video. In geval van een stilstaande camera wordt meestal één beginframe vergeleken met alle frames die erna komen. Het verschil tussen frame 1 en frame x zijn vervolgens alle bewegende objecten. <br>
Het verschil tussen verschillende objecten en het bijhouden welk object waarheen gaat, wordt gemaakt door: ófwel van elk object een mesh te maken en die constant te vergelijken (dit werkt alleen als het object niet van vorm verandert), óf door het vergelijken van (voorspelde) snelheid en versnelling (dit werkt alleen goed als objecten niet te lang buiten beeld vallen of elkaar aanraken).  
Het verschil tussen verschillende objecten en het bijhouden welk object waarheen gaat, wordt gemaakt door: ófwel van elk object een mesh te maken en die constant te vergelijken (dit werkt alleen als het object niet van vorm verandert), óf door het vergelijken van (voorspelde) snelheid en versnelling (dit werkt alleen goed als objecten niet te lang buiten beeld vallen of elkaar aanraken).  
Bewegende objecten worden gedetecteerd met behulp van mean-shifting. Per frame wordt er iteratief gekeken naar het gemiddelde van de cluster van punten (bewegende pixels) om zo positie, snelheid en acceleratie vast te stellen.
Bewegende objecten worden gedetecteerd met behulp van zogenaamde mean-shifting. Per frame wordt er iteratief gekeken naar het gemiddelde van de cluster van punten (bewegende pixels) om zo positie, snelheid en acceleratie vast te stellen.


=== Onderdelen van video tracking algoritme ===
Deze pagina beschrijft kort de onderdelen van het video tracking algoritme, waarbij geavanceerde technieken op aparte pagina's uitgelegd worden.
 
== Onderdelen van video tracking algoritme ==


Video tracking bestaat uit een aantal stappen, die in de introductie al kort beschreven zijn. In pseudo-code kan het als volgt beschreven worden: <br>  
Video tracking bestaat uit een aantal stappen, die in de introductie al kort beschreven zijn. In pseudo-code kan het als volgt beschreven worden: <br>  
Line 14: Line 14:


<code>
<code>
while ( not (einde video) )
while ( not (einde video) )
{
{
   1. Open 1 frame uit video
   1. Open 1 frame uit video
   2. Detecteer interessante objecten uit het frame via image processing
   2. Filter het frame via image processing
   3. Vergelijk met tracks uit vorig(e) frame(s)
   3. Detecteer objecten uit frame
   4. Maak nieuwe tracks aan voor nieuwe objecten
   4. Output filter-resultaten naar het scherm
   5. Output gevonden tracks
   5. Output naar het drone-besturingsscript
}
}
<code>
</code>
 
Deze genummerde stappen komen overeen met de nummers in de code.
 
=== Frame laden ===
 
Video analyse wordt logischerwijs altijd per frame gedaan, daarom moet het algoritme in een while-loop uitgevoerd worden, waarin in elke iteratie één frame geanalyseerd wordt en vergeleken met resultaten van de vorige. Dit heeft als groot voordeel dat slechts één frame tegelijk in het geheugen hoeft te blijven. <br>
Het detectie-script accepteert zowel livestream als videobestanden, om mee te testen.
 
=== Object detectie ===
 
Een van de moeilijkste stappen van elk video analyse algoritme is image processing: uit een afbeelding (in dit geval één frame van een video) belangrijke objecten detecteren, en ruis negeren. Deze ruis zal voor komen bij elke camera in de praktijk. <br>
Het moeilijkste probleem is echter bepalen wat er wel en niet gedetecteerd moet worden, en welke techniek deze objecten het best eruit kan filteren. Voor het filteren van objecten op een voetbalveld zijn twee technieken nodig:
* Binaire detectie om lijnen, de bal en andere duidelijke markeringspunten duidelijk te filteren. Dit is een belangrijke eerste stap, want grotendeels op basis hiervan is de drone in staat de bal en de randen van het veld te volgen.
* Kleurdetectie om het veld te onderscheiden van andere spelers (en de bal). Met deze filtertechniek blijven bepaalde kleuren bewaard, waardoor het verschil tussen spelers gezien kan worden.
 
==== Binaire afbeelding detectie ====
In de meeste gevallen wordt (eerst) een binaire detectie toegepast. Dit wil zeggen dat de afbeelding als zwart-wit (grijstinten) afbeelding gefilterd wordt. Het voordeel hiervan is dat de afbeelding nu slechts een LxB matrix van getallen (vaak zelfs integers) is, waarbij elke index een intensiteit-waarde tussen zwart (0) en wit (1 of 255) aanduidt. <br>
 
In het geval van lijndetectie op een voetbalveld is deze techniek erg nuttig, aangezien witte lijnen een hoge intensiteit hebben. Hiervoor is een simpele [[thresholding]]-operatie genoeg.
 
==== Kleur detectie ====
Aangezien de test plaatsvindt op een voetbalveld, is het erg makkelijk om op basis van kleur de achtergrond uit een frame te filteren. Een afbeelding in kleur verschilt van een zwart-wit afbeelding slechts in het feit dat het bestaat uit 3 intensiteit matrixen, meestal in rood, groen en blauw (RGB), maar andere zijn ook mogelijk. <br>
Om een groen veld te filteren zou het logisch lijken om alle hoge Groen-waardes uit het frame te halen. Dit is echter niet zo, omdat bijvoorbeeld geel (groen + rood) en wit (alle kleuren) ook hoge groen-waardes hebben. Als alleen groen uit het frame moet worden gefilterd, is het nuttiger om te kijken naar het verschil tussen de Groen-waardes en de andere kleurwaardes, ofwel


==== Frame laden ====
<code> G>R*i & G>B*i </code>


Video analyse wordt logischerwijs altijd per frame gedaan, daarom moet het algoritme in een while-loop uitgevoerd worden, waarin in elke iteratie één frame geanalyseerd wordt en vergeleken met resultaten van de vorige. Dit heeft als groot voordeel dat slechts één frame tegelijk in het geheugen hoeft te blijven.
In deze formule geeft i de intensiteit van het filter aan. Hoe lager i, hoe meer kleuren worden weggefilterd.


==== Object detectie ====
=== Baldetectie ===


==== Track bijhouden =====
Een van de belangrijkste doelen van videotracking is het detecteren van de bal. Dit gebeurt in stap (3). Deze stap begint met een gefilterd (binair) camera-beeld. Hieruit worden objecten gedetecteerd met behulp van een blob-analyzer. Die detecteert uit binaire afbeeldingen witte pixels die aan elkaar vast zitten (die dus een vorm (blob) hebben). Hiervan kan de analyzer verschillende eigenschappen geven, zoals oppervlakte, doorsnee of eccentriciteit: 'rondheid' van een voorwerp. Deze laatste twee zijn erg relevant voor bal detectie. <br>
Vervolgens moet bepaald worden welke blobs objecten zijn en welke ruis. In pseudo-code werkt baldetectie als volgt:
<code>
%Baldetectie
  1. [blobs,eigenschappen] = Blob-detectie
  2.  delete blobs(geen goede eigenschappen)
  of 3a. bal = max(eccentriciteit)
    3b. check ruis


==== Nieuwe tracks ====
</code>


==== Output ====
Er zijn dus twee mogelijke manieren.
* Blobs filteren (2): Alle blobs die geen goede eigenschappen hebben (te grote eccentriciteit) worden eruit gefilterd. Het voordeel is dat deze techniek goed te tunen is, omdat alle blobs met een eccentriciteit groter dan een threshold (zie [[thresholding]]) gefilterd worden. Het nadeel is dat het vaststellen van deze threshold vaak lastig is, omdat bijvoorbeeld de achtergrond of licht constant verandert.
* Blobs maximaliseren (3): Alleen de blob met de grootste eccentriciteit blijft over. Deze techniek zorgt ervoor dat alleen de 'beste' blob overblijft, en haalt ruis beter weg dan de vorige techniek. Het heeft echter een groot nadeel: als er geen correcte detectie is, blijft deze techniek een blob detecteren. Deze zogenaamde 'false positives', zie [[detectiefouten]], kunnen erg gevaarlijk zijn. <br>
Daarom worden de twee technieken gecombineerd: na het maximaliseren van eccentriciteit wordt nog gecontroleerd of de gedetecteerde 'bal' wel daadwerkelijk een bal kan zijn door middel van een threshold.


===== Mesh tracking =====
=== Output ===


===== Velocity prediction tracking =====
Output bestaat uit 2 delen. Allereerst wordt het videobeeld en interessante filters naar het scherm gestuurd, om de werking van de filters visueel te analyseren. Daarnaast wordt de relevante data naar het drone-besturingsscript gestuurd. Hierbij is het belangrijk dat de interconnect tussen deze systemen goed werkt: de input en output van beide scripts moeten aan elkaar gelinkt zijn. Daarnaast is het belangrijk om niet te veel data naar het script te sturen. <br>
In het geval van baldetectie wordt een vector met coordinaten van de bal doorgestuurd.


=== Video tracking in MATLAB ===
== Video tracking in MATLAB ==


MATLAB heeft een standaard example dat als basis kan worden gebruikt voor video tracking.
MATLAB heeft een standaard example dat als basis kan worden gebruikt voor video tracking.
Line 49: Line 83:


Zie MathWorks site. [http://nl.mathworks.com/help/vision/examples/motion-based-multiple-object-tracking.html]
Zie MathWorks site. [http://nl.mathworks.com/help/vision/examples/motion-based-multiple-object-tracking.html]
NOTE: je hebt een support package nodig als je een webcam wil gebruiken: [http://nl.mathworks.com/help/supportpkg/usbwebcams/ug/installing-the-webcams-support-package.html]
----
De uiteindelijke MATLAB code om de video van de drone te verwerken volgens de hierboven beschreven methode is de [[MATLAB Videotracking code]].
== Calibratie en filter tuning ==
Om de filters en algoritmes te testen en optimaliseren zonder het hele system te testen, zijn er al in week 3 calibratie foto's en video's gemaakt. De resultaten van deze tests staan hieronder.
Line Detection calibratie:
Voor:
[[File:calibrate4.jpg|400px]]
Na:
[[File:calibrateresult4.jpg|400px]]
----
== Baldetectie ==
Ook bij het detecteren van een bewegende bal moeten verschillende filtermethoden toegepast worden om ruis te elimineren.
De gebruikte video is gemaakt met de hand, hierdoor zijn er trillingen en bewegingen in de opname. Deze bewegingen resulteren in een slecht tracking-gedrag, zoals hieronder weergegeven is.
Deze tracking is voltooid zonder het tunen van de filters, en de standaardwaarden van "multiObjectTracking.m" zijn toegepast.
[[File:tracking_stdvalue.jpg|400px]]
In deze afbeelding is het resultaat te zien van de tracking. De toegepaste filters geven niet voldoende resultaat, hierdoor worden verschillende ''detectionboxes'' onterecht weergegeven.
Dit kan aangepast worden door de ''minimum blob area'' aan te passen. Dit houdt in dat je de minimale grootte (aantal pixels) van de blob aanpast voordat het wordt gezien als een object. Omdat de bal in dit geval een van de grootste objecten is, zal deze overblijven als laatste object/blob.
[[File:tracking_blobarea3000.jpg|400px]]
Echter is hier in de rechter afbeelding nog steeds veel ruis te zien. Om dit te voorkomen is de [[opening(morfologie)]] van het frame aangepast. De filtergrootte wordt vergroot, wat resulteert in minder ruis. Door het aanpassen filterwaarden is de tracking is nu realistischer en betrouwbaarder dan voorheen.
[[File:tracking_imopen15x15.jpg|400px]].
== Reconstructie ==
Om er zeker van te zijn dat enkel bruikbare visuele informatie wordt gebruikt bij het aansturen van de drone, is er een reconstructie gemaakt. <br>
Dit houdt in dat er een binaire stream is, waarin enkel de bal wordt weergegeven als cirkel. Het middelpunt van de eerder (op kleur) gedetecteerde blob wordt gebruikt als middelpunt van de cirkel. De diameter die de cirkel heeft is afhankelijk van de maximale diameter van de gedetecteerde blob. Omdat de rode/oranje bal enkele kleurverschillen heeft (witte letters) levert dit geen mooie blob, door reconstructie ontstaat er een zwarte afbeelding met één witte cirkel als object/blob, zie afbeelding. <br>
[[File:Reconstruction.jpg|800px]]
----
Terug naar: [[PRE2015_2_Groep2]], [[Uitbal detectie]]

Latest revision as of 12:32, 17 January 2016

Introductie

Video tracking is het volgen van objecten per frame van een video. In geval van een stilstaande camera wordt meestal één beginframe vergeleken met alle frames die erna komen. Het verschil tussen frame 1 en frame x zijn vervolgens alle bewegende objecten.
Het verschil tussen verschillende objecten en het bijhouden welk object waarheen gaat, wordt gemaakt door: ófwel van elk object een mesh te maken en die constant te vergelijken (dit werkt alleen als het object niet van vorm verandert), óf door het vergelijken van (voorspelde) snelheid en versnelling (dit werkt alleen goed als objecten niet te lang buiten beeld vallen of elkaar aanraken). Bewegende objecten worden gedetecteerd met behulp van zogenaamde mean-shifting. Per frame wordt er iteratief gekeken naar het gemiddelde van de cluster van punten (bewegende pixels) om zo positie, snelheid en acceleratie vast te stellen.

Deze pagina beschrijft kort de onderdelen van het video tracking algoritme, waarbij geavanceerde technieken op aparte pagina's uitgelegd worden.

Onderdelen van video tracking algoritme

Video tracking bestaat uit een aantal stappen, die in de introductie al kort beschreven zijn. In pseudo-code kan het als volgt beschreven worden:

Open video bestand of stream;

while ( not (einde video) )
{
 1. Open 1 frame uit video
 2. Filter het frame via image processing
 3. Detecteer objecten uit frame
 4. Output filter-resultaten naar het scherm
 5. Output naar het drone-besturingsscript
}

Deze genummerde stappen komen overeen met de nummers in de code.

Frame laden

Video analyse wordt logischerwijs altijd per frame gedaan, daarom moet het algoritme in een while-loop uitgevoerd worden, waarin in elke iteratie één frame geanalyseerd wordt en vergeleken met resultaten van de vorige. Dit heeft als groot voordeel dat slechts één frame tegelijk in het geheugen hoeft te blijven.
Het detectie-script accepteert zowel livestream als videobestanden, om mee te testen.

Object detectie

Een van de moeilijkste stappen van elk video analyse algoritme is image processing: uit een afbeelding (in dit geval één frame van een video) belangrijke objecten detecteren, en ruis negeren. Deze ruis zal voor komen bij elke camera in de praktijk.
Het moeilijkste probleem is echter bepalen wat er wel en niet gedetecteerd moet worden, en welke techniek deze objecten het best eruit kan filteren. Voor het filteren van objecten op een voetbalveld zijn twee technieken nodig:

  • Binaire detectie om lijnen, de bal en andere duidelijke markeringspunten duidelijk te filteren. Dit is een belangrijke eerste stap, want grotendeels op basis hiervan is de drone in staat de bal en de randen van het veld te volgen.
  • Kleurdetectie om het veld te onderscheiden van andere spelers (en de bal). Met deze filtertechniek blijven bepaalde kleuren bewaard, waardoor het verschil tussen spelers gezien kan worden.

Binaire afbeelding detectie

In de meeste gevallen wordt (eerst) een binaire detectie toegepast. Dit wil zeggen dat de afbeelding als zwart-wit (grijstinten) afbeelding gefilterd wordt. Het voordeel hiervan is dat de afbeelding nu slechts een LxB matrix van getallen (vaak zelfs integers) is, waarbij elke index een intensiteit-waarde tussen zwart (0) en wit (1 of 255) aanduidt.

In het geval van lijndetectie op een voetbalveld is deze techniek erg nuttig, aangezien witte lijnen een hoge intensiteit hebben. Hiervoor is een simpele thresholding-operatie genoeg.

Kleur detectie

Aangezien de test plaatsvindt op een voetbalveld, is het erg makkelijk om op basis van kleur de achtergrond uit een frame te filteren. Een afbeelding in kleur verschilt van een zwart-wit afbeelding slechts in het feit dat het bestaat uit 3 intensiteit matrixen, meestal in rood, groen en blauw (RGB), maar andere zijn ook mogelijk.
Om een groen veld te filteren zou het logisch lijken om alle hoge Groen-waardes uit het frame te halen. Dit is echter niet zo, omdat bijvoorbeeld geel (groen + rood) en wit (alle kleuren) ook hoge groen-waardes hebben. Als alleen groen uit het frame moet worden gefilterd, is het nuttiger om te kijken naar het verschil tussen de Groen-waardes en de andere kleurwaardes, ofwel

G>R*i & G>B*i

In deze formule geeft i de intensiteit van het filter aan. Hoe lager i, hoe meer kleuren worden weggefilterd.

Baldetectie

Een van de belangrijkste doelen van videotracking is het detecteren van de bal. Dit gebeurt in stap (3). Deze stap begint met een gefilterd (binair) camera-beeld. Hieruit worden objecten gedetecteerd met behulp van een blob-analyzer. Die detecteert uit binaire afbeeldingen witte pixels die aan elkaar vast zitten (die dus een vorm (blob) hebben). Hiervan kan de analyzer verschillende eigenschappen geven, zoals oppervlakte, doorsnee of eccentriciteit: 'rondheid' van een voorwerp. Deze laatste twee zijn erg relevant voor bal detectie.
Vervolgens moet bepaald worden welke blobs objecten zijn en welke ruis. In pseudo-code werkt baldetectie als volgt:

%Baldetectie
 1. [blobs,eigenschappen] = Blob-detectie
 2.  delete blobs(geen goede eigenschappen)
 of 3a. bal = max(eccentriciteit)
    3b. check ruis

Er zijn dus twee mogelijke manieren.

  • Blobs filteren (2): Alle blobs die geen goede eigenschappen hebben (te grote eccentriciteit) worden eruit gefilterd. Het voordeel is dat deze techniek goed te tunen is, omdat alle blobs met een eccentriciteit groter dan een threshold (zie thresholding) gefilterd worden. Het nadeel is dat het vaststellen van deze threshold vaak lastig is, omdat bijvoorbeeld de achtergrond of licht constant verandert.
  • Blobs maximaliseren (3): Alleen de blob met de grootste eccentriciteit blijft over. Deze techniek zorgt ervoor dat alleen de 'beste' blob overblijft, en haalt ruis beter weg dan de vorige techniek. Het heeft echter een groot nadeel: als er geen correcte detectie is, blijft deze techniek een blob detecteren. Deze zogenaamde 'false positives', zie detectiefouten, kunnen erg gevaarlijk zijn.

Daarom worden de twee technieken gecombineerd: na het maximaliseren van eccentriciteit wordt nog gecontroleerd of de gedetecteerde 'bal' wel daadwerkelijk een bal kan zijn door middel van een threshold.

Output

Output bestaat uit 2 delen. Allereerst wordt het videobeeld en interessante filters naar het scherm gestuurd, om de werking van de filters visueel te analyseren. Daarnaast wordt de relevante data naar het drone-besturingsscript gestuurd. Hierbij is het belangrijk dat de interconnect tussen deze systemen goed werkt: de input en output van beide scripts moeten aan elkaar gelinkt zijn. Daarnaast is het belangrijk om niet te veel data naar het script te sturen.
In het geval van baldetectie wordt een vector met coordinaten van de bal doorgestuurd.

Video tracking in MATLAB

MATLAB heeft een standaard example dat als basis kan worden gebruikt voor video tracking.

typ >>multiObjectTracking in command window.

Typ >>edit multiObjectTracking voor de code.

Zie MathWorks site. [1]

NOTE: je hebt een support package nodig als je een webcam wil gebruiken: [2]



De uiteindelijke MATLAB code om de video van de drone te verwerken volgens de hierboven beschreven methode is de MATLAB Videotracking code.

Calibratie en filter tuning

Om de filters en algoritmes te testen en optimaliseren zonder het hele system te testen, zijn er al in week 3 calibratie foto's en video's gemaakt. De resultaten van deze tests staan hieronder.

Line Detection calibratie:

Voor:

Calibrate4.jpg

Na:

Calibrateresult4.jpg



Baldetectie

Ook bij het detecteren van een bewegende bal moeten verschillende filtermethoden toegepast worden om ruis te elimineren. De gebruikte video is gemaakt met de hand, hierdoor zijn er trillingen en bewegingen in de opname. Deze bewegingen resulteren in een slecht tracking-gedrag, zoals hieronder weergegeven is.

Deze tracking is voltooid zonder het tunen van de filters, en de standaardwaarden van "multiObjectTracking.m" zijn toegepast.

Tracking stdvalue.jpg

In deze afbeelding is het resultaat te zien van de tracking. De toegepaste filters geven niet voldoende resultaat, hierdoor worden verschillende detectionboxes onterecht weergegeven. Dit kan aangepast worden door de minimum blob area aan te passen. Dit houdt in dat je de minimale grootte (aantal pixels) van de blob aanpast voordat het wordt gezien als een object. Omdat de bal in dit geval een van de grootste objecten is, zal deze overblijven als laatste object/blob.

Tracking blobarea3000.jpg

Echter is hier in de rechter afbeelding nog steeds veel ruis te zien. Om dit te voorkomen is de opening(morfologie) van het frame aangepast. De filtergrootte wordt vergroot, wat resulteert in minder ruis. Door het aanpassen filterwaarden is de tracking is nu realistischer en betrouwbaarder dan voorheen.

Tracking imopen15x15.jpg.

Reconstructie

Om er zeker van te zijn dat enkel bruikbare visuele informatie wordt gebruikt bij het aansturen van de drone, is er een reconstructie gemaakt.
Dit houdt in dat er een binaire stream is, waarin enkel de bal wordt weergegeven als cirkel. Het middelpunt van de eerder (op kleur) gedetecteerde blob wordt gebruikt als middelpunt van de cirkel. De diameter die de cirkel heeft is afhankelijk van de maximale diameter van de gedetecteerde blob. Omdat de rode/oranje bal enkele kleurverschillen heeft (witte letters) levert dit geen mooie blob, door reconstructie ontstaat er een zwarte afbeelding met één witte cirkel als object/blob, zie afbeelding.
Reconstruction.jpg


Terug naar: PRE2015_2_Groep2, Uitbal detectie