Первый адрес:Tickets.WeChat.QQ.com/Yes/PA Ингредиент V стоит 4…
Если вы не знаете, в какой порт плывете, не имеет значения, дует ли ветер юго-восточный или северо-западный.
-- "Минимализм" Парадигма 2: Придумай, что делать, это полдела
0. Введение
Китайское название долговой расписки — отношение пересечения и союза, что означает соотношение пересечения и союза. это широко используемый алгоритм обнаружения целей
принцип долговой расписки
Как показано на рисунке выше, необходимо рассчитать отношение заштрихованной части вверху к заштрихованной части внизу.
Давайте разделим задачу, молекулярная часть — это область пересечения Box1 и Box2, которая сначала устанавливается в A1. Часть знаменателя — это площадь объединения Box1 и Box2, которая равна A2, что на самом деле представляет собой площадь S1 Box1 плюс площадь S2 Box2 минус A1 (зачем вычитать A1, потому что Box1 и Box2 перекрываются? Часть А1, и ее нужно вычесть Переходите к единице, детская обувь, о которой я не подумала, уходит в стену за 0,1 секунды :)
IoU = A1 / A2
A2 = S1 + S2 -A1
IoU = A1 / (S1 + S2 -A1)
S1 — это площадь Box1, а S2 — площадь Box2. Фактически задача трансформируется в решение Box и A1.
Далее продолжаем разбирать задачу
0.0: Определение осей координат
Координатор OpenCV
Сначала взгляните на определение координатных осей в OpenCV. Начало координат находится в верхнем левом углу изображения, положительное направление оси X — вправо, положительное направление оси Y — вниз (это отличается от определения в математике).
0.1: Представление и вычисление блока
Box имеет два часто используемых выражения:
1: Boxa = (xmin,ymin,xmax,ymax) (формат coco и voc); 2: Boxb = (xcenter,ycenter,w,h) (формат yolo).
На самом деле, согласно различным выражениям вещи, она по существу одна и та же.
Соответствующее отношение преобразования приведено ниже:
xmin,ymin,xmax,ymax = round(xcenter-(w/2.0)) ,round(ycenter-(h/2.0)),round(xcenter+(w/2.0)),round(ycenter+(h/2.0))
xcenter,ycenter,w,h = round((xmin+xmax)/2.0),round((ymin+ymax)/2.0),round(xmax-xmin),round(ymax-ymin)
Boxa = (round(Boxb[0]-(Boxb[2]/2.0)) ,round(Boxb[1]-(Boxb[3]/2.0),round(Boxb[0]+(Boxb[2]/2.0),round(Boxb[1]+(Boxb[3]/2.0))
Площадь коробки рассчитывается как w*h
S_Boxa = (xmax-xmin)*(ymax-ymin) = (Boxa[2]-Boxa[0])*(Boxa[3]-Boxa[1])
S_Boxb = w*h = Boxb[2]*Boxb[3]
0.2: Представление и расчет A1
Некоторые случаи пересечения коробок
Вычисление площади пересечения аналогично предыдущей задаче, просто посчитайте, что w и h поля пересечения равны 0, если они не пересекаются. Из приведенного выше рисунка можно найти следующие правила: если пересечение
xmin =max(xmin1, xmin2)#相交框xmin是两个框的左上角x坐标的最大值:
ymin =max(ymin1, ymin2)#相交框ymin是两个框的左上角y坐标的最大值:
xmax =min(xmax1, xmax2)#相交框xmax是两个框的右下角x坐标的最大值:
ymax =min(ymax1, ymax2)#相交框ymax是两个框的右下角y坐标的最大值:
Наконец, разберитесь с ситуацией, когда вы не хотите платить.Вы можете обнаружить, что когда вы не хотите платить, будет по крайней мере одна из следующих ситуаций:
xmax<=xmin or ymax<ymin
Так что метод обработки очень прост: в любом случае один из w или h будет равен 0, так что вычисляемая площадь тоже будет 0
w =max(0, xmax - xmin)
h =max(0, ymax - ymin)
Итак, общий код готов к выходу, не правда ли, все просто :)
1. Код
def cal_iou(box1, box2):
"""
:param box1: = [xmin1, ymin1, xmax1, ymax1]
:param box2: = [xmin2, ymin2, xmax2, ymax2]
:return:
"""
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
# 计算每个矩形的面积
s1 = (xmax1 - xmin1) * (ymax1 - ymin1) # b1的面积
s2 = (xmax2 - xmin2) * (ymax2 - ymin2) # b2的面积
# 计算相交矩形
xmin = max(xmin1, xmin2)
ymin = max(ymin1, ymin2)
xmax = min(xmax1, xmax2)
ymax = min(ymax1, ymax2)
w = max(0, xmax - xmin)
h = max(0, ymax - ymin)
a1 = w * h # C∩G的面积
a2 = s1 + s2 - a1
iou = a1 / a2 #iou = a1/ (s1 + s2 - a1)
return iou