Proof of Concept 1: Face Recognition

Voor het in de wilde weg te beginnen met programmeren is er gekeken naar mogelijke programmeertalen. Hierbij kwam ik uit bij Node. Node is een zeer geschikte oplossing omdat deze taal zowel te gebruiken valt in het front-end en backend. Daarbij maakt Node gebruik van een event-based architecture and non-blocking I/O waardoor het gebruik van een CPU en computer memory gemaximaliseerd wordt. Hierdoor is de taal sneller op de server.

Er zijn al enkele voorbeelden verschenen met werkende en stabiele versies van face detection in Javascript en Node. Omdat Javascript een vertrouwde taal is lijkt dit een goede stap om te beginnen. Na een proof of concept bleek dat het project: face-detection-node-opencv goed werkt maar geen extra features heeft ingebouwd.

 

Om geen onnodig werk te doen verken ik het gebied verder in de hoop een project of library te vinden die naast de Face Detection ook extra features heeft zoals geslacht, leeftijd en of emotie. Tijdens het verkennen kwam ik uit op face-classification-js. Een Face Detection met extra features. Ook dit project heb ik eerst getest op de werkzaamheid. De stabiliteit van dit project ligt een stuk lager en gezichten dienen een heel stuk dichter bij de camera te blijven. Echter zodra een gezicht herkend wordt klopte het geslacht en de emotie wel.

 

Omdat de extra features goed werken heb ik hier besloten om de twee projecten te combineren. De goede stabiele herkenning van Project 1, met de extra features van Project 2. Dit lukte waarna gezichten goed herkend werden en extra informatie verkregen is. Alleen is de precisie niet groot genoeg. Hoewel de grotere afstand goed herkend wordt is de hoek waarin een gezicht gedetecteerd wordt te klein.

Na verscheidenen pogingen om de hoek groter te maken kwam ik tot de conclusie dat Javascript en Node niet de oplossing bieden. Hoewel het lukte om de hoek groter te maken ging dit af van het rendement van het aantal gezichten. Zodra een gezicht gedetecteerd wordt in het scherm gaat alles prima. Dit blijft met meerdere gezichten hetzelfde. Maar zodra er meerdere gezichten in het beeld zijn en er één gezicht bij zit dat schuin gedetecteerd wordt hangt het systeem vast totdat alle gezichten recht zijn.

 

De stabielst bereikte versie was met nested functies waarbij de hoeken een voor een gecontroleerd werden. Dit vergt echter te veel van de processor. Doordat het nested functies zijn wacht het geheel op elkaar. Bij meer gezichten stapelt dit op en raakt het systeem vertraagd.

Hoewel Node over het algemeen sneller is, is Node minder efficiënt met CPU-intensieve processen. Onder deze processen valt het verwerken van afbeeldingen en het verkleinen van afbeeldingen. Omdat dit aantal verwerkingen per “gebruiker” wordt vergroot wordt het systeem te zwaar voor Node om over een process te draaien.

Multithreading zou een oplossing kunnen bieden door deze processen gelijktijdig te benaderen. Node is echter single threaded, waarbij de libraries die beweren parallelle functies toe te voegen toch op een core blijven. Al zijn er enkele opties om toch multithreading te bereiken. Dit kan onder andere door meerdere processen te starten, al is het delen van de data een stuk moeizamer.

 

Bibliografie

Kim, E. J. (2018). face-detection-node-opencv. Opgehaald van Github: https://github.com/drejkim/face-detection-node-opencv

Lalonde, O. (2018). Node.js and CPU intensive requests. Opgehaald van Stackoverflow: https://stackoverflow.com/questions/3491811/node-js-and-cpu-intensive-requests

Natera, S. (2018). Multithreading, Multiprocessing and the NodeJS event loop. Opgehaald van Medium: https://hackernoon.com/multithreading-multiprocessing-and-the-nodejs-event-loop-5b2929bd450b

Tupleblog. (2018). face-classification-js. Opgehaald van Github: https://github.com/tupleblog/face-classification-js

Westerhoff, P. (2018). Why is node.js not suitable for heavy CPU apps? Opgehaald van Stackoverflow: https://stackoverflow.com/questions/16974557/why-is-node-js-not-suitable-for-heavy-cpu-apps