Hauterkennung in Wolfram-Sprache (Mathematica)

Ursprünglicher Autor: Matthias Odisio
  • Übersetzung

Übersetzung von Matthias Odisios Beitrag " Haut mit Mathematica sehen ".
Sie können die Datei mit dem Text des Artikels, den interaktiven Modellen und dem gesamten im Artikel enthaltenen Code hier herunterladen .
Ich bedanke mich bei Kirill Guzenko für die Hilfe bei der Übersetzung.

Die Hauterkennung kann sehr nützlich sein - dies ist einer der Hauptschritte bei fortgeschritteneren Systemen, die darauf abzielen, Personen zu erkennen, Gesten und Gesichter zu erkennen, anhand von Inhalten zu filtern und vieles mehr. Trotz alledem war meine Motivation für die Erstellung der Anwendung unterschiedlich. Die Entwicklungs- und Forschungsabteilung von Wolfram Research, in der ich arbeite, wurde geringfügig umstrukturiert. Mit meinen Kollegen, die sich mit Wahrscheinlichkeiten und Statistiken beschäftigten, die mir viel näher kamen, beschloss ich, eine kleine Anwendung zu entwickeln, die sowohl Bildverarbeitungsfunktionen in Mathematica als auch statistische Funktionen verwendet. Hauterkennung ist das erste, was mir in den Sinn gekommen ist.

Hauttöne und Aussehen können variieren, was die Erkennung erschwert. Der Detektor, den ich entwickeln wollte, basiert auf Wahrscheinlichkeitsmodellen für Pixelfarben. Für jedes Pixel des Bildes, das dem Eingang zugeführt wird, gibt der Hautdetektor die Wahrscheinlichkeit an, dass dieses Pixel zum Hautbereich gehört.

Hauterkennungsmodell

Betrachten wir dieses Problem aus der Sicht der Wahrscheinlichkeitstheorie. Wir möchten die Wahrscheinlichkeit bewerten, dass ein Pixel zu einem Bereich mit Haut einer bestimmten Farbe gehört. Mit der Bayes-Formel können wir es folgendermaßen ausdrücken (nennen wir es Gleichung 1):

Gleichung 1

Beachten Sie, dass in diesem Beitrag die Wahrscheinlichkeiten durch das Großbuchstaben P [.] Bezeichnet werden.

Die drei Bedingungen auf der rechten Seite der Gleichung können in berechenbarer Form dargestellt werden. Hier bieten sich der probabilistische Ansatz und diese beiden Trainingsdatensätze an: Der erste besteht aus Pixeln, die zu Bereichen mit Haut gehören, und der zweite aus Pixeln, die nicht dazu gehören. Wir werden das statistische Modell trainieren und die Formel für P [Farbe | Haut] erhalten . Die Schätzung von a priori P [Haut] kann in dem Sinne willkürlich sein, dass sie von der endgültigen Anwendung abhängt, für die der Hautdetektor entwickelt wird. Wir gehen auf einfache Weise vor und bestimmen die a priori Wahrscheinlichkeit durch das Verhältnis der Pixelanzahl aus zwei Trainingsdatensätzen. Mit P [Farbe]Zunächst wird es mehr Probleme geben, da eine zuverlässige Wahrscheinlichkeitsmodellierung für jede mögliche Farbe einen großen Trainingsdatensatz erfordert. Glücklicherweise können wir mit der vollständigen Wahrscheinlichkeitsformel dieses Problem umgehen, indem wir diesen Begriff wie folgt zerlegen:



Schließlich wird unser probabilistischer Hautdetektor durch die Formel implementiert (nennen wir es Gleichung 2):

Gleichung 2

Jetzt erstellen wir zwei Sätze von Bildern und trainieren unser Modell auf diesen.

Ich weiß aus erster Hand, dass das Erstellen solcher Sammlungen eine Kunst ist und viel Aufwand erfordert. Dieses Mal werden wir jedoch nicht besonders eifrig sein und stattdessen nur ein Dutzend Bilder sammeln, die Haut darstellen. Natürlich würden ernsthafte statistisch signifikante Modelle Hunderte von Bildern und hochentwickelte Hautmodelle erfordern.

Используя меню Graphics в Mathematica, я могу вручную выбрать области с кожей в изображении и повторить процесс для подборок с изображениями — честно говоря, не самая интересная часть моего дня:

Auswahl von Hautregionen

Есть сведения, что стандартное цветовое пространство RGB не является лучшим цветовым пространством для реализации моделей с разделением цветов по критерию кожа/не кожа. Большинство проблем может возникать из-за того, что при разном освещении и разных чертах лица кожа выглядит по разному.

Как можно увидеть, цвета кожи и всего помимо неё (изображённые в красном и зелёном цветах соответственно) не сильно перекрываются в изображениях в выборке, но при этом охватывают большую часть трёхмерного пространства RGB:

3D-Raum von Haut- und Nichthautfarben

Lassen Sie uns mit einem anderen Farbraum experimentieren, in dem solche Änderungen im Aussehen der Haut möglicherweise zuverlässiger modelliert werden.

Als Farbraum können Sie CIE XYZ auswählen und Hautfarben in zwei Farb- und einer Helligkeitskoordinate darstellen. Um Modelle zu entwickeln, die widerstandsfähiger gegenüber Änderungen der Lichtverhältnisse sind, arbeiten wir nur mit den Farbkoordinaten x und y , definiert als x = X / ( X + Y + Z ) und y = Y / ( X + Y + Z ):
Funktion colorConvertxyergibt ein zweikanaliges xy- Bild: Das

colorConvertxy [img_]: = ImageApply [Most [#] / (Total [#] + $ MachineEpsilon) &, ColorConvert [img, "XYZ"];

Extrahieren einer Liste von Paaren von xy- Regionen mit Haut wird unter Verwendung des Bildes selbst, der Maske von Hautbereichen und der Funktionen PixelValuePositions und PixelValue ausgeführt . Eine Liste von Paaren von xy hautlosen Bildbereichen kann auf genau dieselbe Weise erhalten werden.

Extrahieren der Liste von Nicht-Skin-XY-Paaren

Im zweidimensionalen xy- Farbraum haben die Bereiche mit den Koordinaten der Hautpunkte für alle Trainingsbilder eine kleinere Fläche als in RGB, und der Unterschied zwischen Bereichen mit und ohne Haut ist weniger ausgeprägt. In den nachstehenden Verteilungen für die Farben von Bereichen mit und ohne Haut sind die ersteren in Grüntönen und die letzteren in Rottönen dargestellt.

Erstellen eines 3D-Histogramms, um zu veranschaulichen, wo sich Haut- und Nicht-Hautbereiche im Datensatz befinden

3D-Histogramm von Haut- und Nichthautregionen

Arbeite im zweidimensionalen xyDer Farbraum scheint vielversprechend. Lassen Sie uns zurückgehen und die statistischen Modelle basierend auf den Daten für Gleichung 2 präsentieren. Der Einfachheit halber geben wir die Formel noch einmal an:

Gleichung 2

Der Anteil von Pixeln mit Haut unter den Millionen Pixeln des Trainingsdatensatzes beträgt ungefähr 13%. Diesen Erfahrungswert behalten wir in unserem Modell für die a priori Wahrscheinlichkeit P [skin] bei :

pskin = N [Länge [skinxy]] / (Länge [skinxy] + Länge [nicht hautxy])

0,12706

Um die Wahrscheinlichkeitsdichtefunktionen P [color | skin] und P [color | nonskin] zu modellieren, wird eine bestimmte Mischung von Gaußschen Verteilungen in Betracht gezogen . Diese Verteilungen können für gegebene Paare xy gut geeignet seinoben dargestellt. Auf meinem Laptop sind die Berechnungen jedoch etwas schneller, wenn Sie ein Modell auswählen, das auf Verteilungen mit glatten Kernelverteilungen basiert, die mit der Funktion SmoothKernelDistribution erstellt wurden :

pcolorskin = SmoothKernelDistribution [skinxy];

pcolornonskin = SmoothKernelDistribution [nonskinxy];

Schließlich kann die Wahrscheinlichkeit, dass diese Farbe in xy der Skin entspricht, durch die folgende Funktion dargestellt werden :

Wahrscheinlichkeitshaut = Funktion [{x, y}, Auswerten [(pskin PDF [pcolorskin, {x, y}]) / ((1 - pskin) PDF [pcolornonskin, {x, y}] + pskin PDF [pcolorskin, {x , y}] + $ MachineEpsilon)]];

Plot3D [Wahrscheinlichkeitshaut [x, y], {x, 0, 1}, {y, 0, 1}]

3D-Darstellung der Wahrscheinlichkeit, dass eine bestimmte xy-Farbe der Haut entspricht

Wie wird das vorgestellte Modell funktionieren? Wenden wir die Funktion auf mehrere Testbilder an:

Skinness [image_]: = ImageApply [Wahrscheinlichkeitskin [Sequence @@ #] &, colorConvertxy [image]];

Anwendung der Hauterkennungsfunktion

Endergebnis mit erkannter Haut

Nicht schlecht, oder? Aber mit einem anderen Testbild unten wird es interessant - der unscharfe Bereich an der Grenze zwischen dem roten T-Shirt und dem grünen Laub wird fälschlicherweise mit hoher Wahrscheinlichkeit als Haut identifiziert.

Ausführen der Hauterkennungs-App

Beispielbild mit erkannter Haut

Alles ist fast fertig. Grundsätzlich erfordert die Hauterkennung eine Entscheidung darüber, ob ein Pixel zur Haut gehört. Um ein solches Binärbild zu erstellen, können wir einen Schwellenwert für die empfangenen Bilder festlegen. Welchen Schwellenwert soll man jedoch wählen? Wenn Sie zu hoch auswählen, werden die Skin-Pixel möglicherweise nicht erkannt. Wenn Sie zu niedrig auswählen, ist die Anzahl der als Skin ohne Skin definierten Pixel groß. All dies führt zur Konstruktion und Analyse von ROC-Kurven. Ja, es wäre großartig, eine solche Funktionalität mit Mathematica wiederherzustellen , aber ich glaube, dass dieses Thema mehr Aufmerksamkeit verdient. In der Regel ein anderes Mal, in einem anderen Beitrag.

Eine alternative Strategie schlägt vor, die Wahrscheinlichkeiten zu vergleichen, mit denen ein Pixel Teil des Hautbereichs ist oder nicht. Nehmen wir wie beim letzten Mal einen probabilistischen Ansatz und überarbeiten Gleichung 1: P [Haut | Farbe] == P [Farbe | Haut] * P [Haut] / P [Farbe] . Auf die gleiche Weise können wir die hintere Wahrscheinlichkeit ausdrücken, dass dieses Pixel nicht zum Hautbereich gehört:

P [Nichthaut | Farbe] == P [Farbe | Nichthaut] * P [Nichthaut] / P [Farbe]

Um diese Farbe nach dem Kriterium Haut / nicht Haut zu sortieren, müssen wir nur die erhaltenen hinteren Wahrscheinlichkeiten vergleichen und eine größere auswählen. P [Farbe] kann verworfen werden, und dann wird das Pixel als zum Hautbereich gehörend definiert, wenn P [Farbe | Haut] * P [Haut]> P [Farbe | Haut] * P [Haut] .

So funktioniert der Hautdetektor derzeit:

Aufbau des Hautdetektors

Eine schnelle Beurteilung von Testbildern lässt uns den Schluss ziehen, dass das System die Aufgabe durchaus erfüllen kann:

Durchführung der Analyse an zwei Testbildern

Zwei Testbilder mit erkannter Haut

Beenden wir dieses Thema mit einer Anwendung zur

Zeigt die Hauterkennungs-App an

Beispielbilder mit hervorgehobener Skin

Hauterkennung : Zunächst war es mein Ziel, einen Hautdetektor zu entwickeln, der nur aus Freude an der Untersuchung der Wechselwirkungen zwischen Wahrscheinlichkeiten, Statistiken und Bildverarbeitung besteht. Nahezu jedes Element unserer endgültigen Version eines Hautdetektors (z. B. ein Trainingsset, eine Auswahl statistischer Verteilungen, ein Klassifikator, eine quantitative Bewertung) kann mithilfe der umfangreichen Mathematica- Funktionalität detaillierter untersucht und verbessert werden .

Jetzt auch beliebt: