Objectdetectie verbeteren met Contrast Stretching (Deel 1/2)

Een belangrijk onderdeel van het trainen van neurale netwerken is het voorbewerken van de input. Er kan veel prestatiewinst worden behaald door de invoergegevens zorgvuldig te onderzoeken, op te schonen en te transformeren. In dit bericht zullen we de invloed van contrast stretching van onze invoerbeelden op de prestaties van een sneller R-CNN-netwerk om objecten te herkennen bekijken. In deze Hackathon zijn deze objecten witte tenten in vluchtelingenkampen. Dit bericht is het eerste deel van onze serie over contrast stretching. Het tweede deel vind je hier.

Achtergrond
A Faster R-CNN is een objectdetectiemodel. Het is gebaseerd op conventionele CNN's. Een CNN (Convolutional Neural Network) wordt vaak gebruikt om afbeeldingen te classificeren. Een Faster R-CNN-model is gebaseerd op een dergelijk CNN-model en breidt dit uit met regiovoorstellen. Deze gebiedsvoorstellen bevatten gebieden van het beeld waarin een object potentieel aanwezig is. Vervolgens classificeert het CNN-deel deze voorstellen.

Met behulp van een trainingsset van 3.500 beeldsegmenten, trainen we het Faster R-CNN-model 10 tijdperken, met in elk tijdperk 1.000 willekeurig gekozen afbeeldingen. We valideren ons model op een validatieset, bestaande uit 2.034 image slices met in totaal 1.976 witte tenten.

In figuur 1 is de mAP (mean Average Precision) plot te vinden, samen met de rolling mean (window=100) van een maat voor de oppervlakte van de detecties (sqrt(Area)). Houd er rekening mee dat, om een ​​mAP-curve te maken, de gedetecteerde boxes worden gesorteerd op de kans dat de box een tent bevat, volgens het model. We merken twee dingen op: hoewel er veel tenten worden gevonden (recall=0.7), hebben we veel false positives (precisie=0.2). Vooral de scherpe daling in de mAP-curve aan de linkerkant van de grafiek is een probleem; dit geeft aan dat, hoewel het model vrij zeker is van deze boxes met een tent, ze in werkelijkheid geen enkel object bevatten. Ook lijkt het model zekerder te zijn bij het beoordelen van grotere begrenzingskaders, aangezien deze verschijnen (ten onrechte zoals zojuist besproken) aan het begin van de mAP-curve.

Figuur 1: Precision-Recall plot voor contrast stretching, 10 epochs

We proberen deze resultaten te verbeteren door gebruik te maken van contrast stretching. Contrast stretching zou in theorie het leervermogen van het model moeten verbeteren, omdat het de contouren van objecten verbetert en het verschil tussen object en achtergrond benadrukt. Dit helpt de convolutielagen bij het extraheren van informatie en kenmerken uit de afbeeldingen. Contrast stretching kan voor een afbeelding worden gedaan door eenvoudig een formule te gebruiken die de verschillen in pixelwaarden vergroot. Omdat we gekleurde afbeeldingen willen gebruiken, moeten we drie beeld-'kanalen' opschalen: het rode kanaal (R), het groene kanaal (G) en het blauwe kanaal (B). Een gebruikelijke afspraak is om elke pixel van elk kanaal weer te geven met een geheel getal in het bereik [0,255], waarbij een RGB-waarde van (0,0,0) gelijk is aan zwart en (255,255,255) voor wit.

De wiskunde
Aangezien we te maken hebben met image slices van 400×400 pixels, resulteert dit in drie kanalen van 400×400 pixels. In totaal kan dus één image slice worden weergegeven door een 400x400x3 matrix met waarden tussen 0 en 255. Voordat we in de formules duiken, moet nog een laatste opmerking worden gemaakt. We gaan deze 400x400x3 matrix opsplitsen in 3 matrices van 400×400. Daarna passen we contrast stretching toe op elk kleurkanaal (R, G en B) en daarna combineren we de drie uitgerekte matrices weer tot een 400x400x3 matrix.

Uitrekken kan dan door pixel x te transformeren met een formule als:

waarbij a de ondergrens vertegenwoordigt waarnaar we willen schalen en b de bovengrens vertegenwoordigt. In plaats van de minimale en maximale waarde in ons contrasttraject als onder- en bovengrens te gebruiken, gebruiken we respectievelijk de 2 en 98 percentielwaarden. Een voordeel van het nemen van deze percentielwaarden is dat het robuuster is voor uitschieters; als slechts één pixel in het beeldkanaal 0 zou zijn en slechts één pixel 255 zou zijn, zou er geen contrast stretching plaatsvinden. Omdat we de 2 en 98 percentielwaarden gebruiken, genereren we meer rek. We moeten er echter voor zorgen dat we na het oprekken op deze manier alle waarden onder het 2 percentiel naar boven afronden naar een waarde van 0 en alle waarden boven het 98 percentiel naar een waarde van 255. Dit toont direct het nadeel aan van stretching met andere waarden dan de minimum- en maximumwaarde; we verliezen wat informatie.

Om het effect van de contrast stretching te kwantificeren, introduceren we een metriek die de spreiding in kleur binnen één kanaal k in één afbeelding n weergeeft: σk,n.

Deze standaarddeviatie kan worden verkregen door de variantie van één 400 × 400-matrix te berekenen. Als we bij rij i en kolom j van deze 400×400 matrix een pixel x aangeven met xi,j, krijgen we:

waarbij x̄ de gemiddelde pixelwaarde in de matrix is, berekend met

met I,J=400. Dan is σk,n = √σ2k,n.

Onze totale dataset bestaat uit N=58.163 afbeeldingen.

In de bovenste twee beeldsegmenten in figuur 2 is het kwalitatieve effect van 2-98 percentile contrast stretching te zien.

In de twee onderstaande diagrammen hebben we de histogrammen van onze metriek uitgezet. Voor elk van de afbeeldingssegmenten hebben we de standaarddeviatie van elk van de drie afbeeldingskanalen berekend. Vervolgens passen we de contrast stretching afzonderlijk toe op de drie kanalen, wat resulteert in het diagram hiernaast. Omdat we het effect van het afzonderlijk toepassen van contrastuitbreiding op elk kanaal willen volgen, hebben we ook een histogram van het totale beeld geplot, door het gemiddelde te nemen van de drie standaarddeviaties (R,G en B, dus K=3):

Zoals te zien is, is de verschuiving in de gemiddelde standaarddeviatie voor elk beeld representatief voor de verschuiving per kanaal. Bovendien kan een significante toename van de standaarddeviatie worden waargenomen. We kunnen de gemiddelde standaarddeviatie van alle beeldsegmenten berekenen met

Figuur 2: Linksboven: origineel afbeeldingsfragment (Bron: Google Earth, Maxar Technologies). Rechtsboven: hetzelfde beeldfragment na 2-98 percentile contrast stretching. In de onderste twee afbeeldingen de verdeling van de standaarddeviatie per image slice voor elke image band (GBR) en het gemiddelde van de standaarddeviatie van de drie kanalen (in oranje)

Merk op dat deze standaarddeviatie van de pixelwaarden in een afbeelding veel toeneemt. De gemiddelde standaarddeviatie van alle pixelwaarden binnen een image slice (400×400 pixels) was μσ = 26 vóór contrast stretching en na stretching is het μσ = 64. Ook de waarden van de standaarddeviatie zijn meer normaal verdeeld. Elk kanaal is uitgerekt met zijn eigen 2 en 98 percentielwaarden (per image slice), maar zoals te zien is, is het stretching effect voor elk kanaal hetzelfde.

Resultaten
Bij het trainen van het model op deze voorbewerkte dataset krijgen we een nieuwe mAP-curve, zie figuur 3.

Figuur 3: Precision-Recall plot na 2-98 percentile contrast stretching, 10 epochs

Bij het vergelijken van figuur 1 met figuur 3, kunnen we verschillende verbeteringen opmerken. Allereerst stijgt de recall van 0,7 naar 0,8, waardoor 80% van de 1.976 tenten wordt gedetecteerd. Ook de scherpe daling in precisie aan het begin van de kaartplot is verminderd. Samen leidt dit tot een verbeterde mAP-score van 9%. Merk verder op dat het voortschrijdend gemiddelde van het gebied ook geleidelijker afneemt. Omdat we willen dat het model niet te gevoelig is voor de grootte van tenten, is dit ook een verbetering. We merken echter dat kleinere gedetecteerde begrenzingsvakken nog steeds een snellere daling van de precisie hebben, zoals te zien is wanneer u de blauwe grafiek van recall=0.6 naar rechts volgt. Er kan dus nog wel wat verbeterd worden. 

// Contact

Notilyze B.V.
Stationsplein 45 A4.004
3013 AK Rotterdam
+31 10 798 62 95
info@notilyze.com

// Stel een vraag