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
JavaScript
/**
* @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