Created
July 25, 2021 22:48
-
-
Save nailsonlinux/228bd96956023775b30d38a15fb56d7c to your computer and use it in GitHub Desktop.
non_max_suppression
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# import the necessary packages | |
import numpy as np | |
def non_max_suppression(boxes, probs=None, overlapThresh=0.3): | |
# if there are no boxes, return an empty list | |
if len(boxes) == 0: | |
return [] | |
# if the bounding boxes are integers, convert them to floats -- this | |
# is important since we'll be doing a bunch of divisions | |
if boxes.dtype.kind == "i": | |
boxes = boxes.astype("float") | |
# initialize the list of picked indexes | |
pick = [] | |
# grab the coordinates of the bounding boxes | |
x1 = boxes[:, 0] | |
y1 = boxes[:, 1] | |
x2 = boxes[:, 2] | |
y2 = boxes[:, 3] | |
# compute the area of the bounding boxes and grab the indexes to sort | |
# (in the case that no probabilities are provided, simply sort on the | |
# bottom-left y-coordinate) | |
area = (x2 - x1 + 1) * (y2 - y1 + 1) | |
idxs = y2 | |
# if probabilities are provided, sort on them instead | |
if probs is not None: | |
idxs = probs | |
# sort the indexes | |
idxs = np.argsort(idxs) | |
# keep looping while some indexes still remain in the indexes list | |
while len(idxs) > 0: | |
# grab the last index in the indexes list and add the index value | |
# to the list of picked indexes | |
last = len(idxs) - 1 | |
i = idxs[last] | |
pick.append(i) | |
# find the largest (x, y) coordinates for the start of the bounding | |
# box and the smallest (x, y) coordinates for the end of the bounding | |
# box | |
xx1 = np.maximum(x1[i], x1[idxs[:last]]) | |
yy1 = np.maximum(y1[i], y1[idxs[:last]]) | |
xx2 = np.minimum(x2[i], x2[idxs[:last]]) | |
yy2 = np.minimum(y2[i], y2[idxs[:last]]) | |
# compute the width and height of the bounding box | |
w = np.maximum(0, xx2 - xx1 + 1) | |
h = np.maximum(0, yy2 - yy1 + 1) | |
# compute the ratio of overlap | |
overlap = (w * h) / area[idxs[:last]] | |
# delete all indexes from the index list that have overlap greater | |
# than the provided overlap threshold | |
idxs = np.delete(idxs, np.concatenate(([last], | |
np.where(overlap > overlapThresh)[0]))) | |
# return the indexes of only the bounding boxes to keep | |
return pick |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment