Stap 6: Denken en leren
Ja, hoe snel, het maakt twee subprocessen één voor elke servo, wanneer een servo wordt verteld om te bewegen, een snelheid is geboden. De subproces een lus en wordt de positie van de servo verhoogd met één met elke pass - totdat de gewenste positie wordt bereikt. Hoe snel het loops is gebaseerd op de gegeven snelheid-parameter. Dit kunt u verplaatsen van de servomotoren op verschillende snelheden, hoewel de motorsnelheid niet verstelbaar. Ik oorspronkelijk uitgevoerd dit met draden, maar python bleek te hebben zeer slechte afhandeling van draden bij hoge CPU-belasting.
Net als vrijwel alle open source facial recognitie applicatie, we OpenCV van haar-classificatie trapsgewijs gebruiken om te zoeken naar patronen die overeenkomen met die gevonden in de FrontalFace.xml opgenomen. Maar er lijken er enkele slecht begrepen en gedocumenteerd de aspecten van de parameters van de functie cvHaarDetectObjects die een grote invloed op de prestaties van het programma hebben.
De eerste parameter is natuurlijk het beeld. Passeer de functie de afbeelding die u wilt zoeken naar gezichten binnen, er lijkt te zijn van enige verwarring zelfs bij deze stap - mensen lijken te denken dat door het eerste omzetten in het beeld grijs-schaal, de verwerking sneller zal zijn. Een eenvoudige benchmark zal laten zien dat dit niet waar - in feite het het proces langzamer maken zal, omdat u een extra stap uitvoert. Mensen ook lijken te denken dat eerst de afbeelding te schalen naar beneden dingen sneller maken zal-dit intuïtief gevoel, maakt want nu is er een kleinere afbeelding om te zoeken naar een gezicht binnen, maar dit niet de meest efficiënte methode, dat me bij de volgende parameter is brengt,
Scalefactor--de forum bewoners lijken te geven suggesties over wat dit moet worden ingesteld op zonder veel uitleg over wat het is. Om volledig te begrijpen, moet u weten hoe OpenCV ontdekt gezichten:
OpenCV Face Detection: gevisualiseerd van Adam Harvey op Vimeo.
Bekijk deze video en bijzondere aandacht aan het einde. Merk op dat een vierkantje van linksboven naar rechts beweegt. Telkens als het beweegt, wordt er gezocht naar een patroon binnen het--in dit geval een gezicht, maar met OpenCV dat patroon kon worden iets. Zie hoe het maakt één keer en wordt groter, dan gaat het weer? Het bedrag dat het groter wordt met elke pass is de scalefactor. Als u het instelt op 1.1 zal zou ontvang 1.1 maal groter (10%) met elke pass 1.3 maken krijgen 1,3 keer zo groot is met elke pass--30%. Natuurlijk hoe sneller het groeit in omvang, hoe sneller het voltooit, maar ten koste van het eventueel ontbreken van een gezicht dat er was.
De volgende parameter heeft geen invloed op de prestaties, dus voor zover ik kan vertellen. MinNeighbors vertelt het programma hoe kieskeurig te zijn over wat zij beschouwt als een match. De functie is op zoek naar patronen en controles als die patronen overeenkomen met haar patronendatabase - een XML-bestand. Ik denk dat de standaard het 3--wat betekent dat als er 3 patronen binnen het plein waar het naar op zoek is, die overeenkomen met patronen gevonden in het XML-bestand, dan overwegen het een match. Ik stel mij op 4. Hoe hoger u het instelt, hoe meer zeker dat u kan zijn dat wanneer het zegt dat het een gevonden het klopt. Echter, het te laag en hij denkt dat alles wat die ze ziet is een gezicht. Het te hoog en het zal problemen ondervindt bij het vangen van de werkelijke gezichten.
De volgende parameter vlaggen; Dit zijn de Boole-waarden die u inschakelen kunt om te tweaken dingen:
een is CV_HAAR_DO_CANNY_PRUNING. Deze vlag werd ontworpen alleen voor gezichten; het vertelt de functie overslaan zoeken over gebieden met scherpe randen... omdat gezichten in het algemeen geen geen scherpe randen hebben. (Zie bijgevoegde afbeelding, soms ze misschien...) Dit versnelt dingen afhankelijk van de achtergrond.
een ander voorbeeld is de HAAR_FIND_BIGGEST_OBJECT dit vertelt de functie op enige teruggave het grootste object dat het gevonden.
een ander voorbeeld is CV_HAAR_DO_ROUGH_SEARCH die de functie om te stoppen met kijken vertelt zodra het iets vindt, het is bedoeld om te worden gebruikt met HAAR_FIND_BIGGEST_OBJECT en sterk verbetert de prestaties wanneer u slechts probeert om te vinden van een gezicht.
De laatste twee parameters zijn belangrijk, of ten minste een van hen is - ze zijn minimaal en MaxSize. Een gemeenschappelijke methode voor het zoeken versnellen lijkt te zijn te verkleinen van afbeeldingen, als u wilt dubbele van de snelheid van de detectie van een gezicht in een afbeelding van 800 x 600, schalen tot 400 x 300. Het probleem met deze logica is dat u potentiële gezichten zijn krimpen, en haar niet betrouwbaar gezichten kleiner dan 20 x 20 pixels vinden. Niet alleen dat, nu u computerbronnen gebruikt om dat beeld krimpen. U kunt de dezelfde snelheid te verhogen door te geven van een minimaal voor het gezicht krijgen. 20 x 20 is de standaard, maar 40 x 40 zal gek snel in vergelijking. Hoe hoger je gaat, hoe sneller het zoeken zal worden, maar u kunt beginnen met het ontbreken van kleinere gezichten.
Wilde alleen maar duidelijk dat omhoog...
Ik hoop dat dit helpt, en ik hoop dat iedereen geniet van het werken met de Raspberry Pi en OpenCV zo veel als ik deed.
Dit is mijn eerste instructable. Ik zou graag zien uw opmerkingen.
Bedankt,
Chris