Bilderkennung



  • Hoi,
    ich programmiere gerade an einem Uniprojekt, und leiste etwas Fleißarbeit im Voraus. 😉

    Hier mal die Pseudo-Aufgabenstellung:
    Wir haben Bilder von Gras, Wasser und Stein, geordnet in einer Datenbank. Jetzt kommt ein unbekanntes Bild ins Spiel und wir müssen bestimmen, ob es ein Bild von Stein, Gras oder Wasser ist.

    Unser Ansatz ist Local Binary Pattern. Das ist soweit schon fertig implementiert und mit einem Testprogramm kann ich schon gut erkennen, in welche Kategorie ein Bild fällt, indem ich einfach das Unbekannte Bild mit jeweils 1 Bild pro Kategorie vergleiche und die Kategorie des Bildes mit dem geringsten Abstand nehme.

    Soweit so gut.
    Aber was mache ich, wenn ich eine ganze Datenbank an Bildern nutzen möchte? Ich zb 500 Bilder von Gras habe? Was ist dann die übliche Vorgehensweise, um das erweiterte Wissen auszunutzen?

    Danke und Grüße,
    Ethon



  • Die Resultate mehrerer Classifier können mit Ada-Boost* kombiniert werden. In Deinem Fall hast Du für jedes der 500 Bilder einen Classifier.

    * http://en.wikipedia.org/wiki/AdaBoost



  • Das ist dann aber auch einen Faktor 500 langsamer. Eine sehr verbreitete Möglichkeit ist, dass man versucht ein mathematisches Model für die Bilder aufzustellen, das mit wenigen Parametern auskommt. Anachließend schätzt man aus den Bildern die Parameter und trainierrt darauf einen Klassifikator. Wenn man kein Modell hat kann man natürlich auch einfach Merkmale definieren und extrahieren. Einfach die Bilder direkt zu verwenden ist wohl insgesamt das ungeschickteste, weil der Merkmalsraum dann sehr hochdimensional ist, womit die Klassifikation erschwert wird.



  • Du könntest dir die Feature Vektoren mit SIFT rausholen und dann mit den SIFT Vektoren der Bilder der Datenbank vergleichen. Damit solltest du sehr eindeutig die Bilder klassifizieren können.



  • Sind es Farbbilder?



  • Um ein paar Missverständnissen vorzubeugen ... 😉

    1. Wir müssen LBP verwenden, keine Freiheiten bezüglich der Classifiers.
    2. Ja, es sind Farbbilder.
    3. Es ist ein Grundlagenkurs, von daher fallen viele fortgeschrittene Techniken leider raus, uns fehlt das Wissen dazu.
    4. Das Ziel ist eine möglichst geringe Fehlerrate bei der Erkennung, Performance ist egal. (Schreiben das Ganze auch in Java)

    Die Resultate mehrerer Classifier können mit Ada-Boost* kombiniert werden. In Deinem Fall hast Du für jedes der 500 Bilder einen Classifier.

    * http://en.wikipedia.org/wiki/AdaBoost

    Das klingt ganz gut, ist sicher einen Blick wert. 🙂

    Das ist dann aber auch einen Faktor 500 langsamer. Eine sehr verbreitete Möglichkeit ist, dass man versucht ein mathematisches Model für die Bilder aufzustellen, das mit wenigen Parametern auskommt. Anachließend schätzt man aus den Bildern die Parameter und trainierrt darauf einen Klassifikator. Wenn man kein Modell hat kann man natürlich auch einfach Merkmale definieren und extrahieren. Einfach die Bilder direkt zu verwenden ist wohl insgesamt das ungeschickteste, weil der Merkmalsraum dann sehr hochdimensional ist, womit die Klassifikation erschwert wird.

    Danke für die Kritik, du hast wohl recht damit.
    Dein Vorschlag erscheint mir allerdings gerade zu hoch, müsste mir vlt mal ein paar Gedanken darüber machen...



  • LBP scheint laut Wikipedia erstmal nur die Bildinformation zu reduzieren.

    Aber was mache ich, wenn ich eine ganze Datenbank an Bildern nutzen möchte?

    Indem du die Bildinformation einer Klasse ebenfalls reduzierst. Das macht ein Klassifikator fuer dich.



  • Wir erzeugen aus dem Bild ein Histogramm und verwenden dann ein Abstandsmaß für Histogramme. So ist es auch vorgegeben, wir verwenden aktuell den Chi-Square-Test, probieren aber auch mit anderen herum.

    Indem du die Bildinformation einer Klasse ebenfalls reduzierst. Das macht ein Klassifikator fuer dich.

    Was für das in der Umsetzung bedeuten? Natürlich würden wir zuerst ein Histogramm für jedes Bild in der Datenbank erzeugen. Aber was wäre der sinnvollste Weg jetzt weiterzuarbeiten?



  • Ethon schrieb:

    Das ist dann aber auch einen Faktor 500 langsamer. Eine sehr verbreitete Möglichkeit ist, dass man versucht ein mathematisches Model für die Bilder aufzustellen, das mit wenigen Parametern auskommt. Anachließend schätzt man aus den Bildern die Parameter und trainierrt darauf einen Klassifikator. Wenn man kein Modell hat kann man natürlich auch einfach Merkmale definieren und extrahieren. Einfach die Bilder direkt zu verwenden ist wohl insgesamt das ungeschickteste, weil der Merkmalsraum dann sehr hochdimensional ist, womit die Klassifikation erschwert wird.

    Danke für die Kritik, du hast wohl recht damit.
    Dein Vorschlag erscheint mir allerdings gerade zu hoch, müsste mir vlt mal ein paar Gedanken darüber machen...

    1. In der Wahl der Merkmale steckt natuerlich immer eine gewisse Modellbildung. Die sind also nicht irgendwie gewaehlt.

    2. Du sagst ja jetzt schon, wenn Du zwei Bilder mit Steinen hast und jeweils die von Dir gewaehlten LBP-Merkmalsvektoren extrahierst, dass die relativ nah bei einander liegen sollten. Zumindest deutlich naeher als Steine und Gras. Was Du allerdings nicht weisst ist, wie nah sie eigentlich bei einander liegen sollten und ob Dein genutzter Prototyp-Vektor optimal ist. Ein optimaler Prototypvektor und Informationen ueber die Verteilung bzw. die typische Abweichung von diesem Vektor, sind aber sehr nuetzlich, um einen guten Klassifikator zu bauen. Um diese Ausgangsgroessen zu finden, hast Du jetzt Deine Datenbank zur Verfuegung. Der optimale Prototypvektor sollte recht einfach zu bestimmen sein. Er ist mehr oder weniger der Mittelwert aus all den LBP-Merkmalsvektoren, die zur jeweiligen Klasse gehoeren. Als naechstes bist Du an der Standardabwechung interessiert. Vermutlich wirst Du das ganz naiv erstmal als Normalverteilung modellieren. Du hast also einen Prototyp und alle anderen Stein-Bilder sind bezueglich der von Dir genutzten Merkmale normalverteilt irgendwo im Umfeld dieses Prototypen zu finden. Ueber die Statistik kannst Du jetzt problemlos die Standardabweichung bestimmen, die zu dieser Normalverteilung gehoert. Damit kannst Du dann nach der Berechnung dieser Groessen fuer gegebene Testbilder jeweils sagen, wie wahrscheinlich es ist, dass das Bild zu einer gegebenen Klasse gehoert.

    3. AdaBoost brauchst Du hier nicht. Das ist die Loesung zu einem anderen Problem. Was Du hier brauchst ist ein Modell. Ein naheliegendes habe ich Dir oben schon skizziert: "Normalverteilungen". Unter Umstaenden waere allerdings auch ein anderes Modell besser. Das weisst Du selbst aber eher. Vielleicht hast Du auch im Vorfeld Informationen darueber, wie haeufig Gras-, Wasser- und Steinbilder auftauchen werden. Dann solltest Du einen Bayes-Klassifikator bauen.



  • Er ist mehr oder weniger der Mittelwert aus all den LBP-Merkmalsvektoren

    Ich habe mir mal http://www.ee.oulu.fi/mvg/files/pdf/pdf_524.pdf bis Seite 7 durchgelesen. Da steht genau drin, wie in deinem konkreten Fall zu verfahren ist.



  • Jester schrieb:

    Das ist dann aber auch einen Faktor 500 langsamer.

    Und nicht nur das, dr Klassifizierer wird gnadenlos overfitten.

    @Ethon bevor du irgendwas machst, frag deine Betreuer, was genau sie wollen. Die haben meistens einen recht genauen Plan/Forschungsfrage und davon abzuweichn kann dazu führen, dass du doppelte Arbeit hast.

    Aber im Grund ist schon der richtige Ansatz, dir irgendwie aussagekräftige Merkmale aus den Bildern zu extrahieren und auf dieser kompakten repräsentation zu Klassifizieren.


Anmelden zum Antworten