Zahlenerkennung im Bild
-
Hallo !
Folgenden Versuch:
Ich möchte ein einfaches (!) Bild mit einem einfarbigen Hintergrund, dass Zahlen erhält durch ein Programm schicken, dass mir
die Zahlenkombination ausgibt. Soweitso gut.Ich habe mich in diese Bildverarbeitungstheorie ein wenig eingelesen und habe ein paar einfache Filter realisiert.
http://img108.imageshack.us/img108/3294/zahlenwz5.png
Anhang einer
- Binarisierung (Wert ergibt sich aus dem Mittelwert aller Pixel
- Anschließend jage ich den Sobelfilter drüber
- Invertieren des Bildes und nochmal Binarisieren
http://img514.imageshack.us/img514/439/zahlen2fh9.png
Hier sieht man nun schön die Zahlen-"kanten".
Wie sollte hierbei nun die weitere Vorgehensweise sein ?
Manchmal les ich von Vektoriesierung mit anschließendem Neuronalem Netzwerk.
Teilweise wirkt mir das ganze auch ziemlich überdimensioniert,..?Leider findet man über google mehr Studienlehrgänge die "Bildverarbeitung"
beinhalten als einen Tipp

-
wenn die form der zahlen vorgegeben ist, könntest du einfach an der kante die winkel messen und mit den hinterlegten vergleichen
-
... und wenn nicht ?

Das wär dann aber sehrrrrrr einfach
-
ne sehr simple methode ist pattern matching. du hältst dir vor jeder zahl ein typisches sample vor, skalierst die erkannten ziffern entsprechend runter und berechnest einen matching faktor für jedes sample. das höchste gewinnt. je nach bedingungen ist die methode sogar recht robust.
eine andere, etwas komplexere variante, ist schon ziemlich alt, aber auch noch relativ einfach umzusetzen. ein demokratisches netzwerk aus geometrischen form-erkennern. du brauchst verschiedene module, die sich jeweils auf bestimmte geometrische formen spezialisieren. für zahlen reichen wahrscheinlich detektoren für vertikale, horizontale und "schräge" (nahe 45 grad) linien und dazu dein detektor für bögen, vielleicht noch geschlossene bögen, also ovale.
für jede zahl gibt es dann ein bestimmtes muster, ungefähr so:
zahl | v | h | 45 | bogen 0 | - | - | - | ++ 1 | - | ++ | - | -- 2 | -- | + | + | +usw.
-
Naja, an irgendeiner Stelle musst Du natürlich einen Vergleich durchführen. Die Frage ist halt, was Du vergleichst. Du musst Merkmale der Zahlen finden, durch die Du sie charakterisieren kannst. Das könnten zum Beispiel so Sachen wie "Anzahl der Ecken", "Gesamtlänge der Kanten", "Anzahl kurzer/langer Kanten", "Abmessung der Bounding Box" oder so sein. Du kannst auch versuchen, die Zahlen, durch Fourier-Deskriptoren zu charakterisieren. Oder Du kannst eine Skelettierung der Zahlen durchführen und darüber an Merkmale kommen. Vielleicht kannst Du auch soetwas, was man im Zusammenhang mit Gesichtserkennung als "Fisher Faces" kennt auf die Zahlen anwenden.
Der Grund, warum Du nicht soviel zu Deinem Problem findest, wird sein, dass es einfach unglaublich viele Ansatzmöglichkeiten gibt und DIE Lösung nicht existiert.
Das Stichwort ist hier übrigens "Optical Character Recognition", falls Du danach noch nicht im Netz gesucht hast.
-
ein neuronales netz dürfte doch sicherlich das einfachste sein.
-
Mein Vorschlag: schau dir mal Randbeschreibungen an (vor allem Chain-Codes). Die Kontur der Zahlen ergeben sich ja als Zusammenhangskomponenten (eventuell ist ein Hystereseverfahren notwendig, falls zu viele Lücken in der Randkontur sind). Sammel die Kontur auf und bau dir ein Chain Code Histogramm. Ich hab nicht geprüft, wie eindeutig sich diese Histogramme auf Zahlen matchen lassen, sollte aber imho ganz gut funktionieren. Neuronale Netze etc. sind meiner Meinung nach nicht unbedingt notwendig...
Du hast beim Chain-Code allerdings keine Rotations-Invarianz, d.h. du kriegst Probleme, wenn die Zahlen auch gedreht auftauchen. Sollte das der Fall sein, könntest du stattdessen Fourierdeskriptoren verwenden.
-
gentoo schrieb:
ein neuronales netz dürfte doch sicherlich das einfachste sein.
Das ist sicherlich eine Möglichkeit. Aber definitiv keine einfache. Bei Neuronalen Netzen muss man eine ganze Menge wissen und am Besten auch einiges an entsprechender Erfahrung haben. Wie sollte man das KNN dimensionieren, wieviele Layer, wieviele Neuronen pro Layer? Solche und andere Fragen sind für jemanden, der noch nichts mit neuronalen Netzen zu tun hatte, eher schwer zu beantworten. Andere Ansätze sind "greifbarer". Neuronale Netze kommen immer ganz schnell als Stichwort, wenn man ein Problem hat, bei dem man erstmal nicht so genau weiß, wie man es angehen soll. Aber eigentlich heißt das ja, dass man kein vernünftiges Modell des Problems hat. Das ist ein schlechter Ausgangspunkt für jede Problemlösung. Auch für den Einsatz von KNN.
Andererseits: Hatten hier nicht mal ein paar Leute ein ähnliches Problem auf Basis von Künstlichen Neuronalen Netzen gelöst? Möglich ist es also auf jeden Fall.
-
naja ich habe generell diese erfahrung gemacht:
-eingabeschicht, so groß wie das bild
-ausgabeschicht so große wie für eine differenzierung der ausgabe notwendig oder größer (je nach dem wie mans will)
-viele schichten erhöhen den lernerfolge bei feed-forward netzen nicht wirklich, sondern setzen nur eine niedrigere lernrate vorraus,weil sonst fehlerminima übersprungen werden
-viele neuronen in einer schicht wirken sich of positiv auf das lernergebnis aus
-kurioserweise scheint ein schwellwert pro neuron keinen einfluss auf mein netz geahbt zu haben, wobei ich nicht weis warum, wos doch in der literatur immer so löblich erwähnt wurde....wie dem auch sei. bei meinen kleinen 9x7 pixel bildern hatte ich trotz fehler oft erkennungsraten von 99,9999% das dürfte für solche aufgaben genügen. nun habe ich aber nie mit großen bildern getestet.
edit:
erkennungsrate ist vielleicht falsch. das korrekte ausgabeneuron nähert sich eher 99,9... prozent dem sollwert an.
irgendwie finde ich solche netze viel cooler, als sich mit irgendwelchen algorythmen herumzuquälen die womöglich nicht besonders robust auf veränderungen reagieren. bei netzen ist das zwar auch nicht viel besser. aber auf geringfügige abweichungen reagieren sie oft richtig.