5

Die Codierung, auf die ich mich konzentriere, ist die Kodierung von Fishern, da ich gezeigt habe, dass sie die besten Ergebnisse mit meiner Arbeit erzielt. Ich möchte also die Kodierung von Fisher auf meinen extrahierten (SIFT) Features testen und die Leistung des Systems mit oder ohne Kodierung testen.Die Codierung der extrahierten Funktionen verstehen

Statt frischen Start fand ich, dass vl_feat eine in der Bibliothek für Fischer Codierung gebaut hat, und sie haben ein Tutorial für das auch here verknüpft

Nun habe ich bereits getan das meiste, was erforderlich ist, aber was tatsächlich erhalten hat codiert ist verwirrend ich, zum Beispiel des Tutorial macht es deutlich, dass Fischer-Codierung durchgeführt wird, unter Verwendung der von GMM so erhaltenen Parametern wie [means, covariances, priors] und die SIFT extrahierten Merkmale werden verwendet, gemäß der Anleitung in GMM hier zu:

die Die Fisher-Codierung verwendet GMM, um ein visuelles Wörterbuch zu erstellen. Um beispielhaften Aufbau eines GMM, betrachten Sie eine Anzahl von 2-dimensionalen Daten Punkte. In der Praxis wären diese Punkte eine Sammlung von SIFT- oder anderen lokalen Bildmerkmalen. set

numFeatures = 5000 ; 
dimension = 2 ; 
data = rand(dimension,numFeatures) ; 

numClusters = 30 ; 
[means, covariances, priors] = vl_gmm(data, numClusters); 

Dann, wenn ich diesen Schritt durchgeführt haben, ich bin eine andere Daten zu codieren? Das verwirrt mich. Ich habe bereits meine extrahierten SIFT-Funktionen verwendet, um die Parameter für GMM zu generieren.

Als Nächstes erstellen wir einen weiteren zufälligen Satz von Vektoren, die die Fisher-Vektordarstellung verwendet und das GMM nur erhalten codiert werden sollte:

encoding = vl_fisher(datatoBeEncoded, means, covariances, priors); 

Also hier encoded das Endergebnis ist, aber was hat es codiert? Ich möchte, dass meine SIFT-Funktionen, die ich aus meinen Bildern extrahiert habe, codiert werden, aber wenn ich dem Tutorial folge, das in GMM verwendet wird. Wenn das der Fall ist, was ist datatoBeEncoded? Soll ich die SIFT-Talente hier wieder benutzen?

Danke

aktualisieren:

@Shai

Danke, aber ich glaube ich falsch, etwas zu tun sein. Ich verstehe nicht ganz, was Sie mit "Bilder vergleichen mit sich selbst" meinen. Ich habe 4 Klassen, von jeder Klasse 1000 Bilder. So habe ich die ersten 600 Bilder von der Klasse 1 die GMM-Parameter zu erfahren, und dann diese Parameter verwenden, um codieren die Fisher Vektoren

numClusters = 128 ; 
[means, covariances, priors] = vl_gmm(data, numClusters); 

so jede means, covariances sind der Größe 128 x 128 und priors der Größe 1 x 128

nun, wenn ich diese mit dem Fischer-Vektor auf den 400 Bilder codieren, mit der Funktion

encoding = vl_fisher(datatoBeEncoded, means, covariances, priors); 

die Größe der Codierung ist sehr unterschiedlich, etwas in der Größe von 12000 x 1. Diese können nicht mit den generierten Modellen verglichen werden.

Ich hatte bereits ein System, das an der nicht kodierten Version des Datensatzes arbeitete und es funktionierte gut, aber ich wollte sehen, wie Kodierung einen Unterschied machen wird, theoretisch sollten die Ergebnisse verbessert werden.

Ich kann den Code hier bei Bedarf hinzufügen, aber es ist für UBM-GMM und der Grund, warum ich verwirrt bin, ist, weil die Trainingsmethode, die Sie erwähnten, ist, was ich für UBM verwende.

Wenn ich nur die Testbilder kodiere, kann ich sie wegen der Größenabweichung nicht im Klassifikator verwenden.

Vielleicht wähle ich das nicht richtig oder mache einen dummen Fehler, wäre es möglich, ein einfaches Beispiel zu bekommen, durch das ich die Arbeit verstehen kann.

Vielen Dank

Antwort

3

Sie haben zwei Phasen in den Prozess:
(1) Ausbildung, wo Sie einige statistische Eigenschaften Ihrer Domain verwenden lernen, und
(2) Test, wo Sie verwenden die erlernten Repräsentationen/Modelle und wenden sie auf neue Proben an.

Dementsprechend sollten Sie Ihre Daten-Set von Funktionen in zwei „Splits“ eine Spaltung der GVM für die Fisher-Codierung für das Lernen (a Ausbildung Satz), und eine weitere Spaltung der Codierung (a Test Satz) anzuwenden .

Normalerweise sampeln Sie eine signifikante Anzahl von Bildern, die Ihre Interessensgebiete darstellen (wenn Sie beispielsweise an Menschen interessiert sind, sollten Sie viele Bilder von Personen im Innen- und Außenbereich, Nahaufnahmen und Gruppenfotos usw. berücksichtigen) viele SIFT-Deskriptoren, wie Sie können aus diesen Trainingsbildern und nutzen sie, um das Modell zu lernen:

numClusters = 30 ; 
[means, covariances, priors] = vl_gmm(TrainingData, numClusters); 

Wenn Sie dieses Modell haben es zu speichern, dann können Sie es auf neue Fotos gelten sie

zu kodieren
encoding = vl_fisher(TestData, means, covariances, priors); 

Beachten Sie, dass während TrainingData im Allgemeinen sehr groß und kann von Dutzenden (oder sogar Hunderten) von Bildern gesammelt werden, TestData deutlich kleiner sein kann, und sogar Deskriptoren von einem einzigen Bild gesammelt werden.

+0

Vielen Dank für Ihre Antwort. Also, wenn ich 1000 Bilder habe und 600 für Training und den Rest zum Testen verwende, wie vergleiche ich dann die beiden? Ich meine, in diesem Fall wird das Training in Bezug auf die "gmm" -Parameter durchgeführt, während der Test in Form von "fisher vectors" durchgeführt wird, wobei ein Klassifikator verwendet wird, wie werden sie verglichen? Ist das nicht so, als würde man einen Feature-Typ (Training) mit einem anderen Feature-Typ (Test) vergleichen? Tut mir leid, vielleicht verstehe ich deine Erklärung nicht richtig, wenn möglich kannst du bitte ein Beispiel dafür geben, wie das funktionieren würde? Vielen Dank – StuckInPhD

+0

@FarazKhan Sie sollen nicht gegen das Trainingssatz vergleichen - das wäre "Betrug". Sie können 600 Fotos zum Lernen des Modells verwenden und dann die Fischervektoren der 400 Bilder mit sich selbst vergleichen: ähnliche Bilder finden usw. Sie können zum Beispiel ein Bild (von 400) auswählen und nach den 10 Bildern mit dem nächsten suchen Vektor - das ist die Suche nach den 10 ähnlichsten Bildern. – Shai

+0

es war zu viel, um hier zu schreiben, also habe ich meine ursprüngliche Frage aktualisiert, können Sie bitte einen Blick darauf werfen. Vielen Dank – StuckInPhD