CIoU nan bug fix (#736)
This commit is contained in:
parent
fb4fc8cd02
commit
5e0b90de8f
|
|
@ -1,15 +1,15 @@
|
||||||
import glob
|
import glob
|
||||||
|
import logging
|
||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
|
import platform
|
||||||
import random
|
import random
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import logging
|
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from copy import copy
|
from copy import copy
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import platform
|
|
||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
import matplotlib
|
import matplotlib
|
||||||
|
|
@ -339,19 +339,19 @@ def compute_ap(recall, precision):
|
||||||
return ap
|
return ap
|
||||||
|
|
||||||
|
|
||||||
def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False):
|
def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-12):
|
||||||
# Returns the IoU of box1 to box2. box1 is 4, box2 is nx4
|
# Returns the IoU of box1 to box2. box1 is 4, box2 is nx4
|
||||||
box2 = box2.T
|
box2 = box2.T
|
||||||
|
|
||||||
# Get the coordinates of bounding boxes
|
# Get the coordinates of bounding boxes
|
||||||
if x1y1x2y2: # x1, y1, x2, y2 = box1
|
if x1y1x2y2: # x1, y1, x2, y2 = box1
|
||||||
b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]
|
b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2] + eps, box1[3] + eps
|
||||||
b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]
|
b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2] + eps, box2[3] + eps
|
||||||
else: # transform from xywh to xyxy
|
else: # transform from xywh to xyxy
|
||||||
b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2
|
b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2 + eps
|
||||||
b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2
|
b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2 + eps
|
||||||
b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2
|
b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2 + eps
|
||||||
b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2
|
b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2 + eps
|
||||||
|
|
||||||
# Intersection area
|
# Intersection area
|
||||||
inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
|
inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
|
||||||
|
|
@ -360,18 +360,18 @@ def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False):
|
||||||
# Union Area
|
# Union Area
|
||||||
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1
|
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1
|
||||||
w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1
|
w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1
|
||||||
union = (w1 * h1 + 1e-16) + w2 * h2 - inter
|
union = w1 * h1 + w2 * h2 - inter
|
||||||
|
|
||||||
iou = inter / union # iou
|
iou = inter / union # iou
|
||||||
if GIoU or DIoU or CIoU:
|
if GIoU or DIoU or CIoU:
|
||||||
cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex (smallest enclosing box) width
|
cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex (smallest enclosing box) width
|
||||||
ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex height
|
ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex height
|
||||||
if GIoU: # Generalized IoU https://arxiv.org/pdf/1902.09630.pdf
|
if GIoU: # Generalized IoU https://arxiv.org/pdf/1902.09630.pdf
|
||||||
c_area = cw * ch + 1e-16 # convex area
|
c_area = cw * ch # convex area
|
||||||
return iou - (c_area - union) / c_area # GIoU
|
return iou - (c_area - union) / c_area # GIoU
|
||||||
if DIoU or CIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
|
if DIoU or CIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
|
||||||
# convex diagonal squared
|
# convex diagonal squared
|
||||||
c2 = cw ** 2 + ch ** 2 + 1e-16
|
c2 = cw ** 2 + ch ** 2
|
||||||
# centerpoint distance squared
|
# centerpoint distance squared
|
||||||
rho2 = ((b2_x1 + b2_x2) - (b1_x1 + b1_x2)) ** 2 / 4 + ((b2_y1 + b2_y2) - (b1_y1 + b1_y2)) ** 2 / 4
|
rho2 = ((b2_x1 + b2_x2) - (b1_x1 + b1_x2)) ** 2 / 4 + ((b2_y1 + b2_y2) - (b1_y1 + b1_y2)) ** 2 / 4
|
||||||
if DIoU:
|
if DIoU:
|
||||||
|
|
@ -379,7 +379,7 @@ def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False):
|
||||||
elif CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
|
elif CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
|
||||||
v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2)
|
v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2)
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
alpha = v / (1 - iou + v + 1e-16)
|
alpha = v / ((1 + eps) - iou + v)
|
||||||
return iou - (rho2 / c2 + v * alpha) # CIoU
|
return iou - (rho2 / c2 + v * alpha) # CIoU
|
||||||
|
|
||||||
return iou
|
return iou
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue