從NMS談起 自適應非極大值抑制演算法(ANMS)

2021-08-09 07:18:36 字數 1709 閱讀 1069

上一章提到不管是nms還是bucketing的方法都無法獲得最優的關鍵點空間分布。前者在視窗內避免了關鍵點的聚集效應,但是無法保證全域性的均勻分布;後者能保證全域性大概均勻分布,但是無法保證區域性不聚集(當然目前的實現中往往opencv已經做了3x3的nms,但是這種視窗的大小無法保證真正意義上的不聚集)。更大的問題是這這兩種演算法都有一些超引數需要手動調整,導致適用的場景有一定的限制。

為解決這一問題,matthew brown在**multi-image matching using multi-scale oriented patches提出了自適應非極大值抑制演算法(adaptive non-maximum suppression,anms),實現了特徵點在區域性上的稀疏分布和全域性上的均勻分布。

自適應非極大值抑制演算法基本思想是評估所有候選點的極大區域,並進行排序。

具體來說,就是先選取很多的評分較高的候選點,組成集合s。對s中的每個點x

ix_i

xi​,尋找它的響應能作為區域最大值的區域半徑r

ir_i

ri​,即

r i=

min∣

∣xi−

xj∣∣

,s.t

.res

pons

e(xi

)spon

se(x

j),x

j∈sr_i =min||x_i-x_j||,s.t.response(x_i)ri

​=mi

n∣∣x

i​−x

j​∣∣

,s.t

.res

pons

e(xi

​)spon

se(x

j​),

xj​∈

s將找到的r

ir_i

ri​降序排列。選取前n個元素對應的點,即為自適應非極大值濾波後得到的關鍵點。

演算法效果如圖:

過濾前

過濾後

有興趣的話可以與上一章中的nms和bucketing的結果進行對比。

double computer(point2i x1, point2i x2)
template < typename t>

vector< size_t> sort_indexes(const vector< t> & v) );

return idx;

}vectoranms(const std::vector& kpts,int num = 500)

auto max_response = maxmum*0.9;

for (size_t i = 0; i < sz; i++)

else

}} }

auto sorted = sort_indexes(raduis);

vectorrpts;

for (size_t i = 0; i < num; i++)

return std::move(rpts);

}

非極大值抑制(NMS)

非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...

NMS非極大值抑制

非極大值抑制演算法 non maximum suppression for object detection in python 非極大值抑制演算法 nms 非極大值抑制 矩形框融合 nms 卷積網路改進實現 筆記 人臉檢測視窗選擇辦法 nms convnet 開源 如何用soft nms實現目標檢...

非極大值抑制(NMS)

非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...