Подтвердить что ты не робот

Пересечение между двумя обнаружениями

Я читал в газете: Ferrari и др. в разделе "Размеры близости". Я понял, что Ferrari et al. пытается получить сродство:

  • Аффинность местоположения - использование области пересечения над соединением между двумя обнаружениями
  • Сходство внешнего вида - с использованием евклидовых расстояний между гистограммами
  • Мера аффинности точки KLT

Однако у меня есть две основные проблемы:

  • Я не могу понять, что на самом деле означает перекрест-соединение между двумя обнаружением и как его вычислять.
  • Я попробовал незначительную разницу в отношении близости. Я преобразовал RGB-детектирование в HSV.. конкатенацию оттенка и насыщенности в 1 вектор и использовал его для сравнения с другими обнаружениями. Однако использование этого метода не удавалось, поскольку обнаружение сумки имело более высокий показатель подобия, чем обнаружение той же головы человека (с другой ориентацией).

Любые предложения или решения моих проблем, описанные выше? Спасибо, и ваша помощь очень ценится.

4b9b3361

Ответ 1

1) У вас есть два перекрывающих ограничивающих поля. Вы вычисляете пересечение ящиков, которое является областью перекрытия. Вы вычисляете объединение перекрывающихся ящиков, которое представляет собой сумму площадей всех полей за вычетом области перекрытия. Затем вы разделите пересечение на союз. Для этого в System Vision System Toolbox есть функция, называемая bboxOverlapRatio.

2) Как правило, вы не хотите конкатенировать цветовые каналы. Вместо этого вы хотите использовать трехмерную гистограмму, где размеры H, S и V.

Ответ 2

Попробуйте пересечение над Union

Пересечение над соединением - это оценочная метрика, используемая для измерения точности детектора объекта на конкретном наборе данных.

Более формально для того, чтобы применить пересечение над Союзом для оценки (произвольного) детектора объекта, нам нужно:

  • Ограничительные поля с наземной истиной (т.е. рука, помеченная ограничивающими прямоугольниками из набора тестов, указывающая, где на изображении находится наш объект).
  • Предсказываемые ограничивающие рамки из нашей модели.

Ниже я привел наглядный пример ограничивающего прямоугольника для истины и предсказанного ограничивающего прямоугольника:

введите описание изображения здесь

Предсказанная ограничивающая рамка рисуется красным цветом, в то время как ограничивающая рамка с наземной истиной (то есть с ручной маркировкой) рисуется зеленым цветом.

На рисунке выше мы видим, что наш детектор объектов обнаружил наличие знака остановки в изображении.

Вычисление пересечения над Союзом может поэтому определяться с помощью:

введите описание изображения здесь

Пока у нас есть эти два набора ограничивающих прямоугольников, мы можем применить пересечение над Союзом.

Вот код 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

gt и pred являются

  • gt: Ограничительная коробка с заземлением.
  • pred: предсказанная ограничивающая рамка из нашей модели.

Для получения дополнительной информации вы можете нажать этот пост

Ответ 3

Могу ли я использовать IoU с границами, а не с полями?

Ответ 4

Нынешний ответ уже четко объяснил вопрос. Так что здесь я предоставляю немного лучшую версию IoU с Python, которая не ломается, когда два ограничивающих прямоугольника не пересекаются.

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