sustaining_gazes/matlab_version/face_detection/face_detection_yu/face_detect_64/nms_face.m

75 lines
1.8 KiB
Matlab

function top = nms_face(boxes,overlap)
% Non-maximum suppression.
% Greedily select high-scoring detections and skip detections
% that are significantly covered by a previously selected detection.
if nargin < 2
overlap = 0.5;
end
N = length(boxes);
if isempty(boxes)
top = [];
else
numpart = size(boxes(1).xy,1);
% throw away boxes with low score if there are too many candidates
if N > 30000
s = [boxes.s];
[vals, I] = sort(s);
boxes = boxes(I(end-29999:end));
end
N = min(30000,N);
x1 = zeros(N,1);
y1 = zeros(N,1);
x2 = zeros(N,1);
y2 = zeros(N,1);
area = zeros(N,1);
for nb = 1:N
if numpart==1
x1(nb) = boxes(nb).xy(1);
y1(nb) = boxes(nb).xy(2);
x2(nb) = boxes(nb).xy(3);
y2(nb) = boxes(nb).xy(4);
else
x1(nb) = min(boxes(nb).xy(:,1));
y1(nb) = min(boxes(nb).xy(:,2));
x2(nb) = max(boxes(nb).xy(:,3));
y2(nb) = max(boxes(nb).xy(:,4));
end
area(nb) = (x2(nb)-x1(nb)+1) * (y2(nb)-y1(nb)+1);
end
s = [boxes.s];
[vals, I] = sort(s);
pick = [];
while ~isempty(I)
last = length(I);
i = I(last);
pick = [pick; i];
suppress = [last];
j = I(1:last-1);
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;
w(w<0) = 0;
h = yy2-yy1+1;
h(h<0) = 0;
inter = w.*h;
o1 = inter ./ area(j);
o2 = inter / area(i);
idx = (find((o1 > overlap) | (o2 > overlap)));
suppress = [suppress ; idx];
I(suppress) = [];
end
top = boxes(pick);
end