Bitte mal so richtig auseinandernehmen: Handschriftenerkennung
-
Hallo,
Wie vielleicht einige von Euch noch wissen, haben Jester und Korbinian auf dem Forumstreffen letztes Jahr Vorträge zum Thema "Pattern Recognition" gehalten, nach denen dann - unter reger Beteiligung einiger anderer Mitglieder - eine kleine Handschriftenerkennung entstand, die Jester freundlicherweise auch zum Download bereitgestellt hat.
Ich habe mir vorgenommen, wenn ich demnächst mal ein bisschen Zeit habe, ein paar Features hinzuzufügen und das ganze zu diesem Zweck mal ein wenig verstümmelt, damit es ganz unabhängig von dEUs genial simpler GUI und somit auch unter Unix läuft. Genaugenommen denke ich, dass meine jetzige Variante - obwohl noch unbenutzbar - prinzipiell relativ plattformunabhängig sein sollte.
Ziel der ganzen Aktion ist für mich, dass die Handschriftenerkennung irgendwann mal zu einer Library wird, die man sowohl unter Windows als auch unter Unix bequem einsetzen kann.
Bevor ich mich allerdings hinsetze und beginne, zusätzliche Features einzubauen, hätte ich gerne, dass sich so viele Leute wie möglich hinsetzen und das Programm in altbewährter c++.de-Manier so richtig auseinandernehmen, so dass wir ein richtig nettes Fundament haben, auf dem man dann aufbauen kann.
Vorerst steht der erkenner übrigens unter der GPL, sobald er zu einer Library gemacht worden ist, wird die Lizenz auf LGPL geändert werden. Damit haben sich alle bisher an dem Projekt beteiligten Personen einverstanden erklärt und wenn Ihr Beiträge zum erkenner macht, dann denkt bitte auch daran.
Ich freue mich schon auf Eure Anregungen!
Happy Zerpflücking!
nman(edit: pinned)
-
Hi,
Verbesserungs-/Änderungsvorschläge:
1. Einheitliche Dateiendungen ( nicht h, hxx, hh und hpp sondern entweder oder...)
(Evtl ne Strukturierung des Sourceverzeichnisses wenn es viele Files geben wird)2. Zeiger Attribute von Klassen in Smartpointer packen (zur Sicherheit)
3. Verwendung des Pimpl Idioms => Bessere Lesbarkeit von Header Files (Man sieht nur das was man benutzten darf/soll)MfG evilissimo
-
Punkt 1 hab ich mal gleich behoben; das geht ja sed-sei-Dank recht flott, die anderen Sachen schau ich mir im Laufe der Woche an.
-
Habe jetzt auch mal schnell alle nicht benötigten numerics-Sachen rausgenommen, dürfte jetzt etwas übersichtlicher sein.
-
mit den smartpointern kann mans auch übertreiben. ich finde man kann die normalen durchaus stehn lassen, jeder weis ja normalerweise was er tut
-
Ich habe jetzt nochmal die Formatierung ein bisschen aufräumen lassen und ein dist-Target zum Makefile hinzugefügt.
-
Ich weiß ja nicht ob das nur bei mir so ist, aber wenn ich das programm auf meinem win98 800mhz recher starte reagiert er nur noch langsam oder gar nicht und ein fenster bekomme ich auch nach mehreren minuten nicht angezeigt... Probiere es jetzt mal auf dem anderen pc (win xp 2600mhz)
-
MasterCounter schrieb:
Ich weiß ja nicht ob das nur bei mir so ist, aber wenn ich das programm auf meinem win98 800mhz recher starte reagiert er nur noch langsam oder gar nicht
Dass es derzeit noch nicht vernünftig benutzbar ist, habe ich geschrieben, aber bevor ich das behebe möchte ich eine saubere Codebase.
und ein fenster bekomme ich auch nach mehreren minuten nicht angezeigt...
Naja, könnte das daran liegen, dass das Ding einfach nach stdout ausgibt und Du es aus einer Konsole heraus starten musst?
Wenn Du unter Windows was zum spielen und ausprobieren verwenden möchtest, dann schau Dir bitte Jesters alte Variante an, mit meiner aktuellen wirst Du sonst nicht viel Freude haben.
-
ich habe doch die alte version verwendet...
-
MasterCounter schrieb:
ich habe doch die alte version verwendet...
Auch die braucht ewig zum Starten.
Sollte grundsätzlich aber funktionieren.
-
ich hab mir den code jetzt nicht angeschaut, aber warum? das ist doch eigentlich nicht viel zum starten oder?
-
MasterCounter schrieb:
ich hab mir den code jetzt nicht angeschaut, aber warum? das ist doch eigentlich nicht viel zum starten oder?
Hättest Du wohl besser tun sollen, da ist eine Menge zu Starten.
Die Erkennung lernt im Grunde bei jedem Start sämtliche existierende Samples neu; darum hat sich bis jetzt niemand gekümmert, weil das Programm im wesentlichen in einer Nacht geschrieben wurde und eigentlich nur ein reines Proof-Of-Concept war, das ich jetzt gerne weiterführen würde.Aber wenn Du weitere Fragen hast, könnten wir die vielleicht woanders klären?
Ich hätte hier gerne wirklich Design-Ratschläge und Code-Verbesserungen entgegengenommen, da sind Deine Fragen ein bisschen unpassend...
-
ok, sorry, hat mich halt nur gewundert...
ich werd mir auf alle fälle mal den code anschauen
-
MasterCounter schrieb:
ok, sorry, hat mich halt nur gewundert...
Ist ja kein Problem, ich würde das nur gerne aus diesem Thread hier raushalten, damit der übersichtlich bleibt.
-
Habe jetzt noch ein bisschen aufgeräumt, das Ding kompiliert jetzt auch mit g++-3.4.3 bei "-Wall -pedantic -std=c++98" ohne Warnungen.
-
Hmm, mir ist nicht so klar wie das ganze funktioniert.
Eine kurze Anleitung währe mal ganz nett.
Die Erkennung sieht bei mir irgendwie nach 'random' aus; als ob das Verfahren keinerlei Translations- oder Skalierungsinvarianz besitzt.Klärt mich mal auf.
Gruß
-
grob gesagt: es wird das eingabefeld runtergesampled auf 16x16 pixel. dieses wird dann als 256 bit vektor aufgefasst (schwarz/weis sozusagen). auf diesen wird jetzt die pca angewendet (was im endeffekt v.a. eine dimensionsreduzieurng ist), wie du richtig erkannt hast, ist das verfahren nicht gerade das beste, wenn es um translation oder skalierung geht (ich sag ja: ein neuer extrakter muss her :). dieser minderdimensionale vektor wird jetzt durch einen billigen next-neighbour klassifikator gejagt (oder isses mitlerweile schon ein n-next-neighbour?). thats all Ach ja, die Samples werden halt noch gespeichert, damit man nicht immer bei null anfangen muss!
-
Also für ein wenig mehr invarianz sollte das Bild, genauer gesagt der Buchstabe, vorher normiert werden.
Sehr einfach ist da eine Bounding Box um den Buchstaben zu legen (kleinster x/y-Wert bis größter x/y-Wert) und dann das Rechteck inkl. Inhalt auf die Maße zu skalieren, die auch für die Buchstaben in der Trainingsmenge verwendet wurden.
Das würde evtl. sogar einen kleinen Teil Affininvarianz bringen...Rotationsinvarianz gibt es dann, indem man den Buchstaben vorher noch dreht. (Die Ausrichtung gibts durch die Eigenwerte; oder Momente des äquivalenten Rechtecks).
http://www.c-plusplus.net/forum/viewtopic.php?t=98145Wenn Du einen (k-)NN-Klassifikator mit euklidscher Norm verwendest, kannst Du die Wurzel bei der Berechnung der Distanzen weglassen, da Du nur an dem Minimum interessiert bist.
Ich hoffe das meintest Du mit auseinandernehmen.
Gruß
-
jo in die richtung gehts. am klassifikator wird eh noch derb geschraubt. momentan gehts mehr drum, die schnittstellen (extrakter, klassifikator, etc) ordentlich aufzubauen, um spaeter entsprechend unterschiedliche implementierungen anzudocken. (der aktuelle klassifikator war ne 3 minuten nummer, kein "mit hirn" programmierter)
-
Kyon: Ich habe an unserer in einer Nacht gebastelten Erkennung selbst absolut nichts verändert, ich habe sie nur komplett vom GUI losgelöst.
Mir geht es, wie Korbinian bereits sagte, nur darum, den existierenden Code aufzuräumen, damit wir dann eine fixe Schnittstelle etablieren können.
Und der Klassifikator ist dann das geringste Problem, wenn die Infrastruktur steht, soll der Klassifikator selbst zur Laufzeit austauschbar werden, so dass man ganz einfach neue Klassifikatoren hinzufügen kann, was natürlich verbunden mit ein paar anderen geplanten Features auch das Testen extrem vereinfachen wird.
-
etwa so soll das ganze dann ausschaun: www.korbinian-riedhammer.de/docs/schrifterkennung-uml.png