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任...