Thumbnail Object Tracking

Door: Thijs Zumbrink
30-11-2011 17:11

De laatste tijd ben ik bezig met het implementeren van Object Tracking: hoe een computer een object volgt in een video. Er zijn allerlei technieken voor, sommigen extreem ingewikkeld, dus om de ergste hoofdpijnen te voorkomen heb ik eerst zelf een methode in elkaar geknutseld die doet wat ik voorlopig nodig heb.

De input voor ons probleem is een video stream en een afbeelding van het eerste frame met daarop het object aangemerkt. (Een zogeheten masker) De ouput is een masker van het object in elk frame.

Een homebrew aanpak

Na wat gepeins en het lezen van een survey paper over verschillende object tracking methoden koos ik ervoor om een feature-based aanpak te nemen. Dat wil zeggen: we registreren features van het object vanuit de informatie die we hebben gekregen over het eerste frame. Features kunnen erg uiteen lopen, dus het is een kunst om de juiste features te kiezen. Ik registreer kleurhistogrammen, zodat het programma weet dat we de kleur oranje moeten volgen. (Voorbeeld zoals in de video's hier onder. Het programma registreert de kleur oranje uit het eerste frame en onthoudt dat.)

Vervolgens lopen we beeld-voor-beeld de video door, en van elke pixel wordt de kleur berekend. (Hue en saturation, value laat ik weg omdat dat instabiele resultaten geeft) Die kleur wordt vergeleken met het berekende histogram, en op basis daarvan kunnen we bepalen of de pixel tot de bal behoort of tot de achtergrond. Dat ziet er dan zo uit:



Het is duidelijk dat er veel kleine storingen ontstaan. Die zijn eenvoudig weg te filteren met operaties zoals opening en closing. Daarbij vul ik ook nog interne gaten op. Het resultaat:



Disk-fitting

Tegen deze tijd kwam ik op het idee dat het voorlopig acceptabel is om aan te nemen dat we altijd met een bol-vormig object te maken hebben. Die aanname komt een klein beetje voort uit andere delen van het project, dus dat komt hier wel handig uit. (Later worden de delen van het project verbeterd en vallen dergelijke aannames weg.) In het berekende masker kan ik nu een schijf plaatsen, waarbij ik probeer deze zo goed mogelijk te laten overlappen.

Dit schijnt nog best een lastig probleem te zijn (ook weer veel wiskunde nodig) dus heb ik voorlopig mijn eigen manier bedacht. Ik zoek door middel van mediaan-(x,y)-waarden van de pixels het centrum van het masker op, en maak een initiele schatting voor de radius van de bal. (Minimum van de hoogte en de breedte van het masker.) Vervolgens geef ik er een kwaliteitsgraad aan door te tellen hoeveel masker pixels er binnen de straal vallen, en hoeveel niet-masker pixels erbuiten. Dan krimp/groei ik de straal totdat deze kwaliteitsgraad maximaal is.

quality = 0;
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
bool insideCircle = (x-xMedian)*(x-xMedian) + (y-yMedian)*(y-yMedian) <= radius*radius;
bool insideMask = mask.getBinaryPixel(x, y);
if (insideCircle == insideMask) {
++quality;
} else {
--quality;
}
}
}


De uitwerking hiervan:


Als laatste stap schakel ik de hulp in van Optical Flow, dat me een indicatie geeft waar het masker in het vorige frame naartoe is verplaatst. De resultaten zijn op zichzelfstaand niet echt goed, maar gecombineerd met wat ik al had is het een kleine verbetering, gezien het de positie van het vorige masker meeneemt in de berekening van het nieuwe masker.

Het resultaat



Voorlopig is dit resultaat acceptabel. Echter, het neemt aan dat het object duidelijk te herkennen is aan de kleur, en daarbij ook nog eens bolvormig is! Later zal ik, om deze aannames te laten vallen, een van de bestaande methodes moeten bestuderen en gebruiken, of in het ergste geval implementeren. Ik heb een methode gevonden dat naar eigen zeggen verbluffende resultaten geeft (het trackt zonder probleem dingen zoals menselijke gezichten, rugzakken, hele personen, etc. gebaseerd op Canny Edges) maar het paper zag eruit als Chinees, dus dat heb ik maar even weggelegd...

Reacties
Log in of registreer om reacties te plaatsen.
Mirielle, 01-12-2011 13:45:
Cool! Ik ga deze week toevallig bij AI leren over computer vision en canny edges. Ben benieuwd. :D

Thijs Zumbrink, 01-12-2011 13:50:
Awesome! Als ze een goede tracking methode laten zien, let me know!