Skip to content

Instantly share code, notes, and snippets.

@sodri126
Forked from meyerjo/iou.py
Created July 13, 2019 13:59
Show Gist options
  • Select an option

  • Save sodri126/6eb180511eb0284e6bc5a849d83a1e60 to your computer and use it in GitHub Desktop.

Select an option

Save sodri126/6eb180511eb0284e6bc5a849d83a1e60 to your computer and use it in GitHub Desktop.
Python code to compute the intersection of two boundingboxes
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'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment