FaceMatcher.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var FaceMatch_1 = require("../classes/FaceMatch");
  4. var LabeledFaceDescriptors_1 = require("../classes/LabeledFaceDescriptors");
  5. var euclideanDistance_1 = require("../euclideanDistance");
  6. var FaceMatcher = /** @class */ (function () {
  7. function FaceMatcher(inputs, distanceThreshold) {
  8. if (distanceThreshold === void 0) { distanceThreshold = 0.6; }
  9. this._distanceThreshold = distanceThreshold;
  10. var inputArray = Array.isArray(inputs) ? inputs : [inputs];
  11. if (!inputArray.length) {
  12. throw new Error("FaceRecognizer.constructor - expected atleast one input");
  13. }
  14. var count = 1;
  15. var createUniqueLabel = function () { return "person " + count++; };
  16. this._labeledDescriptors = inputArray.map(function (desc) {
  17. if (desc instanceof LabeledFaceDescriptors_1.LabeledFaceDescriptors) {
  18. return desc;
  19. }
  20. if (desc instanceof Float32Array) {
  21. return new LabeledFaceDescriptors_1.LabeledFaceDescriptors(createUniqueLabel(), [desc]);
  22. }
  23. if (desc.descriptor && desc.descriptor instanceof Float32Array) {
  24. return new LabeledFaceDescriptors_1.LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor]);
  25. }
  26. throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array | Array<LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array>");
  27. });
  28. }
  29. Object.defineProperty(FaceMatcher.prototype, "labeledDescriptors", {
  30. get: function () { return this._labeledDescriptors; },
  31. enumerable: true,
  32. configurable: true
  33. });
  34. Object.defineProperty(FaceMatcher.prototype, "distanceThreshold", {
  35. get: function () { return this._distanceThreshold; },
  36. enumerable: true,
  37. configurable: true
  38. });
  39. FaceMatcher.prototype.computeMeanDistance = function (queryDescriptor, descriptors) {
  40. return descriptors
  41. .map(function (d) { return euclideanDistance_1.euclideanDistance(d, queryDescriptor); })
  42. .reduce(function (d1, d2) { return d1 + d2; }, 0)
  43. / (descriptors.length || 1);
  44. };
  45. FaceMatcher.prototype.matchDescriptor = function (queryDescriptor) {
  46. var _this = this;
  47. return this.labeledDescriptors
  48. .map(function (_a) {
  49. var descriptors = _a.descriptors, label = _a.label;
  50. return new FaceMatch_1.FaceMatch(label, _this.computeMeanDistance(queryDescriptor, descriptors));
  51. })
  52. .reduce(function (best, curr) { return best.distance < curr.distance ? best : curr; });
  53. };
  54. FaceMatcher.prototype.findBestMatch = function (queryDescriptor) {
  55. var bestMatch = this.matchDescriptor(queryDescriptor);
  56. return bestMatch.distance < this.distanceThreshold
  57. ? bestMatch
  58. : new FaceMatch_1.FaceMatch('unknown', bestMatch.distance);
  59. };
  60. FaceMatcher.prototype.toJSON = function () {
  61. return {
  62. distanceThreshold: this.distanceThreshold,
  63. labeledDescriptors: this.labeledDescriptors.map(function (ld) { return ld.toJSON(); })
  64. };
  65. };
  66. FaceMatcher.fromJSON = function (json) {
  67. var labeledDescriptors = json.labeledDescriptors
  68. .map(function (ld) { return LabeledFaceDescriptors_1.LabeledFaceDescriptors.fromJSON(ld); });
  69. return new FaceMatcher(labeledDescriptors, json.distanceThreshold);
  70. };
  71. return FaceMatcher;
  72. }());
  73. exports.FaceMatcher = FaceMatcher;
  74. //# sourceMappingURL=FaceMatcher.js.map