前言:Hello大家好,我是小哥談。NMS是指非極大值抑制(non maximum suppression),它是一種常用于物體檢測任務的算法。在物體檢測中,通常會有多個預測框(bounding box)被提議出來,并且這些框可能存在重疊或者重復的情況。NMS的目的就是通過抑制非極大值的方式,來選擇出最具代表性的框。本節課就給大家介紹一下非極大值抑制的概念、原理及其算法實現。🌈?
?前期回顧:
? ? ? ? ? ?YOLOv5基礎知識入門(1)— YOLO算法的發展歷程
? ? ? ? ? ?YOLOv5基礎知識入門(2)— YOLOv5核心基礎知識講解
? ? ? ? ? ?YOLOv5基礎知識入門(3)— 目標檢測相關知識點
? ? ? ? ? ?YOLOv5基礎知識入門(4)— 神經網絡的基本概念與原理?
? ? ? ? ? ?YOLOv5基礎知識入門(5)— 損失函數(IoU、GIoU、DIoU、CIoU和EIoU)
? ? ? ? ? ?YOLOv5基礎知識入門(6)— 激活函數(Mish、Sigmoid、Tanh、ReLU、Softmax、SiLU等)
? ? ? ? ? ?目錄
🚀1.NMS概念
🚀2.目標檢測中的NMS
🚀3.NMS算法實現
🚀4.YOLOv5中的NMS
🚀1.NMS概念
非極大值抑制(Non-Maximum Suppression,NMS),顧名思義就是抑制不是極大值的元素,可以理解為局部最大搜索。這個局部代表的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。這里不討論通用的NMS算法(參考論文《Efficient Non-Maximum Suppression》對1維和2維數據的NMS實現),而是用于目標檢測中提取分數最高的窗口的。🌳
舉例:在人臉檢測中,滑動窗口經提取特征,經分類器分類識別后,每個窗口都會得到一個分數,但是滑動窗口會導致很多窗口與其他窗口存在包含或者大部分交叉的情況。這時就需要用到NMS來選取那些鄰域里分數最高,并且抑制那些分數低的窗口。🍁
🚀2.目標檢測中的NMS
目標檢測一般分為兩個過程:訓練過程+檢測(推理)過程。🌻
在訓練過程中,目標檢測算法會根據給定的ground truth調整深度學習網絡參數來擬合數據集的目標特征,訓練完成后,神經網絡的參數固定,因而能夠直接對新的圖像進行目標預測。 然而,在實際的目標預測中,一般的目標檢測算法(R-CNN、YOLO等等)都會產生非常多的目標框,其中有很多重復的框定位到同一個目標,NMS作為目標檢測的最后一步,用來去除這些重復的框,獲得真正的目標框。🍄
在兩階段目標檢測算法中,以Faster-RCNN為例,有兩處使用NMS,第一處是在訓練的時候,利用 ProposalCreator 來生成 proposal 的時候,因為只需要一部分 proposal,所以利用NMS進行篩選。第二處使用是在預測的時候,當得到300個分類與坐標偏移結果的時候,需要對每個類別逐一進行非極大值抑制。那為什么對于每個類別不直接取置信度最高的那一個作為最終的預測呢?因為一張圖中某個類別可能不止一個,例如一張圖中有多個人,直接取最高置信度的只能預測其中的一個人,而通過NMS理想情況下可以使得每個人(每類中的每個個體)都會有且僅有一個 bounding box 框。🌺
在一階段目標檢測算法中,以YOLOv5為例,輸入一張640*640的圖像,NMS之前會產生(80*80+40*40+20*20)*3=25200個目標框,這些框都有相應的分類置信度,當置信度滿足正樣本條件時(比如100個框,這些框密集的分布在目標周圍),被送入NMS,NMS后會產生個數位個目標框(比如7個),如下圖所示。👇
目標檢測中應用NMS算法的主要目的是消除多余(交叉重復)的窗口,找到最佳物體檢測位置。由于目標在圖像中的形狀和大小可能是各種各樣的,所以為了能夠較好地在圖像中檢測這些目標,通常會設計生成數量眾多、長寬各異的候選邊界框。但是對于一個目標檢測任務來說,理想的情況是一個,所以目標只需輸出一個最準確的邊界框即可。💞
🚀3.NMS算法實現
為了從多個候選邊界框中選擇一個最佳邊界框,通常會使用非極大值抑制(NMS)算法,這種算法用于“抑制”置信度低的邊界框并只保留置信度最高的邊界框。🌿
算法的實現過程為:
輸入: 候選邊界框集合B(每個候選框都有一個置信度)、IoU閾值N
輸出: 最終的邊界框集合D(初始為空集合)
1. 對集合B根據置信度進行降序排序;
2. 從集合B中選擇第一個候選框(置信度最高),把它放入集合D中并從集合B中刪除;
3. 遍歷集合B中的每個候選框,計算它們與D集合中這個候選框的IoU值。如果IoU值大于閾值N, 則把它從集合B中刪除;
4. 重復步驟2~3直到集合B為空。
🚀4.YOLOv5中的NMS
YOLOv5的通用工具類中有一段核心代碼是處理后處理的NMS(非極大值抑制)部分。NMS是一種用于去除重疊較多的邊界框的算法,以篩選出最準確的目標框。🐳
下面就對YOLOv5的NMS進行詳解。🍎 🍏 ?🍒
NMS的主要思路是通過計算目標框之間的重疊度(即IOU,交并比),并選擇IOU較低的目標框保留下來。YOLOv5的NMS代碼使用了一個循環來遍歷所有的預測框,并進行判斷和篩選。🌴
首先,通過設定置信度閾值和IOU閾值,將預測框中置信度低于閾值的框過濾掉,只保留置信度高的框。
接著,對剩下的框按照置信度進行降序排序,確保置信度高的框排在前面。
然后,從置信度最高的框開始,與其余框逐一計算IOU。如果某個框的IOU高于設定的IOU閾值,則將其刪除,否則保留。
最后,重復上述步驟,直到遍歷完所有的預測框,并得到最終篩選出來的目標框。
以上就是YOLOv5的NMS的主要講解。這段代碼的作用是在目標檢測過程中,根據置信度和IOU閾值對預測框進行篩選,以得到準確的目標框。📚
名詞解釋:
置信度:置信度是介于0-1(或100%)之間的數字,它描述模型認為此預測邊界框包含某類別目標的概率。
IoU(Intersection over Union,IoU):即兩個邊界框相交面積與相并面積的比值,邊界框的準確度可以用IoU進行表示;一般約定,在檢測中,IOU>0.5,則認為檢測正確,一般閾值設為0.5。