NMS、Soft-NMS、Softer-NMS
NMS
NMS 顧名思義,非極大值抑制,也就是把極值周圍的給抑制掉,不輸出。在深度學習中叫去重,只保留最可靠的那個輸出。
首先定義一個相似度,深度學習中用IOU表示兩個框的相似度。
步驟:
1、取分值最大的框。
2、將IOU大于閾值(0.5)的框抑制掉。
3、取剩下框分值最大的框,循環步驟1、2。
很簡單,是不是!
代碼:
def NMS(boxes, scores, th):x1 = boxes[:,0]y1 = boxes[:,1]x2 = boxes[:,2]y2 = boxes[:,3]box_erea = (y2 - y1) * (x2 - x1)orders = scores.argsort()[::-1] ## 取逆序print(orders)keep = []print(orders.size)while orders.size > 0:item = orders[0]keep.append(item)cur_box = boxes[item]ix1 = np.maximum(cur_box[0], x1[orders[1:]]) iy1 = np.maximum(cur_box[1], y1[orders[1:]]) ix2 = np.minimum(cur_box[2], x2[orders[1:]]) iy2 = np.minimum(cur_box[3], y2[orders[1:]])iners = np.maximum(ix2 - ix1 + 1, 0.) * np.maximum(iy2 - iy1 + 1, 0.)unions = (box_erea[orders[1:]] + box_erea[item]) - inersious = iners / unionstemp = np.where(ious < th)[0]orders = orders[temp + 1]return keep代碼解析:
1、先計算所有框的面積
2、分值降序排序,得到一個位置序列
3、循環:如果序列(N個值)不空:
取最大分值框,id對應第0個位置。
取所有剩余的框,id對應第0個位置之后。
剩余框(N-1個值)和最大分值框求IOU(N-1 個 IOU)
保留(N-1個)剩余框中對應IOU小于閾值的框的序列編號。作為新的序列。
注意事項:
temp = np.where(ious < th)[0]
orders = orders[temp + 1]
因為 temp 對應的是(N-1個)剩余框的位置,要取原序列(N個值)對應的位置,所以temp 對應的位置要加1。
np.max() 求最大值
np.minimum(array, a)array 和 a 逐個比較取最大。
Soft-NMS
顧名思義,柔和的NMS。也就是不會立馬斬殺,而是降低分值待考察。為的就是防止漏檢。
怎么降低score呢?有很多種方式,
1、IOU線性抑制
2、IOU 高斯抑制
抑制死亡閾值: th = 0.001 , 未達到死亡閾值,仍可保留。
Softer-NMS
主要用在:
NMS時用到的score僅僅是分類置信度得分,不能反映Bounding box的定位精準度,既分類置信度和定位置信非正相關的。
基于soft-NMS,對預測標注方差范圍內的候選框加權平均,使得高定位置信度的bounding box具有較高的分類置信度。
其實很簡單,預測的四個頂點坐標,分別對IoU>Nt的預測加權平均計算,得到新的4個坐標點。
總結
以上是生活随笔為你收集整理的NMS、Soft-NMS、Softer-NMS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Opencv Python:图片与视频互
- 下一篇: GD32系列总结 - systick介绍