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
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';
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==