2021-09-13 00:37:06 +02:00
|
|
|
import { log } from './helpers';
|
2021-09-13 19:28:35 +02:00
|
|
|
import type { GraphModel } from './tfjs/types';
|
2021-06-18 15:16:21 +02:00
|
|
|
import * as facemesh from './blazeface/facemesh';
|
|
|
|
import * as faceres from './faceres/faceres';
|
|
|
|
import * as emotion from './emotion/emotion';
|
|
|
|
import * as posenet from './posenet/posenet';
|
|
|
|
import * as handpose from './handpose/handpose';
|
|
|
|
import * as blazepose from './blazepose/blazepose';
|
|
|
|
import * as efficientpose from './efficientpose/efficientpose';
|
|
|
|
import * as movenet from './movenet/movenet';
|
|
|
|
import * as nanodet from './object/nanodet';
|
|
|
|
import * as centernet from './object/centernet';
|
|
|
|
import * as segmentation from './segmentation/segmentation';
|
2021-09-17 17:23:00 +02:00
|
|
|
import { env } from './env';
|
2021-08-01 02:42:28 +02:00
|
|
|
// import * as agegenderrace from './gear/agegenderrace';
|
2021-06-18 15:16:21 +02:00
|
|
|
|
2021-09-17 17:23:00 +02:00
|
|
|
export function reset(instance) {
|
|
|
|
// if (instance.config.debug) log('resetting loaded models');
|
|
|
|
instance.models = {
|
|
|
|
face: null, // array of models
|
|
|
|
handpose: null, // array of models
|
|
|
|
posenet: null,
|
|
|
|
blazepose: null,
|
|
|
|
efficientpose: null,
|
|
|
|
movenet: null,
|
|
|
|
age: null,
|
|
|
|
gender: null,
|
|
|
|
emotion: null,
|
|
|
|
embedding: null,
|
|
|
|
nanodet: null,
|
|
|
|
centernet: null,
|
|
|
|
faceres: null,
|
|
|
|
segmentation: null,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-09-19 01:09:02 +02:00
|
|
|
/** Load method preloads all instance.configured models on-demand */
|
2021-06-18 15:16:21 +02:00
|
|
|
export async function load(instance) {
|
2021-09-17 17:23:00 +02:00
|
|
|
if (env.initial) reset(instance);
|
2021-06-18 15:16:21 +02:00
|
|
|
if (instance.config.async) { // load models concurrently
|
|
|
|
[
|
|
|
|
instance.models.face,
|
|
|
|
instance.models.emotion,
|
|
|
|
instance.models.handpose,
|
|
|
|
instance.models.posenet,
|
|
|
|
instance.models.blazepose,
|
|
|
|
instance.models.efficientpose,
|
|
|
|
instance.models.movenet,
|
|
|
|
instance.models.nanodet,
|
|
|
|
instance.models.centernet,
|
|
|
|
instance.models.faceres,
|
|
|
|
instance.models.segmentation,
|
2021-08-01 02:42:28 +02:00
|
|
|
// instance.models.agegenderrace,
|
2021-06-18 15:16:21 +02:00
|
|
|
] = await Promise.all([
|
|
|
|
instance.models.face || (instance.config.face.enabled ? facemesh.load(instance.config) : null),
|
|
|
|
instance.models.emotion || ((instance.config.face.enabled && instance.config.face.emotion.enabled) ? emotion.load(instance.config) : null),
|
|
|
|
instance.models.handpose || (instance.config.hand.enabled ? handpose.load(instance.config) : null),
|
|
|
|
instance.models.posenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('posenet') ? posenet.load(instance.config) : null),
|
|
|
|
instance.models.blazepose || (instance.config.body.enabled && instance.config.body.modelPath.includes('blazepose') ? blazepose.load(instance.config) : null),
|
|
|
|
instance.models.efficientpose || (instance.config.body.enabled && instance.config.body.modelPath.includes('efficientpose') ? efficientpose.load(instance.config) : null),
|
|
|
|
instance.models.movenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('movenet') ? movenet.load(instance.config) : null),
|
|
|
|
instance.models.nanodet || (instance.config.object.enabled && instance.config.object.modelPath.includes('nanodet') ? nanodet.load(instance.config) : null),
|
|
|
|
instance.models.centernet || (instance.config.object.enabled && instance.config.object.modelPath.includes('centernet') ? centernet.load(instance.config) : null),
|
|
|
|
instance.models.faceres || ((instance.config.face.enabled && instance.config.face.description.enabled) ? faceres.load(instance.config) : null),
|
|
|
|
instance.models.segmentation || (instance.config.segmentation.enabled ? segmentation.load(instance.config) : null),
|
2021-08-01 02:42:28 +02:00
|
|
|
// instance.models.agegenderrace || ((instance.config.face.enabled && instance.config.face.agegenderrace.enabled) ? agegenderrace.load(instance.config) : null),
|
2021-06-18 15:16:21 +02:00
|
|
|
]);
|
|
|
|
} else { // load models sequentially
|
|
|
|
if (instance.config.face.enabled && !instance.models.face) instance.models.face = await facemesh.load(instance.config);
|
|
|
|
if (instance.config.face.enabled && instance.config.face.emotion.enabled && !instance.models.emotion) instance.models.emotion = await emotion.load(instance.config);
|
|
|
|
if (instance.config.hand.enabled && !instance.models.handpose) instance.models.handpose = await handpose.load(instance.config);
|
|
|
|
if (instance.config.body.enabled && !instance.models.posenet && instance.config.body.modelPath.includes('posenet')) instance.models.posenet = await posenet.load(instance.config);
|
|
|
|
if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body.modelPath.includes('blazepose')) instance.models.blazepose = await blazepose.load(instance.config);
|
|
|
|
if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body.modelPath.includes('efficientpose')) instance.models.efficientpose = await blazepose.load(instance.config);
|
|
|
|
if (instance.config.body.enabled && !instance.models.movenet && instance.config.body.modelPath.includes('movenet')) instance.models.movenet = await movenet.load(instance.config);
|
|
|
|
if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object.modelPath.includes('nanodet')) instance.models.nanodet = await nanodet.load(instance.config);
|
|
|
|
if (instance.config.object.enabled && !instance.models.centernet && instance.config.object.modelPath.includes('centernet')) instance.models.centernet = await centernet.load(instance.config);
|
|
|
|
if (instance.config.face.enabled && instance.config.face.description.enabled && !instance.models.faceres) instance.models.faceres = await faceres.load(instance.config);
|
|
|
|
if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = await segmentation.load(instance.config);
|
2021-08-01 02:42:28 +02:00
|
|
|
// if (instance.config.face.enabled && instance.config.face.agegenderrace.enabled && !instance.models.agegenderrace) instance.models.agegenderrace = await agegenderrace.load(instance.config);
|
2021-06-18 15:16:21 +02:00
|
|
|
}
|
|
|
|
}
|
2021-09-13 00:37:06 +02:00
|
|
|
|
|
|
|
export async function validate(instance) {
|
|
|
|
interface Op { name: string, category: string, op: string }
|
|
|
|
const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div'];
|
|
|
|
for (const defined of Object.keys(instance.models)) {
|
|
|
|
if (instance.models[defined]) { // check if model is loaded
|
|
|
|
let models: GraphModel[] = [];
|
2021-09-17 20:30:57 +02:00
|
|
|
if (Array.isArray(instance.models[defined])) {
|
|
|
|
models = instance.models[defined]
|
|
|
|
.filter((model) => (model !== null))
|
|
|
|
.map((model) => ((model && model.executor) ? model : model.model));
|
|
|
|
} else {
|
|
|
|
models = [instance.models[defined]];
|
|
|
|
}
|
2021-09-13 00:37:06 +02:00
|
|
|
for (const model of models) {
|
2021-09-17 17:23:00 +02:00
|
|
|
if (!model) {
|
|
|
|
if (instance.config.debug) log('model marked as loaded but not defined:', defined);
|
|
|
|
continue;
|
|
|
|
}
|
2021-09-13 00:37:06 +02:00
|
|
|
const ops: string[] = [];
|
|
|
|
// @ts-ignore // executor is a private method
|
|
|
|
const executor = model?.executor;
|
2021-09-17 17:23:00 +02:00
|
|
|
if (executor && executor.graph.nodes) {
|
2021-09-13 00:37:06 +02:00
|
|
|
for (const kernel of Object.values(executor.graph.nodes)) {
|
|
|
|
const op = (kernel as Op).op.toLowerCase();
|
|
|
|
if (!ops.includes(op)) ops.push(op);
|
|
|
|
}
|
2021-09-17 17:23:00 +02:00
|
|
|
} else {
|
|
|
|
if (!executor && instance.config.debug) log('model signature not determined:', defined);
|
2021-09-13 00:37:06 +02:00
|
|
|
}
|
|
|
|
const missing: string[] = [];
|
|
|
|
for (const op of ops) {
|
|
|
|
if (!simpleOps.includes(op) // exclude simple ops
|
|
|
|
&& !instance.env.kernels.includes(op) // check actual kernel ops
|
|
|
|
&& !instance.env.kernels.includes(op.replace('_', '')) // check variation without _
|
|
|
|
&& !instance.env.kernels.includes(op.replace('native', '')) // check standard variation
|
|
|
|
&& !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation
|
|
|
|
missing.push(op);
|
|
|
|
}
|
|
|
|
}
|
2021-09-17 17:23:00 +02:00
|
|
|
// log('model validation ops:', defined, ops);
|
2021-09-13 00:37:06 +02:00
|
|
|
if (missing.length > 0 && instance.config.debug) log('model validation:', defined, missing);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|