nonMaxSupp.m 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. function [top, pick] = nonMaxSupp(boxes,overlap,numpart)
  2. % Non-maximum suppression.
  3. % Greedily select high-scoring detections and skip detections
  4. % that are significantly covered by a previously selected detection.
  5. pick=[];
  6. if nargin < 2
  7. overlap = 0.5;
  8. end
  9. if nargin < 3
  10. numpart = floor(size(boxes,2)/4);
  11. end
  12. if isempty(boxes)
  13. top = [];
  14. else
  15. x1 = zeros(size(boxes,1),numpart);
  16. y1 = zeros(size(boxes,1),numpart);
  17. x2 = zeros(size(boxes,1),numpart);
  18. y2 = zeros(size(boxes,1),numpart);
  19. area = zeros(size(boxes,1),numpart);
  20. for p = 1:numpart
  21. x1(:,p) = boxes(:,1+(p-1)*4);
  22. y1(:,p) = boxes(:,2+(p-1)*4);
  23. x2(:,p) = boxes(:,3+(p-1)*4);
  24. y2(:,p) = boxes(:,4+(p-1)*4);
  25. area(:,p) = (x2(:,p)-x1(:,p)+1) .* (y2(:,p)-y1(:,p)+1);
  26. end
  27. s = boxes(:,5);
  28. [vals, I] = sort(s);
  29. pick = [];
  30. while ~isempty(I)
  31. last = length(I);
  32. i = I(last);
  33. %similar=find(abs(s(I)-s(i))<1e-5);
  34. %[m,i]=max(area(I(similar)));
  35. %i=I(similar(i));
  36. %disp('here');
  37. %pause;
  38. pick = [pick; i];
  39. xx1 = bsxfun(@max,x1(i,:), x1(I,:));
  40. yy1 = bsxfun(@max,y1(i,:), y1(I,:));
  41. xx2 = bsxfun(@min,x2(i,:), x2(I,:));
  42. yy2 = bsxfun(@min,y2(i,:), y2(I,:));
  43. w = xx2-xx1+1;
  44. w(w<0) = 0;
  45. h = yy2-yy1+1;
  46. h(h<0) = 0;
  47. inter = sum(w.*h,2);
  48. o = double(inter) ./double(sum(area(I,:),2));
  49. I(o > overlap) = [];
  50. end
  51. top = boxes(pick,:);
  52. end