UNPKG

face-api.js

Version:

JavaScript API for face detection and face recognition in the browser with tensorflow.js

72 lines 3.55 kB
import { FaceMatch } from '../classes/FaceMatch'; import { LabeledFaceDescriptors } from '../classes/LabeledFaceDescriptors'; import { euclideanDistance } from '../euclideanDistance'; var FaceMatcher = /** @class */ (function () { function FaceMatcher(inputs, distanceThreshold) { if (distanceThreshold === void 0) { distanceThreshold = 0.6; } this._distanceThreshold = distanceThreshold; var inputArray = Array.isArray(inputs) ? inputs : [inputs]; if (!inputArray.length) { throw new Error("FaceRecognizer.constructor - expected atleast one input"); } var count = 1; var createUniqueLabel = function () { return "person " + count++; }; this._labeledDescriptors = inputArray.map(function (desc) { if (desc instanceof LabeledFaceDescriptors) { return desc; } if (desc instanceof Float32Array) { return new LabeledFaceDescriptors(createUniqueLabel(), [desc]); } if (desc.descriptor && desc.descriptor instanceof Float32Array) { return new LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor]); } throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array | Array<LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array>"); }); } Object.defineProperty(FaceMatcher.prototype, "labeledDescriptors", { get: function () { return this._labeledDescriptors; }, enumerable: true, configurable: true }); Object.defineProperty(FaceMatcher.prototype, "distanceThreshold", { get: function () { return this._distanceThreshold; }, enumerable: true, configurable: true }); FaceMatcher.prototype.computeMeanDistance = function (queryDescriptor, descriptors) { return descriptors .map(function (d) { return euclideanDistance(d, queryDescriptor); }) .reduce(function (d1, d2) { return d1 + d2; }, 0) / (descriptors.length || 1); }; FaceMatcher.prototype.matchDescriptor = function (queryDescriptor) { var _this = this; return this.labeledDescriptors .map(function (_a) { var descriptors = _a.descriptors, label = _a.label; return new FaceMatch(label, _this.computeMeanDistance(queryDescriptor, descriptors)); }) .reduce(function (best, curr) { return best.distance < curr.distance ? best : curr; }); }; FaceMatcher.prototype.findBestMatch = function (queryDescriptor) { var bestMatch = this.matchDescriptor(queryDescriptor); return bestMatch.distance < this.distanceThreshold ? bestMatch : new FaceMatch('unknown', bestMatch.distance); }; FaceMatcher.prototype.toJSON = function () { return { distanceThreshold: this.distanceThreshold, labeledDescriptors: this.labeledDescriptors.map(function (ld) { return ld.toJSON(); }) }; }; FaceMatcher.fromJSON = function (json) { var labeledDescriptors = json.labeledDescriptors .map(function (ld) { return LabeledFaceDescriptors.fromJSON(ld); }); return new FaceMatcher(labeledDescriptors, json.distanceThreshold); }; return FaceMatcher; }()); export { FaceMatcher }; //# sourceMappingURL=FaceMatcher.js.map