Um uns von einem Nutzer ein noch genaueres Bild machen können und so auch die Brillenvorschläge zu verbessern haben wir einem Merkmal gewidmet, dass bisher noch aus stand: Die Haarfarbe.
Um die Haarfarbe ermitteln zu können müssen wir zunächst die Haare aus dem Bild des Nutzers ausschneiden. Indem wir auf unsere bisherige Arbeit aufbauen können wir uns viel Arbeit für diesen Schritt sparen.
Wir nutzen unsere Gesichtserkennung, um zunächst den Kopf zu erkennen. Dann muss aus diesem Gesichtsausschnitt nur noch der Teil der Haare erkannt werden. Dafür können wir wiederum auf eine Version des CelebA Datensatzes zurückgreifen. Der CelebA-Mask-HQ Datensatz besteht aus vielen sehr detaillierten Segmentierungsmasken für alle möglichen Gesichtsmerkmale: Dabei unter anderem auch Haare.
Trainiert haben wir wiederum ein EfficientNetB0, um den Bildausschnitt der Haare zu bestimmen. Eine Herausforderung bei dieser Aufgabe sind die oft filigranen Haaransätze, die oft dazu führen, dass Teile vom Hintergrund mit eingeschlossen werden. Dies kann leicht dazu führen, dass eine falsche Haarfarbe erkannt werden kann. Dieses Problem ließ sich zu einem großen Teil mit einem sehr aggressiven threshold verhindern. Wobei immer noch kleine Teile des Hintergrundes mit eingeschlossen werden können.
Nun können wir dazu übergehen die Haarfarbe der Person über die Pixelwerte zu bestimmen. Dazu haben wir zunächst die gleiche Farberkennung genutzt, die wir bereits für Kleidungsstücke verwendet haben. Hier wird einfach der häufigste RGB-Farbwert bestimmt und ausgegeben. Wir mussten schnell feststellen, dass unsere bisherige Farberkennung recht ungenau bei Haarfarben arbeitet.
Haare haben häufig starke Farbverläufe. Die Farberkennung konzentriert sich jedoch auf solide Farbblöcke. Außerdem kommt es häufig dazu, dass Teile der Haare überbelichtet werden. Besonders, wenn die Person von hinten beleuchtet wird. Dann erkennt die Farberkennung die helle solide Farbe des überbelichteten Teils des Ausschnittes, nicht jedoch die Haarfarbe.
Um dieses Problem zu lösen sind wir nun dazu übergegangen die dominante Farbe des Bildausschnitts mithilfe von klassischem k-means Clustering zu bestimmen. Clustering erlaubt das Erkennen von Strukturen in Daten. Hier interessieren wir uns vor allem für das erkennen von gemeinsamen Gruppen.
Die endgültige Farbe der Person wird dabei über die Mitte des umfangreichsten Clusters bestimmt.
Da dieser Ansatz weit weniger fehleranfällig als unser bisheriger Ansatz ist, setzen wir diese neue Farberkennung nun auch für Kleidungsstücke ein.