2015-02-25 16 views
14

Stavo leggendo il documento: Ferrari et al. nella sezione "Misure di affinità". Ho capito che Ferrari et al. cerca di ottenere l'affinità da:Intersection-over-union tra due rilevamenti

  1. Località affinità - con zona di intersezione-over-unione tra due rilevazioni
  2. Aspetto affinità - con distanze euclidee tra istogrammi
  3. KLT misura punto affinità

Tuttavia, ho 2 problemi principali:

  1. Non riesco a capire cosa si intende per int ersection-over-union tra 2 rilevamenti e come calcolarlo
  2. Ho provato una misura di affinità dell'aspetto leggermente diversa. Ho trasformato il rilevamento RGB in HSV ... concatenando la tonalità e la saturazione in 1 vettore, e l'ho usato per confrontarlo con altri rilevamenti. Tuttavia, l'uso di questa tecnica non ha funzionato, in quanto il rilevamento di una borsa presentava un punteggio di somiglianza migliore rispetto a un rilevamento della testa della stessa persona (con un orientamento diverso).

Eventuali suggerimenti o soluzioni ai miei problemi sopra descritti? Grazie e il tuo aiuto è molto apprezzato.

+0

Questa non è una questione Matlab. Rimuovi il tag 'Matlab'. – Ratbert

+0

Puoi suggerire altri tag rilevanti per favore? – Sambas23

+0

Vedi anche: [Calcoledi IoU per AABB] (http://stackoverflow.com/a/42874377/562769) –

risposta

20

1) Sono presenti due riquadri di delimitazione sovrapposti. Calcoli l'intersezione delle caselle, che è l'area della sovrapposizione. Calcoli l'unione delle caselle sovrapposte, che è la somma delle aree dell'intero riquadro meno l'area della sovrapposizione. Quindi dividi l'intersezione per unione. Esiste una funzione per questo nella casella degli strumenti del sistema di visione artificiale denominata bboxOverlapRatio.

2) In genere, non si desidera concatenare i canali di colore. Ciò che si vuole, invece, è un istogramma 3D, dove le dimensioni sono H, S e V.

+0

Grazie mille Dima. La tua assistenza è molto apprezzata. Spero di poter revocare le tue risposte. Quindi per la domanda 2). se ho capito bene, creerò un istogramma 3D e poi troverò la differenza tra due istogrammi 3D per verificare la somiglianza. Questo dovrebbe differire dal fatto che li ho semplicemente concatenati? I valori dovrebbero essere gli stessi no? Grazie – Sambas23

20

Prova intersezione sopra Unione

Intersezione su Union è una metrica di valutazione utilizzato per misurare la precisione di un rilevatore di oggetto un set di dati particolare.

Più formalmente, al fine di applicare Intersezione sopra Unione per valutare un (arbitrario) rilevatore oggetto abbiamo bisogno:

  1. La terra-verità di delimitazione scatole (vale a dire, la mano etichettato delimitazione scatole dal set di test che specificare dove nell'immagine si trova il nostro oggetto).
  2. Le caselle di delimitazione previste dal nostro modello.

Sotto ho incluso un esempio visivo di una terra-verità rettangolo di selezione rispetto a un rettangolo di selezione previsto:

enter image description here

Il predetto rettangolo di selezione è disegnato in rosso, mentre la terra-verità (cioè , etichettato a mano) il riquadro di delimitazione è disegnato in verde.

Nella figura sopra possiamo vedere che il nostro rilevatore di oggetti ha rilevato la presenza di un segnale di stop in un'immagine.

Computing Intersezione sopra Unione può quindi essere determinata mediante:

enter image description here

Finché abbiamo questi due insiemi di delimitazione scatole possiamo applicare Intersezione sopra dell'Unione.

Ecco il codice Python

# 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 

Il gt e pred sono

  1. gt: Il terreno verità rettangolo di selezione.
  2. pred: il bounding box previsto dal nostro modello.

Per ulteriori informazioni, è possibile fare clic this post

+6

questo codice interrompe (restituisce valori negativi) per rettangoli non sovrapposti. –

+1

Per le caselle (0,0,10,10) e (1,1,11,11) ciò fornisce risultati errati; l'area di intersezione è 100 anziché 81. –

+0

@AleksandarJovanovic, grazie, è perché il codice originale è stato aggiunto 1 per calcolare l'area. È in questo momento? –