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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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. 😃
God save the screen.
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:
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!"
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
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.
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.
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
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.
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
Von gesuchten Kriminellen und gesuchten Terroristen.
Ich sprach nicht von unbekannten Selbstmordattentätern.
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.
Falls es noch aktuell ist:
Dein Verfahren wird mehrstufig sein müssen um die Datenflut einigermaßen in den Griff zu kriegen.