非極大值抑制(nms)
非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後,每個視窗都會得到乙個分數。但是滑動視窗會導致很多視窗與其他視窗存在包含或者大部分交叉的情況。這時就需要用到nms來選取那些鄰域裡分數最高(是行人的概率最大),並且抑制那些分數低的視窗。
**如下
[plain]view plain
copy
function pick = nms(boxes, overlap)
% pick = nms(boxes,overlap)
% non-maximumsuppression.
% greedily selecthigh-scoring detections and skip detections
% that are significantlycovered by a previously selected detection.
% boxes = boxes';
if isempty(boxes)
pick = ;
else
x1 = boxes(:,1);
y1 = boxes(:,2);
x2 = boxes(:,3);
y2 = boxes(:,4);
% x1 = boxes(:,1);
% y1 = boxes(:,2);
% x2 = boxes(:,2);
% y2 = boxes(:,4);
s = boxes(:,end);
area = (x2-x1+1) .* (y2-y1+1);%çó³öëùóðãæ»ý
[vals, i] = sort(s);
pick = ;
while ~isempty(i)
last = length(i);
i = i(last);
pick = [pick; i];
suppress = [last];
for pos = 1:last-1
j = i(pos);
xx1 = max(x1(i), x1(j));
yy1 = max(y1(i), y1(j));
xx2 = min(x2(i), x2(j));
yy2 = min(y2(i), y2(j));
w = xx2-xx1+1;
h = yy2-yy1+1;
if w > 0 && h > 0
% compute overlap
o = w * h / min(area(i),area(j));
% o = w/area(j);
if o > overlap
suppress = [suppress; pos];
end
end
end
i(suppress) = ;
end
end
輸入的視窗的位置和分數,以及視窗面積交叉是多大比例進行抑制。boxes應當是n*5的矩陣,一行代表著乙個視窗,包括[x,y,width,height ,score ],overlap是介於0~1的實數。輸出的是區域性分數最大的視窗序號序列。
程式解讀:首先計算出所有視窗的面積,對所有視窗的分數進行從小到大排序取出最高分數的序號。迴圈計算1到次高分數視窗與最高分數視窗的交叉面積與兩者間最小面積的比例,若超過overlap那麼把這一視窗抑制了。交叉面積怎麼計算呢?如下圖對應於程式
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...
NMS非極大值抑制
非極大值抑制演算法 non maximum suppression for object detection in python 非極大值抑制演算法 nms 非極大值抑制 矩形框融合 nms 卷積網路改進實現 筆記 人臉檢測視窗選擇辦法 nms convnet 開源 如何用soft nms實現目標檢...
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...