NPTricky / img-classification-ss13

Image Classification Student Project in Summer Semester 2013 @ OVGU
1 stars 1 forks source link

K-Means Algorithmus und Klassifizierung #8

Open HyDr0x opened 11 years ago

HyDr0x commented 11 years ago

Hi, mir ist grad noch ne coole Klasse in OpenCV aufgefallen, die mir einfach nen extra Issue Wert war. Die Klasse heißt "BOWTrainer" also BagOfVisualWordsTrainer. Das ist ne Basisklasse für nen Trainer und Klassifizierer für Bag of Visual Words. "BOWKMeansTrainer" erbt davon und ihm gibt man die aus Sift oder woher auch immer berechneten Deskriptoren seiner Trainingsbilder und bekommt dann das Vocabulary. Danach muss man nur noch der Klasse "BOWImgDescriptorExtractor" das Vocabulary übergeben und kann dann einzelne Bilder hinschicken. Für die wird dann die Zuordnung der einzelnen Keypoints des Bildes zu den einzelnen Cluster-Zentren vom Vocabulary berechnet und zurückgegeben. Daraus kann man dann relativ easy sein Histogramm basteln und ist fertig.

Hier nochmal der Link zur Klasse: http://docs.opencv.org/modules/features2d/doc/object_categorization.html?highlight=kmeans#BOWKMeansTrainer

BOW Anwendung: http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

BOW paper: http://217.109.185.161/layout/set/print/content/download/20785/148346/file/2004_010.pdf

NPTricky commented 11 years ago

Klingt nach einem Plan, mehr Zeit für andere Sachen. Hab 'mal kurz gegoogled und noch ein wenig Beispiel & Diskussion zum Thema gefunden. http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

HyDr0x commented 11 years ago

So ich hab jetzt mal nen kleinen Rundumschlag gemacht.

  1. Es gibt ne Klasse die nennt sich "ImageDataBase". Da kommen einfach die ganzen Bilder rein die vom TreeWidget eingelesen werden. Im Moment funtzt das nur für einzelne Bilder. Die andere Funktion bei der man nen ganzes Directory einlesen kann könntest du dann noch implementieren, da kenn ich mich atm mit dem QT Zeugs zu wenig aus. Die Klasse speichert die Bilder nich nur, sondern merkt sich auch deren Klasse. Daher übernimmt sie für einem auch gleich das randomisierte sortieren der Bilder nach trainigs- und klassifizier-Bildern. Sprich man muss nur noch z.B. die Funktion "getTrainingImages" aufrufen und das Ding gibt einem zur gegebenen Klasse 50% random die Bilder zurück und bei "getClassifyImages" die restlichen 50% zum klassifizieren. Zudem gibts auch ne Liste aller vorhandenen Klassennamen damit man einfach durchiterieren kann. Das alles als Slots. Ich denke das is ne gute Basis um da jetzt schnell was zu haben.
  2. Der Computation Manager arbeitet jetzt mit den neuen BOW Funktionen. @ Sarah ich hab deinen Computation Manager behalten, leider war das jetzt alles nen bissl hektisch aufgrund der wenigen Zeit die uns noch bleibt und wahrscheinlich haste das Issue hier nit mitbekommen. Wahrscheinlich brauchen wir die expliziten SIFT, SURF und MSER Sachen nimmer da das jetzt alles schon von den BOW Klassen mit erledigt wird und uns so einiges an Arbeit spart. Bis jetzt funtzt schonmal das Erstellen der Vocabularies und das Erstellen der Histogramme. Daher müsste man jetzt eigentlich nur noch die Histogramme auswerten und dann sagen zu welcher Klasse das Bild gehört und den entsprechenden Klassennamen zurückgeben. Zusätzlich kann dann direkt an der Stelle nachgeschaut werden ob die gefundene Klasse mit der eigentlichen Klasse des Bildes übereinstimmt und die Auswertung gemacht werden. Dürfte nich mehr allzuviel Arbeit bereiten.
  3. Da sich durch das BOW Konzept jetzt endlich ein konkreter Workflor herauskristalisiert hat, war ich auch mal so frei die Toolbox entsprechend anzupassen. Ich glaub auch das es keinen Sinn macht mit zwei verschiedenen Klassifizierern zu Trainieren und zu klassifizieren deswegen hab ich da mal eine Combobox rausgehaun etc. Könnte man wahrscheinlich noch hübscher machen, sprich man wählt ganz am Anfang den Algo aus, also SIFT, SURF oder MSER und hat dann nur noch die Buttons "Train", "Klassifiziere" hat. Bei Analyze hab ich mal die Visualisierunggeschichten reingedrückt, bisher noch ohne Funktion. Das gilt es jetzt noch umzusetzen.

Was jetzt im groben noch fehlt:

  1. Directories einladen, möglicherweise direkt über den TreeView und nicht nur über den Ordner öffnen Dialog.
  2. Den Visualizer damit verbinden
  3. Den ComputationManagerBOW finishen, sprich die Klassifizierung einbaun und das Testen.
  4. MSER einbaun, im Moment klappts wenn überhaupt nur mit SIFT und SURF, MSER is hiern bissl spezieller.
  5. Den ComputationManagerBOW mit der Toolbox-GUI verbinden.

Das Testen hat meiner Meinung noch etwas Zeit. Der Visualizer auch denke ich. Nach der Präsi am Mittwoch bleiben uns noch 2 Wochen um das alles hier ordentlich zu finishen/überarbeiten und richtig zum laufen zu bringen und um die Abschlusspräsi zu machen. Also sorry für meinen Alleingang hier, aber bis Mittwoch sollte der Klassifizierungsprozess halt schon laufen und im Moment haben wir nur ein paar Puzzleteile gehabt.

NPTricky commented 11 years ago

ToDo's