-
-
Save meyerjo/dd3533edc97c81258898f60d8978eddc to your computer and use it in GitHub Desktop.
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 = abs(max((xB - xA, 0)) * max((yB - yA), 0)) | |
if interArea == 0: | |
return 0 | |
# compute the area of both the prediction and ground-truth | |
# rectangles | |
boxAArea = abs((boxA[2] - boxA[0]) * (boxA[3] - boxA[1])) | |
boxBArea = abs((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 | |
if __name__ == '__main__': | |
# Pointing out a wrong IoU implementation in https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/ | |
boxA = [0., 0., 10., 10.] | |
boxB = [1., 1., 11., 11.] | |
correct = bb_intersection_over_union(boxA, boxB) | |
print('Correct solution - also analytical: {0}\n' | |
'Solution by published function: {1}\n' | |
'Solution by correction (ptyshevs): {2}'.format(correct, '0.704225352113', '0.680672268908')) | |
print('Normalizing coordinates in a 100x100 coordinate system') | |
boxA = [a / 100. for a in boxA] | |
boxB = [b / 100. for b in boxB] | |
correct = bb_intersection_over_union(boxA, boxB) | |
print('Correct solution - also analytical: {0}\n' | |
'Solution by published function: {1}\n' | |
'Solution by correction: {2}'.format(correct, '0.964445166004', '0.680672268908')) | |
print('Two boxes with no overlap') | |
boxA = [0., 0., 10., 10.] | |
boxB = [12., 12., 22., 22.] | |
correct = bb_intersection_over_union(boxA, boxB) | |
print('Correct solution - also analytical: {0}\n' | |
'Solution by published function: {1}\n' | |
'Solution by correction (ptyshevs): {2}'.format(correct, '0.0', '0.0204081632653')) | |
print('Example in the comments from ptyshevs') | |
boxA = [0., 0., 2., 2.] | |
boxB = [1., 1., 3., 3.] | |
correct = bb_intersection_over_union(boxA, boxB) | |
print('Correct solution - also analytical: {0}\n' | |
'Solution by published function: {1}\n' | |
'Solution by correction (ptyshevs): {2}'.format(correct, '0.285714285714', '0.142857142857')) |
are the bounding box coordinates in this format [x1 y1 x2 y2] ? Using this code sometimes I am getting iou>1, What could be the reason?
Why is the abs
in line 9 necessary? Isn't the two maxima always at least zero? Thanks!
Pointing out a wrong IoU implementation in https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/
is that still actual? if so, what the problem with his code?
Is this the line that is problematic?
interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)
Thanks meyerjo!
interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0))
Should be
interArea = max((xB - xA), 0) * max((yB - yA), 0)
Because max(x, 0)
the absolute value is unnecessary.
interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0))
Should be
interArea = max((xB - xA), 0) * max((yB - yA), 0)
Because
max(x, 0)
the absolute value is unnecessary.
yep the abs is useless, which should be remove.
Pointing out a wrong IoU implementation in https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/
is that still actual? if so, what the problem with his code?