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

Сравните два ограничивающих прямоугольника друг с другом Matlab

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

Детали ограничивающего блока сохраняются в этом формате [x,y,width,height]

4b9b3361

Ответ 1

Изменить. Я исправил ошибку, указанную другими пользователями.

Я предполагаю, что вы обнаруживаете какой-то объект, и вы рисуете вокруг него ограничивающий прямоугольник. Это происходит в широко изученной/исследуемой области обнаружения объекта. Лучшим методом оценки точности будет вычисление пересечения по объединению. Это взято из задачи PASCAL VOC, из здесь. См. здесь для визуальных эффектов.

Если у вас есть определение ограничивающей рамки и ограничивающий поле истины, то область перекрытия между ними должна быть больше или равна 50%. Предположим, что ограничивающий квадрат истинности истины gt=[x_g,y_g,width_g,height_g], а предсказанный ограничивающий прямоугольник pr=[x_p,y_p,width_p,height_p], тогда область перекрытия может быть вычислена по формуле:

intersectionArea = rectint(gt,pr); %If you don't have this function then write a simple one for yourself which calculates area of intersection of two rectangles.
unionArea = (width_g*height_g)+(width_p*height_p)-intersectionArea;
overlapArea = intersectionArea/unionArea; %This should be greater than 0.5 to consider it as a valid detection.

Надеюсь, теперь это ясно для вас.

Ответ 2

Вы должны вычислить пересечение и объединение, тогда индекс Jaccard (пересечение/объединение) - это значение от 0 до 1 (1 среднее идеальное совпадение, 0 означает идеальное несоответствие).

Ответ 3

Попробуйте пересечение над 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 + 1) * (yB - yA + 1)

    # compute the area of both the prediction and ground-truth
    # rectangles
    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 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: предсказанная ограничивающая рамка из нашей модели.

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

Ответ 4

Ответ, который был отмечен как лучший ответ выше, неверен.

Решение, предлагаемое @Parag, фактически вычисляет отношение площади пересечения и площади минимального накрывающего прямоугольника. Вместо этого это должно быть область объединения.

Итак, код будет

rect1 = [x1,y1,w1,h1]; 
rect2 = [x2,y2,w2,h2];
intersectionArea = rectint(rect1,rect2);
unionArea = w1*h1 + w2*h2 - intersectionArea;
overlap = intersectionArea/unionArea;

Вы можете проверить этот код, чтобы подтвердить это (этот код выиграл вызов Pascal).

Ответ 5

Все ответы на вопрос предполагают использование метрики пересечения по объединению (IoU). Это векторизованная версия IoU, которая может использоваться для множественного соответствия .

function [IoU, match] = rectIoU(R1, R2, treshold)
I = rectint(R1, R2);
A1 = R1(:, 3).*R1(:, 4);
A2 = R2(:, 3).*R2(:, 4);
U = bsxfun(@plus, A1, A2')-I;
IoU = I./U;
if nargout > 1
    if nargin<3
        treshold = 0.5;
    end
    match = IoU>treshold;
end
end

Он вычисляет попарно IoU для двух наборов ограничивающих прямоугольников. Если R1 и R2 задают один прямоугольник, выходной IoU является скаляром.

R1 и R2 также могут быть матрицами, где каждая строка является вектором положения ([xywh]). IoU - это матрица, дающая IoU всех прямоугольников, указанных R1 со всеми прямоугольниками, указанными R2. То есть, если R1 является n-by-4 и R2 является m-by-4, то IoU является IoU n-by-m где IoU(i,j) - это IoU прямоугольников, указанных i й строкой R1 и j й ряд R2.

Он также принимает скалярный параметр, treshold, чтобы установить match выходных данных. Размер match в точности соответствует IoU. match(i,j) указывает, соответствуют ли прямоугольники, указанные в i й строке R1 и j й строке R2.

Например,

R1 = [0 0 1 1; 2 1 1 1];
R2 = [-.5 2 1 1; flipud(R1)];
R2 = R2+rand(size(R2))*.4-.2;
[IoU, match] = rectIoU(R1, R2, 0.4)

возвращает:

IoU =
     0         0    0.7738
     0    0.6596         0


match =
     0     0     1
     0     1     0

это означает, что R1(1, :) и R1(2, :) соответствуют R2(3, :) и R2(2, :) соответственно.

enter image description here

PS: В то время, когда я отправляю этот ответ, в ответе Parag есть небольшая ошибка (принятый ответ выше). ИМХО они неправильно вычисляют площадь профсоюза. unionCoords в их ответе - фактически синий квадрат на рисунке ниже, а unionArea - его область, которая, очевидно, не является областью объединения красных и зеленых прямоугольников.

enter image description here

Ответ 6

Просто расширение того, что сказал @Parag S. Chandakkar. Я отредактировал его код, чтобы получить матрицу отношения совпадений для большого количества ящиков.

Если вы хотите построить функцию и использовать ее непосредственно для получения матрицы перекрытия (M, N) (каждая запись лежит между [0,1]) для Box1 (M, 4) и Box2 (N, 4). (Box1 и Box2 содержат (x, y, ширина, высота) данные полей M и N соответственно).

    function result= overlap_matrix(box1,box2)
    [m,y1]=size(box1);
    [n,y2]=size(box2);
    result=zeros(m,n,'double');
    for  i = 1:m 
      for j=1:n
         gt=box1(i,:);
         pr=box2(j,:);

         x_g=box1(i,1);
         y_g=box1(i,2);
         width_g=box1(i,3);
         height_g=box1(i,4);

         x_p=box2(j,1);
         y_p=box2(j,2);
         width_p=box2(j,3);
         height_p=box2(j,4);
         intersectionArea=rectint(gt,pr); 
         unionCoords=[min(x_g,x_p),min(y_g,y_p),max(x_g+width_g-1,x_p+width_p-1),max(y_g+height_g-1,y_p+height_p-1)];
         unionArea=(unionCoords(3)-unionCoords(1)+1)*(unionCoords(4)-unionCoords(2)+1);
         overlapArea=intersectionArea/unionArea; 
         result(i,j)=overlapArea;
      end
    end

Это параллельная функция bboxOverlapRatio (http://in.mathworks.com/help/vision/ref/bboxoverlapratio.html), но недоступна в R2014a или ранее.