非極大值抑制演算法(Python實現)

如果有不對的地方歡迎指正

演算法原理

非極大值抑制演算法的本質是搜索局部極大值,抑制非極大值元素。

演算法用途

如在物體檢測中可以通過應用NMS演算法來消除多餘的交叉重複的窗口,使在同一物體的多個檢測窗口中保留下得分最高的窗口。

NMS演算法亦可用於視頻跟蹤/數據挖掘/3D重建以及文理分析等。

演算法實現思路

首先迭代所有的點,迭代每一個點的時候判斷該點是否符合局部最大值的條件。

NMS演算法在三鄰域情況下的實現

三鄰域情況下的NMS即判斷一維數組array中的元素array[i]是否大於其左鄰元素array[i-1]和右鄰元素array[i+1],具體實現如下圖(Python表示):

import numpy as nparray = [0] + np.random.randint(100, size=10).tolist() + [0]keep = []i = 1while i <= 10: if array[i] > array[i+1]: if array[i] > array[i-1]: keep.append(array[i]) else: i += 1 while i <= 10 and array[i] <= array[i+1]: i += 1 if i <= 10: keep.append(array[i]) i += 2

NMS演算法應用於人臉檢測窗口選擇的實現(Python實現)

import numpy as npdef nms(rects, threshold): x1, y1, x2, y2, scores = rects[:, 0], rects[:, 1], rects[:, 2], rects[:, 3], rects[:, 4] areas = (x2 - x1 + 1) * (y2 - y1 + 1) order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(i) xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.minimum(x2[i], x2[order[1:]]) yy2 = np.minimum(y2[i], y2[order[1:]]) inter = np.maximun(0.0, xx2 - xx1 + 1) * np.maximum(0.0, yy2 - yy1 + 1) iou = inter / (areas[i] + areas[order[1:]] - inter) indexs = np.where(iou <= threshold)[0] order = order[indexs + 1] return keep

推薦閱讀:

012 Integer to Roman[M]
演算法教練談談碼工面試
6. ZigZag Conversion(medium) & 7.Reverse Integer(easy)
K近鄰演算法(內附Kd-tree視頻演示)
【CV-Semantic Segmentation】deeplabv3+:語義分割領域的新高峰

TAG:Python | 演算法 | 機器學習 |