Skip to content
{{ message }}

Instantly share code, notes, and snippets.

# meyerjo/iou.py

Last active Mar 8, 2021
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, boxB) yA = max(boxA, boxB) xB = min(boxA, boxB) yB = min(boxA, boxB) # 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 - boxA) * (boxA - boxA)) boxBArea = abs((boxB - boxB) * (boxB - boxB)) # 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'))

### rajeev-samalkha commented Sep 7, 2018

 Thank you Meyerjo

### prashant-bansod commented Nov 27, 2018

 @meyejo Thanks for the implementation . will this work if rectangle inside the other rectangle?

### prashant-bansod commented Nov 27, 2018

 @meyejo what if there are multiple bounding boxes?

### meyerjo commented Jan 14, 2019

 @meyejo what if there are multiple bounding boxes? Just iterate over all possible combinations

### meyerjo commented Jan 14, 2019

 @meyejo Thanks for the implementation . will this work if rectangle inside the other rectangle? This shouldn't be an issue. The union space of both boxes is 1. It depends on the respective size of the boxes, how large the IoU becomes.

### fader111 commented Dec 5, 2019 • edited

 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?

### SamihaSara commented Feb 27, 2020

 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?

### kkew3 commented Apr 25, 2020

 Why is the `abs` in line 9 necessary? Isn't the two maxima always at least zero? Thanks!
to join this conversation on GitHub. Already have an account? Sign in to comment