NMS演算法 pytorch版本

2021-10-07 01:24:14 字數 1805 閱讀 6322

nms存在乙個非常簡約的實現方法,演算法輸入包含了所有**框的 得分、左上點座標、右下點座標一共5個**量,以及乙個設定的iou閾 值。具體流程如下:

(1)按照得分,對所有邊框進行降序排列,記錄下排列的索引 order,並新建乙個列表keep,作為最終篩選後的邊框索引結果。

(2)將排序後的第乙個邊框置為當前邊框,並將其保留到keep 中,再求當前邊框與剩餘所有框的iou。

(3)在order中,僅僅保留iou小於設定閾值的索引,重複第(2) 步,直到order中僅僅剩餘乙個邊框,則將其保留到keep中,退出迴圈, nms結束。

利用pytorch,可以很方便地實現nms模組。具體**如下: 

def nms(self, bboxes, scores, thresh=0.5):      

x1 = bboxes[:,0]

y1 = bboxes[:,1]

x2 = bboxes[:,2]

y2 = bboxes[:,3]

# 計算每個box的面積

areas = (x2-x1+1)*(y2-y1+1)

# 對得分進行降序排列,order為降序排列的索引

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

# keep保留了nms留下的邊框box

keep =

while order.numel() > 0:

if order.numel() == 1: # 保留框只剩乙個

i = order.item()

break

else:

i = order[0].item() # 保留scores最大的那個框box[i]

# 巧妙利用tensor.clamp函式求取每乙個框與當前框的最大值和最小值

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

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

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

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

# 求取每乙個框與當前框的重合部分面積

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

# 計算每乙個框與當前框的iou

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

# 保留iou小於閾值的邊框索引

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

if idx.numel() == 0:

break

# 這裡的+1是為了補充idx與order之間的索引差

order = order[idx+1]

# 返回保留下的所有邊框的索引值,型別為torch.longtensor

return torch.longtensor(keep)

實現NMS演算法

python3 import numpy as np defpy nms dets,thresh pure python nms baseline.x1 y1 x2 y2 以及score賦值 x1 dets 0 y1 dets 1 x2 dets 2 y2 dets 3 scores dets 4 ...

NMS演算法實現

nms演算法 非極大值抑制 是目標檢測演算法中經典的後處理步驟,其本質是搜尋區域性最大值,抑制非極大值元素。主要利用目標檢測框以及對應的置信度分數,設定一定的閾值來刪除重疊較大的邊界框。其演算法流程如下 根據置信度得分進行排序 選擇置信度最高的目標檢測框新增到輸出列表中,將其從檢測框列表中刪除 計算...

非極大值抑制NMS演算法c 版本

非極大值抑制nms演算法 縮寫nms,全稱 non maximum suppression 常用於計算機視覺中的邊緣檢測 物體識別等。給出一張和上面許多物體檢測的候選框 即每個框可能都代表某種物體 但是這些框很可能有互相重疊的部分,我們要做的就是只保留最優的框。nms的作用 去掉detection任...