2 非極大值抑制(NMS)

非極大值抑制(Non-Maximum Suppression窘哈,NMS[1])可以正面地表述為局部最大搜索(Local Maximum Search), 其中局部最大值大于其所有鄰居 (不包括其自身)。本質(zhì)上是搜索局部極大值雌澄,抑制非極大值元素倚喂。

NMS 在計(jì)算機(jī)視覺領(lǐng)域有著非常重要的應(yīng)用每篷,如視頻目標(biāo)跟蹤、數(shù)據(jù)挖掘端圈、3D重建焦读、目標(biāo)識別以及紋理分析等。[2]

2.1 1D NMS

Straightforward Implementation

NMS 的簡單實(shí)現(xiàn)由兩個(gè)嵌套循環(huán)組成, 其中外部循環(huán)遍歷所有像素, 內(nèi)部循環(huán)針對外部循環(huán)的所有鄰居測試其候選項(xiàng)舱权。一旦鄰居強(qiáng)度超過當(dāng)前候選, 內(nèi)部循環(huán)就會中止矗晃。顯然, 該算法需要對每個(gè)像素做 2n 次比較, 而不需要提前中止。在最壞的情況下, 中止不能降低復(fù)雜性宴倍。這可以通過將算法應(yīng)用于強(qiáng)度趨勢來看出张症。由于一側(cè)的像素總是小于候選像素, 因此內(nèi)部循環(huán)會在第 (n + 1) 迭代處中止, 從而使每個(gè)像素有 n + 1 次比較。因此, 比較像素的最壞情況數(shù)是 O(n)鸵贬。關(guān)于時(shí)間復(fù)雜度分析的具體內(nèi)容可查看原論文[1]俗他。下面我以一張圖片來說明 NMS:

import numpy as np
from matplotlib import pyplot as plt
np.set_printoptions(2)     # 修改了 NumPy 的打印精度
# 指定默認(rèn)字體, 為在 Matplotlib 中顯示中文,設(shè)置特殊字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負(fù)號 '-' 顯示為方塊的問題

%matplotlib inline

img_name = '../images/catdog.jpg'
img = plt.imread(img_name)

載入圖片之后恭理,我們先討論 3-Neighborhood拯辙。

3-近鄰

我們先將原圖片拉直為一個(gè)向量郭变,下面我們定義 NMS:

I = img.flatten()[:30]
w = len(I)
maximumat = []
i = 1
while i + 1 < w:
    if I[i] > I[i+1] and I[i] >= I[i-1]:  # I[i] 是極大值
        maximumat.append(i)
    else:
        i += 1
        while i + 1 < w and I[i] <= I[i+1]:
            i += 1
        if i + 1 < w:
            maximumat.append(i)
    i += 2

plt.plot(I, 'y--')
plt.scatter(maximumat, I[maximumat])
plt.axis('off')
for _x, _y in enumerate(I):
    plt.text(_x, _y, str(_x))
前 30 個(gè)像素點(diǎn)的極大值分布圖:圖中藍(lán)色圓點(diǎn)表示 3 近鄰的極大值點(diǎn)

為了更加形象颜价,下面我們將展示 NMS 處理前后的圖像:

I = img.flatten()
w = len(I)
maximumat = []
i = 1
while i + 1 < w:
    if I[i] > I[i+1] and I[i] >= I[i-1]:
        maximumat.append(i)
    else:
        i += 1
        while i + 1 < w and I[i] <= I[i+1]:
            i += 1
        if i + 1 < w:
            maximumat.append(i)
    i += 2
K = img[:].flatten()
K[maximumat] = 0

img1 = K.reshape(img.shape)  # 去除極大值點(diǎn)后組成的圖像
img2 = img - img1   # 極大值點(diǎn)組成的圖像
plt.figure(figsize=(10, 10))
plt.subplot(131)
plt.imshow(img)
plt.title('原圖')
plt.axis('off')
plt.subplot(132)
plt.imshow(img1)
plt.title('去除極大值點(diǎn)圖')
plt.axis('off')
plt.subplot(133)
plt.imshow(img2)
plt.title('極大值點(diǎn)圖')
plt.axis('off')
plt.show()
NMS 處理前后對比

2.2 動(dòng)態(tài)塊算法:(2n+1)-近鄰

def nms(y, n):
    '''
    參數(shù)
    ===========
    y:: 一維數(shù)組
    n:: 近鄰數(shù)
    
    返回
    ==========
    N-近鄰 的 NMS
    '''
    i = 0
    maximumat = []
    w = len(y)
    while 2 * n + i < w:

        if I[i+n] > max(I[i+n+1:i+2*n]) and I[i+n] >= max(I[i:i+n]):
            maximumat.append(i+n)
        else:
            i += 1
            while 2 * n + i < w and I[i+n] < max(I[i+n+1:i+2*n]):
                i += 1
            if 2 * n + i < w:
                maximumat.append(i+n)
        i += n
    return maximumat

為了方便我將可視化的代碼放入函數(shù):

def plot(img, img1, img2):
    plt.figure(figsize=(10, 10))
    plt.subplot(131)
    plt.imshow(img)
    plt.title('原圖')
    plt.axis('off')
    plt.subplot(132)
    plt.imshow(img1)
    plt.title('去除極大值點(diǎn)圖')
    plt.axis('off')
    plt.subplot(133)
    plt.imshow(img2)
    plt.title('極大值點(diǎn)圖')
    plt.axis('off')
    plt.show()
import numpy as np
from matplotlib import pyplot as plt
np.set_printoptions(2)     # 修改了 NumPy 的打印精度
# 指定默認(rèn)字體, 為在 Matplotlib 中顯示中文,設(shè)置特殊字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負(fù)號 '-' 顯示為方塊的問題

%matplotlib inline

img_name = '../images/catdog.jpg'
img = plt.imread(img_name)
I = img.flatten()
n = 3
maximumat = nms(I, n)
K = img[:].flatten()
K[maximumat] = 0

img1 = K.reshape(img.shape)  # 去除極大值點(diǎn)后組成的圖像
img2 = img - img1   # 極大值點(diǎn)組成的圖像
plot(img, img1, img2)
n=3
I = img.flatten()
n = 100
maximumat = nms(I, n)
K = img[:].flatten()
K[maximumat] = 0

img1 = K.reshape(img.shape)  # 去除極大值點(diǎn)后組成的圖像
img2 = img - img1   # 極大值點(diǎn)組成的圖像
plot(img, img1, img2)
n=100

  1. Neubeck A, Van Gool L. Efficient Non-Maximum Suppression[C]. international conference on pattern recognition, 2006: 850-855. ? ?

  2. 非極大值抑制(Non-Maximum Suppression诉濒,NMS)周伦,顧名思義就是抑制不是極大值的元素,可以理解為局部最大搜索未荒。這個(gè)局部代表的是一個(gè)鄰域专挪,鄰域有兩個(gè)參數(shù)可變,一是鄰域的維數(shù),二是鄰域的大小寨腔。這里不討論通用的 NMS 算法(參考論文《Efficient Non-Maximum Suppression》 對 1 維和 2 維數(shù)據(jù)的 NMS 實(shí)現(xiàn))速侈,而是用于目標(biāo)檢測中提取分?jǐn)?shù)最高的窗口的。例如在行人檢測中迫卢,滑動(dòng)窗口經(jīng)提取特征倚搬,經(jīng)分類器分類識別后,每個(gè)窗口都會得到一個(gè)分?jǐn)?shù)乾蛤。但是滑動(dòng)窗口會導(dǎo)致很多窗口與其他窗口存在包含或者大部分交叉的情況每界。這時(shí)就需要用到 NMS 來選取那些鄰域里分?jǐn)?shù)最高(是行人的概率最大),并且抑制那些分?jǐn)?shù)低的窗口家卖。@http://www.cnblogs.com/makefile/p/nms.html ? 康行天下 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載眨层,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末上荡,一起剝皮案震驚了整個(gè)濱河市趴樱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酪捡,老刑警劉巖伊佃,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沛善,居然都是意外死亡航揉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門金刁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帅涂,“玉大人,你說我怎么就攤上這事尤蛮∠庇眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵产捞,是天一觀的道長醇锚。 經(jīng)常有香客問我,道長坯临,這世上最難降的妖魔是什么焊唬? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮看靠,結(jié)果婚禮上赶促,老公的妹妹穿的比我還像新娘。我一直安慰自己挟炬,他們只是感情好鸥滨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布嗦哆。 她就那樣靜靜地躺著,像睡著了一般婿滓。 火紅的嫁衣襯著肌膚如雪老速。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天凸主,我揣著相機(jī)與錄音烁峭,去河邊找鬼。 笑死秕铛,一個(gè)胖子當(dāng)著我的面吹牛约郁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播但两,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鬓梅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谨湘?” 一聲冷哼從身側(cè)響起绽快,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紧阔,沒想到半個(gè)月后坊罢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擅耽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年活孩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乖仇。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憾儒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乃沙,到底是詐尸還是另有隱情起趾,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布警儒,位于F島的核電站训裆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜀铲。R本人自食惡果不足惜边琉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝙茶。 院中可真熱鬧艺骂,春花似錦、人聲如沸隆夯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹄衷。三九已至忧额,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愧口,已是汗流浹背睦番。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耍属,地道東北人托嚣。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像厚骗,于是被迫代替她去往敵國和親示启。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容