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.

142 lines 11.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable, Inject } from '@angular/core'; // tslint:disable-next-line:max-line-length import { loadMtcnnModel, loadSsdMobilenetv1Model, loadFaceExpressionModel, loadFaceLandmarkModel, loadTinyFaceDetectorModel, loadFaceRecognitionModel, loadAgeGenderModel, } from 'face-api.js'; // tslint:disable-next-line:max-line-length import { ModelsUrl } from '../tokens/ModelsUrl'; import { ExpressionsFeatureToken, LandmarksFeatureToken, DescriptorsFeatureToken, AgeAndGenderToken, } from '../tokens/FeatureToken'; import { SsdMobilenetv1Model, FaceExpressionModel, FaceLandmarkModel, FaceRecognitionModel, AgeAndGenderModel, MtcnnModel, TinyFaceDetectorModel, } from '../tokens/ModelToken'; export class ModelLoaderService { /** * @param {?} modelUrl */ constructor(modelUrl) { this.modelUrl = modelUrl; this.loadedModels = []; } /** * @private * @param {?} tokens * @return {?} */ getReqiredModels(tokens) { return [SsdMobilenetv1Model].concat(Object.entries({ [ExpressionsFeatureToken]: [FaceExpressionModel, SsdMobilenetv1Model], [LandmarksFeatureToken]: [FaceLandmarkModel, SsdMobilenetv1Model], [DescriptorsFeatureToken]: [FaceRecognitionModel], [AgeAndGenderToken]: [AgeAndGenderModel], }) .map((/** * @param {?} __0 * @return {?} */ ([key, models]) => tokens.includes((/** @type {?} */ (key))) ? models : [])) .reduce((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => a.concat(b))) .filter((/** * @param {?} v * @param {?} i * @param {?} arr * @return {?} */ (v, i, arr) => arr.indexOf(v) === i))); } /** * @private * @param {?} model * @return {?} */ mapLoadFunction(model) { switch (model) { case SsdMobilenetv1Model: return loadSsdMobilenetv1Model; case MtcnnModel: return loadMtcnnModel; case FaceExpressionModel: return loadFaceExpressionModel; case FaceLandmarkModel: return loadFaceLandmarkModel; case FaceRecognitionModel: return loadFaceRecognitionModel; case TinyFaceDetectorModel: return loadTinyFaceDetectorModel; case AgeAndGenderModel: return loadAgeGenderModel; } } /** * @param {?} model * @return {?} */ isLoaded(model) { return this.loadedModels.includes(model); } /** * @param {...?} models * @return {?} */ load(...models) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const loadTargetModels = models.filter((/** * @param {?} m * @return {?} */ m => this.isLoaded(m) === false)); yield Promise.all(loadTargetModels .map((/** * @param {?} m * @return {?} */ m => this.mapLoadFunction(m))) .map((/** * @param {?} load * @return {?} */ load => load(this.modelUrl)))); if (loadTargetModels.length >= 0) { this.loadedModels = loadTargetModels.concat(this.loadedModels); } }); } /** * @param {?} tokens * @return {?} */ loadForFeature(tokens) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const reqiredModels = this.getReqiredModels(tokens); console.log({ reqiredModels }); yield this.load(...reqiredModels); }); } } ModelLoaderService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ModelLoaderService.ctorParameters = () => [ { type: String, decorators: [{ type: Inject, args: [ModelsUrl,] }] } ]; if (false) { /** * @type {?} * @private */ ModelLoaderService.prototype.loadedModels; /** * @type {?} * @private */ ModelLoaderService.prototype.modelUrl; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtZmFjZS1hcGktanMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvbW9kZWwtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFbkQsT0FBTyxFQUNMLGNBQWMsRUFDZCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGFBQWEsQ0FBQzs7QUFFckIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2QixpQkFBaUIsR0FDbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsTUFBTSxPQUFPLGtCQUFrQjs7OztJQUc3QixZQUVVLFFBQWdCO1FBQWhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFKbEIsaUJBQVksR0FBaUIsRUFBRSxDQUFDO0lBS3JDLENBQUM7Ozs7OztJQUVJLGdCQUFnQixDQUFDLE1BQXNCO1FBQzdDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNiLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDO1lBQ3JFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO1lBQ2pFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO1lBQ2pELENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1NBQ3pDLENBQUM7YUFDQyxHQUFHOzs7O1FBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQ3JCLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQUEsR0FBRyxFQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUNuRDthQUNBLE1BQU07Ozs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDO2FBQzdCLE1BQU07Ozs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQy9DLENBQUM7SUFDSixDQUFDOzs7Ozs7SUFFTyxlQUFlLENBQUMsS0FBaUI7UUFDdkMsUUFBUSxLQUFLLEVBQUU7WUFDYixLQUFLLG1CQUFtQjtnQkFDdEIsT0FBTyx1QkFBdUIsQ0FBQztZQUNqQyxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxjQUFjLENBQUM7WUFDeEIsS0FBSyxtQkFBbUI7Z0JBQ3RCLE9BQU8sdUJBQXVCLENBQUM7WUFDakMsS0FBSyxpQkFBaUI7Z0JBQ3BCLE9BQU8scUJBQXFCLENBQUM7WUFDL0IsS0FBSyxvQkFBb0I7Z0JBQ3ZCLE9BQU8sd0JBQXdCLENBQUM7WUFDbEMsS0FBSyxxQkFBcUI7Z0JBQ3hCLE9BQU8seUJBQXlCLENBQUM7WUFDbkMsS0FBSyxpQkFBaUI7Z0JBQ3BCLE9BQU8sa0JBQWtCLENBQUM7U0FDN0I7SUFDSCxDQUFDOzs7OztJQUVNLFFBQVEsQ0FBQyxLQUFpQjtRQUMvQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7Ozs7O0lBRUssSUFBSSxDQUFDLEdBQUcsTUFBb0I7OztrQkFDMUIsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU07Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFDO1lBRXZFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixnQkFBZ0I7aUJBQ2IsR0FBRzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBQztpQkFDakMsR0FBRzs7OztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUNwQyxDQUFDO1lBRUYsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDaEU7UUFDSCxDQUFDO0tBQUE7Ozs7O0lBRUssY0FBYyxDQUFDLE1BQXNCOzs7a0JBQ25DLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7S0FBQTs7O1lBbEVGLFVBQVU7Ozs7eUNBS04sTUFBTSxTQUFDLFNBQVM7Ozs7Ozs7SUFIbkIsMENBQXdDOzs7OztJQUd0QyxzQ0FDd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7XG4gIGxvYWRNdGNubk1vZGVsLFxuICBsb2FkU3NkTW9iaWxlbmV0djFNb2RlbCxcbiAgbG9hZEZhY2VFeHByZXNzaW9uTW9kZWwsXG4gIGxvYWRGYWNlTGFuZG1hcmtNb2RlbCxcbiAgbG9hZFRpbnlGYWNlRGV0ZWN0b3JNb2RlbCxcbiAgbG9hZEZhY2VSZWNvZ25pdGlvbk1vZGVsLFxuICBsb2FkQWdlR2VuZGVyTW9kZWwsXG59IGZyb20gJ2ZhY2UtYXBpLmpzJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7IE1vZGVsc1VybCB9IGZyb20gJy4uL3Rva2Vucy9Nb2RlbHNVcmwnO1xuaW1wb3J0IHtcbiAgRmVhdHVyZVRva2VuLFxuICBFeHByZXNzaW9uc0ZlYXR1cmVUb2tlbixcbiAgTGFuZG1hcmtzRmVhdHVyZVRva2VuLFxuICBEZXNjcmlwdG9yc0ZlYXR1cmVUb2tlbixcbiAgQWdlQW5kR2VuZGVyVG9rZW4sXG59IGZyb20gJy4uL3Rva2Vucy9GZWF0dXJlVG9rZW4nO1xuaW1wb3J0IHtcbiAgTW9kZWxUb2tlbixcbiAgU3NkTW9iaWxlbmV0djFNb2RlbCxcbiAgRmFjZUV4cHJlc3Npb25Nb2RlbCxcbiAgRmFjZUxhbmRtYXJrTW9kZWwsXG4gIEZhY2VSZWNvZ25pdGlvbk1vZGVsLFxuICBBZ2VBbmRHZW5kZXJNb2RlbCxcbiAgTXRjbm5Nb2RlbCxcbiAgVGlueUZhY2VEZXRlY3Rvck1vZGVsLFxufSBmcm9tICcuLi90b2tlbnMvTW9kZWxUb2tlbic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2RlbExvYWRlclNlcnZpY2Uge1xuICBwcml2YXRlIGxvYWRlZE1vZGVsczogTW9kZWxUb2tlbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNb2RlbHNVcmwpXG4gICAgcHJpdmF0ZSBtb2RlbFVybDogc3RyaW5nLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXRSZXFpcmVkTW9kZWxzKHRva2VuczogRmVhdHVyZVRva2VuW10pOiBNb2RlbFRva2VuW10ge1xuICAgIHJldHVybiBbU3NkTW9iaWxlbmV0djFNb2RlbF0uY29uY2F0KFxuICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICBbRXhwcmVzc2lvbnNGZWF0dXJlVG9rZW5dOiBbRmFjZUV4cHJlc3Npb25Nb2RlbCwgU3NkTW9iaWxlbmV0djFNb2RlbF0sXG4gICAgICAgIFtMYW5kbWFya3NGZWF0dXJlVG9rZW5dOiBbRmFjZUxhbmRtYXJrTW9kZWwsIFNzZE1vYmlsZW5ldHYxTW9kZWxdLFxuICAgICAgICBbRGVzY3JpcHRvcnNGZWF0dXJlVG9rZW5dOiBbRmFjZVJlY29nbml0aW9uTW9kZWxdLFxuICAgICAgICBbQWdlQW5kR2VuZGVyVG9rZW5dOiBbQWdlQW5kR2VuZGVyTW9kZWxdLFxuICAgICAgfSlcbiAgICAgICAgLm1hcCgoW2tleSwgbW9kZWxzXSkgPT5cbiAgICAgICAgICB0b2tlbnMuaW5jbHVkZXMoa2V5IGFzIEZlYXR1cmVUb2tlbikgPyBtb2RlbHMgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSlcbiAgICAgICAgLmZpbHRlcigodiwgaSwgYXJyKSA9PiBhcnIuaW5kZXhPZih2KSA9PT0gaSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwTG9hZEZ1bmN0aW9uKG1vZGVsOiBNb2RlbFRva2VuKSB7XG4gICAgc3dpdGNoIChtb2RlbCkge1xuICAgICAgY2FzZSBTc2RNb2JpbGVuZXR2MU1vZGVsOlxuICAgICAgICByZXR1cm4gbG9hZFNzZE1vYmlsZW5ldHYxTW9kZWw7XG4gICAgICBjYXNlIE10Y25uTW9kZWw6XG4gICAgICAgIHJldHVybiBsb2FkTXRjbm5Nb2RlbDtcbiAgICAgIGNhc2UgRmFjZUV4cHJlc3Npb25Nb2RlbDpcbiAgICAgICAgcmV0dXJuIGxvYWRGYWNlRXhwcmVzc2lvbk1vZGVsO1xuICAgICAgY2FzZSBGYWNlTGFuZG1hcmtNb2RlbDpcbiAgICAgICAgcmV0dXJuIGxvYWRGYWNlTGFuZG1hcmtNb2RlbDtcbiAgICAgIGNhc2UgRmFjZVJlY29nbml0aW9uTW9kZWw6XG4gICAgICAgIHJldHVybiBsb2FkRmFjZVJlY29nbml0aW9uTW9kZWw7XG4gICAgICBjYXNlIFRpbnlGYWNlRGV0ZWN0b3JNb2RlbDpcbiAgICAgICAgcmV0dXJuIGxvYWRUaW55RmFjZURldGVjdG9yTW9kZWw7XG4gICAgICBjYXNlIEFnZUFuZEdlbmRlck1vZGVsOlxuICAgICAgICByZXR1cm4gbG9hZEFnZUdlbmRlck1vZGVsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0xvYWRlZChtb2RlbDogTW9kZWxUb2tlbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRlZE1vZGVscy5pbmNsdWRlcyhtb2RlbCk7XG4gIH1cblxuICBhc3luYyBsb2FkKC4uLm1vZGVsczogTW9kZWxUb2tlbltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZFRhcmdldE1vZGVscyA9IG1vZGVscy5maWx0ZXIobSA9PiB0aGlzLmlzTG9hZGVkKG0pID09PSBmYWxzZSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGxvYWRUYXJnZXRNb2RlbHNcbiAgICAgICAgLm1hcChtID0+IHRoaXMubWFwTG9hZEZ1bmN0aW9uKG0pKVxuICAgICAgICAubWFwKGxvYWQgPT4gbG9hZCh0aGlzLm1vZGVsVXJsKSksXG4gICAgKTtcblxuICAgIGlmIChsb2FkVGFyZ2V0TW9kZWxzLmxlbmd0aCA+PSAwKSB7XG4gICAgICB0aGlzLmxvYWRlZE1vZGVscyA9IGxvYWRUYXJnZXRNb2RlbHMuY29uY2F0KHRoaXMubG9hZGVkTW9kZWxzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkRm9yRmVhdHVyZSh0b2tlbnM6IEZlYXR1cmVUb2tlbltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVxaXJlZE1vZGVscyA9IHRoaXMuZ2V0UmVxaXJlZE1vZGVscyh0b2tlbnMpO1xuICAgIGNvbnNvbGUubG9nKHsgcmVxaXJlZE1vZGVscyB9KTtcbiAgICBhd2FpdCB0aGlzLmxvYWQoLi4ucmVxaXJlZE1vZGVscyk7XG4gIH1cbn1cbiJdfQ==