123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 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
|