一. 引入NMS
在R-CNN中對於2000多個region proposals得到特征向量(4096維)后,輸入到SVM中進行打分(score)。除了背景以外VOC數據集共有20類。那么2000*4096維特征矩陣與20個SVM組成的權重矩陣4096*20相乘得到結果為2000*20維矩陣。這個矩陣2000行表示有2000個框。20列為每一個框屬於這20個類的score(置信度)。也就是說每一列即每一類有2000個不同的分值。那么每一類有這么多候選框肯定大多冗余。所以需要利用非極大值抑制方法進行刪除重疊候選框。
NMS算法的輸入:2000個候選框的位置坐標(兩個頂點的x,y坐標,共4個值)、score分數值(置信度)。
NMS算法的輸出:所有滿足篩選條件的建議框(可能不止一個)。
NMS算法的大致思想:對於有重疊的候選框:若大於規定閾值(某一提前設定的置信度)則刪除,低於閾值的保留。
對於無重疊的候選框:都保留。
二. 算法實現
nms.m
function pick = nms(boxes, overlap) % pick = nms(boxes, overlap) 輸入: boxes為所有候選框的左下角和右上角x,y坐標。overlap為事先人為設定的閾值。 % Non-maximum suppression. 輸出: pick,即所有保留下來的框 % Greedily select high-scoring detections and skip detections % that are significantly covered by a previously selected detection. if isempty(boxes) pick = []; else x1 = boxes(:,1); %所有候選框的左下角頂點x y1 = boxes(:,2); %所有候選框的左下角頂點y x2 = boxes(:,3); %所有候選框的右上角頂點x y2 = boxes(:,4); %所有候選框的右上角頂點y s = boxes(:,end); %所有候選框的置信度,可以包含1列或者多列,用於表示不同准則的置信度 area = (x2-x1+1) .* (y2-y1+1); %所有候選框的面積 [vals, I] = sort(s); %將所有候選框進行從小到大排序,vals為排序后結果,I為排序后標簽 pick = []; while ~isempty(I) last = length(I); %last代表標簽I的長度,即最后一個元素的位置,(matlab矩陣從1開始計數) i = I(last); %所有候選框的中置信度最高的那個的標簽賦值給i pick = [pick; i]; %將i存入pick中,pick保存輸出的NMS處理后的box的序號,即保存最后結果 suppress = [last]; %將I中最大置信度的標簽在I中位置賦值給suppress,suppress作用為類似打標志, for pos = 1:last-1 %從1到倒數第二個進行循環 j = I(pos); %得到pos位置的標簽,賦值給j xx1 = max(x1(i), x1(j));%左上角最大的x(求兩個方框的公共區域) yy1 = max(y1(i), y1(j));%左上角最大的y xx2 = min(x2(i), x2(j));%右下角最小的x yy2 = min(y2(i), y2(j));%右下角最小的y w = xx2-xx1+1; %公共區域的寬度 h = yy2-yy1+1; %公共區域的高度 if w > 0 && h > 0 %w,h全部>0,證明2個候選框相交 o = w * h / area(j);%計算overlap比值,即交集占候選框j的面積比例 if o > overlap %如果大於設置的閾值就去掉候選框j,因為候選框i的置信度最高 suppress = [suppress; pos]; %大於規定閾值就加入到suppress,即待刪除的框 end end end I(suppress) = [];%將待刪除的框刪除,I中剩余未處理的框。當I為空結束循環 end end
nms_draw.m
boxes=[200,200,400,400,0.99; 220,220,420,420,0.9; 100,100,150,150,0.82; 200,240,400,440,0.5; 150,250,300,400,0.88]; overlap=0.8; # 設置好的閾值 pick = nms(boxes, overlap); figure; for i=1:size(boxes,1) rectangle('Position',[boxes(i,1),boxes(i,2),boxes(i,3)-boxes(i,1),boxes(i,4)-boxes(i,2)],'EdgeColor','y','LineWidth',6); text(boxes(i,1),boxes(i,2),num2str(boxes(i,5)),'FontSize',14,'color','b'); end for i=1:size(pick,1) rectangle('Position',[boxes(pick(i),1),boxes(pick(i),2),boxes(pick(i),3)-boxes(pick(i),1),boxes(pick(i),4)-boxes(pick(i),2)],'EdgeColor','r','LineWidth',2); end axis([0 600 0 600]);
結果:
可以看到:置信度為0.99的框保留下來是因為其置信度最高。第一次迭代時就已經存入了pick數組中。
置信度為0.88的框保留下來是因為其與0.99的框交並比IOU < overlap = 0.8
置信度為0.82的框保留下來是因為其與任何框都無重疊。
注意此時經過NMS后,每類別還可能會剩余不止一個的候選框。而對於圖像中的每個類別我們只需一個候選框即可。所以還有后續處理。
后續:R-CNN分別用20個回歸器對上述20個類別中剩余的候選框進行回歸操作。最終得到每個類別修正后的得分最高的bounding box。
Reference: