UNPKG

ngx-face-api-js

Version:

Angular directives for face detection and face recognition in the browser. It is a wrapper for face-api.js, so it is not dependent on the browser implementation.

184 lines 16.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import * as faceapi from 'face-api.js'; var DetectTask = /** @class */ (function () { function DetectTask(option) { var _this = this; this.type = option.type; this.tokens = option.tokens; this.realtime = option.realtime || false; this.target = new Promise((/** * @param {?} resolver * @return {?} */ function (resolver) { return (_this.targetResolver = resolver); })); } Object.defineProperty(DetectTask.prototype, "resolveTarget", { get: /** * @return {?} */ function () { return this.targetResolver; }, enumerable: true, configurable: true }); /** * @private * @param {?} patten * @param {?} target * @return {?} */ DetectTask.prototype.isMatchPattern = /** * @private * @param {?} patten * @param {?} target * @return {?} */ function (patten, target) { return patten.every((/** * @param {?} item * @return {?} */ function (item) { return target.includes(item); })); }; /** * @template THIS * @this {THIS} * @param {...?} tokens * @return {THIS} */ DetectTask.prototype.with = /** * @template THIS * @this {THIS} * @param {...?} tokens * @return {THIS} */ function () { var tokens = []; for (var _i = 0; _i < arguments.length; _i++) { tokens[_i] = arguments[_i]; } var _a; (_a = (/** @type {?} */ (this)).tokens).push.apply(_a, tslib_1.__spread(tokens)); return (/** @type {?} */ (this)); }; /** * @param {?=} option * @return {?} */ DetectTask.prototype.detect = /** * @param {?=} option * @return {?} */ function (option) { return tslib_1.__awaiter(this, void 0, void 0, function () { var t, _a, _b, _c, _d; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: if (!(this.type === 'all')) return [3 /*break*/, 2]; _b = (_a = faceapi).detectAllFaces; return [4 /*yield*/, this.target]; case 1: t = _b.apply(_a, [_e.sent(), option || undefined]); return [3 /*break*/, 4]; case 2: _d = (_c = faceapi).detectSingleFace; return [4 /*yield*/, this.target]; case 3: t = _d.apply(_c, [_e.sent(), option || undefined]); _e.label = 4; case 4: if (this.isMatchPattern(['expressions', 'landmarks', 'ageAndGender', 'descriptors'], this.tokens)) { if (t instanceof faceapi.DetectSingleFaceTask) { return [2 /*return*/, t .withFaceLandmarks() .withFaceExpressions() .withAgeAndGender() .withFaceDescriptor() .run()]; } else if (t instanceof faceapi.DetectAllFacesTask) { return [2 /*return*/, t .withFaceLandmarks() .withFaceExpressions() .withAgeAndGender() .withFaceDescriptors() .run()]; } } else if (this.isMatchPattern(['expressions', 'landmarks', 'descriptors'], this.tokens)) { if (t instanceof faceapi.DetectSingleFaceTask) { return [2 /*return*/, t .withFaceLandmarks() .withFaceExpressions() .withFaceDescriptor() .run()]; } else if (t instanceof faceapi.DetectAllFacesTask) { return [2 /*return*/, t .withFaceLandmarks() .withFaceExpressions() .withFaceDescriptors() .run()]; } } else if (this.isMatchPattern(['expressions', 'landmarks', 'ageAndGender'], this.tokens)) { return [2 /*return*/, t .withFaceLandmarks() .withFaceExpressions() .withAgeAndGender() .run()]; } else if (this.isMatchPattern(['expressions', 'landmarks'], this.tokens)) { return [2 /*return*/, t .withFaceLandmarks() .withFaceExpressions() .run()]; } else if (this.isMatchPattern(['expressions', 'ageAndGender'], this.tokens)) { return [2 /*return*/, t .withFaceExpressions() .withAgeAndGender() .run()]; } else if (this.isMatchPattern(['expressions'], this.tokens)) { return [2 /*return*/, t.withFaceExpressions().run()]; } else if (this.isMatchPattern(['landmarks', 'ageAndGender'], this.tokens)) { return [2 /*return*/, t .withFaceLandmarks() .withAgeAndGender() .run()]; } else if (this.isMatchPattern(['landmarks'], this.tokens)) { return [2 /*return*/, t.withFaceLandmarks().run()]; } return [2 /*return*/, t.run()]; } }); }); }; return DetectTask; }()); export { DetectTask }; if (false) { /** @type {?} */ DetectTask.prototype.type; /** @type {?} */ DetectTask.prototype.tokens; /** @type {?} */ DetectTask.prototype.realtime; /** @type {?} */ DetectTask.prototype.target; /** * @type {?} * @private */ DetectTask.prototype.targetResolver; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGV0ZWN0VGFzay5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mYWNlLWFwaS1qcy8iLCJzb3VyY2VzIjpbImxpYi9jbGFzc2VzL0RldGVjdFRhc2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGFBQWEsQ0FBQztBQUl2QztJQVdFLG9CQUFZLE1BSVg7UUFKRCxpQkFXQztRQU5DLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTzs7OztRQUN2QixVQUFBLFFBQVEsSUFBSSxPQUFBLENBQUMsS0FBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsRUFBaEMsQ0FBZ0MsRUFDN0MsQ0FBQztJQUNKLENBQUM7SUFyQkQsc0JBQVcscUNBQWE7Ozs7UUFBeEI7WUFHRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0IsQ0FBQzs7O09BQUE7Ozs7Ozs7SUF1Qk8sbUNBQWM7Ozs7OztJQUF0QixVQUF1QixNQUFnQixFQUFFLE1BQWdCO1FBQ3ZELE9BQU8sTUFBTSxDQUFDLEtBQUs7Ozs7UUFBQyxVQUFBLElBQUksSUFBSSxPQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQXJCLENBQXFCLEVBQUMsQ0FBQztJQUNyRCxDQUFDOzs7Ozs7O0lBRU0seUJBQUk7Ozs7OztJQUFYO1FBQVksZ0JBQXlCO2FBQXpCLFVBQXlCLEVBQXpCLHFCQUF5QixFQUF6QixJQUF5QjtZQUF6QiwyQkFBeUI7OztRQUNuQyxDQUFBLEtBQUEsbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxDQUFBLENBQUMsSUFBSSw0QkFBSSxNQUFNLEdBQUU7UUFD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QUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQzVELHNCQUFPLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFDO3lCQUN0Qzs2QkFBTSxJQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUMvRDs0QkFDQSxzQkFBTyxDQUFDO3FDQUNMLGlCQUFpQixFQUFFO3FDQUNuQixnQkFBZ0IsRUFBRTtxQ0FDbEIsR0FBRyxFQUFFLEVBQUM7eUJBQ1Y7NkJBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUMxRCxzQkFBTyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBQzt5QkFDcEM7d0JBQ0Qsc0JBQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFDOzs7O0tBQ2hCO0lBQ0gsaUJBQUM7QUFBRCxDQUFDLEFBMUhELElBMEhDOzs7O0lBbkhDLDBCQUFvQzs7SUFDcEMsNEJBQXVDOztJQUN2Qyw4QkFBa0M7O0lBZWxDLDRCQUE0RDs7Ozs7SUFFNUQsb0NBQTBFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmFjZWFwaSBmcm9tICdmYWNlLWFwaS5qcyc7XG5pbXBvcnQgeyBUYXNrVHlwZVRva2VuIH0gZnJvbSAnLi4vdG9rZW5zL1Rhc2tUeXBlVG9rZW4nO1xuaW1wb3J0IHsgRmVhdHVyZVRva2VuIH0gZnJvbSAnLi4vdG9rZW5zL0ZlYXR1cmVUb2tlbic7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RUYXNrIHtcbiAgcHVibGljIGdldCByZXNvbHZlVGFyZ2V0KCk6IChcbiAgICBlbDogSFRNTEltYWdlRWxlbWVudCB8IEhUTUxWaWRlb0VsZW1lbnQsXG4gICkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0UmVzb2x2ZXI7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogVGFza1R5cGVUb2tlbjtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuczogRmVhdHVyZVRva2VuW107XG4gIHB1YmxpYyByZWFkb25seSByZWFsdGltZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb246IHtcbiAgICB0eXBlOiBUYXNrVHlwZVRva2VuO1xuICAgIHRva2VuczogRmVhdHVyZVRva2VuW107XG4gICAgcmVhbHRpbWU/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdGhpcy50eXBlID0gb3B0aW9uLnR5cGU7XG4gICAgdGhpcy50b2tlbnMgPSBvcHRpb24udG9rZW5zO1xuICAgIHRoaXMucmVhbHRpbWUgPSBvcHRpb24ucmVhbHRpbWUgfHwgZmFsc2U7XG4gICAgdGhpcy50YXJnZXQgPSBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudD4oXG4gICAgICByZXNvbHZlciA9PiAodGhpcy50YXJnZXRSZXNvbHZlciA9IHJlc29sdmVyKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRhcmdldDogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudD47XG5cbiAgcHJpdmF0ZSB0YXJnZXRSZXNvbHZlcjogKGVsOiBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGlzTWF0Y2hQYXR0ZXJuKHBhdHRlbjogc3RyaW5nW10sIHRhcmdldDogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0dGVuLmV2ZXJ5KGl0ZW0gPT4gdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKTtcbiAgfVxuXG4gIHB1YmxpYyB3aXRoKC4uLnRva2VuczogRmVhdHVyZVRva2VuW10pOiB0aGlzIHtcbiAgICB0aGlzLnRva2Vucy5wdXNoKC4uLnRva2Vucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGV0ZWN0KG9wdGlvbj86IGZhY2VhcGkuRmFjZURldGVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCB0OiBmYWNlYXBpLkRldGVjdEFsbEZhY2VzVGFzayB8IGZhY2VhcGkuRGV0ZWN0U2luZ2xlRmFjZVRhc2s7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHQgPSBmYWNlYXBpLmRldGVjdEFsbEZhY2VzKGF3YWl0IHRoaXMudGFyZ2V0LCBvcHRpb24gfHwgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdCA9IGZhY2VhcGkuZGV0ZWN0U2luZ2xlRmFjZShhd2FpdCB0aGlzLnRhcmdldCwgb3B0aW9uIHx8IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc01hdGNoUGF0dGVybihcbiAgICAgICAgWydleHByZXNzaW9ucycsICdsYW5kbWFya3MnLCAnYWdlQW5kR2VuZGVyJywgJ2Rlc2NyaXB0b3JzJ10sXG4gICAgICAgIHRoaXMudG9rZW5zLFxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBmYWNlYXBpLkRldGVjdFNpbmdsZUZhY2VUYXNrKSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgICAgICAgLndpdGhGYWNlTGFuZG1hcmtzKClcbiAgICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgICAgLndpdGhBZ2VBbmRHZW5kZXIoKVxuICAgICAgICAgIC53aXRoRmFjZURlc2NyaXB0b3IoKVxuICAgICAgICAgIC5ydW4oKTtcbiAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIGZhY2VhcGkuRGV0ZWN0QWxsRmFjZXNUYXNrKSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgICAgICAgLndpdGhGYWNlTGFuZG1hcmtzKClcbiAgICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgICAgLndpdGhBZ2VBbmRHZW5kZXIoKVxuICAgICAgICAgIC53aXRoRmFjZURlc2NyaXB0b3JzKClcbiAgICAgICAgICAucnVuKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuaXNNYXRjaFBhdHRlcm4oXG4gICAgICAgIFsnZXhwcmVzc2lvbnMnLCAnbGFuZG1hcmtzJywgJ2Rlc2NyaXB0b3JzJ10sXG4gICAgICAgIHRoaXMudG9rZW5zLFxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBmYWNlYXBpLkRldGVjdFNpbmdsZUZhY2VUYXNrKSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgICAgICAgLndpdGhGYWNlTGFuZG1hcmtzKClcbiAgICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgICAgLndpdGhGYWNlRGVzY3JpcHRvcigpXG4gICAgICAgICAgLnJ1bigpO1xuICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgZmFjZWFwaS5EZXRlY3RBbGxGYWNlc1Rhc2spIHtcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgICAud2l0aEZhY2VMYW5kbWFya3MoKVxuICAgICAgICAgIC53aXRoRmFjZUV4cHJlc3Npb25zKClcbiAgICAgICAgICAud2l0aEZhY2VEZXNjcmlwdG9ycygpXG4gICAgICAgICAgLnJ1bigpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlzTWF0Y2hQYXR0ZXJuKFxuICAgICAgICBbJ2V4cHJlc3Npb25zJywgJ2xhbmRtYXJrcycsICdhZ2VBbmRHZW5kZXInXSxcbiAgICAgICAgdGhpcy50b2tlbnMsXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdFxuICAgICAgICAud2l0aEZhY2VMYW5kbWFya3MoKVxuICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgIC53aXRoQWdlQW5kR2VuZGVyKClcbiAgICAgICAgLnJ1bigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc01hdGNoUGF0dGVybihbJ2V4cHJlc3Npb25zJywgJ2xhbmRtYXJrcyddLCB0aGlzLnRva2VucykpIHtcbiAgICAgIHJldHVybiB0XG4gICAgICAgIC53aXRoRmFjZUxhbmRtYXJrcygpXG4gICAgICAgIC53aXRoRmFjZUV4cHJlc3Npb25zKClcbiAgICAgICAgLnJ1bigpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlzTWF0Y2hQYXR0ZXJuKFsnZXhwcmVzc2lvbnMnLCAnYWdlQW5kR2VuZGVyJ10sIHRoaXMudG9rZW5zKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRcbiAgICAgICAgLndpdGhGYWNlRXhwcmVzc2lvbnMoKVxuICAgICAgICAud2l0aEFnZUFuZEdlbmRlcigpXG4gICAgICAgIC5ydW4oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNNYXRjaFBhdHRlcm4oWydleHByZXNzaW9ucyddLCB0aGlzLnRva2VucykpIHtcbiAgICAgIHJldHVybiB0LndpdGhGYWNlRXhwcmVzc2lvbnMoKS5ydW4oKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5pc01hdGNoUGF0dGVybihbJ2xhbmRtYXJrcycsICdhZ2VBbmRHZW5kZXInXSwgdGhpcy50b2tlbnMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdFxuICAgICAgICAud2l0aEZhY2VMYW5kbWFya3MoKVxuICAgICAgICAud2l0aEFnZUFuZEdlbmRlcigpXG4gICAgICAgIC5ydW4oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNNYXRjaFBhdHRlcm4oWydsYW5kbWFya3MnXSwgdGhpcy50b2tlbnMpKSB7XG4gICAgICByZXR1cm4gdC53aXRoRmFjZUxhbmRtYXJrcygpLnJ1bigpO1xuICAgIH1cbiAgICByZXR1cm4gdC5ydW4oKTtcbiAgfVxufVxuIl19