Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Hash für Gesichtserkennung, aber ein Hash der die Ähnlichkeit repräsentiert
Ballom
myCSharp.de - Member

Avatar #avatar-3498.gif


Dabei seit:
Beiträge: 26

Themenstarter:

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

beantworten | zitieren | melden

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 :o)
Attachments
God save the screen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16237

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Ballom
myCSharp.de - Member

Avatar #avatar-3498.gif


Dabei seit:
Beiträge: 26

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ballom am .
God save the screen.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7590
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Ballom,
Zitat von 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
private Nachricht | Beiträge des Benutzers
Ballom
myCSharp.de - Member

Avatar #avatar-3498.gif


Dabei seit:
Beiträge: 26

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Ballom
myCSharp.de - Member

Avatar #avatar-3498.gif


Dabei seit:
Beiträge: 26

Themenstarter:

beantworten | zitieren | melden

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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ballom am .
God save the screen.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

Hi FZelle,
Zitat von 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.
Zitat von FZelle
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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

Von gesuchten Kriminellen und gesuchten Terroristen.
Ich sprach nicht von unbekannten Selbstmordattentätern.
private Nachricht | Beiträge des Benutzers
Mallett
myCSharp.de - Member



Dabei seit:
Beiträge: 176

beantworten | zitieren | melden

Zitat von Ballom
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.
private Nachricht | Beiträge des Benutzers
ismirschlecht
myCSharp.de - Member



Dabei seit:
Beiträge: 47

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers