Laden...

Hash für Gesichtserkennung, aber ein Hash der die Ähnlichkeit repräsentiert

Erstellt von Ballom vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.988 Views
Ballom Themenstarter:in
31 Beiträge seit 2015
vor 8 Jahren
Hash für Gesichtserkennung, aber ein Hash der die Ähnlichkeit repräsentiert

Hi

Ich versuche mich gerade in der Gesichtserkennung. Das heisst, ich möchte auf einem Bild erkennen WO das Gesicht ist und (noch) NICHT wer es ist.

Dazu habe ich mal ein Foto genommen und das Gesicht ausgeschnitten. Aus dem Gesicht habe ich einen Wert berechnet (der unterschied von Pixel (0,0) zu (0,1), von (0,1) zu (0,2), ...) und die Differenz einfach immer addiert. So erhalte ich für verschiedene Gesichter verschiedene Werte.

Natürlich ist das so ziemlich primitiv und es funktioniert nicht wirklich, weil es nicht die Konturen und Bereiche berücksichtigt. So kann auch eine Türklinke diesen Wert haben (wie ihr auf dem Screenshot erkennt).

Leider kann ich keinen normalen Hash verwenden, weil der bei der kleinsten Veränderung (wenn auch nur ein einziges Pixel anders ist) komplett anders ist.

Jetzt die Frage: Wie würdet ihr so einen Hash berechnen?

Und nein, ich möchte KEINE Bibliothek oder irgend ein Plugin von jemand anders verwenden. Wenn ich Google, finde ich immer nur Lösungen von dritten, die so komplex sind, das ich das nicht verstehe. Es geht mir jetzt erst nur um diesen Hash.

Vielen Dank für eure Ratschläge 😮)

God save the screen.

16.807 Beiträge seit 2008
vor 8 Jahren

Ich kann mir nicht vorstellen, dass dieser Pixel-Hash-Ansatz funktioniert. Der kann ja durch beliebige Konstellationen getroffen werden.
Soweit ich das weiß verfolgen die meisten Bibliotheken stets die Variante, dass das Muster von Augen, Nase und Mund in einem Verhältnis steht - also nicht das Gesicht selbst, sondern nur dessen Gerüst.

In sich ist die Gesichtserkennung ja hoch-komplex.
Facebook für deren Gesichts-Tag-Funktion bis zum ersten Release ca. 2500 Manntage investiert.

Ballom Themenstarter:in
31 Beiträge seit 2015
vor 8 Jahren

Hi

Danke für die Antwort.

Soweit ich weiss, berechnen die "profis" auch einen Hash, aber eben einen "Perceptual Hash", der die Ähnlichkeit beschreibt. Und sie haben eine grosse Bibliothek mit Augen, Nasen, Haaren, Mündern etc und vergleichen diesen "Perceptual Hash". Aber ich möchte das halt jetzt eben vereinfacht auf das ganze Gesicht anwenden.

Wäre schön, wenn da jemand eine Idee hätte. 😃

Perceptual hashing

God save the screen.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Nun das die Algorithmen die man findet so Komplex sind wird wohl daran liegen, das eine gute Gesichtserkennung nicht trivial ist. Um "sehr gute" Ergebnisse zugekommen, kann sich der Aufwand lohnen sich dar einzuarbeiten.

Wenn du selber, den Algorithmus schreiben kannst du schauen, das du immer genauer wirst. Also erst mal alle "Ovale" finden. Und dann in den "Ovalen" nach mehr charakteristischen Anhaltspunkte für ein Gesicht suchen (Auge(n), Nase Mund u.s.w). Das wirst du so weit verfeinern müssen bis du eine Genauigkeit hast die deinen Ansprüchen entspricht.

Für die Gesichtserkennung musst du Entscheiden wann für die ein Gesicht gleich ist. Z.B. Dreiecke (Euklidische Geometrie) sind gleich wenn ihre Innenwinkel gleich sind. Bei Gesichtern kannst du dir N-Kriterien heraus suchen anhand der du entscheidest ob zwei Gesichter gleich sind. Wichtig wird hier wohl sein keine Absoluten Werte zu nehmen, sondern eher Verhältnisse. An dem Punkt kannst du auch gewisse Toleranzen einfügen. Gewisse Fehler durch unterschiedliche Ausrichtungen des Gesichts wirst du wohl korrigieren müssen, bzw die Toleranz so wählen, das sie Vernachlässigt werden können. Ich würde erst mal noch die eigentlichen Werte behalten. Über deine Kriterien solltest du dann zum Schluss einen Hashwert bilden können.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

6.911 Beiträge seit 2009
vor 8 Jahren

Hallo Ballom,

dass das Thema nicht trivial ist, wirst du ja schon erkannt haben. Bei der Suche nach Google-Suche nach face detection und http://citeseerx.ist.psu.edu/search?q=face+detection&submit=Search&sort=rlv&t=doc lassen sich schon ein paar interessante Papers finden. Z.B. gibt Detecting Faces in Images: A Survey einen recht guten Überblick der Möglichkeiten. Schau dir dort auch das Literaturverzeichnis an. So kannst du dich zum benötigten Wissen vorarbeiten.

Interessant kann auch die Viola-Jones-Methode sein. Diese ist in OpenCV implementiert, da diese frei ist könntest du dir dort auch etwas anschauen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.657 Beiträge seit 2006
vor 8 Jahren

Hi Ballom,

Soweit ich weiss, berechnen die "profis" auch einen Hash, aber eben einen "Perceptual Hash", der die Ähnlichkeit beschreibt.

der Unterschied zu deinem Ansatz ist aber, daß die Ähnlichkeit nicht auf Farbwerten von nebeneinanderliegenden Pixeln basiert, sondern auf geometrischen Eigenschaften wie Augenabstand usw. Du läßt einfach den wichtigsten Schritt (die Feature-Erkennung) weg, indem du dich nur auf die Pixel konzentrierst. Wenn die Person sich nur ein wenig dreht oder den Kopf neigt, ist dein Hashwert dann wieder hinfällig.

Das sollte aber aus den von gfoidl verlinkten Artikeln hervorgehen.

Ansonsten wäre noch die Empfehlung, sich wenigstens mal die fertigen Bibliotheken und Verfahren anzuschauen, wenn man sie schon nicht nutzen will.

Christian

Weeks of programming can save you hours of planning

Ballom Themenstarter:in
31 Beiträge seit 2015
vor 8 Jahren

Ok! Vielen dank für die vielen Tipps.

Ich schaue mir gerade emguCV an. Ist wie OpenCV aber für C# 😃

Falls sich da noch jemand dafür interessiert... habe mit Multiple face detection and recognition in real time ein perfektes Beispielprojekt gefunden!

God save the screen.

Ballom Themenstarter:in
31 Beiträge seit 2015
vor 8 Jahren

Ich habe eine neue Idee!

Bei einer fixen Kamera könnte man das Bild (ohne Personen) speichern und dann immer das neue Frame mit dem Standbild vergleichen. So, dass man am Ende nur noch die veränderten Pixel hat. Also eigentlich der ganze Mensch. Und das Gesicht/Kopf ist dann einfach im oberen 1/4. So könnte man auch anhand der Silhouette erkennen ob es ein Mensch ist oder eine Katze.

Ich möchte nämlich, dass die Kamera "lernfähig" wird. Das heisst, wenn sie mein Gesicht erkennt und ich den Kopf drehe (damit sie das Gesicht nicht mehr erkennt, aber sie weiss, dass ich immer noch da stehe), dann erweitert sie ihre Daten über mich und wird mich un Zukunft noch besser erkennen...

God save the screen.

5.657 Beiträge seit 2006
vor 8 Jahren

Eventuell solltest du dich erstmal mit den grundlegenden Verfahren der Bildverarbeitung und besonders der Objekterkennung auseinandersetzen. Dann kannst du die Anforderung für deine Anwendung evaluieren (feste Kameraposition, gleiche Blickrichtung usw.), geeignete Algorithmen mit etwaigen Modifikationen auswählen, implementieren, die Ergebnisse testen, vergleichen und optimieren.

Wenn deine Anwendung "lernfähig" sein soll, dann gilt das gleiche für den Bereich der Neuronalen Netze.

Insgesamt erscheint mir deine Herangehensweise doch etwas unsystematisch. Ich sehen jedenfalls keinen Gewinn darin, irgendwelche Ideen in den Raum zu stellen und zu warten, bis jemand den Lösungsweg vorgibt.

Christian

Weeks of programming can save you hours of planning

F
10.010 Beiträge seit 2004
vor 8 Jahren

Insgesamt erscheint mir deine Herangehensweise doch etwas unsystematisch

Ich würde es eher Naiv nennen, denn es gibt zig Hightec Universitäten die sich mit sowas beschäftigen und wenn das so einfach wäre, dann gäbe es keine gesuchten Kriminellen oder Terroristen mehr.

5.657 Beiträge seit 2006
vor 8 Jahren

Hi FZelle,

Ich würde es eher Naiv nennen

Ich hab es absichtlich nicht so geschrieben, denn ich möchte ja niemanden davon abhalten, sich mit solchen (durchaus interessanten) Themen auseinanderzusetzen.

wenn das so einfach wäre, dann gäbe es keine gesuchten Kriminellen oder Terroristen mehr.

DAS wiederum halte ich für naiv. Wie sollte uns denn Gesichtserkennung vor Selbstmordattentätern schützen?

Christian

Weeks of programming can save you hours of planning

F
10.010 Beiträge seit 2004
vor 8 Jahren

Von gesuchten Kriminellen und gesuchten Terroristen.
Ich sprach nicht von unbekannten Selbstmordattentätern.

M
171 Beiträge seit 2012
vor 8 Jahren

Ich habe eine neue Idee!

Bei einer fixen Kamera könnte man das Bild (ohne Personen) speichern und dann immer das neue Frame mit dem Standbild vergleichen.

Auf Pixel-Ebene kannst Du das aber voll vergessen. Selbst wenn Du zwei Mal hintereinander dieselbe Szene aufnimmst werden die Pixel-Werte niemals alle identisch sein, bei keiner Kamera der Welt.

Der Ansatz, hier Pixel-Werte zu vergleichen, ist einfach grundlegend falsch. Die Vorposter hier haben Dir schon den Tipp gegeben, mit Abstandsverhältnissen zu arbeiten, das ist ein weit besserer Ansatz um mal anzufangen. Einfach wird es sicher nicht, um das Einlesen in die bestehenden Algorithmen wirst Du nicht drum herum kommen.

I
45 Beiträge seit 2012
vor 8 Jahren

Falls es noch aktuell ist:
Dein Verfahren wird mehrstufig sein müssen um die Datenflut einigermaßen in den Griff zu kriegen.

  1. Kanten suchen und die Farben des Bildes auf 2 reduzieren: schwarz und weiß
  2. Irgendwie erreichen, daß das Gesicht im Bild immer die gleiche relative Größe hat
  3. Prüfen, ob das Gesicht im Bild mit einem Referenzumriß übereinstimmt.
    Dazu brauchst Du die 2dimensionale Kreuzkorrelation, die allerdings sogar sagt, wo das Gesicht ist.
    Na ja, die nächsten fünf Jahre wirst Du keine Langeweile haben.
    Aber bangemachen gilt nicht.
    ism.