2015-02-25 10 views
14

Ich las das Papier: Ferrari et al. im Abschnitt "Affinity Measures". Ich habe verstanden, dass Ferrari et al. indem versucht Affinität zu erhalten:Schnittpunkt-über-Verbindung zwischen zwei Erfassungen

  1. Location Affinität - unter Verwendung von Kreuzungsbereich-over-Verbindung zwischen zwei Detektionen
  2. Aussehen Affinität - unter Verwendung der euklidischen Abstände zwischen Histogrammen
  3. KLT Punkt Affinitätsmess

Allerdings habe ich 2 Hauptprobleme:

  1. Ich kann nicht verstehen, was eigentlich int gemeint ist ersection-over-union zwischen 2 Erkennungen und wie man es berechnet
  2. Ich versuchte ein wenig Unterschied Aussehen Affinitätsmaß. Ich transformierte die RGB-Erkennung in HSV..konnte den Farbton und die Sättigung in 1-Vektor und verwendete ihn zum Vergleich mit anderen Erfassungen. Die Verwendung dieser Technik schlug jedoch fehl, da eine Erkennung eines Beutels einen besseren Ähnlichkeitswert aufwies als eine Erkennung desselben Kopfes (mit einer anderen Ausrichtung).

Irgendwelche Vorschläge oder Lösungen zu meinen oben beschriebenen Problemen? Vielen Dank und Ihre Hilfe wird sehr geschätzt.

+0

Dies ist keine Frage Matlab. Bitte entfernen Sie das "Matlab" -Tag. – Ratbert

+0

Können Sie bitte weitere relevante Tags vorschlagen? – Sambas23

+0

Siehe auch: [Calcualte IoU für AABBs] (http://Stackoverflow.com/a/42874377/562769) –

Antwort

20

1) Sie haben zwei überlappende Begrenzungsrahmen. Sie berechnen den Schnittpunkt der Boxen, der Bereich der Überlappung. Sie berechnen die Vereinigung der überlappenden Kästchen, die die Summe der Bereiche der gesamten Kästchen minus der Fläche der Überlappung darstellt. Dann teilst du die Kreuzung durch die Vereinigung. Dafür gibt es in der Computer Vision System Toolbox eine Funktion namens bboxOverlapRatio.

2) Im Allgemeinen möchten Sie die Farbkanäle nicht verketten. Was Sie wollen stattdessen ein 3D-Histogramm ist, wo die Abmessungen sind H, S und V.

+0

Vielen Dank Dima. Ihre Hilfe ist sehr zu schätzen. Ich wünsche mir, dass ich Ihnen Ihre Antworten auffrischen kann. Also für Frage 2). Wenn ich Sie richtig verstanden habe, werde ich ein 3D-Histogramm erstellen und dann den Unterschied zwischen zwei 3D-Histogrammen finden, um die Ähnlichkeit zu überprüfen. Sollte das tatsächlich von der Tatsache abweichen, dass ich sie einfach verkette? Die Werte sollten gleich sein, nein? Danke – Sambas23

20

Try Kreuzung über Union

Überschneidung über Union ist eine Bewertungsmetrik verwendet, um die Genauigkeit eines Objektdetektors messen auf ein bestimmter Datensatz

formal, um Überschneidung über Union anzuwenden, um einen (beliebigen) Objektdetektor zu bewerten wir brauchen:

  1. Die Grund Wahrheit Begrenzungskästen (dh die Hand etikettierte Kisten aus dem Testsatz begrenzt, dass geben Sie an, wo im Bild unser Objekt ist).
  2. Die vorhergesagten Begrenzungsboxen aus unserem Modell.

Im Folgenden werde ich ein visuelles Beispiel einer Grund Wahrheit Begrenzungsbox im Vergleich zu einem vorhergesagten Zeichen-Box enthalten sind:

enter image description here

Die vorhergesagte Begrenzungsbox in rot gezogen wird, während der Boden-Wahrheit (dh , handbeschriftet) ist der Begrenzungsrahmen grün gezeichnet.

In der Abbildung oben können wir sehen, dass unser Objektdetektor das Vorhandensein eines Stoppzeichens in einem Bild erkannt hat.

Computing Überschneidung über Union kann daher über ermittelt werden:

enter image description here

Solange wir diese beiden Sätze von Begrenzungskästen haben, können wir Überschneidung über Union. Hier

ist der Python-Code

# import the necessary packages 
from collections import namedtuple 
import numpy as np 
import cv2 

# define the `Detection` object 
Detection = namedtuple("Detection", ["image_path", "gt", "pred"]) 

def bb_intersection_over_union(boxA, boxB): 
    # determine the (x, y)-coordinates of the intersection rectangle 
    xA = max(boxA[0], boxB[0]) 
    yA = max(boxA[1], boxB[1]) 
    xB = min(boxA[2], boxB[2]) 
    yB = min(boxA[3], boxB[3]) 

    # compute the area of intersection rectangle 
    interArea = (xB - xA) * (yB - yA) 

    # compute the area of both the prediction and ground-truth 
    # rectangles 
    boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1]) 
    boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1]) 

    # compute the intersection over union by taking the intersection 
    # area and dividing it by the sum of prediction + ground-truth 
    # areas - the interesection area 
    iou = interArea/float(boxAArea + boxBArea - interArea) 

    # return the intersection over union value 
    return iou 

Die gt und pred sind

  1. gt: Das Ground-Truth-Box begrenzen.
  2. pred: Die vorhergesagte Begrenzungsbox aus unserem Modell.

Für weitere Informationen können Sie auf this post

+6

Dieser Code bricht (gibt negative Werte zurück) für nicht überlappende Rechtecke. –

+1

Für Boxen (0,0,10,10) und (1,1,11,11) ergibt dies falsche Ergebnisse; der Schnittbereich ist 100 statt 81. –

+0

@AleksandarJovanovic, danke, es ist weil der ursprüngliche Code 1 hinzugefügt, um den Bereich zu berechnen. Ist es gerade jetzt? –