universidad registro licencia imagenes imagen contraste aumentar adquisicion computer-vision matlab-cvst

computer-vision - registro - matlab universidad



Intersección sobre unión entre dos detecciones (3)

1) Tiene dos cuadros delimitadores superpuestos. Se calcula la intersección de los cuadros, que es el área de la superposición. Se calcula la unión de los cuadros superpuestos, que es la suma de las áreas de los cuadros completos menos el área de la superposición. Luego se divide la intersección por la unión. Hay una función para eso en la Caja de herramientas del sistema de visión computarizada llamada bboxOverlapRatio .

2) Generalmente, no desea concatenar los canales de color. Lo que quieres en cambio, es un histograma 3D, donde las dimensiones son H, S y V.

Estaba leyendo el artículo: Ferrari et al. en la sección "Medidas de afinidad". Entendí que Ferrari et al. Intenta obtener afinidad por:

  1. Afinidad de ubicación: uso del área de intersección sobre unión entre dos detecciones
  2. Afinidad de aparición: uso de distancias euclidianas entre histogramas
  3. Medida de afinidad del punto KLT

Sin embargo, tengo 2 problemas principales:

  1. No puedo entender lo que realmente significa intersección sobre unión entre 2 detecciones y cómo calcularlo
  2. Probé una medida de afinidad de apariencia ligeramente diferente. Transformé la detección de RGB en HSV ... concatenando el tono y la saturación en 1 vector, y lo usé para comparar con otras detecciones. Sin embargo, el uso de esta técnica falló porque la detección de una bolsa tenía una mejor puntuación de similitud que la detección de la cabeza de la misma persona (con una orientación diferente).

¿Alguna sugerencia o solución a mis problemas descritos anteriormente? Gracias y su ayuda es muy apreciada.


Intenta la intersección sobre Union

Intersection over Union es una métrica de evaluación que se utiliza para medir la precisión de un detector de objetos en un conjunto de datos en particular.

Más formalmente, para aplicar Intersection over Union para evaluar un detector de objetos (arbitrario) necesitamos:

  1. Los cuadros delimitadores de la verdad fundamental (es decir, los cuadros delimitadores etiquetados a mano del conjunto de prueba que especifican en qué parte de la imagen se encuentra nuestro objeto).
  2. Las cajas delimitadoras previstas de nuestro modelo.

A continuación, he incluido un ejemplo visual de un cuadro delimitador de la verdad fundamental frente a un cuadro delimitador predicho:

El cuadro delimitador predicho se dibuja en rojo, mientras que el cuadro delimitador de la verdad del terreno (es decir, etiquetado a mano) se dibuja en verde.

En la figura anterior podemos ver que nuestro detector de objetos ha detectado la presencia de una señal de stop en una imagen.

Por lo tanto, la Intersección computacional sobre la Unión se puede determinar a través de:

Mientras tengamos estos dos conjuntos de cuadros delimitadores, podemos aplicar Intersection over Union.

Aquí está el código de 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

El gt y el pred son

  1. gt : El cuadro delimitador de la verdad del suelo.
  2. pred : el cuadro delimitador previsto de nuestro modelo.

Para más información, puedes hacer clic en esta publicación.


La respuesta actual ya explicó la pregunta claramente. Así que aquí proporciono una versión un poco mejor de IoU con Python que no se rompe cuando no se intersecan dos cuadros delimitadores.

import numpy as np def IoU(box1: np.ndarray, box2: np.ndarray): """ calculate intersection over union cover percent :param box1: box1 with shape (N,4) or (N,2,2) or (2,2) or (4,). first shape is preferred :param box2: box2 with shape (N,4) or (N,2,2) or (2,2) or (4,). first shape is preferred :return: IoU ratio if intersect, else 0 """ # first unify all boxes to shape (N,4) if box1.shape[-1] == 2 or len(box1.shape) == 1: box1 = box1.reshape(1, 4) if len(box1.shape) <= 2 else box1.reshape(box1.shape[0], 4) if box2.shape[-1] == 2 or len(box2.shape) == 1: box2 = box2.reshape(1, 4) if len(box2.shape) <= 2 else box2.reshape(box2.shape[0], 4) point_num = max(box1.shape[0], box2.shape[0]) b1p1, b1p2, b2p1, b2p2 = box1[:, :2], box1[:, 2:], box2[:, :2], box2[:, 2:] # mask that eliminates non-intersecting matrices base_mat = np.ones(shape=(point_num,)) base_mat *= np.all(np.greater(b1p2 - b2p1, 0), axis=1) base_mat *= np.all(np.greater(b2p2 - b1p1, 0), axis=1) # I area intersect_area = np.prod(np.minimum(b2p2, b1p2) - np.maximum(b1p1, b2p1), axis=1) # U area union_area = np.prod(b1p2 - b1p1, axis=1) + np.prod(b2p2 - b2p1, axis=1) - intersect_area # IoU intersect_ratio = intersect_area / union_area return base_mat * intersect_ratio