Handschrifterkennung
-
Ich glaub ich baue auch gleich was ein damit eingegebene Buchstaben aus einer temporären Datei ausgelesen werden, das hätte den Vorteil dass das Testen vereinfacht wäre und die Erkennung selbst zu einem komplett von der GUI unabhängigen Standard-C++ Programm ohne plattformspezifischen Code gemacht werden könnte.
-
Uh, irgendwie hat sich das jetzt ein wenig verselbständigt was ich begonnen habe...
Nur so eine Überlegung meinerseits noch:
Ich will hier wirklich niemandem ans Bein pinkeln, aber eigentlich fand ich das alte Sample-Format gar nicht so schlecht, Klartext ist viel besser wartbar usw. und meines Erachtens wäre es schöner wenn wir die Kompression einem externem Programm/ irgendeiner Library überlassen würden.
Fändet Ihr es sehr schlimm wenn ich dahingehend was unternehmen würde? (Die Frage geht vor allem an Korbinian der das aktuelle Format implementiert hat und Jester dessen "Baby" das Projekt ja im Grunde ist.)edit: Zu später Stunde wiederhole ich mich...
-
nman schrieb:
...und die Erkennung selbst zu einem komplett von der GUI unabhängigen Standard-C++ Programm ohne plattformspezifischen Code gemacht werden könnte.
Hab ich jetzt mal gemacht - die Erkennung kompiliert jetzt mit ein paar Warnungen unter GNU/ Linux. (gcc 3.3.3)
Ich verpass dem Ding dann demnächst noch ein CLI damit mans auch vernünftig testen kann; heute bin ich ehrlich gesagt schon zu müde um da noch großartig was dran zu machen...
-
Schöne Sache.
Wie wär's mit zwei verschiedenen Reader für die beiden Formate? Dann könnte man beides lesen. Ich sehe für beides gewisse Vorteile.
-
Ich werde jetzt mal nur Korbinians Variante drinlassen und hoffe dass ich am Wochenende noch ein bisschen Zeit habe um ein Mini-CLI fertigzustellen, bzip2-Kompression oä kann man später ja immer noch einbauen...
-
nman schrieb:
Korbinian: Könntest Du vielleicht auch Binaries hochladen?
Ich habe kein Windows und kein Visual Studio um den aktuellen Stand der Dinge anzusehen...
(Aber mit Binaries könnte ich probieren ob das Ding vielleicht mit Wine läuft. )Hallo Korbinian,
ich würde wärmstens empfehlen, die Abhängigkeiten von VC in deinem Code zu eleminieren. Ich habe nach 5 min immer noch nicht gefunden, wo dein Erkennungscode überhaupt versteckt ist. Ausserdem wäre es schön, den aktuellen Stand bzw. die TODO in einer Übersicht zu haben, damit man gleich sieht, was funktionieren sollte und was nicht.
Ok, genug gekritelt, bin gespannt, wie's weiter geht!mfg, CC
-
_CC_: Ich habe die Kernfunktionalität bereits in ein VC++-unabhängiges Standard-C++-Programm gepackt, allerdings habe ich derzeit keine Zeit ein vernünftiges CLI dafür zu basteln ohne das das Hochladen wohl absolut keinen Sinn macht...
-
nman schrieb:
_CC_: Ich habe die Kernfunktionalität bereits in ein VC++-unabhängiges Standard-C++-Programm gepackt, allerdings habe ich derzeit keine Zeit ein vernünftiges CLI dafür zu basteln ohne das das Hochladen wohl absolut keinen Sinn macht...
Naja, eigentlich ist das Herzstueck - zumindest fuer mich - das interessanteste. Alles andere ist doch Quark. Also vielleicht doch mal was hochladen, bzw. ein paar Details zum Algorithmus posten.
thx, CC
-
Man kann es aber derzeit noch nicht verwenden und im Grunde ist mein Code ja nur alter Wein in neuen Schläuchen; hab ein wenig Geduld, ich gehe davon aus dass ich bis Anfang nächster Woche Zeit haben sollte, auch ein CLI zu bauen.
Bis dahin musst Du Dich halt durch den alten Code durchbeißen der größtenteils aber auch nicht soo schwer zu verstehen ist.
-
Das Herzstück ist vollkommen unabhängig vom VC.
Du findest es in den beiden KlassenClassifier und PCA.
MfG Jester
-
Ich kann versuchen, kurz zu beschreiben, wie das ganz funktioniert.
Dazu muß ich zunächst mal ein kleines bißchen ausholen.
Wir haben einen Raum und dadrin lauter Punkte (jeder Buchstabe wird durch einen Punkt repräsentiert). Dieser Raum hat ziemlich viele Dimensionen. Die Buchstaben hängen da sozusagen als Wolke in diesem Raum drin. Leider kann man zu Beginn keine besonders einfach Struktur erkennen, nach denen sich bestimmte Buchstaben erkennen lassen. Deshalb suchen wir uns jetzt eine neue Basis. Dazu bestimmen wir die Richtungen, in der die Datenwolke die größte Ausdehnungen hat. Diese Richtungen nehmen wir als neue Basis (Richtungen mit zu kleiner Ausdehnung lassen wir ganz weg => Reduktion der Datenmenge). Dadurch erhalten wir eine Beschreibung der Buchstaben in einem wesentlich aussagekräftigeren Raum.
Da wir allerdings nicht nur lineare Zusammenhänge erkennen wollen (alle Punkte, die ein 'a' repräsentieren liegen in einer Ebene), sondern auch Kreise oder andere Formen erkennen wollen müssen wir zunächst mal die sogenannte Kernmatrix aufstellen. Diese erlaubt dann auch polynomiale Kurven als Ausdehnungsrichtung zu erkennen.
Das geschieht alles in der Klasse PCA.
Zunächst passiert das extrahieren der Krümmungen mit der Kernmatrix. Dazu wird der Kern benutzt, der im Prinzip nichts anderes als ein Skalarprodukt ist.
Danach passiert der Schritt mit dem Zerlegen in wichtige und unwichtige Richtungen.Dann ist die PCA fertig und wir haben jetzt für jeden Buchstaben einen Punkt im (ich glaub nach Reduktion 52-dim.) Raum gefunden. Ähnliche Buchstaben sollten sich dadurch jetzt nah beieinander befinden.
Diese Daten gehen jetzt an den Klassifikator, der merkt sich all diese Punkte und was sie repräsentieren. Kommt ein Anfragepunkt, so wird dieser einfach in diesen Raum projiziert (PCA hat Methode project oder so ähnlich). Anschließend schaut der Klassifikator nach, was die in der Nähe liegenden bereits gespeicherten Punkte repräsentieren und fällt anhand dessen eine Entscheidung.
Gerade der Klassifikator ist noch stark verbesserungswürdig. Ich habe inzwischen einen wesentlich besseren geschrieben (allerdings nicht speziell für dieses Projekt). Nur leider fehlt mir im Moment die Zeit den zu integrieren, da ich demnächst eine Klausur schreibe.
Ich hoffe, es ist etwas klarer geworden, was da passiert.
Wenn Du genauere Infos brauchst: http://www.c-plusplus.net/forum/viewtopic.php?t=77566Da hab ich ein paar Links zu meinem Vortrag darüber gepostet.
MfG Jester
-
Hallo,
Ich wollte Euch nur wissen lassen dass ich heute wieder begonnen habe, am Projekt zu arbeiten, allerdings hänge ich gerade ein wenig fest; wer mir beim Debuggen helfen möchte ist hiermit recht herzlich eingeladen, mir zu helfen! :-|
-
Ich hab seit heute wieder Netzzugang, werd mich demnächst wohl wieder einklinken. Brauch nur noch ein paar Tage pause.
Wo liegt denn aktuell das Problem?
MfG Jester
-
Hm, schwer zu sagen.
Ich habe ein ultraprimitives CLI gebastelt das meine etwas aufgeräumteren Klassen verwendet, aber aus irgendeinem Grund erkennt das seit meinem ersten Test mit zwei möglichen Tokens jede Probe als das letztgelernte Sample.
Ich habe leider momentan nicht die Zeit mich dem Problem fulltime zu widmen, das macht alles noch ein bisschen komplizierter, aber irgendwie würde ich das dennoch gerne lösen weil damit das Schreiben einer portablen GUI für die Schrifterkennung schonmal wesentlich einfacher wäre...edit: Ich habe momentan leider keine Möglichkeit die Sourcen irgendwo hochzuladen, wenn Dich irgendwas bestimmtes interessiert/ Du Ideen hast, dann sags mir und ich mail Dir die Sourcen...
-
edit: Mist, geirrt.
edit2: Hm, irgendwie komme ich einfach nicht mehr weiter, ich glaube ich lasse es gut sein für heute; mal schaun, vielleicht komme ich ja morgen weiter...
-
Nachdem ich jetzt wieder zuhause bin und etwas Freizeit habe, versuche ich gerade wieder, meine Version zum Laufen zu bringen - Erfolg habe ich dabei allerdings keinen.
Hätte eventuell einer der Projekt-Insider mal etwas Zeit um sich mit mir im IRC oder ICQ zu unterhalten? Dann würde ich Euch das Problem genau beschreiben und natürlich die Sourcen schicken, vielleicht kommen wir ja gemeinsam auf einen grünen Zweig.
-
welche version und welches os/compiler hast du?
-
Ich hab eine eigene Version gebaut, die plattformunabhängig laufen sollte. (Nur Standard-C++; habs vom GUI getrennt.)
Ich entwickle unter GNU/ Linux daran weiter, mit der GCC 3.3.3.
-
Hallo!
Jo, würd's mir gern mal anschauen. Kannst Du's mir einfach mal zuschicken? Ich würd's dann einfach zu dem Rest online stellen, wenn Du nichts dagegen hast.
Meine ICQ-Nummer schick ich Dir per Mail, dann können wir uns gern mal unterhalten, fahre nur leider übermorgen für 10 Tage weg.
MfG Jester
-
Ok, Mail an Dich ist raus.