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.
148 lines • 14 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';
export class DetectTask {
/**
* @return {?}
*/
get resolveTarget() {
return this.targetResolver;
}
/**
* @param {?} option
*/
constructor(option) {
this.type = option.type;
this.tokens = option.tokens;
this.realtime = option.realtime || false;
this.target = new Promise((/**
* @param {?} resolver
* @return {?}
*/
resolver => (this.targetResolver = resolver)));
}
/**
* @private
* @param {?} patten
* @param {?} target
* @return {?}
*/
isMatchPattern(patten, target) {
return patten.every((/**
* @param {?} item
* @return {?}
*/
item => target.includes(item)));
}
/**
* @template THIS
* @this {THIS}
* @param {...?} tokens
* @return {THIS}
*/
with(...tokens) {
(/** @type {?} */ (this)).tokens.push(...tokens);
return (/** @type {?} */ (this));
}
/**
* @param {?=} option
* @return {?}
*/
detect(option) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
let t;
if (this.type === 'all') {
t = faceapi.detectAllFaces(yield this.target, option || undefined);
}
else {
t = faceapi.detectSingleFace(yield this.target, option || undefined);
}
if (this.isMatchPattern(['expressions', 'landmarks', 'ageAndGender', 'descriptors'], this.tokens)) {
if (t instanceof faceapi.DetectSingleFaceTask) {
return t
.withFaceLandmarks()
.withFaceExpressions()
.withAgeAndGender()
.withFaceDescriptor()
.run();
}
else if (t instanceof faceapi.DetectAllFacesTask) {
return t
.withFaceLandmarks()
.withFaceExpressions()
.withAgeAndGender()
.withFaceDescriptors()
.run();
}
}
else if (this.isMatchPattern(['expressions', 'landmarks', 'descriptors'], this.tokens)) {
if (t instanceof faceapi.DetectSingleFaceTask) {
return t
.withFaceLandmarks()
.withFaceExpressions()
.withFaceDescriptor()
.run();
}
else if (t instanceof faceapi.DetectAllFacesTask) {
return t
.withFaceLandmarks()
.withFaceExpressions()
.withFaceDescriptors()
.run();
}
}
else if (this.isMatchPattern(['expressions', 'landmarks', 'ageAndGender'], this.tokens)) {
return t
.withFaceLandmarks()
.withFaceExpressions()
.withAgeAndGender()
.run();
}
else if (this.isMatchPattern(['expressions', 'landmarks'], this.tokens)) {
return t
.withFaceLandmarks()
.withFaceExpressions()
.run();
}
else if (this.isMatchPattern(['expressions', 'ageAndGender'], this.tokens)) {
return t
.withFaceExpressions()
.withAgeAndGender()
.run();
}
else if (this.isMatchPattern(['expressions'], this.tokens)) {
return t.withFaceExpressions().run();
}
else if (this.isMatchPattern(['landmarks', 'ageAndGender'], this.tokens)) {
return t
.withFaceLandmarks()
.withAgeAndGender()
.run();
}
else if (this.isMatchPattern(['landmarks'], this.tokens)) {
return t.withFaceLandmarks().run();
}
return t.run();
});
}
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGV0ZWN0VGFzay5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mYWNlLWFwaS1qcy8iLCJzb3VyY2VzIjpbImxpYi9jbGFzc2VzL0RldGVjdFRhc2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGFBQWEsQ0FBQztBQUl2QyxNQUFNLE9BQU8sVUFBVTs7OztJQUNyQixJQUFXLGFBQWE7UUFHdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Ozs7SUFNRCxZQUFZLE1BSVg7UUFDQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU87Ozs7UUFDdkIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEVBQzdDLENBQUM7SUFDSixDQUFDOzs7Ozs7O0lBTU8sY0FBYyxDQUFDLE1BQWdCLEVBQUUsTUFBZ0I7UUFDdkQsT0FBTyxNQUFNLENBQUMsS0FBSzs7OztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDO0lBQ3JELENBQUM7Ozs7Ozs7SUFFTSxJQUFJLENBQUMsR0FBRyxNQUFzQjtRQUNuQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDNUIsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Ozs7O0lBRVksTUFBTSxDQUFDLE1BQXFDOzs7Z0JBQ25ELENBQTREO1lBQ2hFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxL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O3FCQUNMLGlCQUFpQixFQUFFO3FCQUNuQixnQkFBZ0IsRUFBRTtxQkFDbEIsR0FBRyxFQUFFLENBQUM7YUFDVjtpQkFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzFELE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDcEM7WUFDRCxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDO0tBQUE7Q0FDRjs7O0lBbkhDLDBCQUFvQzs7SUFDcEMsNEJBQXVDOztJQUN2Qyw4QkFBa0M7O0lBZWxDLDRCQUE0RDs7Ozs7SUFFNUQsb0NBQTBFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmFjZWFwaSBmcm9tICdmYWNlLWFwaS5qcyc7XG5pbXBvcnQgeyBUYXNrVHlwZVRva2VuIH0gZnJvbSAnLi4vdG9rZW5zL1Rhc2tUeXBlVG9rZW4nO1xuaW1wb3J0IHsgRmVhdHVyZVRva2VuIH0gZnJvbSAnLi4vdG9rZW5zL0ZlYXR1cmVUb2tlbic7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RUYXNrIHtcbiAgcHVibGljIGdldCByZXNvbHZlVGFyZ2V0KCk6IChcbiAgICBlbDogSFRNTEltYWdlRWxlbWVudCB8IEhUTUxWaWRlb0VsZW1lbnQsXG4gICkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0UmVzb2x2ZXI7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogVGFza1R5cGVUb2tlbjtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuczogRmVhdHVyZVRva2VuW107XG4gIHB1YmxpYyByZWFkb25seSByZWFsdGltZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb246IHtcbiAgICB0eXBlOiBUYXNrVHlwZVRva2VuO1xuICAgIHRva2VuczogRmVhdHVyZVRva2VuW107XG4gICAgcmVhbHRpbWU/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdGhpcy50eXBlID0gb3B0aW9uLnR5cGU7XG4gICAgdGhpcy50b2tlbnMgPSBvcHRpb24udG9rZW5zO1xuICAgIHRoaXMucmVhbHRpbWUgPSBvcHRpb24ucmVhbHRpbWUgfHwgZmFsc2U7XG4gICAgdGhpcy50YXJnZXQgPSBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudD4oXG4gICAgICByZXNvbHZlciA9PiAodGhpcy50YXJnZXRSZXNvbHZlciA9IHJlc29sdmVyKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRhcmdldDogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudD47XG5cbiAgcHJpdmF0ZSB0YXJnZXRSZXNvbHZlcjogKGVsOiBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGlzTWF0Y2hQYXR0ZXJuKHBhdHRlbjogc3RyaW5nW10sIHRhcmdldDogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0dGVuLmV2ZXJ5KGl0ZW0gPT4gdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKTtcbiAgfVxuXG4gIHB1YmxpYyB3aXRoKC4uLnRva2VuczogRmVhdHVyZVRva2VuW10pOiB0aGlzIHtcbiAgICB0aGlzLnRva2Vucy5wdXNoKC4uLnRva2Vucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGV0ZWN0KG9wdGlvbj86IGZhY2VhcGkuRmFjZURldGVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCB0OiBmYWNlYXBpLkRldGVjdEFsbEZhY2VzVGFzayB8IGZhY2VhcGkuRGV0ZWN0U2luZ2xlRmFjZVRhc2s7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHQgPSBmYWNlYXBpLmRldGVjdEFsbEZhY2VzKGF3YWl0IHRoaXMudGFyZ2V0LCBvcHRpb24gfHwgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdCA9IGZhY2VhcGkuZGV0ZWN0U2luZ2xlRmFjZShhd2FpdCB0aGlzLnRhcmdldCwgb3B0aW9uIHx8IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc01hdGNoUGF0dGVybihcbiAgICAgICAgWydleHByZXNzaW9ucycsICdsYW5kbWFya3MnLCAnYWdlQW5kR2VuZGVyJywgJ2Rlc2NyaXB0b3JzJ10sXG4gICAgICAgIHRoaXMudG9rZW5zLFxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBmYWNlYXBpLkRldGVjdFNpbmdsZUZhY2VUYXNrKSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgICAgICAgLndpdGhGYWNlTGFuZG1hcmtzKClcbiAgICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgICAgLndpdGhBZ2VBbmRHZW5kZXIoKVxuICAgICAgICAgIC53aXRoRmFjZURlc2NyaXB0b3IoKVxuICAgICAgICAgIC5ydW4oKTtcbiAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIGZhY2VhcGkuRGV0ZWN0QWxsRmFjZXNUYXNrKSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgICAgICAgLndpdGhGYWNlTGFuZG1hcmtzKClcbiAgICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgICAgLndpdGhBZ2VBbmRHZW5kZXIoKVxuICAgICAgICAgIC53aXRoRmFjZURlc2NyaXB0b3JzKClcbiAgICAgICAgICAucnVuKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuaXNNYXRjaFBhdHRlcm4oXG4gICAgICAgIFsnZXhwcmVzc2lvbnMnLCAnbGFuZG1hcmtzJywgJ2Rlc2NyaXB0b3JzJ10sXG4gICAgICAgIHRoaXMudG9rZW5zLFxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBmYWNlYXBpLkRldGVjdFNpbmdsZUZhY2VUYXNrKSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgICAgICAgLndpdGhGYWNlTGFuZG1hcmtzKClcbiAgICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgICAgLndpdGhGYWNlRGVzY3JpcHRvcigpXG4gICAgICAgICAgLnJ1bigpO1xuICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgZmFjZWFwaS5EZXRlY3RBbGxGYWNlc1Rhc2spIHtcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgICAud2l0aEZhY2VMYW5kbWFya3MoKVxuICAgICAgICAgIC53aXRoRmFjZUV4cHJlc3Npb25zKClcbiAgICAgICAgICAud2l0aEZhY2VEZXNjcmlwdG9ycygpXG4gICAgICAgICAgLnJ1bigpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlzTWF0Y2hQYXR0ZXJuKFxuICAgICAgICBbJ2V4cHJlc3Npb25zJywgJ2xhbmRtYXJrcycsICdhZ2VBbmRHZW5kZXInXSxcbiAgICAgICAgdGhpcy50b2tlbnMsXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdFxuICAgICAgICAud2l0aEZhY2VMYW5kbWFya3MoKVxuICAgICAgICAud2l0aEZhY2VFeHByZXNzaW9ucygpXG4gICAgICAgIC53aXRoQWdlQW5kR2VuZGVyKClcbiAgICAgICAgLnJ1bigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc01hdGNoUGF0dGVybihbJ2V4cHJlc3Npb25zJywgJ2xhbmRtYXJrcyddLCB0aGlzLnRva2VucykpIHtcbiAgICAgIHJldHVybiB0XG4gICAgICAgIC53aXRoRmFjZUxhbmRtYXJrcygpXG4gICAgICAgIC53aXRoRmFjZUV4cHJlc3Npb25zKClcbiAgICAgICAgLnJ1bigpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlzTWF0Y2hQYXR0ZXJuKFsnZXhwcmVzc2lvbnMnLCAnYWdlQW5kR2VuZGVyJ10sIHRoaXMudG9rZW5zKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRcbiAgICAgICAgLndpdGhGYWNlRXhwcmVzc2lvbnMoKVxuICAgICAgICAud2l0aEFnZUFuZEdlbmRlcigpXG4gICAgICAgIC5ydW4oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNNYXRjaFBhdHRlcm4oWydleHByZXNzaW9ucyddLCB0aGlzLnRva2VucykpIHtcbiAgICAgIHJldHVybiB0LndpdGhGYWNlRXhwcmVzc2lvbnMoKS5ydW4oKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5pc01hdGNoUGF0dGVybihbJ2xhbmRtYXJrcycsICdhZ2VBbmRHZW5kZXInXSwgdGhpcy50b2tlbnMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdFxuICAgICAgICAud2l0aEZhY2VMYW5kbWFya3MoKVxuICAgICAgICAud2l0aEFnZUFuZEdlbmRlcigpXG4gICAgICAgIC5ydW4oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNNYXRjaFBhdHRlcm4oWydsYW5kbWFya3MnXSwgdGhpcy50b2tlbnMpKSB7XG4gICAgICByZXR1cm4gdC53aXRoRmFjZUxhbmRtYXJrcygpLnJ1bigpO1xuICAgIH1cbiAgICByZXR1cm4gdC5ydW4oKTtcbiAgfVxufVxuIl19