nonMaxSuppression.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. function nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {
  4. var numBoxes = boxes.shape[0];
  5. var outputSize = Math.min(maxOutputSize, numBoxes);
  6. var candidates = scores
  7. .map(function (score, boxIndex) { return ({ score: score, boxIndex: boxIndex }); })
  8. .filter(function (c) { return c.score > scoreThreshold; })
  9. .sort(function (c1, c2) { return c2.score - c1.score; });
  10. var suppressFunc = function (x) { return x <= iouThreshold ? 1 : 0; };
  11. var selected = [];
  12. candidates.forEach(function (c) {
  13. if (selected.length >= outputSize) {
  14. return;
  15. }
  16. var originalScore = c.score;
  17. for (var j = selected.length - 1; j >= 0; --j) {
  18. var iou = IOU(boxes, c.boxIndex, selected[j]);
  19. if (iou === 0.0) {
  20. continue;
  21. }
  22. c.score *= suppressFunc(iou);
  23. if (c.score <= scoreThreshold) {
  24. break;
  25. }
  26. }
  27. if (originalScore === c.score) {
  28. selected.push(c.boxIndex);
  29. }
  30. });
  31. return selected;
  32. }
  33. exports.nonMaxSuppression = nonMaxSuppression;
  34. function IOU(boxes, i, j) {
  35. var boxesData = boxes.arraySync();
  36. var yminI = Math.min(boxesData[i][0], boxesData[i][2]);
  37. var xminI = Math.min(boxesData[i][1], boxesData[i][3]);
  38. var ymaxI = Math.max(boxesData[i][0], boxesData[i][2]);
  39. var xmaxI = Math.max(boxesData[i][1], boxesData[i][3]);
  40. var yminJ = Math.min(boxesData[j][0], boxesData[j][2]);
  41. var xminJ = Math.min(boxesData[j][1], boxesData[j][3]);
  42. var ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]);
  43. var xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]);
  44. var areaI = (ymaxI - yminI) * (xmaxI - xminI);
  45. var areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);
  46. if (areaI <= 0 || areaJ <= 0) {
  47. return 0.0;
  48. }
  49. var intersectionYmin = Math.max(yminI, yminJ);
  50. var intersectionXmin = Math.max(xminI, xminJ);
  51. var intersectionYmax = Math.min(ymaxI, ymaxJ);
  52. var intersectionXmax = Math.min(xmaxI, xmaxJ);
  53. var intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) *
  54. Math.max(intersectionXmax - intersectionXmin, 0.0);
  55. return intersectionArea / (areaI + areaJ - intersectionArea);
  56. }
  57. //# sourceMappingURL=nonMaxSuppression.js.map