Idag var jag på mitt första Woominar om Ansiktsigenkänning hos Woocode – en konsultfirma i Borås. Woominar är Woocodiska för ett seminarium. Den fullständiga titeln på föredraget var ”AI – Ansiktsigenkänning och deep learning i python och open source”.

Woominar

Woominaret hölls av Patrick Gabrielsson, en forskande lärare från Högskolan i Borås. Föredraget var ungefär en timme långt och hölls i Woocodes lokaeler i Pallashuset i Borås.

Först gick Patrick igenom hur man gick till väga för att känna igen ansikten i bilder. Här följer stegen i tur och ordning.

  1.  Hitta ansikten i bilden. Detta kallas för Face Detection på engelska. Det går till så att man scannar igenom små delar av bilden och gör en bedömning om just den rutan innehåller ett ansikte. Till sin hjälp har man Histogram of oriented gradient. Mer om det nedan.
  2.  Lista ut hur ansiktet är vänt (Face pose estimation and alignment). Här letar man reda på ett antal mätpunkter (68 stycken) i ansiktet och använder sig av dem för att förvränga bilden så att den ser ut som att den är tagen rakt framifrån.
  3. Ansiktskodning (Face embedding). I detta steg omvandlar man ansiktet till ett antal siffror. I vårt exempel var det 128 siffror. Varje ansikte har en unik uppsättning siffror och genom att beräkna dessa får man ett ”fingeravtryck” för ansiktet.
  4.  Ansiktsigenkänning (Face recognition). I det sista steget tar man det digitala ansikts-fingeravtrycket – de 128 siffrorna – och jämför det med vad man har i databasen. Har man gjort rätt så ska fingeravtrycket nästan precis matcha en individ.

Teori

För att hitta ansikten i en bild så använder man sig som sagt av Histogram of oriented gradient. I nästa stycke ska jag berätta mer om det. Är du inte intresserad av detaljerna kan du hoppa över det.

Vad man gör är att man manuellt går in och markerar ett ansikte på ett antal bilder. Dessa ansikten görs sedan om till gråskala och man tittar på varje individuell pixel. Från varje pixel ritar man en pil från den ljusaste till den mörkaste angränsande pixeln. Till slut får man en hel radda med pilar som pekar åt olika håll. Detta förfarandet gör att man inte behöver bry sig så mycket om ljusförhållanden. När alla pilar är dragna delar man upp bilden i 16×16 stora rutmönster och räknar hur många pilar som pekar åt varje håll. Denna sammanfattning över pilar bildar ett histogram.

Idag används mest Convolutional Neural Networks (CNN) för bildigenkänning. Dessa kallas Faltningsnätverk på svenska. Det man gör i ett CNN är att man skapar kluster av pixlar alltså grupperar dem 3×3 och beräknar ett snittvärde på dem. Sedan destillerar man ner dem till färre och färre pixlar. Detta förfarandet gör att man inte behöver svepa över pixlarna för att leta efter ansikten som man behöver göra med histogramen.

När man jobbar med ansiktsigenkänning fungerar de vanliga loss-funktionerna dåligt. Loss-funktionen är det man använder för att berätta för modellen hur fel den har när man tränar den. Google har en formel för detta som kallas för Facenet. Där använder man tre bilder för att träna nätverket. Man skickar in en bild som man tränar på, tillsammans med en bild som föreställer samma person och slutligen en bild som föreställer någon helt annan. Man vill sedan träna nätverket så att vikterna för den första bilden hamnar närmare den andra.

Tomas i konferensrum hos Woocode

Jag kände mig som en James Bond-skurk i högsätet i Woocodes konferensrum.

Praktik

När vi hade gått igenom grunderna visade Patrick oss några exempel. Vi använde oss av Python, vilket verkar vara det som gäller för att träna neurala nätverk.

Till vår hjälp hade vi några tredjeparts-bibliotek.

Dessa bibliotek använde vi sedan på följande sätt.

  • Patrick började med att markera upp ansikten manuellt i tre bilder. Dessa bilderna använde han sedan till att bygga upp ett histogram.
  • Vill man inte gå igenom omaket att bygga upp ett histogram kan man använda ett färdigt i dlib-biblioteket (dlib.get_frontal_face_detector).
  • Börja med att visa ett antal bilder och markera ansiktet manuellt för att kunna hitta ansikten sedan. Bygg upp ett histogram för detta.
  • Nästa steg är att hitta de 68 mätvärdena, också med hjälp av dlib.
  • Sedan kan man transformera bilden mot de 68 punkterna och hitta de 128 mätvärdena.

Haha, detta kändes självklart när jag antecknade det. Har ni förstått?

I alla fall kunde man sedan använda sig av denna tränade model för att känna igen ansikten i bilder. Hade man lite kräm i datorn kunde man dessutom göra det i realtid. Patrick visade bilder från sin webbkamera där nätverket korrekt identifierade honom som Patrick. Han visade också en film från en kändisgala där nätverket identifierade en hel hög med kända människor.

En mycket intressant föreläsning som väcker många roliga idéer.

Tack för ett intressant Woominarium, Woocode!