python 實(shí)現(xiàn)非極大值抑制算法(Non-maximum suppression, NMS)
NMS 算法在目標(biāo)檢測,目標(biāo)定位領(lǐng)域有較廣泛的應(yīng)用。
算法原理
非極大值抑制算法(Non-maximum suppression, NMS)的本質(zhì)是搜索局部極大值,抑制非極大值元素。
算法的作用
當(dāng)算法對一個(gè)目標(biāo)產(chǎn)生了多個(gè)候選框的時(shí)候,選擇 score 最高的框,并抑制其他對于改目標(biāo)的候選框

適用場景
一幅圖中有多個(gè)目標(biāo)(如果只有一個(gè)目標(biāo),那么直接取 score 最高的候選框即可)。
算法的輸入
算法對一幅圖產(chǎn)生的所有的候選框,以及每個(gè)框?qū)?yīng)的 score (可以用一個(gè) 5 維數(shù)組 dets 表示,前 4 維表示四個(gè)角的坐標(biāo),第 5 維表示分?jǐn)?shù)),閾值 thresh。
算法的輸出
正確的候選框組(dets 的一個(gè)子集)。
細(xì)節(jié)
- 起始,設(shè)所有的框都沒有被抑制,所有框按照
score從大到小排序。 - 從第 0 個(gè)框(分?jǐn)?shù)最高)開始遍歷:對于每一個(gè)框,如果該框沒有被抑制,就將所有與它
IoU大于thresh的框設(shè)為抑制。 - 返回沒被抑制的框。
參考代碼
# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------
import numpy as np
cimport numpy as np
cdef inline np.float32_t max(np.float32_t a, np.float32_t b):
return a if a >= b else b
cdef inline np.float32_t min(np.float32_t a, np.float32_t b):
return a if a <= b else b
def cpu_nms(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh):
cdef np.ndarray[np.float32_t, ndim=1] x1 = dets[:, 0]
cdef np.ndarray[np.float32_t, ndim=1] y1 = dets[:, 1]
cdef np.ndarray[np.float32_t, ndim=1] x2 = dets[:, 2]
cdef np.ndarray[np.float32_t, ndim=1] y2 = dets[:, 3]
cdef np.ndarray[np.float32_t, ndim=1] scores = dets[:, 4]
cdef np.ndarray[np.float32_t, ndim=1] areas = (x2 - x1 + 1) * (y2 - y1 + 1)
cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]
cdef int ndets = dets.shape[0]
cdef np.ndarray[np.int_t, ndim=1] suppressed = \
np.zeros((ndets), dtype=np.int)
# nominal indices
cdef int _i, _j
# sorted indices
cdef int i, j
# temp variables for box i's (the box currently under consideration)
cdef np.float32_t ix1, iy1, ix2, iy2, iarea
# variables for computing overlap with box j (lower scoring box)
cdef np.float32_t xx1, yy1, xx2, yy2
cdef np.float32_t w, h
cdef np.float32_t inter, ovr
keep = []
for _i in range(ndets):
i = order[_i]
if suppressed[i] == 1:
continue
keep.append(i)
ix1 = x1[i]
iy1 = y1[i]
ix2 = x2[i]
iy2 = y2[i]
iarea = areas[i]
for _j in range(_i + 1, ndets):
j = order[_j]
if suppressed[j] == 1:
continue
xx1 = max(ix1, x1[j])
yy1 = max(iy1, y1[j])
xx2 = min(ix2, x2[j])
yy2 = min(iy2, y2[j])
w = max(0.0, xx2 - xx1 + 1)
h = max(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (iarea + areas[j] - inter)
if ovr >= thresh:
suppressed[j] = 1
return keep
以上就是python 實(shí)現(xiàn)非極大值抑制算法(Non-maximum suppression, NMS)的詳細(xì)內(nèi)容,更多關(guān)于python 非極大值抑制算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn)
這篇文章主要介紹了如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
python實(shí)現(xiàn)ssh及sftp功能(實(shí)例代碼)
這篇文章主要介紹了python實(shí)現(xiàn)ssh及sftp功能 ,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
python 處理telnet返回的More,以及get想要的那個(gè)參數(shù)方法
今天小編就為大家分享一篇python 處理telnet返回的More,以及get想要的那個(gè)參數(shù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Python機(jī)器學(xué)習(xí)k-近鄰算法(K Nearest Neighbor)實(shí)例詳解
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)k-近鄰算法(K Nearest Neighbor),結(jié)合實(shí)例形式分析了k-近鄰算法的原理、操作步驟、相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2018-06-06
Django模板中變量的運(yùn)算實(shí)現(xiàn)
這篇文章主要介紹了Django模板中變量的運(yùn)算,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

