Pan / Tilt ansiktsspårning med raspberry pi (6 / 6 steg)
Steg 6: Reflektera och lära sig
Ja, hur snabbt det skapar två delprocesser en för varje servo, när en servo berättas att flytta, en överföringshastighet. Underprocess loopar och ökar den servo positionen med en med varje pass - tills den når önskad position. Hur snabbt det loopar är baserad på medföljande speed-parametern. Detta kan du flytta servomotorer vid olika hastigheter även om motorisk hastighet inte är justerbar. Jag genomfört detta ursprungligen med trådar, men python visat sig ha mycket dålig hantering av trådar på hög CPU belastning.
Precis som ganska mycket alla öppen källkod ansiktsigenkänning program använder vi Opencv's haar-klassificeraren cascade för att söka efter mönster på de som finns i den medföljande FrontalFace.xml. Men det verkar det vara några dåligt förstådd och dokumenterade aspekter av parametrarna för funktionen cvHaarDetectObjects som har en stor inverkan på prestanda för programmet.
Den första parametern är ju bilden. Du passerar funktionen bilden du vill söka efter ansikten inom, det verkar vara viss förvirring även i detta steg - folk verkar tro att bearbetning av först konverterar bilden till gråskala, kommer att bli snabbare. Ett enkelt riktmärke visar att detta är osant - faktiskt det gör processen långsammare eftersom du utför ett extra steg. Folk verkar också tro att först skala bilden kommer göra saker snabbare - detta är intuitivt rimligt, eftersom det finns nu en mindre bild söka efter ett ansikte inom, men detta är inte den effektivaste metoden, vilket leder mig till nästa parameter,
ScaleFactor--forum invånare verkar ge förslag om vad denna ska anges till utan att ge mycket förklaring om vad det är. För att fullt förstå, behöver du veta hur OpenCV upptäcker ansikten:
OpenCV Face Detection: visualiseras från Adam Harvey på Vimeo.
Titta på video och särskild uppmärksamhet mot slutet. Observera att en kvadrat flyttas från övre vänstra till nedre rätt. Varje gång det rör sig, det ser för ett mönster inom det - i detta fall en ansikte, men med OpenCV att mönstret kan vara allt. Se hur det gör en gång och blir större, då går på det igen? Det belopp som den ökar i storlek med varje pass är scalefactor. Om du ställer in det till 1.1 kommer det att skulle få 1,1 gånger större (10%) med varje pass. 1.3 göra det blir 1,3 gånger större med varje pass--30%. Uppenbarligen desto fortare den växer i storlek, desto snabbare kommer det komplett, men på bekostnad av eventuellt saknas ett ansikte som var där.
Nästa parameter har ingen inverkan på prestanda så längt som jag kanna berätta. MinNeighbors berättar hur kräsen om vad den anser en match programmet. Funktionen söker mönster och kontrollerar om dessa mönster matchar dess mönster databas - en XML-fil. Jag tror att standard det 3--vilket innebär att om det finns 3 mönster inuti är torget där det är ute, som matchar mönster finns i XML-filen, sedan överväga det en match. Jag sätta min till 4. Ju högre du ställer in det, desto mer säker kan du vara att när det säger att det finns en match är det rätt. Dock ställa in den för lågt och det tycker allt man ser är ett ansikte. Ställa in den för hög och det kommer att ha problem att fånga faktiska ansikten.
Nästa parameter flaggor; dessa är booleska värden som du kan aktivera för att justera saker:
en är CV_HAAR_DO_CANNY_PRUNING. Denna flagga var avsedd bara för ansikten; den berättar funktionen att hoppa över söka över områden med vassa kanter... eftersom ansikten generellt inte har några vassa kanter. (Se bifogad bild, ibland de kanske...) Detta påskyndar saker beroende på bakgrund.
en annan är HAAR_FIND_BIGGEST_OBJECT detta säger att funktionen endast retur den största objekt det finns.
en annan är CV_HAAR_DO_ROUGH_SEARCH som anger för funktionen att sluta titta när den hittar något, det är tänkt att användas med HAAR_FIND_BIGGEST_OBJECT och avsevärt förbättrar prestanda när du bara försöker hitta ett ansikte.
De sista två parametrarna är viktiga, eller åtminstone en av dem är - de är minstorlek och MaxSize. En vanlig metod för att påskynda sökandet verkar vara att skala ner bilderna, om du vill fördubbla hastigheten på upptäckt av ett ansikte i en bild 800 x 600, skala upp det till 400 x 300. Problemet med denna logik är du krymper potentiella ansikten, som haar inte tillförlitligt hittar ansikten mindre än 20 x 20 pixlar. Inte bara det, nu du använder datorresurser för att krympa den bilden. Du kan få samma hastighetsökning genom att ange en minstorlek för ansiktet. 20 x 20 är standard, men 40 x 40 ska gå galet snabbt i jämförelse. Ju högre du går, desto snabbare blir sökningen, men du får börja saknas mindre ansikten.
Ville bara klart att...
Jag hoppas att detta hjälper, och jag hoppas alla tycker om att arbeta med Raspberry Pi och OpenCV så mycket som jag gjorde.
Detta är min första instructable. Jag skulle älska att se dina kommentarer.
Tack
Chris