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