Objectherkenning: een introductie en overzicht (met Tensorflow)
Inleiding
Hoewel objectherkenning tot voor kort een relatief geavanceerde taak was, hebben vooruitgangen in diepe leernetwerken het veel eenvoudiger en sneller gemaakt. De huidige technieken in machine learning zijn snel genoeg om video's en streams in real-time te analyseren en ze hebben niet meer enorm veel data nodig om de neurale netwerken te trainen. Er zijn al veel vooraf getrainde modellen online te vinden, die je gemakkelijk in je eigen objectdetectiemodel kunt integreren. ### Een typisch objectdetectiesysteem Een normaal objectdetectiesysteem werkt meestal als volgt. Eerst genereert het systeem een interessant gebied met behulp van een speciale techniek. Dit zijn meestal rechthoeken rond het object dat je zoekt, en vaak bedekken ze samen de hele afbeelding. Zodra deze rechthoeken gemaakt zijn, worden voor elke rechthoek visuele kenmerken opgehaald. Hier kijkt het model naar objecten die van tevoren zijn ingesteld op basis van bepaalde visuele kenmerken. Uiteindelijk worden de overlappende rechthoeken samengevoegd, een stap die we "non-maximum suppressie" noemen.
Objectdetectie versus afbeeldingclassificatie
Hoewel deze twee concepten behoorlijk op elkaar lijken, verwerken ze afbeeldingen op heel verschillende manieren. De toepassingen zijn ook anders. Een beeldclassifier wordt gebruikt om te controleren of een afbeelding tot een bepaalde categorie behoort. Bijvoorbeeld: het zal identificeren of de afbeelding een 'kat' of een 'hond' is. Een objectdetectie-algoritme is daarentegen ontworpen om de locatie van verschillende objecten in een doelafbeelding te bepalen; het kan 2 katten en 3 honden in 1 afbeelding spotten.
De twee concepten sluiten elkaar niet uit. Als je doel is om te controleren of een afbeelding tot een bepaalde categorie behoort, kan het object in kwestie soms te klein zijn in verhouding tot de volledige afbeelding. In zulke gevallen kun je eerst objectdetectie doen en daarna beeldclassificatie toepassen.
Neem bijvoorbeeld printplaten en het detecteren van defecten daarop. Dit lijkt in eerste instantie misschien een classificatieprobleem, omdat je de resultaten moet scheiden in correct of incorrect. Echter, de defecten op de printplaat kunnen erg klein zijn, dus kun je beter objectherkenning gebruiken en vooraf een dataset opstellen om daarop te trainen. Net zoals bij het classificeren van soorten paddenstoelen of glas in scikit-learn is precisie bij het identificeren van de nuances van de dataset heel belangrijk.
Een beeldclassificatiemodel is ontworpen om afbeeldingskenmerken te genereren met behulp van verschillende deep learning-methoden. Natuurlijk zijn de resulterende kenmerken samenvattingen van de oorspronkelijke afbeelding, wat niet altijd is wat je zoekt. Objectdetectie daarentegen, stelt je in staat om de afbeelding in meer detail te onderzoeken en patronen op een gedetailleerder niveau te zoeken.
Gegevens die noodzakelijk zijn voor het trainen van objectherkenningsmodellen
Voor het maken van een model voor objectherkenning is er data nodig, en niet zomaar data. Gelabelde data is essentieel. Dit betekent afbeeldingen met vooraf gemaakte begrenzingen, samen met labels en coördinaten. Als je een afbeelding hebt, moet je het model x- en y-coördinaten geven, evenals de klasse van het object dat je wilt herkennen, zodat het model weet welk type object in welk deel van de afbeelding is.
Telkens wanneer er een probleem met objectherkenning wordt besproken, komt er een vraag naar boven: Hoeveel gelabelde afbeeldingen zijn er nodig om het netwerk goed te trainen? Hoewel dit een goede vraag is, is het misschien belangrijker om na te denken over de toepassing van het model en hoe het gaat worden gebruikt.
Het is natuurlijk altijd aanbevolen om een grote dataset te hebben om mee te werken, bij voorkeur met meer dan honderd of zelfs duizend gelabelde afbeeldingen. En niet alleen dat, de afbeeldingen moeten representatief zijn, en de genoemde aantallen zijn per objectklasse. Voor iedereen die zich bezighoudt met machine learning projecten die beeldanalyse omvatten, kan het handig zijn om bronnen te verkennen zoals "Personenherkenning in videostreams met Python, OpenCV en dieplearning". Bovendien betekent representatief in dit geval dat de afbeeldingen moeten passen bij de scenario's en gebruikscases die je aan het begin van het project voor ogen hebt.
Als voorbeeld, een model voor het detecteren van verkeersborden heeft afbeeldingen nodig van dezelfde borden in verschillende weersomstandigheden, anders kan je toepassing niet naar verwachting presteren. Net als bij elk ander machine learning algoritme, verwacht geen magische resultaten van je modellen, want ze zijn alleen zo goed als de hoeveelheid data waar ze mee getraind zijn.
Genereren van regio-voorstellen
Om gebieden van interesse in een afbeelding te vinden, kunnen verschillende algoritmes worden gebruikt. Een daarvan heet selectieve zoekopdracht, en dit is een op clustering gebaseerde methode. Dit betekent dat het algoritme probeert pixels te groeperen volgens een patroon en vervolgens gebiedsvoorstellen genereert op basis van de resulterende clusters.
Er zijn ook andere methoden, waaronder enkele die proberen veel complexere visuele kenmerken uit de afbeelding te halen om gebieden te genereren. Daarnaast kun je ook kiezen voor een brute-force algoritme dat gewoon een afbeelding van boven naar beneden scant, zonder rekening te houden met afbeeldingskenmerken.
Zoals je zou verwachten, moet je een afweging maken als je de gewenste methode voor gebiedsvoorstelgeneratie kiest, namelijk in termen van het totale aantal gebieden versus de rekenkundige complexiteit. Het is logisch dat je met meer gebieden een betere kans hebt om het gewenste object te spotten. Aan de andere kant is zo'n taak erg zwaar qua rekenkracht. Bovendien kan het zijn dat je het vermogen verliest om de objectdetectie in real-time uit te voeren, wat een groot nadeel is voor bepaalde toepassingen.
Toch zijn er scenario's waarin deze aanpak kan werken als je de details van tevoren kent. Bijvoorbeeld, je kunt het aantal regio's sterk verminderen bij het zoeken naar voetgangers in een afbeelding, omdat ze meestal een verhouding van 1,5 hebben. Hierdoor kun je alle andere verhoudingen negeren en de uitvoeringstijd van je model aanzienlijk versnellen.
Het gewenste kenmerken extraheren
Omdat je vaak met afbeeldingen van verschillende groottes werkt, is feature extraction ontworpen om elke afbeelding om te zetten naar een vaste set van visuele kenmerken, waardoor het probleem wordt opgelost. De meeste modellen voor beeldclassificatie zijn zo ontworpen dat ze zeer sterke methoden voor visuele feature extraction gebruiken.
Het doel van zulke modellen is om deze kenmerken te extraheren om erachter te komen tot welke klasse een afbeelding behoort. Er zijn verschillende manieren om dit te doen, zoals histogrammethoden, deep learning, en zelfs filters; al deze methoden bereiken uiteindelijk hetzelfde.
Een object detection-framework is meestal ontworpen met gebruik van gepretrainde beeldclassificatiemodellen. Hierdoor kun je de visuele kenmerken die relevant zijn voor jouw situatie, extraheren uit een verscheidenheid aan algemene datasets. Er zijn veel van zulke datasets te vinden op het internet, waarbij MS CoCo een voorbeeld is dat je toestaat om een model te trainen op algemene kenmerken. Het is aan te bevelen om een paar verschillende benaderingen uit te proberen, vooral als je het model wilt verbeteren en meer toepasbaar wilt maken voor jouw specifieke behoeften.
Hoe niet-maximale onderdrukking werkt
Kort gezegd laat het non-maximum suppressie-algoritme je toe om overlappende detecties in een afbeelding samen te voegen tot één enkele omlijstende doos. Deze stap is erg belangrijk als je afbeeldingen meestal veel verschillende objecten bevatten. Het is ook goed om te weten dat NMS wat hyperparameter-afstemming nodig kan hebben om goed te werken met je model.
Metrieken gebruikt voor evaluatie
Objectherkenning kan op verschillende manieren worden geëvalueerd, maar een van de meest gebruikte methoden is de "mAP", ofwel "mean average precision". Deze metric varieert van 0 tot 100, waarbij hogere waarden beter zijn. Het is belangrijk om te weten dat deze waarden niet de nauwkeurigheid van de classificatie aangeven.
Het werkt eenvoudig: elk begrenzingsvakje krijgt een score die aangeeft hoe groot de kans is dat het een object bevat. Daarna wordt er voor elke klasse een PR-curve (wat staat voor precision-recall curve) gegenereerd door de score-drempel te variëren. De gemiddelde precisie wordt berekend als het gebied onder de PR-curve. Tenslotte wordt de mAP berekend door de AP (average precision) van elke klasse te berekenen en deze gemiddelde waarde te nemen over alle klassen.
Om de detectie te bepalen, kijkt het model naar de "intersection over union", ook bekend als IoU. Deze IoU moet groter zijn dan een bepaalde drempel om de detectie als een echte positieve te beschouwen. Een gebruikelijke drempel is 0.5, daarom zie je vaak de term [email protected], wat verwijst naar de IoU die in het proces gebruikt wordt.
De Tensorflow-detectie-API
Duik in de werking van de SSD en Faster R-CNN algoritmes om te begrijpen hoe ze zijn geïmplementeerd in de TensorFlow Detection API van Google.
Om te beginnen is het belangrijk enkele basisconcepten uit te leggen. Het is namelijk essentieel om te begrijpen hoe SSD en Faster R-CNN op een basaal niveau functioneren, aangezien deze algoritmes de Tensorflow Detection API aandrijven.
Tenslotte kunnen we bespreken hoe Tensorflow deze concepten gebruikt om resultaten te behalen. Het mooie aan de Tensorflow Detection API is dat het veel van de hierboven besproken ideeën in één pakket samenbrengt en het je gemakkelijk maakt om tussen methodes te schakelen. Met deze API kun je een objectdetectiemodel definiëren met behulp van bepaalde configuratiebestanden, terwijl Tensorflow zelf zorgt voor het structureren van de rest.
De Protos-map
Aangezien de API veel verschillende onderdelen ondersteunt, is het aan te raden om een kijkje te nemen in de "protos map". Daar kun je alle belangrijke functie-omschrijvingen vinden. Enkele hiervan zijn ook preprocess protos zoals ssd, eval en faster_rcnn.
Het SSD-model (Single Shot Multibox Detector)
Onderzoekers van Google hebben in 2016 het SSD-model uitgebracht. Dit model gebruikt een enkel diep neurale netwerk dat kenmerken en regionale voorstellen combineert om objecten te identificeren en detecteren. Als je je eigen deep learning machine wilt bouwen om met modellen zoals SSD te experimenteren, biedt Building your own deep learning machine in 2023: some reflections nuttige inzichten.
Eerst worden er verschillende standaardboxen met diverse schalen en zijverhoudingen op de feature maps toegepast. Vervolgens gaan de afbeeldingen door een klassificatie netwerk, waar de feature maps worden berekend en de kenmerken in één stap voor elke begrenzingsbox worden geëxtraheerd. Elke standaardbox krijgt ook een score voor de objectcategorieën. Daarna worden correctieoffsets berekend voor elke box, zodat ze beter passen bij de ground truth.
Om verschillende schalen voor objecten aan te pakken, komen verschillende receptieve velden overeen met verschillende feature maps in het convolutionele netwerk. Dankzij dit gebeurt het werk door één enkel netwerk, wat zorgt voor snelle berekeningen, zoals 59 frames per seconde voor een invoer van 300 x 300.
Gebruik van verschillende configuratiebestanden
Als je werkt met de SSD-architectuur, zijn er een paar belangrijke dingen om op te letten. We gaan een paar voorbeeldbestanden doornemen en daar dieper op ingaan.
Ten eerste, niet alle classificatienetwerken zijn hetzelfde; elk heeft zijn eigen sterke en zwakke punten. De ResNet-architectuur biedt bijvoorbeeld een hoge algemene nauwkeurigheid, terwijl Inceptionv3 is ontworpen om objecten op meerdere schalen goed te detecteren. Dan heb je ook nog Mobilenet, dat is getraind om te werken met weinig rekenkracht.
Om te begrijpen wat je wint of verliest als je het ene netwerk boven het andere kiest, kun je de prestaties op ImageNet bekijken en het totale aantal parameters overwegen dat is gebruikt om de originele dataset te trainen. Meer informatie over de feature extractor vind je in de sectie “feature_extractor”.
Daarnaast moet je rekening houden met de parameters voor de aspectverhoudingen en de standaardvakken. Gelabelde data komt met verschillende aspectverhoudingen en schalen voor de begrenzingsvakken, maar de beste resultaten krijg je door naar jouw specifieke toepassing te kijken. Zo zorg je ervoor dat het netwerk geen onnodig werk doet buiten de gewenste schalen en aspectverhoudingen.
Je kunt deze parameters aanpassen in de sectie “ssd_anchor_generator”, maar houd in gedachten dat het uitbreiden van het bereik van schalen en aspectverhoudingen de prestaties kan verbeteren, maar alleen in bepaalde situaties en met afnemende meeropbrengsten.
De andere secties die aandacht nodig hebben voordat je het model traint, zijn de “image_resizer” en “data_augmentation_options”. Werken met grote afbeeldingsformaten heeft nadelen qua prestaties, maar helpt als je te maken hebt met kleine objecten die moeilijk te detecteren zijn. Bovendien, als je te maken hebt met verschillende schalen, is data-augmentatie ook een cruciale stap voor SSD.
Tot slot kun je ook sleutelen aan het “train_config” configuratiebestand om de batchgrootte en de leersnelheid in te stellen. Deze parameters hangen af van hoe groot je dataset is, en het is belangrijk om overfitting te vermijden.
Het Faster R-CNN model
In tegenstelling tot SSD, is het Faster R-CNN model ontwikkeld door Microsoft. Zoals de naam al aangeeft, is dit model gebaseerd op R-CNN, maar dan met verbeterde prestaties. R-CNN detecteert objecten door een meerfasen aanpak en gebruikt een selectief zoeken om regio-voorstellen te maken. Deze voorstellen worden vervolgens door een klassificatienetwerk gehaald en daarna gebruikt een SVM om de verschillende regio's te classificeren.
Faster R-CNN volgt een eind-tot-eind aanpak. Het heeft een Region Proposal Network (RPN) in plaats van standaard begrenzingsvakken om een vaste set regio’s te genereren. Dit RPN netwerk maakt bijna gratis regio-voorstellen mogelijk door gebruik te maken van de convolutionele kenmerken uit het afbeeldingklassificatienetwerk. Object scores en grenzen worden op elke positie voorspeld met een volledig convolutioneel netwerk, namelijk de RPN.
Ondanks de verschillen, hebben zowel SSD als RPN een vergelijkbare opzet, omdat de begrenzingsvakvoorspellingen niet zomaar uit de lucht komen vallen. Een RPN-netwerk neemt de kenmerkkaarten en schuift een venster over deze kaarten. De voorstellen worden berekend bij verschillende verhouding en schalen door het verschuivende venster op elke ankerpunt of locatie. De resultaten zijn in de vorm van aangepaste begrenzingsvakken, net zoals bij SSD.
Kort gezegd, leidt een RPN de aandacht van het netwerk naar regio’s die interessant zijn. Alle onderdelen zijn ook gecombineerd in één enkele opstelling, maar de training kan in meerdere fasen of eind-tot-eind gedaan worden.
Toepassingen voor Faster R-CNN
Er zijn geen grote verschillen tussen SSD en Faster R-CNN wat betreft hoe je ze gebruikt. Maar, het is goed om op te merken dat als je voor de hoogste mAP-prestatie gaat, Faster R-CNN meestal beter is dan SSD. Maar dan moet je ook meer rekenkracht opofferen.
Wat betreft relevante delen bij het gebruik van Fast R-CNN, kun je kijken naar de configuratie van de first_stage_anchor_generator. Daar vind je de definities voor de ankers die door de RPN worden gegenereerd. Als je het model wilt aanpassen voor kleinere objecten, kun je de “stride” parameter aanpassen, die bepaalt hoe groot de stappen van het glijdend venster zijn.
Ten slotte raden de ontwikkelaars van Faster R-CNN aan om het te gebruiken op kleinere datasets, hoewel dat niet per se een regel is.
Slotgedachten
Hoewel deze architecturen het meest populair zijn voor objectdetectie, zijn er ook andere die goede resultaten behalen. Niet al deze modellen zijn onderdeel van de Tensorflow Detection API, maar ze kunnen in de toekomst worden toegevoegd.
Delen