Objekterkennung mit Neuronalen Netzen



  • Hallo!
    Ich beschäftige mich in letzter zeit sehr viel mit künstlichen neuronalen Netzen und habe auch schon die ein oder anderen muster erkennungs programme mit neuronalen netzen realisiert. Nun wollte ich mich mit der Objekterkennung in Bildern auseinandersetzen. Nun können diese Objekte ja in verschiedener Anzahl und Größe in einem Bild vorkommen also muss man ja irgendwie jedes Objekt erkennen und die Merkmale in Matrizen packen und durch das neuronale Netz jagen.
    Nur wie haben diese Merkmale auszusehen? Bzw. wie filtert man die Objekte aus dem bild raus? Kennt wer irgendwelche Formeln die mir da weiterhelfen könnten?

    MfG,
    FunnyItsElmo



  • Hi,

    Ich glaube Du verschätzt Dich wenn Du glaubst, mit den künstlichen neuronalen Netzen (KNNs) den kniffligen Teil bearbeitet zu haben und Du Dir jetzt nur noch mit ein paar "Formeln" den Rest ranschaffen musst.

    Ein Musterkennungssystem besteht aus einer ganzen Reihe von Komponenten, die jeweils für sich sauber entworfen werden müssen. Und da es sich um eine Pipeline handelt beeinflusst die Qualität, die in einem Schritt erreicht wird maßgeblich die überhaupt noch erreichbare Qualität in den nächsten Schritten.

    Die Pipeline sieht im Wesentlichen so aus:

    1. Aufnahme der Rohdaten
    2. Vorverarbeitung
    3. Segmentierung
    4. Merkmalsextraktion
    5. Klassifikation

    In 1) geht es darum überhaupt Daten aufzunehmen und dafür möglichst gute Rahmenbedingungen herzustellen (etwa Wahl der Beleuchtung, geeignete Kamera, Aufnahmetechnik, etc.

    In 2) wird versucht die Rohdaten so vorzuverarbeiten, dass sie möglichst gut für die Erkennungsaufgabe geeignet sind. Dazu gehört das entfernen von Rauschen, glätten von Peaks (z.B. Überbelichtungen).

    In 3) geht es darum rauszufinden welche Regionen des Bildes überhaupt von Interesse sind und genauer angeschaut werden sollten. Übliche Techniken sind zum Beispiel das Entdecken bestimmter Formen (z.B. Kreise oder Rechtecke mit bestimmten Farben für Verkehrsschilder). Oder man verwendet Kantendetektion um Bereichsbegrenzungen zu schätzen. Oder Radon-Transformation um Geraden im Bild oder im Kantenbild zu finden... oder oder oder.

    Anschließend erzeugt man ein neues Bild für jede für interessant befundene Region und normiert diese auf eine feste Größe (z.B. 32x32 Pixel).

    Nun führt man für jedes dieser Kandidatenbilder die Schritte 4) und 5) aus. Das heißt, man extrahiert Merkmale, beispielsweise Farbverteilungen (in passenden Farbräumen), Vorkommen bestimmter Muster und Formen etc. und wenn man das alles hat, dann gibt man es als Eingabe in einen (entsprechend trainierten) Klassifikator. Das kann ein KNN sein oder eine Support-Vektor-Maschine oder auch irgendwas anderes.

    Wichtig ist, dass man wirklich den richtigen Aufwand in alle Stufen der Pipeline steckt. Auch wenn aus irgendeinem Grund Schritt 5 am beliebtesten ist, ist das nur der letzte Schritt. Das hilft allerdings alles nichts wenn die Aufnahme schon von Anfang an schlecht ist, man bei der Segmentierung nicht die richtigen Bildbereiche findet oder man schlechte Merkmale gewählt hat.



  • so eine schöne Antwort und dann keine Reaktion ...

    Im übrigen funktioniert es schon, dass du mehr oder weniger die Bildmatrix in dein neuronales Netzwerk jagst, Facebook macht das auch so bei der Gesichtserkennung (ok ... ein bisschen Vorverarbeitung ist doch dabei, aber nicht viel!), siehe z.B.: DeepFace: Closing the Gap to Human-Level Performance in Face Verification --> http://www.cv-foundation.org/openaccess/content_cvpr_2014/papers/Taigman_DeepFace_Closing_the_2014_CVPR_paper.pdf

    Im Allgemeinen wird aber dann doch ein bisschen Vorverarbeitung gemacht. Den Objekten werden Vektoren zugeordnet. Im einfachsten Fall schaust du dann ob der Vektor deines gesuchten Objekts (ungefähr) dem Vektor des gefundenen Objekts entspricht.

    Wenn du mal ein bisschen "spielen" willst um zu sehen wie Bildverarbeitung so funktioniert, lade dir OpenCV runter. Am besten noch die Python Bindings, dann kannst du mit kleinen Python Skripten sehr schnell testen ob deine Ideen funktionieren.

    Viel Spaß!



  • Mit openCV und C++ mache ich derzeit neue Erfahrungen, die Gesichtserkennung mit Haar-Cascades und Tracking der Kopfbewegungen funktioniert schon ziemlich gut, viel schlimmer ist das Visual-Studio-Gedöns.

    Wie man das nun durch neuronale Netze und Matritzen jagt weiß ich aber nicht, ich würde es am liebsten durch den elektronischen Schredder jagen 😃



  • Hi,

    wie Jester bereits gesagt hat ist die Klassifikation nur der letzte Schritt.

    Jester schrieb:

    Die Pipeline sieht im Wesentlichen so aus:

    1. Aufnahme der Rohdaten
    2. Vorverarbeitung
    3. Segmentierung
    4. Merkmalsextraktion
    5. Klassifikation

    Zu Punkt 4 würde ich noch die https://en.wikipedia.org/wiki/Feature_selection einfügen.

    Vorallem solltest du den Fluch der Dimensionalität im Hinterkopf behalten. (Je nach Verfahren) Wenn du ein z.B. ein Bild mit 1024*768 Pixeln direkt ins neuronale Netze schiebst, dann arbeitest du in einem 786432-dimensionalen Merkmalsraum 😉

    http://www.visiondummy.com/2014/04/curse-dimensionality-affect-classification/
    https://en.wikipedia.org/wiki/Curse_of_dimensionality



  • Hallo FunnyItsElmo

    Ich denke bevor man mit Formeln anfängt sollte man die Fragestellung präzisieren.

    Mustererkennung allgemein (was etwas anderes ist als cluster Probleme) lassen sich sehr häufig mit Attraktor Netzwerken bewerkstelligen, wie z.b. einem sog. Hopfield Netz. Es gibt aber auch andere Netz Modelle die das können, wie STDP-Netze zum Beispiel.

    Gruß
    cpp_Jungspund


Anmelden zum Antworten