非極大值抑制(NMS) Yolov4 二

2021-10-18 18:36:05 字數 2713 閱讀 1870

非極大值抑制

非極大值抑制也屬於後處理一部分,單獨說可能會清楚一點,之所以要進行這步操作,原因在於很多時候乙個目標存在多個**框,這時我們需要選出最好的那個作為**結果。怎麼選的過程就是非極大值抑制操作。如下圖所示:

圖1 可愛的小貓

上圖中乙個目標有三個**框,所以需要通過非極大值抑制選出最好的那個(黃色框)。需要說明的是,一般情況下,一張中可能存在幾個類別的目標,每個類別目標可能有多個個體,比如一張中可能包含3只貓和2隻狗這類更一般的情況。但是一般非極大值抑制每次僅針對乙個類別來操作。這裡結合**來說明其具體思路。對於非極大值抑制,我們的輸入一般是影象中一類目標(比如貓)的所有**框和每乙個**框對應的得分以及乙個閾值。

def nms(bboxs, scores, threshold):

x1 = bboxs[:, 0]

y1 = bboxs[:, 1]

x2 = bboxs[:, 2]

y2 = bboxs[:, 3]

areas = (y2 - y1) * (x2 - x1) # 每個bbox的面積

# order為排序後的得分對應的原陣列索引值

_, order = scores.sort(0, descending=true)

keep = # 儲存所有結果框的索引值。

while order.numel() > 0:

if order.numel() == 1:

break

else:

i = order[0].item()

# 計算最大得分的bboxs[i]與其餘各框的iou

xx1 = x1[order[1:]].clamp(min=int(x1[i]))

yy1 = y1[order[1:]].clamp(min=int(y1[i]))

xx2 = x2[order[1:]].clamp(max=int(x2[i]))

yy2 = y2[order[1:]].clamp(max=int(y2[i]))

inter = (yy2 - yy1).clamp(min=0) * (xx2 - xx1).clamp(min=0)

iou = inter / (areas[i] + areas[order[1:]] - inter)

# 如果bboxs長度為n,則iou長度為n-1

# 保留iou小於閾值的剩餘bboxs,.nonzero().squeeze()轉化為數字索引,可驗證

idx = (iou <= threshold).nonzero().squeeze()

if idx.numel() == 0:

break

order = order[idx + 1]

# idx+1表示對其每個值加一(保證和原來的order中索引一致),並替換原來的order

return keep

解析:當我們輸入需要進行非極大值抑制的所有**框及其對應的得分和乙個閾值後,按如下步驟進行:

第一步:計算所有**框的面積,areas = (y2 - y1) * (x2 - x1),這是矩陣運算噢。

第二步:根據所有**框的得分對其進行降序排序, _,order = scores.sort(0, descending=true),order為排序後的得分對應的原陣列索引值。

第三步:保留最高得分**框索引值order[0],計算其和剩餘**框的交集inter,這裡也是矩陣運算。

第四步:求得分最高的**框和其餘**框的交並比iou。

圖2 iou示意圖

第五步:保留iou小於閾值的那部分**框,原因是iou越大,表明其和最高得分**框的重合度越大,所以應該去除。

第六步:更新order,order = order[idx + 1],返回第三步,直到iou小於閾值的那部分**框數量為零就停止。

通過上面的步驟,我們就可以完成非極大值抑制。同時選出最合適的**框!

接上一節我們得到的三個結果:通過[1,3,13,13,85]變成[1,507,85]、通過[1,3,26,26,85]變成[1,2028,85]、通過[1,3,52,52,85]變成[1,8112,85],這都是維度變化表示噢!對於以上結果我們進行融合後開始非極大值抑制操作,融合**為:all_prediction= torch.cat((preds,predm,predl),1)

其中preds=[1,507,85],predm=[1,2028,85],predl=[1,8112,85]。

經過非極大值抑制處理後的結果(所有**框和其對應得分及類別標籤)再稍微處理下就可以得到最終的顯示效果(這部分看**就行)。顯示效果就是根據上面的結果在圖上畫出**框以及對應得分和識別標籤。如下所示:

圖3 識別結果

至此yolov4的結構原理及識別過程完!

非極大值抑制

nms non maximum suppression 中文名非極大值抑制,在很多計算機視覺任務中都有廣泛應用,如 邊緣檢測 目標檢測等。這裡主要以人臉檢測中的應用為例,來說明nms,並給出matlab和c 示例程式。人臉檢測的一些概念 1 絕大部分人臉檢測器的核心是分類器,即給定乙個尺寸固定,分類...

非極大值抑制

參考 思想 1.將每乙個檢測框的得分值排序,得到得分值最大的檢測框,將該檢測框記錄下來 2.然後其他計算所有的檢測框與該框的iou,將iou大於閾值的檢測框去除,iou小於閾值的認為是不同的目標,則保留 3.對剩下的檢測框繼續做上述的處理 import numpy as np def py cpu ...

非極大值抑制

在進行目標檢測的時候,當多個方框都 到同乙個目標的時候,我們需要去除iou小的方框,原始碼如下 def nms boxes,threshold,method union param boxes n,9 x1,y1,x2,y2,score,offset x1,offset y1,offset x2,o...