2016-07-20 15 views
-1

Ich implementiere eine content-based image retrieval Anwendung, die das Modell Bag of Features beinhaltet. Ich verwende cv::SIFT als Feature-Detektor.Wird die Anzahl der erkannten Features in SIFT erhöht, um die Präzision zu erhöhen?

Wie auch immer, die Anwendungsleistung ist nicht großartig und ich versuche, sie vom Algorithmus des ersten Schrittes zu verbessern, der Merkmale entdeckt.

Lesen cv::SIFT::create() documentation Ich habe drei Parameter zu sehen, die meine Aufmerksamkeit erregt:

  • nFunktionen - Die Anzahl der besten Eigenschaften zu behalten. Die Merkmale werden nach ihren Werten eingestuft (gemessen im SIFT-Algorithmus als lokaler Kontrast).
  • contrastThreshold - Die Kontrastschwelle, die verwendet wird, um schwache Merkmale in semi-einheitlichen (kontrastarmen) Regionen herauszufiltern. Je größer der Schwellenwert ist, desto weniger Merkmale werden vom Detektor erzeugt.
  • edgeThreshold - Der Schwellenwert zum Herausfiltern kantenähnlicher Features. Beachten Sie, dass sich seine Bedeutung von der contrastThreshold unterscheidet, d. H. Je größer der edgeThreshold-Wert, desto weniger Features werden herausgefiltert (mehr Features bleiben erhalten). Diese

bedeutet, dass der erste und der dritte Parameter nimmt zu, während die zweite abnimmt, sollte der Algorithmus Genauigkeit verbessern (mit geringerer Zeitleistungen)?

Ich frage mich, vor allem für die ersten Parameter, wo zum Beispiel, wenn wir nfeatures=2000 setzen, wird es genau 2000 Funktionen erkennen, egal ob sie "interessant" sind oder nicht. Das bedeutet, dass es "uninteressante" (so schlechte) Schlüsselpunkte entdecken wird?

Antwort

2

Ich habe SIFT algo in Python verwendet und habe irgendwann darüber nachgedacht, um die Genauigkeit zu verbessern. Hier sind einige der Punkte, die ich so weit sammeln konnte, wie ich mich erinnern kann:

  1. Die Anzahl der "interessanten" Features wird immer von dem Objekt abhängen, das Sie verwenden, um zu erkennen. Wenn das Objekt sehr zufällige Kanten hat, sind die erkannten Schlüsselpunkte mehr. Wenn das Bild einfacher ist (d. h. beispielsweise nur eine bestimmte Farbe aufweist und eine sehr ausgeprägte Umrandung aufweist), werden die erkannten Schlüsselpunkte sehr viel kleiner sein. Wenn Sie in diesem Fall das Attribut "nfeatures" erhöhen, besteht eine hohe Wahrscheinlichkeit, dass falsche Punkte erkannt werden und Sie schlechte Ergebnisse erhalten.
  2. unter der Annahme, dass Sie sehr gute Objekt Bild und Sie erhalten die "2000" Schlüsselpunkte, die Sie suchen, wird die Änderung der anderen Attribute erheblich die Funktionen beeinflussen, da die Attribute hauptsächlich für die Lokalisierung von Schlüsselpunkten verwendet werden. Sie müssen mit den Parametern für die Feineinstellung spielen, aber auch diese können von Objekt zu Objekt variieren.

sich nach den offiziellen Dokumenten können http://docs.opencv.org/3.1.0/da/df5/tutorial_py_sift_intro.html#gsc.tab=0 Sie sehen, dass es viele erkannt keypoints im Bild sind.so um die mehr „interessant“ keypoints findout, Parameter

Auch ein weiterer Link zu experimentiert, die finde ich sehr hilfreich, wenn Sie für mathematische Details suchen ist: http://www.inf.fu-berlin.de/lehre/SS09/CV/uebungen/uebung09/SIFT.pdf?bcsi_scan_ee7e30f120188340=0&bcsi_scan_filename=SIFT.pdf

Dies Sie sehen die Ergebnisse helfen können wie Sie die Parameter ändern und es in MATLAB: http://www.vlfeat.org/overview/sift.html Ich hoffe, Sie finden dies nützlich für Ihr Vorhaben.

+0

Danke für Ihre nützliche Antwort. Ich kenne VLFeat, es hat auch eine C-API, ist leider auf der C-Seite nicht so gut dokumentiert. – justHelloWorld

+0

Auf jeden Fall hat Ihre Antwort meine Verdächtigen bestätigt: Die Erhöhung der Anzahl von 'nFeatures' kann zu Fehlalarmen (und so schlechten Ergebnissen) führen. Ich denke, dass ASIFT eine genauere Lösung sein könnte. Wir werden sehen. – justHelloWorld

+0

Sie sind willkommen. :) Ich habe ASIFT nicht benutzt, bin mir also nicht sicher. – Saurav