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.

188 lines 14.1 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'; var ModelLoaderService = /** @class */ (function () { function ModelLoaderService(modelUrl) { this.modelUrl = modelUrl; this.loadedModels = []; } /** * @private * @param {?} tokens * @return {?} */ ModelLoaderService.prototype.getReqiredModels = /** * @private * @param {?} tokens * @return {?} */ function (tokens) { var _a; return [SsdMobilenetv1Model].concat(Object.entries((_a = {}, _a[ExpressionsFeatureToken] = [FaceExpressionModel, SsdMobilenetv1Model], _a[LandmarksFeatureToken] = [FaceLandmarkModel, SsdMobilenetv1Model], _a[DescriptorsFeatureToken] = [FaceRecognitionModel], _a[AgeAndGenderToken] = [AgeAndGenderModel], _a)) .map((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = tslib_1.__read(_a, 2), key = _b[0], models = _b[1]; return tokens.includes((/** @type {?} */ (key))) ? models : []; })) .reduce((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a.concat(b); })) .filter((/** * @param {?} v * @param {?} i * @param {?} arr * @return {?} */ function (v, i, arr) { return arr.indexOf(v) === i; }))); }; /** * @private * @param {?} model * @return {?} */ ModelLoaderService.prototype.mapLoadFunction = /** * @private * @param {?} model * @return {?} */ function (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 {?} */ ModelLoaderService.prototype.isLoaded = /** * @param {?} model * @return {?} */ function (model) { return this.loadedModels.includes(model); }; /** * @param {...?} models * @return {?} */ ModelLoaderService.prototype.load = /** * @param {...?} models * @return {?} */ function () { var models = []; for (var _i = 0; _i < arguments.length; _i++) { models[_i] = arguments[_i]; } return tslib_1.__awaiter(this, void 0, void 0, function () { var loadTargetModels; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: loadTargetModels = models.filter((/** * @param {?} m * @return {?} */ function (m) { return _this.isLoaded(m) === false; })); return [4 /*yield*/, Promise.all(loadTargetModels .map((/** * @param {?} m * @return {?} */ function (m) { return _this.mapLoadFunction(m); })) .map((/** * @param {?} load * @return {?} */ function (load) { return load(_this.modelUrl); })))]; case 1: _a.sent(); if (loadTargetModels.length >= 0) { this.loadedModels = loadTargetModels.concat(this.loadedModels); } return [2 /*return*/]; } }); }); }; /** * @param {?} tokens * @return {?} */ ModelLoaderService.prototype.loadForFeature = /** * @param {?} tokens * @return {?} */ function (tokens) { return tslib_1.__awaiter(this, void 0, void 0, function () { var reqiredModels; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: reqiredModels = this.getReqiredModels(tokens); console.log({ reqiredModels: reqiredModels }); return [4 /*yield*/, this.load.apply(this, tslib_1.__spread(reqiredModels))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; ModelLoaderService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ModelLoaderService.ctorParameters = function () { return [ { type: String, decorators: [{ type: Inject, args: [ModelsUrl,] }] } ]; }; return ModelLoaderService; }()); export { ModelLoaderService }; if (false) { /** * @type {?} * @private */ ModelLoaderService.prototype.loadedModels; /** * @type {?} * @private */ ModelLoaderService.prototype.modelUrl; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtZmFjZS1hcGktanMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvbW9kZWwtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFbkQsT0FBTyxFQUNMLGNBQWMsRUFDZCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGFBQWEsQ0FBQzs7QUFFckIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2QixpQkFBaUIsR0FDbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUI7SUFJRSw0QkFFVSxRQUFnQjtRQUFoQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBSmxCLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztJQUtyQyxDQUFDOzs7Ozs7SUFFSSw2Q0FBZ0I7Ozs7O0lBQXhCLFVBQXlCLE1BQXNCOztRQUM3QyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQ2pDLE1BQU0sQ0FBQyxPQUFPO1lBQ1osR0FBQyx1QkFBdUIsSUFBRyxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDO1lBQ3JFLEdBQUMscUJBQXFCLElBQUcsQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQztZQUNqRSxHQUFDLHVCQUF1QixJQUFHLENBQUMs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QSxBQW5FRCxJQW1FQztTQWxFWSxrQkFBa0I7Ozs7OztJQUM3QiwwQ0FBd0M7Ozs7O0lBR3RDLHNDQUN3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuaW1wb3J0IHtcbiAgbG9hZE10Y25uTW9kZWwsXG4gIGxvYWRTc2RNb2JpbGVuZXR2MU1vZGVsLFxuICBsb2FkRmFjZUV4cHJlc3Npb25Nb2RlbCxcbiAgbG9hZEZhY2VMYW5kbWFya01vZGVsLFxuICBsb2FkVGlueUZhY2VEZXRlY3Rvck1vZGVsLFxuICBsb2FkRmFjZVJlY29nbml0aW9uTW9kZWwsXG4gIGxvYWRBZ2VHZW5kZXJNb2RlbCxcbn0gZnJvbSAnZmFjZS1hcGkuanMnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuaW1wb3J0IHsgTW9kZWxzVXJsIH0gZnJvbSAnLi4vdG9rZW5zL01vZGVsc1VybCc7XG5pbXBvcnQge1xuICBGZWF0dXJlVG9rZW4sXG4gIEV4cHJlc3Npb25zRmVhdHVyZVRva2VuLFxuICBMYW5kbWFya3NGZWF0dXJlVG9rZW4sXG4gIERlc2NyaXB0b3JzRmVhdHVyZVRva2VuLFxuICBBZ2VBbmRHZW5kZXJUb2tlbixcbn0gZnJvbSAnLi4vdG9rZW5zL0ZlYXR1cmVUb2tlbic7XG5pbXBvcnQge1xuICBNb2RlbFRva2VuLFxuICBTc2RNb2JpbGVuZXR2MU1vZGVsLFxuICBGYWNlRXhwcmVzc2lvbk1vZGVsLFxuICBGYWNlTGFuZG1hcmtNb2RlbCxcbiAgRmFjZVJlY29nbml0aW9uTW9kZWwsXG4gIEFnZUFuZEdlbmRlck1vZGVsLFxuICBNdGNubk1vZGVsLFxuICBUaW55RmFjZURldGVjdG9yTW9kZWwsXG59IGZyb20gJy4uL3Rva2Vucy9Nb2RlbFRva2VuJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZGVsTG9hZGVyU2VydmljZSB7XG4gIHByaXZhdGUgbG9hZGVkTW9kZWxzOiBNb2RlbFRva2VuW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1vZGVsc1VybClcbiAgICBwcml2YXRlIG1vZGVsVXJsOiBzdHJpbmcsXG4gICkge31cblxuICBwcml2YXRlIGdldFJlcWlyZWRNb2RlbHModG9rZW5zOiBGZWF0dXJlVG9rZW5bXSk6IE1vZGVsVG9rZW5bXSB7XG4gICAgcmV0dXJuIFtTc2RNb2JpbGVuZXR2MU1vZGVsXS5jb25jYXQoXG4gICAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICAgIFtFeHByZXNzaW9uc0ZlYXR1cmVUb2tlbl06IFtGYWNlRXhwcmVzc2lvbk1vZGVsLCBTc2RNb2JpbGVuZXR2MU1vZGVsXSxcbiAgICAgICAgW0xhbmRtYXJrc0ZlYXR1cmVUb2tlbl06IFtGYWNlTGFuZG1hcmtNb2RlbCwgU3NkTW9iaWxlbmV0djFNb2RlbF0sXG4gICAgICAgIFtEZXNjcmlwdG9yc0ZlYXR1cmVUb2tlbl06IFtGYWNlUmVjb2duaXRpb25Nb2RlbF0sXG4gICAgICAgIFtBZ2VBbmRHZW5kZXJUb2tlbl06IFtBZ2VBbmRHZW5kZXJNb2RlbF0sXG4gICAgICB9KVxuICAgICAgICAubWFwKChba2V5LCBtb2RlbHNdKSA9PlxuICAgICAgICAgIHRva2Vucy5pbmNsdWRlcyhrZXkgYXMgRmVhdHVyZVRva2VuKSA/IG1vZGVscyA6IFtdLFxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKVxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhcnIpID0+IGFyci5pbmRleE9mKHYpID09PSBpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBMb2FkRnVuY3Rpb24obW9kZWw6IE1vZGVsVG9rZW4pIHtcbiAgICBzd2l0Y2ggKG1vZGVsKSB7XG4gICAgICBjYXNlIFNzZE1vYmlsZW5ldHYxTW9kZWw6XG4gICAgICAgIHJldHVybiBsb2FkU3NkTW9iaWxlbmV0djFNb2RlbDtcbiAgICAgIGNhc2UgTXRjbm5Nb2RlbDpcbiAgICAgICAgcmV0dXJuIGxvYWRNdGNubk1vZGVsO1xuICAgICAgY2FzZSBGYWNlRXhwcmVzc2lvbk1vZGVsOlxuICAgICAgICByZXR1cm4gbG9hZEZhY2VFeHByZXNzaW9uTW9kZWw7XG4gICAgICBjYXNlIEZhY2VMYW5kbWFya01vZGVsOlxuICAgICAgICByZXR1cm4gbG9hZEZhY2VMYW5kbWFya01vZGVsO1xuICAgICAgY2FzZSBGYWNlUmVjb2duaXRpb25Nb2RlbDpcbiAgICAgICAgcmV0dXJuIGxvYWRGYWNlUmVjb2duaXRpb25Nb2RlbDtcbiAgICAgIGNhc2UgVGlueUZhY2VEZXRlY3Rvck1vZGVsOlxuICAgICAgICByZXR1cm4gbG9hZFRpbnlGYWNlRGV0ZWN0b3JNb2RlbDtcbiAgICAgIGNhc2UgQWdlQW5kR2VuZGVyTW9kZWw6XG4gICAgICAgIHJldHVybiBsb2FkQWdlR2VuZGVyTW9kZWw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzTG9hZGVkKG1vZGVsOiBNb2RlbFRva2VuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkTW9kZWxzLmluY2x1ZGVzKG1vZGVsKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoLi4ubW9kZWxzOiBNb2RlbFRva2VuW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2FkVGFyZ2V0TW9kZWxzID0gbW9kZWxzLmZpbHRlcihtID0+IHRoaXMuaXNMb2FkZWQobSkgPT09IGZhbHNlKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbG9hZFRhcmdldE1vZGVsc1xuICAgICAgICAubWFwKG0gPT4gdGhpcy5tYXBMb2FkRnVuY3Rpb24obSkpXG4gICAgICAgIC5tYXAobG9hZCA9PiBsb2FkKHRoaXMubW9kZWxVcmwpKSxcbiAgICApO1xuXG4gICAgaWYgKGxvYWRUYXJnZXRNb2RlbHMubGVuZ3RoID49IDApIHtcbiAgICAgIHRoaXMubG9hZGVkTW9kZWxzID0gbG9hZFRhcmdldE1vZGVscy5jb25jYXQodGhpcy5sb2FkZWRNb2RlbHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvYWRGb3JGZWF0dXJlKHRva2VuczogRmVhdHVyZVRva2VuW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXFpcmVkTW9kZWxzID0gdGhpcy5nZXRSZXFpcmVkTW9kZWxzKHRva2Vucyk7XG4gICAgY29uc29sZS5sb2coeyByZXFpcmVkTW9kZWxzIH0pO1xuICAgIGF3YWl0IHRoaXMubG9hZCguLi5yZXFpcmVkTW9kZWxzKTtcbiAgfVxufVxuIl19