上一章提到不管是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演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...