NMS演算法的理解

2021-08-10 14:21:05 字數 2052 閱讀 8149

nonmaximumsuppression 非極大值抑制

當**網路**出bbox的位置之後,一定會產生很多種可能。每乙個bbox包括位置資訊和置信度(概率),這個時候就需要根據nms的來排除掉一些冗餘的bbox。

例如,人臉檢測演算法得到了8個人臉檢測框,這8個檢測框中明顯是由兩個人同時有兩個框的,這樣就產生了冗餘,需要利用nms將這些多餘的框去掉。

//人臉檢測結果資料結構bbox

typedef struct facerect facerect;

排序:

// compare score

bool comparebbox(const faceinfo & a, const faceinfo & b)

nms**:

std::vector

nonmaximumsuppression(std::vector

& bboxes,

float thresh,char methodtype)

bboxes_nms.push_back(bboxes[select_idx]);

mask_merged[select_idx] = 1;

facerect select_bbox = bboxes[select_idx].bbox;

float area1 = static_cast

((select_bbox.x2-select_bbox.x1+1) * (select_bbox.y2-select_bbox.y1+1));

float x1 = static_cast

(select_bbox.x1);

float y1 = static_cast

(select_bbox.y1);

float x2 = static_cast

(select_bbox.x2);

float y2 = static_cast

(select_bbox.y2);

select_idx++;

for (int32_t i = select_idx; i < num_bbox; i++) }}

return bboxes_nms;

}

大體思路首先對8個bbox進行降序排列,排序的依據就是bbox.score的值,從大到小依次排好。

std:

:sort(bboxes.begin(), bboxes.end(), comparebbox);//按照score降序排列

分數最高的肯定是要保留下來的

bboxes_nms.push_back(bboxes[select_idx]);//最初select_idx = 0
然後進行乙個 (人臉數 -1)次的迴圈,依次判斷後續的人臉的和第乙個人臉的iou,如果大於閾值,那麼就將這個人臉pass掉,如果後面的人臉和第乙個人臉的iou為0那麼就跳過,先不處理。

if (static_cast

(area_intersect) / (area1 + area2 - area_intersect) > thresh)

mask_merged[i] = 1;//這裡利用mesk_merged做標記,標記為1的證明大於閾值,需要排除

依次迴圈判斷,最後將冗餘的框排除。

但是nms在目標檢測的有些時候會影響到一定的召回率,例如下面這種情況

有一篇**專門針對nms進行了優化,稱之為soft-nms。下篇文章再總結下soft-nms

實現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 非極大值抑制演算法的理解

一 概念 在目標檢測中,得到多個候選框及其置信度得分。非極大值抑制演算法 nms 對多個候選框,去除重合率大的冗餘候選框,得到最具代表性的結果,以加快目標檢測的效率。二 例項 以下圖人臉檢測為例,目標 消除重合率大且多餘的候選框,保留某個區域的乙個最優的候選框。非極大值抑制演算法 nms 抑制冗餘的...