Unverified Commit b0d514d5 by justadudewhohacks Committed by GitHub

Merge pull request #41 from justadudewhohacks/disposable

param mappings for remaining nets + make face detection and recognition nets extend NeuralNetwork
parents a6a68a56 5e0a71fc
......@@ -11,5 +11,6 @@ export declare class Rect implements IRect {
height: number;
constructor(x: number, y: number, width: number, height: number);
toSquare(): Rect;
pad(padX: number, padY: number): Rect;
floor(): Rect;
}
......@@ -20,6 +20,10 @@ var Rect = /** @class */ (function () {
}
return new Rect(x, y, width, height);
};
Rect.prototype.pad = function (padX, padY) {
var _a = this, x = _a.x, y = _a.y, width = _a.width, height = _a.height;
return new Rect(x - (padX / 2), y - (padY / 2), width + padX, height + padY);
};
Rect.prototype.floor = function () {
return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height));
};
......
{"version":3,"file":"Rect.js","sourceRoot":"","sources":["../src/Rect.ts"],"names":[],"mappings":";;AAOA;IAME,cAAY,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc;QAC7D,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEM,uBAAQ,GAAf;QACM,IAAA,SAA8B,EAA5B,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM,CAAS;QAClC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;QACrC,IAAI,KAAK,GAAG,MAAM,EAAE;YAClB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACf,KAAK,IAAI,IAAI,CAAA;SACd;QACD,IAAI,MAAM,GAAG,KAAK,EAAE;YAClB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACf,MAAM,IAAI,IAAI,CAAA;SACf;QACD,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;IAEM,oBAAK,GAAZ;QACE,OAAO,IAAI,IAAI,CACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACxB,CAAA;IACH,CAAC;IACH,WAAC;AAAD,CAAC,AAnCD,IAmCC;AAnCY,oBAAI"}
\ No newline at end of file
{"version":3,"file":"Rect.js","sourceRoot":"","sources":["../src/Rect.ts"],"names":[],"mappings":";;AAOA;IAME,cAAY,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc;QAC7D,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEM,uBAAQ,GAAf;QACM,IAAA,SAA8B,EAA5B,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM,CAAS;QAClC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAA;QACrC,IAAI,KAAK,GAAG,MAAM,EAAE;YAClB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACf,KAAK,IAAI,IAAI,CAAA;SACd;QACD,IAAI,MAAM,GAAG,KAAK,EAAE;YAClB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACf,MAAM,IAAI,IAAI,CAAA;SACf;QACD,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;IAEM,kBAAG,GAAV,UAAW,IAAY,EAAE,IAAY;QAC/B,IAAA,SAA8B,EAA5B,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM,CAAS;QAClC,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;IAC9E,CAAC;IAEM,oBAAK,GAAZ;QACE,OAAO,IAAI,IAAI,CACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACxB,CAAA;IACH,CAAC;IACH,WAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCY,oBAAI"}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { ParamMapping } from './types';
export declare class NeuralNetwork<TNetParams> {
private _name;
protected _params: TNetParams | undefined;
protected _paramMappings: ParamMapping[];
constructor(_name: string);
readonly params: TNetParams | undefined;
readonly paramMappings: ParamMapping[];
getParamFromPath(paramPath: string): tf.Tensor;
......@@ -21,6 +23,16 @@ export declare class NeuralNetwork<TNetParams> {
}[];
variable(): void;
freeze(): void;
dispose(): void;
dispose(throwOnRedispose?: boolean): void;
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>;
extractWeights(weights: Float32Array): void;
private traversePropertyPath(paramPath);
protected loadQuantizedParams(_: any): Promise<{
params: TNetParams;
paramMappings: ParamMapping[];
}>;
protected extractParams(_: any): {
params: TNetParams;
paramMappings: ParamMapping[];
};
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core");
var NeuralNetwork = /** @class */ (function () {
function NeuralNetwork() {
function NeuralNetwork(_name) {
this._name = _name;
this._params = undefined;
this._paramMappings = [];
}
......@@ -59,10 +61,44 @@ var NeuralNetwork = /** @class */ (function () {
_this.reassignParamFromPath(path, tf.tensor(tensor));
});
};
NeuralNetwork.prototype.dispose = function () {
this.getParamList().forEach(function (param) { return param.tensor.dispose(); });
NeuralNetwork.prototype.dispose = function (throwOnRedispose) {
if (throwOnRedispose === void 0) { throwOnRedispose = true; }
this.getParamList().forEach(function (param) {
if (throwOnRedispose && param.tensor.isDisposed) {
throw new Error("param tensor has already been disposed for path " + param.path);
}
param.tensor.dispose();
});
this._params = undefined;
};
NeuralNetwork.prototype.load = function (weightsOrUrl) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a, paramMappings, params;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error(this._name + ".load - expected model uri, or weights as Float32Array");
}
return [4 /*yield*/, this.loadQuantizedParams(weightsOrUrl)];
case 1:
_a = _b.sent(), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
return [2 /*return*/];
}
});
});
};
NeuralNetwork.prototype.extractWeights = function (weights) {
var _a = this.extractParams(weights), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
};
NeuralNetwork.prototype.traversePropertyPath = function (paramPath) {
if (!this.params) {
throw new Error("traversePropertyPath - model has no loaded params");
......@@ -79,6 +115,12 @@ var NeuralNetwork = /** @class */ (function () {
}
return { obj: obj, objProp: objProp };
};
NeuralNetwork.prototype.loadQuantizedParams = function (_) {
throw new Error(this._name + ".loadQuantizedParams - not implemented");
};
NeuralNetwork.prototype.extractParams = function (_) {
throw new Error(this._name + ".extractParams - not implemented");
};
return NeuralNetwork;
}());
exports.NeuralNetwork = NeuralNetwork;
......
{"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../../src/commons/NeuralNetwork.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../../src/commons/NeuralNetwork.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
import { ParamMapping } from './types';
export declare function disposeUnusedWeightTensors(weightMap: any, paramMappings: ParamMapping[]): void;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function disposeUnusedWeightTensors(weightMap, paramMappings) {
Object.keys(weightMap).forEach(function (path) {
if (!paramMappings.some(function (pm) { return pm.originalPath === path; })) {
weightMap[path].dispose();
}
});
}
exports.disposeUnusedWeightTensors = disposeUnusedWeightTensors;
//# sourceMappingURL=disposeUnusedWeightTensors.js.map
\ No newline at end of file
{"version":3,"file":"disposeUnusedWeightTensors.js","sourceRoot":"","sources":["../../src/commons/disposeUnusedWeightTensors.ts"],"names":[],"mappings":";;AAEA,oCAA2C,SAAc,EAAE,aAA6B;IACtF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI;QACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,EAAE,CAAC,YAAY,KAAK,IAAI,EAAxB,CAAwB,CAAC,EAAE;YACvD,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;SAC1B;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAND,gEAMC"}
\ No newline at end of file
import { ParamMapping } from './types';
export declare function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]): <T>(originalPath: string, paramRank: number, mappedPath?: string | undefined) => T;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var isTensor_1 = require("./isTensor");
function extractWeightEntryFactory(weightMap, paramMappings) {
return function (originalPath, paramRank, mappedPath) {
var tensor = weightMap[originalPath];
if (!isTensor_1.isTensor(tensor, paramRank)) {
throw new Error("expected weightMap[" + originalPath + "] to be a Tensor" + paramRank + "D, instead have " + tensor);
}
paramMappings.push({ originalPath: originalPath, paramPath: mappedPath || originalPath });
return tensor;
};
}
exports.extractWeightEntryFactory = extractWeightEntryFactory;
//# sourceMappingURL=extractWeightEntryFactory.js.map
\ No newline at end of file
{"version":3,"file":"extractWeightEntryFactory.js","sourceRoot":"","sources":["../../src/commons/extractWeightEntryFactory.ts"],"names":[],"mappings":";;AAAA,uCAAsC;AAGtC,mCAA0C,SAAc,EAAE,aAA6B;IAErF,OAAO,UAAa,YAAoB,EAAE,SAAiB,EAAE,UAAmB;QAC9E,IAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAAA;QAEtC,IAAI,CAAC,mBAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,wBAAsB,YAAY,wBAAmB,SAAS,wBAAmB,MAAQ,CAAC,CAAA;SAC3G;QAED,aAAa,CAAC,IAAI,CAChB,EAAE,YAAY,cAAA,EAAE,SAAS,EAAE,UAAU,IAAI,YAAY,EAAE,CACxD,CAAA;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AAEH,CAAC;AAhBD,8DAgBC"}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput';
import { TNetInput } from '../types';
import { FaceDetection } from './FaceDetection';
export declare class FaceDetectionNet {
private _params;
load(weightsOrUrl?: Float32Array | string): Promise<void>;
extractWeights(weights: Float32Array): void;
import { NetParams } from './types';
export declare class FaceDetectionNet extends NeuralNetwork<NetParams> {
constructor();
forwardInput(input: NetInput): {
boxes: tf.Tensor<tf.Rank.R2>[];
scores: tf.Tensor<tf.Rank.R1>[];
......@@ -15,4 +15,18 @@ export declare class FaceDetectionNet {
scores: tf.Tensor<tf.Rank.R1>[];
}>;
locateFaces(input: TNetInput, minConfidence?: number, maxResults?: number): Promise<FaceDetection[]>;
protected loadQuantizedParams(uri: string | undefined): Promise<{
params: NetParams;
paramMappings: {
originalPath?: string | undefined;
paramPath: string;
}[];
}>;
protected extractParams(weights: Float32Array): {
params: NetParams;
paramMappings: {
originalPath?: string | undefined;
paramPath: string;
}[];
};
}
......@@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core");
var NeuralNetwork_1 = require("../commons/NeuralNetwork");
var Rect_1 = require("../Rect");
var toNetInput_1 = require("../toNetInput");
var extractParams_1 = require("./extractParams");
......@@ -11,45 +12,22 @@ var mobileNetV1_1 = require("./mobileNetV1");
var nonMaxSuppression_1 = require("./nonMaxSuppression");
var outputLayer_1 = require("./outputLayer");
var predictionLayer_1 = require("./predictionLayer");
var FaceDetectionNet = /** @class */ (function () {
var FaceDetectionNet = /** @class */ (function (_super) {
tslib_1.__extends(FaceDetectionNet, _super);
function FaceDetectionNet() {
return _super.call(this, 'FaceDetectionNet') || this;
}
FaceDetectionNet.prototype.load = function (weightsOrUrl) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array');
}
_a = this;
return [4 /*yield*/, loadQuantizedParams_1.loadQuantizedParams(weightsOrUrl)];
case 1:
_a._params = _b.sent();
return [2 /*return*/];
}
});
});
};
FaceDetectionNet.prototype.extractWeights = function (weights) {
this._params = extractParams_1.extractParams(weights);
};
FaceDetectionNet.prototype.forwardInput = function (input) {
var _this = this;
if (!this._params) {
var params = this.params;
if (!params) {
throw new Error('FaceDetectionNet - load model before inference');
}
return tf.tidy(function () {
var batchTensor = input.toBatchTensor(512, false);
var x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1));
var features = mobileNetV1_1.mobileNetV1(x, _this._params.mobilenetv1_params);
var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer_1.outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params);
var features = mobileNetV1_1.mobileNetV1(x, params.mobilenetv1);
var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, params.prediction_layer), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer_1.outputLayer(boxPredictions, classPredictions, params.output_layer);
});
};
FaceDetectionNet.prototype.forward = function (input) {
......@@ -112,7 +90,13 @@ var FaceDetectionNet = /** @class */ (function () {
});
});
};
FaceDetectionNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams_1.loadQuantizedParams(uri);
};
FaceDetectionNet.prototype.extractParams = function (weights) {
return extractParams_1.extractParams(weights);
};
return FaceDetectionNet;
}());
}(NeuralNetwork_1.NeuralNetwork));
exports.FaceDetectionNet = FaceDetectionNet;
//# sourceMappingURL=FaceDetectionNet.js.map
\ No newline at end of file
{"version":3,"file":"FaceDetectionNet.js","sourceRoot":"","sources":["../../src/faceDetectionNet/FaceDetectionNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"FaceDetectionNet.js","sourceRoot":"","sources":["../../src/faceDetectionNet/FaceDetectionNet.ts"],"names":[],"mappings":";;;AAAA,0CAA4C;AAE5C,0DAAyD;AAEzD,gCAA+B;AAC/B,4CAA2C;AAE3C,iDAAgD;AAChD,iDAAgD;AAChD,6DAA4D;AAC5D,6CAA4C;AAC5C,yDAAwD;AACxD,6CAA4C;AAC5C,qDAAoD;AAGpD;IAAsC,4CAAwB;IAE5D;eACE,kBAAM,kBAAkB,CAAC;IAC3B,CAAC;IAEM,uCAAY,GAAnB,UAAoB,KAAe;QAEzB,IAAA,oBAAM,CAAS;QAEvB,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;SAClE;QAED,OAAO,EAAE,CAAC,IAAI,CAAC;YACb,IAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAEnD,IAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAgB,CAAA;YACnG,IAAM,QAAQ,GAAG,yBAAW,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;YAE7C,IAAA,8FAGqE,EAFzE,kCAAc,EACd,sCAAgB,CACyD;YAE3E,OAAO,yBAAW,CAAC,cAAc,EAAE,gBAAgB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;IACJ,CAAC;IAEY,kCAAO,GAApB,UAAqB,KAAgB;;;;;;wBAC5B,KAAA,IAAI,CAAC,YAAY,CAAA;wBAAC,qBAAM,uBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;4BAAtD,sBAAO,SAAA,IAAI,GAAc,SAA6B,EAAC,EAAA;;;;KACxD;IAEY,sCAAW,GAAxB,UACE,KAAgB,EAChB,aAA2B,EAC3B,UAAwB;QADxB,8BAAA,EAAA,mBAA2B;QAC3B,2BAAA,EAAA,gBAAwB;;;;;4BAGP,qBAAM,uBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;;wBAAxC,QAAQ,GAAG,SAA6B;wBAExC,KAGF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAFtB,MAAM,WAAA,EACL,OAAO,YAAA,CACc;wBAIzB,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;wBACjB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;wBACzB,KAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;4BACnB,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;yBACrB;wBAGkB,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,IAAI,CAAA;wBAAC,qBAAM,MAAM,CAAC,IAAI,EAAE,EAAA;;wBAA3C,UAAU,GAAG,cAAW,SAAmB,EAAC;wBAE5C,YAAY,GAAG,GAAG,CAAA;wBAClB,OAAO,GAAG,qCAAiB,CAC/B,KAAK,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,CACd,CAAA;wBAEK,oBAAoB,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;wBAC5G,mBAAmB,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;wBAEzG,OAAO,GAAG,OAAO;6BACpB,GAAG,CAAC,UAAA,GAAG;4BACA,IAAA;;;wFAGkC,EAHjC,WAAG,EAAE,cAAM,CAGsB;4BAClC,IAAA;;;uFAGiC,EAHhC,YAAI,EAAE,aAAK,CAGqB;4BACvC,OAAO,IAAI,6BAAa,CACtB,UAAU,CAAC,GAAG,CAAC,EACf,IAAI,WAAI,CACN,IAAI,EACJ,GAAG,EACH,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,GAAG,CACb,EACD;gCACE,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;gCAClC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;6BACjC,CACF,CAAA;wBACH,CAAC,CAAC,CAAA;wBAEJ,KAAK,CAAC,OAAO,EAAE,CAAA;wBACf,MAAM,CAAC,OAAO,EAAE,CAAA;wBAEhB,sBAAO,OAAO,EAAA;;;;KACf;IAES,8CAAmB,GAA7B,UAA8B,GAAuB;QACnD,OAAO,yCAAmB,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAES,wCAAa,GAAvB,UAAwB,OAAqB;QAC3C,OAAO,6BAAa,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IACH,uBAAC;AAAD,CAAC,AA5GD,CAAsC,6BAAa,GA4GlD;AA5GY,4CAAgB"}
\ No newline at end of file
......@@ -5,8 +5,8 @@ var convLayer_1 = require("../commons/convLayer");
function boxPredictionLayer(x, params) {
return tf.tidy(function () {
var batchSize = x.shape[0];
var boxPredictionEncoding = tf.reshape(convLayer_1.convLayer(x, params.box_encoding_predictor_params), [batchSize, -1, 1, 4]);
var classPrediction = tf.reshape(convLayer_1.convLayer(x, params.class_predictor_params), [batchSize, -1, 3]);
var boxPredictionEncoding = tf.reshape(convLayer_1.convLayer(x, params.box_encoding_predictor), [batchSize, -1, 1, 4]);
var classPrediction = tf.reshape(convLayer_1.convLayer(x, params.class_predictor), [batchSize, -1, 3]);
return {
boxPredictionEncoding: boxPredictionEncoding,
classPrediction: classPrediction
......
{"version":3,"file":"boxPredictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/boxPredictionLayer.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,kDAAiD;AAIjD,4BACE,CAAc,EACd,MAA2B;IAE3B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE5B,IAAM,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACtC,qBAAS,CAAC,CAAC,EAAE,MAAM,CAAC,6BAA6B,CAAC,EAClD,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtB,CAAA;QACD,IAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,qBAAS,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,EAC3C,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACnB,CAAA;QAED,OAAO;YACL,qBAAqB,uBAAA;YACrB,eAAe,iBAAA;SAChB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAtBD,gDAsBC"}
\ No newline at end of file
{"version":3,"file":"boxPredictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/boxPredictionLayer.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,kDAAiD;AAIjD,4BACE,CAAc,EACd,MAA2B;IAE3B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE5B,IAAM,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACtC,qBAAS,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,EAC3C,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtB,CAAA;QACD,IAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,qBAAS,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACpC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACnB,CAAA;QAED,OAAO;YACL,qBAAqB,uBAAA;YACrB,eAAe,iBAAA;SAChB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAtBD,gDAsBC"}
\ No newline at end of file
import { ParamMapping } from '../commons/types';
import { NetParams } from './types';
export declare function extractParams(weights: Float32Array): NetParams;
export declare function extractParams(weights: Float32Array): {
params: NetParams;
paramMappings: ParamMapping[];
};
......@@ -2,13 +2,14 @@
Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core");
var extractWeightsFactory_1 = require("../commons/extractWeightsFactory");
function extractorsFactory(extractWeights) {
function extractDepthwiseConvParams(numChannels) {
function extractorsFactory(extractWeights, paramMappings) {
function extractDepthwiseConvParams(numChannels, mappedPrefix) {
var filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);
var batch_norm_scale = tf.tensor1d(extractWeights(numChannels));
var batch_norm_offset = tf.tensor1d(extractWeights(numChannels));
var batch_norm_mean = tf.tensor1d(extractWeights(numChannels));
var batch_norm_variance = tf.tensor1d(extractWeights(numChannels));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/batch_norm_scale" }, { paramPath: mappedPrefix + "/batch_norm_offset" }, { paramPath: mappedPrefix + "/batch_norm_mean" }, { paramPath: mappedPrefix + "/batch_norm_variance" });
return {
filters: filters,
batch_norm_scale: batch_norm_scale,
......@@ -17,115 +18,116 @@ function extractorsFactory(extractWeights) {
batch_norm_variance: batch_norm_variance
};
}
function extractConvParams(channelsIn, channelsOut, filterSize) {
function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, isPointwiseConv) {
var filters = tf.tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tf.tensor1d(extractWeights(channelsOut));
return {
filters: filters,
bias: bias
};
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/" + (isPointwiseConv ? 'batch_norm_offset' : 'bias') });
return { filters: filters, bias: bias };
}
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize) {
var _a = extractConvParams(channelsIn, channelsOut, filterSize), filters = _a.filters, bias = _a.bias;
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
var _a = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true), filters = _a.filters, bias = _a.bias;
return {
filters: filters,
batch_norm_offset: bias
};
}
function extractConvPairParams(channelsIn, channelsOut) {
var depthwise_conv_params = extractDepthwiseConvParams(channelsIn);
var pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1);
return {
depthwise_conv_params: depthwise_conv_params,
pointwise_conv_params: pointwise_conv_params
};
function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) {
var depthwise_conv = extractDepthwiseConvParams(channelsIn, mappedPrefix + "/depthwise_conv");
var pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, mappedPrefix + "/pointwise_conv");
return { depthwise_conv: depthwise_conv, pointwise_conv: pointwise_conv };
}
function extractMobilenetV1Params() {
var conv_0_params = extractPointwiseConvParams(3, 32, 3);
var channelNumPairs = [
[32, 64],
[64, 128],
[128, 128],
[128, 256],
[256, 256],
[256, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 1024],
[1024, 1024]
];
var conv_pair_params = channelNumPairs.map(function (_a) {
var channelsIn = _a[0], channelsOut = _a[1];
return extractConvPairParams(channelsIn, channelsOut);
});
var conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');
var conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');
var conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');
var conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');
var conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');
var conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');
var conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');
var conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');
var conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');
var conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');
var conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');
var conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');
var conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');
var conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');
return {
conv_0_params: conv_0_params,
conv_pair_params: conv_pair_params
conv_0: conv_0,
conv_1: conv_1,
conv_2: conv_2,
conv_3: conv_3,
conv_4: conv_4,
conv_5: conv_5,
conv_6: conv_6,
conv_7: conv_7,
conv_8: conv_8,
conv_9: conv_9,
conv_10: conv_10,
conv_11: conv_11,
conv_12: conv_12,
conv_13: conv_13
};
}
function extractPredictionLayerParams() {
var conv_0_params = extractPointwiseConvParams(1024, 256, 1);
var conv_1_params = extractPointwiseConvParams(256, 512, 3);
var conv_2_params = extractPointwiseConvParams(512, 128, 1);
var conv_3_params = extractPointwiseConvParams(128, 256, 3);
var conv_4_params = extractPointwiseConvParams(256, 128, 1);
var conv_5_params = extractPointwiseConvParams(128, 256, 3);
var conv_6_params = extractPointwiseConvParams(256, 64, 1);
var conv_7_params = extractPointwiseConvParams(64, 128, 3);
var box_encoding_0_predictor_params = extractConvParams(512, 12, 1);
var class_predictor_0_params = extractConvParams(512, 9, 1);
var box_encoding_1_predictor_params = extractConvParams(1024, 24, 1);
var class_predictor_1_params = extractConvParams(1024, 18, 1);
var box_encoding_2_predictor_params = extractConvParams(512, 24, 1);
var class_predictor_2_params = extractConvParams(512, 18, 1);
var box_encoding_3_predictor_params = extractConvParams(256, 24, 1);
var class_predictor_3_params = extractConvParams(256, 18, 1);
var box_encoding_4_predictor_params = extractConvParams(256, 24, 1);
var class_predictor_4_params = extractConvParams(256, 18, 1);
var box_encoding_5_predictor_params = extractConvParams(128, 24, 1);
var class_predictor_5_params = extractConvParams(128, 18, 1);
var box_predictor_0_params = {
box_encoding_predictor_params: box_encoding_0_predictor_params,
class_predictor_params: class_predictor_0_params
var conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');
var conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');
var conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');
var conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');
var conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');
var conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');
var conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');
var conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');
var box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');
var class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');
var box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');
var class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');
var box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');
var class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');
var box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');
var class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');
var box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');
var class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');
var box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');
var class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');
var box_predictor_0 = {
box_encoding_predictor: box_encoding_0_predictor,
class_predictor: class_predictor_0
};
var box_predictor_1_params = {
box_encoding_predictor_params: box_encoding_1_predictor_params,
class_predictor_params: class_predictor_1_params
var box_predictor_1 = {
box_encoding_predictor: box_encoding_1_predictor,
class_predictor: class_predictor_1
};
var box_predictor_2_params = {
box_encoding_predictor_params: box_encoding_2_predictor_params,
class_predictor_params: class_predictor_2_params
var box_predictor_2 = {
box_encoding_predictor: box_encoding_2_predictor,
class_predictor: class_predictor_2
};
var box_predictor_3_params = {
box_encoding_predictor_params: box_encoding_3_predictor_params,
class_predictor_params: class_predictor_3_params
var box_predictor_3 = {
box_encoding_predictor: box_encoding_3_predictor,
class_predictor: class_predictor_3
};
var box_predictor_4_params = {
box_encoding_predictor_params: box_encoding_4_predictor_params,
class_predictor_params: class_predictor_4_params
var box_predictor_4 = {
box_encoding_predictor: box_encoding_4_predictor,
class_predictor: class_predictor_4
};
var box_predictor_5_params = {
box_encoding_predictor_params: box_encoding_5_predictor_params,
class_predictor_params: class_predictor_5_params
var box_predictor_5 = {
box_encoding_predictor: box_encoding_5_predictor,
class_predictor: class_predictor_5
};
return {
conv_0_params: conv_0_params,
conv_1_params: conv_1_params,
conv_2_params: conv_2_params,
conv_3_params: conv_3_params,
conv_4_params: conv_4_params,
conv_5_params: conv_5_params,
conv_6_params: conv_6_params,
conv_7_params: conv_7_params,
box_predictor_0_params: box_predictor_0_params,
box_predictor_1_params: box_predictor_1_params,
box_predictor_2_params: box_predictor_2_params,
box_predictor_3_params: box_predictor_3_params,
box_predictor_4_params: box_predictor_4_params,
box_predictor_5_params: box_predictor_5_params
conv_0: conv_0,
conv_1: conv_1,
conv_2: conv_2,
conv_3: conv_3,
conv_4: conv_4,
conv_5: conv_5,
conv_6: conv_6,
conv_7: conv_7,
box_predictor_0: box_predictor_0,
box_predictor_1: box_predictor_1,
box_predictor_2: box_predictor_2,
box_predictor_3: box_predictor_3,
box_predictor_4: box_predictor_4,
box_predictor_5: box_predictor_5
};
}
return {
......@@ -134,21 +136,26 @@ function extractorsFactory(extractWeights) {
};
}
function extractParams(weights) {
var paramMappings = [];
var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory(extractWeights), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams;
var mobilenetv1_params = extractMobilenetV1Params();
var prediction_layer_params = extractPredictionLayerParams();
var _b = extractorsFactory(extractWeights, paramMappings), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams;
var mobilenetv1 = extractMobilenetV1Params();
var prediction_layer = extractPredictionLayerParams();
var extra_dim = tf.tensor3d(extractWeights(5118 * 4), [1, 5118, 4]);
var output_layer_params = {
var output_layer = {
extra_dim: extra_dim
};
paramMappings.push({ paramPath: 'output_layer/extra_dim' });
if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length);
}
return {
mobilenetv1_params: mobilenetv1_params,
prediction_layer_params: prediction_layer_params,
output_layer_params: output_layer_params
params: {
mobilenetv1: mobilenetv1,
prediction_layer: prediction_layer,
output_layer: output_layer
},
paramMappings: paramMappings
};
}
exports.extractParams = extractParams;
......
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/extractParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/extractParams.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,0EAAyE;AAIzE,2BAA2B,cAAsC,EAAE,aAA6B;IAE9F,oCAAoC,WAAmB,EAAE,YAAoB;QAE3E,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;QACxF,IAAM,gBAAgB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QACjE,IAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAClE,IAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAChE,IAAM,mBAAmB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAEpE,aAAa,CAAC,IAAI,CAChB,EAAE,SAAS,EAAK,YAAY,aAAU,EAAE,EACxC,EAAE,SAAS,EAAK,YAAY,sBAAmB,EAAE,EACjD,EAAE,SAAS,EAAK,YAAY,uBAAoB,EAAE,EAClD,EAAE,SAAS,EAAK,YAAY,qBAAkB,EAAE,EAChD,EAAE,SAAS,EAAK,YAAY,yBAAsB,EAAE,CACrD,CAAA;QAED,OAAO;YACL,OAAO,SAAA;YACP,gBAAgB,kBAAA;YAChB,iBAAiB,mBAAA;YACjB,eAAe,iBAAA;YACf,mBAAmB,qBAAA;SACpB,CAAA;IACH,CAAC;IAED,2BACE,UAAkB,EAClB,WAAmB,EACnB,UAAkB,EAClB,YAAoB,EACpB,eAAyB;QAGzB,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CACzB,cAAc,CAAC,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC,EAClE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAClD,CAAA;QACD,IAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAErD,aAAa,CAAC,IAAI,CAChB,EAAE,SAAS,EAAK,YAAY,aAAU,EAAE,EACxC,EAAE,SAAS,EAAK,YAAY,UAAI,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAE,EAAE,CACnF,CAAA;QAED,OAAO,EAAE,OAAO,SAAA,EAAE,IAAI,MAAA,EAAE,CAAA;IAC1B,CAAC;IAED,oCACE,UAAkB,EAClB,WAAmB,EACnB,UAAkB,EAClB,YAAoB;QAGd,IAAA,+EAGwE,EAF5E,oBAAO,EACP,cAAI,CACwE;QAE9E,OAAO;YACL,OAAO,SAAA;YACP,iBAAiB,EAAE,IAAI;SACxB,CAAA;IACH,CAAC;IAED,+BACE,UAAkB,EAClB,WAAmB,EACnB,YAAoB;QAGpB,IAAM,cAAc,GAAG,0BAA0B,CAAC,UAAU,EAAK,YAAY,oBAAiB,CAAC,CAAA;QAC/F,IAAM,cAAc,GAAG,0BAA0B,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,EAAK,YAAY,oBAAiB,CAAC,CAAA;QAE/G,OAAO,EAAE,cAAc,gBAAA,EAAE,cAAc,gBAAA,EAAE,CAAA;IAC3C,CAAC;IAED;QAEE,IAAM,MAAM,GAAG,0BAA0B,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAEzE,IAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,oBAAoB,CAAC,CAAA;QAClE,IAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACnE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACpE,IAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;QACtE,IAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAA;QACtE,IAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAA;QACvE,IAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAA;QAExE,OAAO;YACL,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,OAAO,SAAA;YACP,OAAO,SAAA;YACP,OAAO,SAAA;YACP,OAAO,SAAA;SACR,CAAA;IACH,CAAC;IAED;QACE,IAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QAClF,IAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACjF,IAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACjF,IAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACjF,IAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACjF,IAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACjF,IAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QAChF,IAAM,MAAM,GAAG,0BAA0B,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAA;QAEhF,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,yDAAyD,CAAC,CAAA;QACzH,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;QAC1G,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,yDAAyD,CAAC,CAAA;QAC1H,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;QAC5G,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,yDAAyD,CAAC,CAAA;QACzH,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;QAC3G,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,yDAAyD,CAAC,CAAA;QACzH,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;QAC3G,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,yDAAyD,CAAC,CAAA;QACzH,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;QAC3G,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,yDAAyD,CAAC,CAAA;QACzH,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;QAE3G,IAAM,eAAe,GAAG;YACtB,sBAAsB,EAAE,wBAAwB;YAChD,eAAe,EAAE,iBAAiB;SACnC,CAAA;QACD,IAAM,eAAe,GAAG;YACtB,sBAAsB,EAAE,wBAAwB;YAChD,eAAe,EAAE,iBAAiB;SACnC,CAAA;QACD,IAAM,eAAe,GAAG;YACtB,sBAAsB,EAAE,wBAAwB;YAChD,eAAe,EAAE,iBAAiB;SACnC,CAAA;QACD,IAAM,eAAe,GAAG;YACtB,sBAAsB,EAAE,wBAAwB;YAChD,eAAe,EAAE,iBAAiB;SACnC,CAAA;QACD,IAAM,eAAe,GAAG;YACtB,sBAAsB,EAAE,wBAAwB;YAChD,eAAe,EAAE,iBAAiB;SACnC,CAAA;QACD,IAAM,eAAe,GAAG;YACtB,sBAAsB,EAAE,wBAAwB;YAChD,eAAe,EAAE,iBAAiB;SACnC,CAAA;QAED,OAAO;YACL,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,MAAM,QAAA;YACN,eAAe,iBAAA;YACf,eAAe,iBAAA;YACf,eAAe,iBAAA;YACf,eAAe,iBAAA;YACf,eAAe,iBAAA;YACf,eAAe,iBAAA;SAChB,CAAA;IACH,CAAC;IAED,OAAO;QACL,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;KAC7B,CAAA;AAEH,CAAC;AAED,uBAA8B,OAAqB;IAEjD,IAAM,aAAa,GAAmB,EAAE,CAAA;IAElC,IAAA,2DAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAE5B,IAAA,qDAG8C,EAFlD,sDAAwB,EACxB,8DAA4B,CACsB;IAEpD,IAAM,WAAW,GAAG,wBAAwB,EAAE,CAAA;IAC9C,IAAM,gBAAgB,GAAG,4BAA4B,EAAE,CAAA;IACvD,IAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAC3B,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,EACxB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CACb,CAAA;IACD,IAAM,YAAY,GAAG;QACnB,SAAS,WAAA;KACV,CAAA;IAED,aAAa,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAA;IAE3D,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,MAAM,EAAE;YACN,WAAW,aAAA;YACX,gBAAgB,kBAAA;YAChB,YAAY,cAAA;SACb;QACD,aAAa,eAAA;KACd,CAAA;AACH,CAAC;AAtCD,sCAsCC"}
\ No newline at end of file
export declare function loadQuantizedParams(uri: string | undefined): Promise<any>;
import { ParamMapping } from '../commons/types';
import { NetParams } from './types';
export declare function loadQuantizedParams(uri: string | undefined): Promise<{
params: NetParams;
paramMappings: ParamMapping[];
}>;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var disposeUnusedWeightTensors_1 = require("../commons/disposeUnusedWeightTensors");
var extractWeightEntryFactory_1 = require("../commons/extractWeightEntryFactory");
var isTensor_1 = require("../commons/isTensor");
var loadWeightMap_1 = require("../commons/loadWeightMap");
var DEFAULT_MODEL_NAME = 'face_detection_model';
function extractorsFactory(weightMap) {
function extractPointwiseConvParams(prefix, idx) {
var pointwise_conv_params = {
filters: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/weights"],
batch_norm_offset: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset"]
};
if (!isTensor_1.isTensor4D(pointwise_conv_params.filters)) {
throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/weights] to be a Tensor4D, instead have " + pointwise_conv_params.filters);
}
if (!isTensor_1.isTensor1D(pointwise_conv_params.batch_norm_offset)) {
throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset] to be a Tensor1D, instead have " + pointwise_conv_params.batch_norm_offset);
}
return pointwise_conv_params;
function extractorsFactory(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory_1.extractWeightEntryFactory(weightMap, paramMappings);
function extractPointwiseConvParams(prefix, idx, mappedPrefix) {
var filters = extractWeightEntry(prefix + "/Conv2d_" + idx + "_pointwise/weights", 4, mappedPrefix + "/filters");
var batch_norm_offset = extractWeightEntry(prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset", 1, mappedPrefix + "/batch_norm_offset");
return { filters: filters, batch_norm_offset: batch_norm_offset };
}
function extractConvPairParams(idx) {
var depthwise_conv_params = {
filters: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights"],
batch_norm_scale: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma"],
batch_norm_offset: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta"],
batch_norm_mean: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean"],
batch_norm_variance: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance"],
};
if (!isTensor_1.isTensor4D(depthwise_conv_params.filters)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights] to be a Tensor4D, instead have " + depthwise_conv_params.filters);
}
if (!isTensor_1.isTensor1D(depthwise_conv_params.batch_norm_scale)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_scale);
}
if (!isTensor_1.isTensor1D(depthwise_conv_params.batch_norm_offset)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_offset);
}
if (!isTensor_1.isTensor1D(depthwise_conv_params.batch_norm_mean)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_mean);
}
if (!isTensor_1.isTensor1D(depthwise_conv_params.batch_norm_variance)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_variance);
}
var mappedPrefix = "mobilenetv1/conv_" + idx;
var prefixDepthwiseConv = "MobilenetV1/Conv2d_" + idx + "_depthwise";
var mappedPrefixDepthwiseConv = mappedPrefix + "/depthwise_conv";
var mappedPrefixPointwiseConv = mappedPrefix + "/pointwise_conv";
var filters = extractWeightEntry(prefixDepthwiseConv + "/depthwise_weights", 4, mappedPrefixDepthwiseConv + "/filters");
var batch_norm_scale = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/gamma", 1, mappedPrefixDepthwiseConv + "/batch_norm_scale");
var batch_norm_offset = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/beta", 1, mappedPrefixDepthwiseConv + "/batch_norm_offset");
var batch_norm_mean = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_mean", 1, mappedPrefixDepthwiseConv + "/batch_norm_mean");
var batch_norm_variance = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_variance", 1, mappedPrefixDepthwiseConv + "/batch_norm_variance");
return {
depthwise_conv_params: depthwise_conv_params,
pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx)
depthwise_conv: {
filters: filters,
batch_norm_scale: batch_norm_scale,
batch_norm_offset: batch_norm_offset,
batch_norm_mean: batch_norm_mean,
batch_norm_variance: batch_norm_variance
},
pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv)
};
}
function extractMobilenetV1Params() {
return {
conv_0_params: extractPointwiseConvParams('MobilenetV1', 0),
conv_pair_params: Array(13).fill(0).map(function (_, i) { return extractConvPairParams(i + 1); })
conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
conv_1: extractConvPairParams(1),
conv_2: extractConvPairParams(2),
conv_3: extractConvPairParams(3),
conv_4: extractConvPairParams(4),
conv_5: extractConvPairParams(5),
conv_6: extractConvPairParams(6),
conv_7: extractConvPairParams(7),
conv_8: extractConvPairParams(8),
conv_9: extractConvPairParams(9),
conv_10: extractConvPairParams(10),
conv_11: extractConvPairParams(11),
conv_12: extractConvPairParams(12),
conv_13: extractConvPairParams(13)
};
}
function extractBoxPredictorParams(idx) {
var params = {
box_encoding_predictor_params: {
filters: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights"],
bias: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases"]
},
class_predictor_params: {
filters: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights"],
bias: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases"]
}
};
if (!isTensor_1.isTensor4D(params.box_encoding_predictor_params.filters)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights] to be a Tensor4D, instead have " + params.box_encoding_predictor_params.filters);
}
if (!isTensor_1.isTensor1D(params.box_encoding_predictor_params.bias)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases] to be a Tensor1D, instead have " + params.box_encoding_predictor_params.bias);
function extractConvParams(prefix, mappedPrefix) {
var filters = extractWeightEntry(prefix + "/weights", 4, mappedPrefix + "/filters");
var bias = extractWeightEntry(prefix + "/biases", 1, mappedPrefix + "/bias");
return { filters: filters, bias: bias };
}
if (!isTensor_1.isTensor4D(params.class_predictor_params.filters)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights] to be a Tensor4D, instead have " + params.class_predictor_params.filters);
}
if (!isTensor_1.isTensor1D(params.class_predictor_params.bias)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases] to be a Tensor1D, instead have " + params.class_predictor_params.bias);
}
return params;
function extractBoxPredictorParams(idx) {
var box_encoding_predictor = extractConvParams("Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor", "prediction_layer/box_predictor_" + idx + "/box_encoding_predictor");
var class_predictor = extractConvParams("Prediction/BoxPredictor_" + idx + "/ClassPredictor", "prediction_layer/box_predictor_" + idx + "/class_predictor");
return { box_encoding_predictor: box_encoding_predictor, class_predictor: class_predictor };
}
function extractPredictionLayerParams() {
return {
conv_0_params: extractPointwiseConvParams('Prediction', 0),
conv_1_params: extractPointwiseConvParams('Prediction', 1),
conv_2_params: extractPointwiseConvParams('Prediction', 2),
conv_3_params: extractPointwiseConvParams('Prediction', 3),
conv_4_params: extractPointwiseConvParams('Prediction', 4),
conv_5_params: extractPointwiseConvParams('Prediction', 5),
conv_6_params: extractPointwiseConvParams('Prediction', 6),
conv_7_params: extractPointwiseConvParams('Prediction', 7),
box_predictor_0_params: extractBoxPredictorParams(0),
box_predictor_1_params: extractBoxPredictorParams(1),
box_predictor_2_params: extractBoxPredictorParams(2),
box_predictor_3_params: extractBoxPredictorParams(3),
box_predictor_4_params: extractBoxPredictorParams(4),
box_predictor_5_params: extractBoxPredictorParams(5)
conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
box_predictor_0: extractBoxPredictorParams(0),
box_predictor_1: extractBoxPredictorParams(1),
box_predictor_2: extractBoxPredictorParams(2),
box_predictor_3: extractBoxPredictorParams(3),
box_predictor_4: extractBoxPredictorParams(4),
box_predictor_5: extractBoxPredictorParams(5)
};
}
return {
......@@ -102,24 +87,28 @@ function extractorsFactory(weightMap) {
}
function loadQuantizedParams(uri) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var weightMap, _a, extractMobilenetV1Params, extractPredictionLayerParams, extra_dim;
var weightMap, paramMappings, _a, extractMobilenetV1Params, extractPredictionLayerParams, extra_dim, params;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap_1.loadWeightMap(uri, DEFAULT_MODEL_NAME)];
case 1:
weightMap = _b.sent();
_a = extractorsFactory(weightMap), extractMobilenetV1Params = _a.extractMobilenetV1Params, extractPredictionLayerParams = _a.extractPredictionLayerParams;
paramMappings = [];
_a = extractorsFactory(weightMap, paramMappings), extractMobilenetV1Params = _a.extractMobilenetV1Params, extractPredictionLayerParams = _a.extractPredictionLayerParams;
extra_dim = weightMap['Output/extra_dim'];
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });
if (!isTensor_1.isTensor3D(extra_dim)) {
throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim);
}
return [2 /*return*/, {
mobilenetv1_params: extractMobilenetV1Params(),
prediction_layer_params: extractPredictionLayerParams(),
output_layer_params: {
params = {
mobilenetv1: extractMobilenetV1Params(),
prediction_layer: extractPredictionLayerParams(),
output_layer: {
extra_dim: extra_dim
}
}];
};
disposeUnusedWeightTensors_1.disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
}
});
});
......
{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/loadQuantizedParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/loadQuantizedParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
......@@ -16,12 +16,27 @@ function getStridesForLayerIdx(layerIdx) {
function mobileNetV1(x, params) {
return tf.tidy(function () {
var conv11 = null;
var out = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0_params, [2, 2]);
params.conv_pair_params.forEach(function (param, i) {
var out = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0, [2, 2]);
var convPairParams = [
params.conv_1,
params.conv_2,
params.conv_3,
params.conv_4,
params.conv_5,
params.conv_6,
params.conv_7,
params.conv_8,
params.conv_9,
params.conv_10,
params.conv_11,
params.conv_12,
params.conv_13
];
convPairParams.forEach(function (param, i) {
var layerIdx = i + 1;
var depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides);
out = pointwiseConvLayer_1.pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]);
out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
out = pointwiseConvLayer_1.pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
if (layerIdx === 11) {
conv11 = out;
}
......
{"version":3,"file":"mobileNetV1.js","sourceRoot":"","sources":["../../src/faceDetectionNet/mobileNetV1.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,2DAA0D;AAG1D,IAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,4BACE,CAAc,EACd,MAAuC,EACvC,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAChE,GAAG,GAAG,EAAE,CAAC,kBAAkB,CACzB,GAAG,EACH,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,mBAAmB,EAC1B,OAAO,EACP,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,iBAAiB,CACzB,CAAA;QACD,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,+BAA+B,QAAgB;IAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,KAAK,QAAQ,EAAhB,CAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,qBAA4B,CAAc,EAAE,MAA0B;IACpE,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,GAAG,GAAG,uCAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAE7D,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,CAAC;YACvC,IAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,IAAM,oBAAoB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC5D,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAA;YAChF,GAAG,GAAG,uCAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAClE,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAA;aACb;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;SACjE;QAED,OAAO;YACL,GAAG,KAAA;YACH,MAAM,EAAE,MAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC;AA1BD,kCA0BC"}
\ No newline at end of file
{"version":3,"file":"mobileNetV1.js","sourceRoot":"","sources":["../../src/faceDetectionNet/mobileNetV1.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,2DAA0D;AAG1D,IAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,4BACE,CAAc,EACd,MAAuC,EACvC,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAChE,GAAG,GAAG,EAAE,CAAC,kBAAkB,CACzB,GAAG,EACH,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,mBAAmB,EAC1B,OAAO,EACP,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,iBAAiB,CACzB,CAAA;QACD,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,+BAA+B,QAAgB;IAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,KAAK,QAAQ,EAAhB,CAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,qBAA4B,CAAc,EAAE,MAA0B;IACpE,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,GAAG,GAAG,uCAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEtD,IAAM,cAAc,GAAG;YACrB,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO;SACf,CAAA;QAED,cAAc,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,CAAC;YAC9B,IAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,IAAM,oBAAoB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC5D,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;YACzE,GAAG,GAAG,uCAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC3D,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAA;aACb;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;SACjE;QAED,OAAO;YACL,GAAG,KAAA;YACH,MAAM,EAAE,MAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC;AA1CD,kCA0CC"}
\ No newline at end of file
......@@ -5,20 +5,20 @@ var boxPredictionLayer_1 = require("./boxPredictionLayer");
var pointwiseConvLayer_1 = require("./pointwiseConvLayer");
function predictionLayer(x, conv11, params) {
return tf.tidy(function () {
var conv0 = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0_params, [1, 1]);
var conv1 = pointwiseConvLayer_1.pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]);
var conv2 = pointwiseConvLayer_1.pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]);
var conv3 = pointwiseConvLayer_1.pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]);
var conv4 = pointwiseConvLayer_1.pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]);
var conv5 = pointwiseConvLayer_1.pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]);
var conv6 = pointwiseConvLayer_1.pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]);
var conv7 = pointwiseConvLayer_1.pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]);
var boxPrediction0 = boxPredictionLayer_1.boxPredictionLayer(conv11, params.box_predictor_0_params);
var boxPrediction1 = boxPredictionLayer_1.boxPredictionLayer(x, params.box_predictor_1_params);
var boxPrediction2 = boxPredictionLayer_1.boxPredictionLayer(conv1, params.box_predictor_2_params);
var boxPrediction3 = boxPredictionLayer_1.boxPredictionLayer(conv3, params.box_predictor_3_params);
var boxPrediction4 = boxPredictionLayer_1.boxPredictionLayer(conv5, params.box_predictor_4_params);
var boxPrediction5 = boxPredictionLayer_1.boxPredictionLayer(conv7, params.box_predictor_5_params);
var conv0 = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0, [1, 1]);
var conv1 = pointwiseConvLayer_1.pointwiseConvLayer(conv0, params.conv_1, [2, 2]);
var conv2 = pointwiseConvLayer_1.pointwiseConvLayer(conv1, params.conv_2, [1, 1]);
var conv3 = pointwiseConvLayer_1.pointwiseConvLayer(conv2, params.conv_3, [2, 2]);
var conv4 = pointwiseConvLayer_1.pointwiseConvLayer(conv3, params.conv_4, [1, 1]);
var conv5 = pointwiseConvLayer_1.pointwiseConvLayer(conv4, params.conv_5, [2, 2]);
var conv6 = pointwiseConvLayer_1.pointwiseConvLayer(conv5, params.conv_6, [1, 1]);
var conv7 = pointwiseConvLayer_1.pointwiseConvLayer(conv6, params.conv_7, [2, 2]);
var boxPrediction0 = boxPredictionLayer_1.boxPredictionLayer(conv11, params.box_predictor_0);
var boxPrediction1 = boxPredictionLayer_1.boxPredictionLayer(x, params.box_predictor_1);
var boxPrediction2 = boxPredictionLayer_1.boxPredictionLayer(conv1, params.box_predictor_2);
var boxPrediction3 = boxPredictionLayer_1.boxPredictionLayer(conv3, params.box_predictor_3);
var boxPrediction4 = boxPredictionLayer_1.boxPredictionLayer(conv5, params.box_predictor_4);
var boxPrediction5 = boxPredictionLayer_1.boxPredictionLayer(conv7, params.box_predictor_5);
var boxPredictions = tf.concat([
boxPrediction0.boxPredictionEncoding,
boxPrediction1.boxPredictionEncoding,
......
{"version":3,"file":"predictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/predictionLayer.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,2DAA0D;AAC1D,2DAA0D;AAG1D,yBACE,CAAc,EACd,MAAmB,EACnB,MAA6B;IAE7B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,KAAK,GAAG,uCAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAErE,IAAM,cAAc,GAAG,uCAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAChF,IAAM,cAAc,GAAG,uCAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC3E,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAE/E,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;YAC/B,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;SACrC,EAAE,CAAC,CAAgB,CAAA;QAEpB,IAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;SAC/B,EAAE,CAAC,CAAgB,CAAA;QAEpB,OAAO;YACL,cAAc,gBAAA;YACd,gBAAgB,kBAAA;SACjB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AA9CD,0CA8CC"}
\ No newline at end of file
{"version":3,"file":"predictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/predictionLayer.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,2DAA0D;AAC1D,2DAA0D;AAG1D,yBACE,CAAc,EACd,MAAmB,EACnB,MAA6B;IAE7B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,KAAK,GAAG,uCAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAM,KAAK,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAE9D,IAAM,cAAc,GAAG,uCAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACzE,IAAM,cAAc,GAAG,uCAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACpE,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACxE,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACxE,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACxE,IAAM,cAAc,GAAG,uCAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QAExE,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;YAC/B,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;SACrC,EAAE,CAAC,CAAgB,CAAA;QAEpB,IAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;SAC/B,EAAE,CAAC,CAAgB,CAAA;QAEpB,OAAO;YACL,cAAc,gBAAA;YACd,gBAAgB,kBAAA;SACjB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AA9CD,0CA8CC"}
\ No newline at end of file
......@@ -13,39 +13,51 @@ export declare namespace MobileNetV1 {
batch_norm_variance: tf.Tensor1D;
};
type ConvPairParams = {
depthwise_conv_params: DepthwiseConvParams;
pointwise_conv_params: PointwiseConvParams;
depthwise_conv: DepthwiseConvParams;
pointwise_conv: PointwiseConvParams;
};
type Params = {
conv_0_params: PointwiseConvParams;
conv_pair_params: ConvPairParams[];
conv_0: PointwiseConvParams;
conv_1: ConvPairParams;
conv_2: ConvPairParams;
conv_3: ConvPairParams;
conv_4: ConvPairParams;
conv_5: ConvPairParams;
conv_6: ConvPairParams;
conv_7: ConvPairParams;
conv_8: ConvPairParams;
conv_9: ConvPairParams;
conv_10: ConvPairParams;
conv_11: ConvPairParams;
conv_12: ConvPairParams;
conv_13: ConvPairParams;
};
}
export declare type BoxPredictionParams = {
box_encoding_predictor_params: ConvParams;
class_predictor_params: ConvParams;
box_encoding_predictor: ConvParams;
class_predictor: ConvParams;
};
export declare type PredictionLayerParams = {
conv_0_params: PointwiseConvParams;
conv_1_params: PointwiseConvParams;
conv_2_params: PointwiseConvParams;
conv_3_params: PointwiseConvParams;
conv_4_params: PointwiseConvParams;
conv_5_params: PointwiseConvParams;
conv_6_params: PointwiseConvParams;
conv_7_params: PointwiseConvParams;
box_predictor_0_params: BoxPredictionParams;
box_predictor_1_params: BoxPredictionParams;
box_predictor_2_params: BoxPredictionParams;
box_predictor_3_params: BoxPredictionParams;
box_predictor_4_params: BoxPredictionParams;
box_predictor_5_params: BoxPredictionParams;
conv_0: PointwiseConvParams;
conv_1: PointwiseConvParams;
conv_2: PointwiseConvParams;
conv_3: PointwiseConvParams;
conv_4: PointwiseConvParams;
conv_5: PointwiseConvParams;
conv_6: PointwiseConvParams;
conv_7: PointwiseConvParams;
box_predictor_0: BoxPredictionParams;
box_predictor_1: BoxPredictionParams;
box_predictor_2: BoxPredictionParams;
box_predictor_3: BoxPredictionParams;
box_predictor_4: BoxPredictionParams;
box_predictor_5: BoxPredictionParams;
};
export declare type OutputLayerParams = {
extra_dim: tf.Tensor3D;
};
export declare type NetParams = {
mobilenetv1_params: MobileNetV1.Params;
prediction_layer_params: PredictionLayerParams;
output_layer_params: OutputLayerParams;
mobilenetv1: MobileNetV1.Params;
prediction_layer: PredictionLayerParams;
output_layer: OutputLayerParams;
};
......@@ -5,9 +5,22 @@ import { TNetInput } from '../types';
import { FaceLandmarks } from './FaceLandmarks';
import { NetParams } from './types';
export declare class FaceLandmarkNet extends NeuralNetwork<NetParams> {
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>;
extractWeights(weights: Float32Array): void;
constructor();
forwardInput(input: NetInput): tf.Tensor2D;
forward(input: TNetInput): Promise<tf.Tensor2D>;
detectLandmarks(input: TNetInput): Promise<FaceLandmarks | FaceLandmarks[]>;
protected loadQuantizedParams(uri: string | undefined): Promise<{
params: NetParams;
paramMappings: {
originalPath?: string | undefined;
paramPath: string;
}[];
}>;
protected extractParams(weights: Float32Array): {
params: NetParams;
paramMappings: {
originalPath?: string | undefined;
paramPath: string;
}[];
};
}
......@@ -21,57 +21,29 @@ function maxPool(x, strides) {
var FaceLandmarkNet = /** @class */ (function (_super) {
tslib_1.__extends(FaceLandmarkNet, _super);
function FaceLandmarkNet() {
return _super !== null && _super.apply(this, arguments) || this;
return _super.call(this, 'FaceLandmarkNet') || this;
}
FaceLandmarkNet.prototype.load = function (weightsOrUrl) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a, paramMappings, params;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array');
}
return [4 /*yield*/, loadQuantizedParams_1.loadQuantizedParams(weightsOrUrl)];
case 1:
_a = _b.sent(), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
return [2 /*return*/];
}
});
});
};
FaceLandmarkNet.prototype.extractWeights = function (weights) {
var _a = extractParams_1.extractParams(weights), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
};
FaceLandmarkNet.prototype.forwardInput = function (input) {
var params = this._params;
var params = this.params;
if (!params) {
throw new Error('FaceLandmarkNet - load model before inference');
}
return tf.tidy(function () {
var batchTensor = input.toBatchTensor(128, true);
var out = conv(batchTensor, params.conv0_params);
var out = conv(batchTensor, params.conv0);
out = maxPool(out);
out = conv(out, params.conv1_params);
out = conv(out, params.conv2_params);
out = conv(out, params.conv1);
out = conv(out, params.conv2);
out = maxPool(out);
out = conv(out, params.conv3_params);
out = conv(out, params.conv4_params);
out = conv(out, params.conv3);
out = conv(out, params.conv4);
out = maxPool(out);
out = conv(out, params.conv5_params);
out = conv(out, params.conv6_params);
out = conv(out, params.conv5);
out = conv(out, params.conv6);
out = maxPool(out, [1, 1]);
out = conv(out, params.conv7_params);
var fc0 = tf.relu(fullyConnectedLayer_1.fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params));
var fc1 = fullyConnectedLayer_1.fullyConnectedLayer(fc0, params.fc1_params);
out = conv(out, params.conv7);
var fc0 = tf.relu(fullyConnectedLayer_1.fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0));
var fc1 = fullyConnectedLayer_1.fullyConnectedLayer(fc0, params.fc1);
var createInterleavedTensor = function (fillX, fillY) {
return tf.stack([
tf.fill([68], fillX),
......@@ -146,6 +118,12 @@ var FaceLandmarkNet = /** @class */ (function (_super) {
});
});
};
FaceLandmarkNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams_1.loadQuantizedParams(uri);
};
FaceLandmarkNet.prototype.extractParams = function (weights) {
return extractParams_1.extractParams(weights);
};
return FaceLandmarkNet;
}(NeuralNetwork_1.NeuralNetwork));
exports.FaceLandmarkNet = FaceLandmarkNet;
......
{"version":3,"file":"FaceLandmarkNet.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/FaceLandmarkNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"FaceLandmarkNet.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/FaceLandmarkNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core");
var extractConvParamsFactory_1 = require("../commons/extractConvParamsFactory");
var extractWeightsFactory_1 = require("../commons/extractWeightsFactory");
function extractParams(weights) {
var paramMappings = [];
var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var extractConvParams = extractConvParamsFactory_1.extractConvParamsFactory(extractWeights, paramMappings);
function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
var filters = tf.tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tf.tensor1d(extractWeights(channelsOut));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/bias" });
return { filters: filters, bias: bias };
}
function extractFcParams(channelsIn, channelsOut, mappedPrefix) {
var fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);
var fc_bias = tf.tensor1d(extractWeights(channelsOut));
......@@ -16,32 +20,32 @@ function extractParams(weights) {
bias: fc_bias
};
}
var conv0_params = extractConvParams(3, 32, 3, 'conv0_params');
var conv1_params = extractConvParams(32, 64, 3, 'conv1_params');
var conv2_params = extractConvParams(64, 64, 3, 'conv2_params');
var conv3_params = extractConvParams(64, 64, 3, 'conv3_params');
var conv4_params = extractConvParams(64, 64, 3, 'conv4_params');
var conv5_params = extractConvParams(64, 128, 3, 'conv5_params');
var conv6_params = extractConvParams(128, 128, 3, 'conv6_params');
var conv7_params = extractConvParams(128, 256, 3, 'conv7_params');
var fc0_params = extractFcParams(6400, 1024, 'fc0_params');
var fc1_params = extractFcParams(1024, 136, 'fc1_params');
var conv0 = extractConvParams(3, 32, 3, 'conv0');
var conv1 = extractConvParams(32, 64, 3, 'conv1');
var conv2 = extractConvParams(64, 64, 3, 'conv2');
var conv3 = extractConvParams(64, 64, 3, 'conv3');
var conv4 = extractConvParams(64, 64, 3, 'conv4');
var conv5 = extractConvParams(64, 128, 3, 'conv5');
var conv6 = extractConvParams(128, 128, 3, 'conv6');
var conv7 = extractConvParams(128, 256, 3, 'conv7');
var fc0 = extractFcParams(6400, 1024, 'fc0');
var fc1 = extractFcParams(1024, 136, 'fc1');
if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length);
}
return {
paramMappings: paramMappings,
params: {
conv0_params: conv0_params,
conv1_params: conv1_params,
conv2_params: conv2_params,
conv3_params: conv3_params,
conv4_params: conv4_params,
conv5_params: conv5_params,
conv6_params: conv6_params,
conv7_params: conv7_params,
fc0_params: fc0_params,
fc1_params: fc1_params
conv0: conv0,
conv1: conv1,
conv2: conv2,
conv3: conv3,
conv4: conv4,
conv5: conv5,
conv6: conv6,
conv7: conv7,
fc0: fc0,
fc1: fc1
}
};
}
......
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/extractParams.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,gFAA+E;AAC/E,0EAAyE;AAIzE,uBAA8B,OAAqB;IACjD,IAAM,aAAa,GAAmB,EAAE,CAAA;IAElC,IAAA,2DAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAElC,IAAM,iBAAiB,GAAG,mDAAwB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;IAEjF,yBAAyB,UAAkB,EAAE,WAAmB,EAAE,YAAoB;QACpF,IAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;QACnG,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAExD,aAAa,CAAC,IAAI,CAChB,EAAE,SAAS,EAAK,YAAY,aAAU,EAAE,EACxC,EAAE,SAAS,EAAK,YAAY,UAAO,EAAE,CACtC,CAAA;QAED,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,OAAO;SACd,CAAA;IACH,CAAC;IAED,IAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IAChE,IAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACjE,IAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACjE,IAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACjE,IAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACjE,IAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IAClE,IAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACnE,IAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACnE,IAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IAC5D,IAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,CAAA;IAE3D,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,aAAa,eAAA;QACb,MAAM,EAAE;YACN,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,YAAY,cAAA;YACZ,UAAU,YAAA;YACV,UAAU,YAAA;SACX;KACF,CAAA;AACH,CAAC;AAvDD,sCAuDC"}
\ No newline at end of file
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/extractParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var extractWeightEntry_1 = require("../commons/extractWeightEntry");
var disposeUnusedWeightTensors_1 = require("../commons/disposeUnusedWeightTensors");
var extractWeightEntryFactory_1 = require("../commons/extractWeightEntryFactory");
var loadWeightMap_1 = require("../commons/loadWeightMap");
var DEFAULT_MODEL_NAME = 'face_landmark_68_model';
function extractorsFactory(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory_1.extractWeightEntryFactory(weightMap, paramMappings);
function extractConvParams(prefix, mappedPrefix) {
var filtersEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/kernel", 4);
var biasEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/bias", 1);
paramMappings.push({ originalPath: filtersEntry.path, paramPath: mappedPrefix + "/filters" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" });
return {
filters: filtersEntry.tensor,
bias: biasEntry.tensor
};
var filters = extractWeightEntry(prefix + "/kernel", 4, mappedPrefix + "/filters");
var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
return { filters: filters, bias: bias };
}
function extractFcParams(prefix, mappedPrefix) {
var weightsEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/kernel", 2);
var biasEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/bias", 1);
paramMappings.push({ originalPath: weightsEntry.path, paramPath: mappedPrefix + "/weights" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" });
return {
weights: weightsEntry.tensor,
bias: biasEntry.tensor
};
var weights = extractWeightEntry(prefix + "/kernel", 2, mappedPrefix + "/weights");
var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
return { weights: weights, bias: bias };
}
return {
extractConvParams: extractConvParams,
......@@ -39,17 +33,18 @@ function loadQuantizedParams(uri) {
paramMappings = [];
_a = extractorsFactory(weightMap, paramMappings), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams;
params = {
conv0_params: extractConvParams('conv2d_0', 'conv0_params'),
conv1_params: extractConvParams('conv2d_1', 'conv1_params'),
conv2_params: extractConvParams('conv2d_2', 'conv2_params'),
conv3_params: extractConvParams('conv2d_3', 'conv3_params'),
conv4_params: extractConvParams('conv2d_4', 'conv4_params'),
conv5_params: extractConvParams('conv2d_5', 'conv5_params'),
conv6_params: extractConvParams('conv2d_6', 'conv6_params'),
conv7_params: extractConvParams('conv2d_7', 'conv7_params'),
fc0_params: extractFcParams('dense', 'fc0_params'),
fc1_params: extractFcParams('logits', 'fc1_params')
conv0: extractConvParams('conv2d_0', 'conv0'),
conv1: extractConvParams('conv2d_1', 'conv1'),
conv2: extractConvParams('conv2d_2', 'conv2'),
conv3: extractConvParams('conv2d_3', 'conv3'),
conv4: extractConvParams('conv2d_4', 'conv4'),
conv5: extractConvParams('conv2d_5', 'conv5'),
conv6: extractConvParams('conv2d_6', 'conv6'),
conv7: extractConvParams('conv2d_7', 'conv7'),
fc0: extractFcParams('dense', 'fc0'),
fc1: extractFcParams('logits', 'fc1')
};
disposeUnusedWeightTensors_1.disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
}
});
......
{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/loadQuantizedParams.ts"],"names":[],"mappings":";;;AAEA,oEAAmE;AACnE,0DAAyD;AAIzD,IAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAEnD,2BAA2B,SAAc,EAAE,aAA6B;IAEtE,2BAA2B,MAAc,EAAE,YAAoB;QAC7D,IAAM,YAAY,GAAG,uCAAkB,CAAC,SAAS,EAAK,MAAM,YAAS,EAAE,CAAC,CAAC,CAAA;QACzE,IAAM,SAAS,GAAG,uCAAkB,CAAC,SAAS,EAAK,MAAM,UAAO,EAAE,CAAC,CAAC,CAAA;QACpE,aAAa,CAAC,IAAI,CAChB,EAAE,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAK,YAAY,aAAU,EAAE,EACzE,EAAE,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAK,YAAY,UAAO,EAAE,CACpE,CAAA;QACD,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,MAAqB;YAC3C,IAAI,EAAE,SAAS,CAAC,MAAqB;SACtC,CAAA;IACH,CAAC;IAED,yBAAyB,MAAc,EAAE,YAAoB;QAC3D,IAAM,YAAY,GAAG,uCAAkB,CAAC,SAAS,EAAK,MAAM,YAAS,EAAE,CAAC,CAAC,CAAA;QACzE,IAAM,SAAS,GAAG,uCAAkB,CAAC,SAAS,EAAK,MAAM,UAAO,EAAE,CAAC,CAAC,CAAA;QACpE,aAAa,CAAC,IAAI,CAChB,EAAE,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAK,YAAY,aAAU,EAAE,EACzE,EAAE,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAK,YAAY,UAAO,EAAE,CACpE,CAAA;QACD,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,MAAqB;YAC3C,IAAI,EAAE,SAAS,CAAC,MAAqB;SACtC,CAAA;IACH,CAAC;IAED,OAAO;QACL,iBAAiB,mBAAA;QACjB,eAAe,iBAAA;KAChB,CAAA;AACH,CAAC;AAED,6BACE,GAAuB;;;;;wBAGL,qBAAM,6BAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAA;;oBAAxD,SAAS,GAAG,SAA4C;oBACxD,aAAa,GAAmB,EAAE,CAAA;oBAElC,KAGF,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,EAF7C,iBAAiB,uBAAA,EACjB,eAAe,qBAAA,CAC8B;oBAEzC,MAAM,GAAG;wBACb,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,YAAY,EAAE,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;wBAC3D,UAAU,EAAE,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC;wBAClD,UAAU,EAAE,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC;qBACpD,CAAA;oBAED,sBAAO,EAAE,MAAM,QAAA,EAAE,aAAa,eAAA,EAAE,EAAA;;;;CACjC;AA1BD,kDA0BC"}
\ No newline at end of file
{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/loadQuantizedParams.ts"],"names":[],"mappings":";;;AAEA,oFAAmF;AACnF,kFAAiF;AACjF,0DAAyD;AAIzD,IAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAEnD,2BAA2B,SAAc,EAAE,aAA6B;IAEtE,IAAM,kBAAkB,GAAG,qDAAyB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IAE9E,2BAA2B,MAAc,EAAE,YAAoB;QAC7D,IAAM,OAAO,GAAG,kBAAkB,CAAiB,MAAM,YAAS,EAAE,CAAC,EAAK,YAAY,aAAU,CAAC,CAAA;QACjG,IAAM,IAAI,GAAG,kBAAkB,CAAiB,MAAM,UAAO,EAAE,CAAC,EAAK,YAAY,UAAO,CAAC,CAAA;QAEzF,OAAO,EAAE,OAAO,SAAA,EAAE,IAAI,MAAA,EAAE,CAAA;IAC1B,CAAC;IAED,yBAAyB,MAAc,EAAE,YAAoB;QAC3D,IAAM,OAAO,GAAG,kBAAkB,CAAiB,MAAM,YAAS,EAAE,CAAC,EAAK,YAAY,aAAU,CAAC,CAAA;QACjG,IAAM,IAAI,GAAG,kBAAkB,CAAiB,MAAM,UAAO,EAAE,CAAC,EAAK,YAAY,UAAO,CAAC,CAAA;QAEzF,OAAO,EAAE,OAAO,SAAA,EAAE,IAAI,MAAA,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO;QACL,iBAAiB,mBAAA;QACjB,eAAe,iBAAA;KAChB,CAAA;AACH,CAAC;AAED,6BACE,GAAuB;;;;;wBAGL,qBAAM,6BAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAA;;oBAAxD,SAAS,GAAG,SAA4C;oBACxD,aAAa,GAAmB,EAAE,CAAA;oBAElC,KAGF,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,EAF7C,iBAAiB,uBAAA,EACjB,eAAe,qBAAA,CAC8B;oBAEzC,MAAM,GAAG;wBACb,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;wBAC7C,GAAG,EAAE,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC;wBACpC,GAAG,EAAE,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC;qBACtC,CAAA;oBAED,uDAA0B,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;oBAEpD,sBAAO,EAAE,MAAM,QAAA,EAAE,aAAa,eAAA,EAAE,EAAA;;;;CACjC;AA5BD,kDA4BC"}
\ No newline at end of file
......@@ -5,14 +5,14 @@ export declare type FCParams = {
bias: tf.Tensor1D;
};
export declare type NetParams = {
conv0_params: ConvParams;
conv1_params: ConvParams;
conv2_params: ConvParams;
conv3_params: ConvParams;
conv4_params: ConvParams;
conv5_params: ConvParams;
conv6_params: ConvParams;
conv7_params: ConvParams;
fc0_params: FCParams;
fc1_params: FCParams;
conv0: ConvParams;
conv1: ConvParams;
conv2: ConvParams;
conv3: ConvParams;
conv4: ConvParams;
conv5: ConvParams;
conv6: ConvParams;
conv7: ConvParams;
fc0: FCParams;
fc1: FCParams;
};
import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput';
import { TNetInput } from '../types';
export declare class FaceRecognitionNet {
private _params;
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>;
extractWeights(weights: Float32Array): void;
import { NetParams } from './types';
export declare class FaceRecognitionNet extends NeuralNetwork<NetParams> {
constructor();
forwardInput(input: NetInput): tf.Tensor2D;
forward(input: TNetInput): Promise<tf.Tensor2D>;
computeFaceDescriptor(input: TNetInput): Promise<Float32Array | Float32Array[]>;
protected loadQuantizedParams(uri: string | undefined): Promise<{
params: NetParams;
paramMappings: {
originalPath?: string | undefined;
paramPath: string;
}[];
}>;
protected extractParams(weights: Float32Array): {
params: NetParams;
paramMappings: {
originalPath?: string | undefined;
paramPath: string;
}[];
};
}
......@@ -2,66 +2,44 @@
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core");
var NeuralNetwork_1 = require("../commons/NeuralNetwork");
var toNetInput_1 = require("../toNetInput");
var convLayer_1 = require("./convLayer");
var extractParams_1 = require("./extractParams");
var loadQuantizedParams_1 = require("./loadQuantizedParams");
var normalize_1 = require("./normalize");
var residualLayer_1 = require("./residualLayer");
var FaceRecognitionNet = /** @class */ (function () {
var FaceRecognitionNet = /** @class */ (function (_super) {
tslib_1.__extends(FaceRecognitionNet, _super);
function FaceRecognitionNet() {
return _super.call(this, 'FaceRecognitionNet') || this;
}
FaceRecognitionNet.prototype.load = function (weightsOrUrl) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array');
}
_a = this;
return [4 /*yield*/, loadQuantizedParams_1.loadQuantizedParams(weightsOrUrl)];
case 1:
_a._params = _b.sent();
return [2 /*return*/];
}
});
});
};
FaceRecognitionNet.prototype.extractWeights = function (weights) {
this._params = extractParams_1.extractParams(weights);
};
FaceRecognitionNet.prototype.forwardInput = function (input) {
var _this = this;
if (!this._params) {
var params = this.params;
if (!params) {
throw new Error('FaceRecognitionNet - load model before inference');
}
return tf.tidy(function () {
var batchTensor = input.toBatchTensor(150, true);
var normalized = normalize_1.normalize(batchTensor);
var out = convLayer_1.convDown(normalized, _this._params.conv32_down);
var out = convLayer_1.convDown(normalized, params.conv32_down);
out = tf.maxPool(out, 3, 2, 'valid');
out = residualLayer_1.residual(out, _this._params.conv32_1);
out = residualLayer_1.residual(out, _this._params.conv32_2);
out = residualLayer_1.residual(out, _this._params.conv32_3);
out = residualLayer_1.residualDown(out, _this._params.conv64_down);
out = residualLayer_1.residual(out, _this._params.conv64_1);
out = residualLayer_1.residual(out, _this._params.conv64_2);
out = residualLayer_1.residual(out, _this._params.conv64_3);
out = residualLayer_1.residualDown(out, _this._params.conv128_down);
out = residualLayer_1.residual(out, _this._params.conv128_1);
out = residualLayer_1.residual(out, _this._params.conv128_2);
out = residualLayer_1.residualDown(out, _this._params.conv256_down);
out = residualLayer_1.residual(out, _this._params.conv256_1);
out = residualLayer_1.residual(out, _this._params.conv256_2);
out = residualLayer_1.residualDown(out, _this._params.conv256_down_out);
out = residualLayer_1.residual(out, params.conv32_1);
out = residualLayer_1.residual(out, params.conv32_2);
out = residualLayer_1.residual(out, params.conv32_3);
out = residualLayer_1.residualDown(out, params.conv64_down);
out = residualLayer_1.residual(out, params.conv64_1);
out = residualLayer_1.residual(out, params.conv64_2);
out = residualLayer_1.residual(out, params.conv64_3);
out = residualLayer_1.residualDown(out, params.conv128_down);
out = residualLayer_1.residual(out, params.conv128_1);
out = residualLayer_1.residual(out, params.conv128_2);
out = residualLayer_1.residualDown(out, params.conv256_down);
out = residualLayer_1.residual(out, params.conv256_1);
out = residualLayer_1.residual(out, params.conv256_2);
out = residualLayer_1.residualDown(out, params.conv256_down_out);
var globalAvg = out.mean([1, 2]);
var fullyConnected = tf.matMul(globalAvg, _this._params.fc);
var fullyConnected = tf.matMul(globalAvg, params.fc);
return fullyConnected;
});
};
......@@ -99,7 +77,13 @@ var FaceRecognitionNet = /** @class */ (function () {
});
});
};
FaceRecognitionNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams_1.loadQuantizedParams(uri);
};
FaceRecognitionNet.prototype.extractParams = function (weights) {
return extractParams_1.extractParams(weights);
};
return FaceRecognitionNet;
}());
}(NeuralNetwork_1.NeuralNetwork));
exports.FaceRecognitionNet = FaceRecognitionNet;
//# sourceMappingURL=FaceRecognitionNet.js.map
\ No newline at end of file
{"version":3,"file":"FaceRecognitionNet.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/FaceRecognitionNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"FaceRecognitionNet.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/FaceRecognitionNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
import { ParamMapping } from '../commons/types';
import { NetParams } from './types';
export declare function extractParams(weights: Float32Array): NetParams;
export declare function extractParams(weights: Float32Array): {
params: NetParams;
paramMappings: ParamMapping[];
};
......@@ -3,43 +3,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core");
var extractWeightsFactory_1 = require("../commons/extractWeightsFactory");
var utils_1 = require("../utils");
function extractorsFactory(extractWeights) {
function extractorsFactory(extractWeights, paramMappings) {
function extractFilterValues(numFilterValues, numFilters, filterSize) {
var weights = extractWeights(numFilterValues);
var depth = weights.length / (numFilters * filterSize * filterSize);
if (utils_1.isFloat(depth)) {
throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize);
}
return tf.transpose(tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]);
return tf.tidy(function () { return tf.transpose(tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]); });
}
function extractScaleLayerParams(numWeights) {
function extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix) {
var filters = extractFilterValues(numFilterValues, numFilters, filterSize);
var bias = tf.tensor1d(extractWeights(numFilters));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/bias" });
return { filters: filters, bias: bias };
}
function extractScaleLayerParams(numWeights, mappedPrefix) {
var weights = tf.tensor1d(extractWeights(numWeights));
var biases = tf.tensor1d(extractWeights(numWeights));
paramMappings.push({ paramPath: mappedPrefix + "/weights" }, { paramPath: mappedPrefix + "/biases" });
return {
weights: weights,
biases: biases
};
}
function extractConvLayerParams(numFilterValues, numFilters, filterSize) {
var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize);
var conv_bias = tf.tensor1d(extractWeights(numFilters));
var scale = extractScaleLayerParams(numFilters);
return {
conv: {
filters: conv_filters,
bias: conv_bias
},
scale: scale
};
function extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix) {
var conv = extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv");
var scale = extractScaleLayerParams(numFilters, mappedPrefix + "/scale");
return { conv: conv, scale: scale };
}
function extractResidualLayerParams(numFilterValues, numFilters, filterSize, isDown) {
function extractResidualLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix, isDown) {
if (isDown === void 0) { isDown = false; }
var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize);
var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize);
return {
conv1: conv1,
conv2: conv2
};
var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, mappedPrefix + "/conv1");
var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv2");
return { conv1: conv1, conv2: conv2 };
}
return {
extractConvLayerParams: extractConvLayerParams,
......@@ -48,27 +45,29 @@ function extractorsFactory(extractWeights) {
}
function extractParams(weights) {
var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory(extractWeights), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams;
var conv32_down = extractConvLayerParams(4704, 32, 7);
var conv32_1 = extractResidualLayerParams(9216, 32, 3);
var conv32_2 = extractResidualLayerParams(9216, 32, 3);
var conv32_3 = extractResidualLayerParams(9216, 32, 3);
var conv64_down = extractResidualLayerParams(36864, 64, 3, true);
var conv64_1 = extractResidualLayerParams(36864, 64, 3);
var conv64_2 = extractResidualLayerParams(36864, 64, 3);
var conv64_3 = extractResidualLayerParams(36864, 64, 3);
var conv128_down = extractResidualLayerParams(147456, 128, 3, true);
var conv128_1 = extractResidualLayerParams(147456, 128, 3);
var conv128_2 = extractResidualLayerParams(147456, 128, 3);
var conv256_down = extractResidualLayerParams(589824, 256, 3, true);
var conv256_1 = extractResidualLayerParams(589824, 256, 3);
var conv256_2 = extractResidualLayerParams(589824, 256, 3);
var conv256_down_out = extractResidualLayerParams(589824, 256, 3);
var fc = tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]);
var paramMappings = [];
var _b = extractorsFactory(extractWeights, paramMappings), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams;
var conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');
var conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');
var conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');
var conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');
var conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);
var conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');
var conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');
var conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');
var conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);
var conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');
var conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');
var conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);
var conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');
var conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');
var conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out');
var fc = tf.tidy(function () { return tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]); });
paramMappings.push({ paramPath: "fc" });
if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length);
}
return {
var params = {
conv32_down: conv32_down,
conv32_1: conv32_1,
conv32_2: conv32_2,
......@@ -86,6 +85,7 @@ function extractParams(weights) {
conv256_down_out: conv256_down_out,
fc: fc
};
return { params: params, paramMappings: paramMappings };
}
exports.extractParams = extractParams;
//# sourceMappingURL=extractParams.js.map
\ No newline at end of file
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/extractParams.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,0EAAyE;AAEzE,kCAAmC;AAGnC,2BAA2B,cAAsC;IAE/D,6BAA6B,eAAuB,EAAE,UAAkB,EAAE,UAAkB;QAC1F,IAAM,OAAO,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;QAC/C,IAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,CAAA;QAErE,IAAI,eAAO,CAAC,KAAK,CAAC,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,iCAA+B,KAAK,0BAAqB,OAAO,CAAC,MAAM,sBAAiB,UAAU,sBAAiB,UAAY,CAAC,CAAA;SACjJ;QAED,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,EACjE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACb,CAAA;IACH,CAAC;IAED,iCAAiC,UAAkB;QACjD,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACvD,IAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACtD,OAAO;YACL,OAAO,SAAA;YACP,MAAM,QAAA;SACP,CAAA;IACH,CAAC;IAED,gCACE,eAAuB,EACvB,UAAkB,EAClB,UAAkB;QAElB,IAAM,YAAY,GAAG,mBAAmB,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACjF,IAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACzD,IAAM,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAA;QAEjD,OAAO;YACL,IAAI,EAAE;gBACJ,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,SAAS;aAChB;YACD,KAAK,OAAA;SACN,CAAA;IACH,CAAC;IAED,oCACE,eAAuB,EACvB,UAAkB,EAClB,UAAkB,EAClB,MAAuB;QAAvB,uBAAA,EAAA,cAAuB;QAEvB,IAAM,KAAK,GAAoB,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACnH,IAAM,KAAK,GAAoB,sBAAsB,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAE9F,OAAO;YACL,KAAK,OAAA;YACL,KAAK,OAAA;SACN,CAAA;IACH,CAAC;IAED,OAAO;QACL,sBAAsB,wBAAA;QACtB,0BAA0B,4BAAA;KAC3B,CAAA;AAEH,CAAC;AAED,uBAA8B,OAAqB;IAC3C,IAAA,2DAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAE5B,IAAA,sCAG+B,EAFnC,kDAAsB,EACtB,0DAA0B,CACS;IAErC,IAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACvD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAExD,IAAM,WAAW,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IAClE,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACzD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACzD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAEzD,IAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACrE,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAE5D,IAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACrE,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAEnE,IAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnF,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,WAAW,aAAA;QACX,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,WAAW,aAAA;QACX,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,YAAY,cAAA;QACZ,SAAS,WAAA;QACT,SAAS,WAAA;QACT,YAAY,cAAA;QACZ,SAAS,WAAA;QACT,SAAS,WAAA;QACT,gBAAgB,kBAAA;QAChB,EAAE,IAAA;KACH,CAAA;AACH,CAAC;AAtDD,sCAsDC"}
\ No newline at end of file
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/extractParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
export declare function loadQuantizedParams(uri: string | undefined): Promise<any>;
import { ParamMapping } from '../commons/types';
import { NetParams } from './types';
export declare function loadQuantizedParams(uri: string | undefined): Promise<{
params: NetParams;
paramMappings: ParamMapping[];
}>;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var disposeUnusedWeightTensors_1 = require("../commons/disposeUnusedWeightTensors");
var extractWeightEntryFactory_1 = require("../commons/extractWeightEntryFactory");
var isTensor_1 = require("../commons/isTensor");
var loadWeightMap_1 = require("../commons/loadWeightMap");
var DEFAULT_MODEL_NAME = 'face_recognition_model';
function extractorsFactory(weightMap) {
function extractorsFactory(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory_1.extractWeightEntryFactory(weightMap, paramMappings);
function extractScaleLayerParams(prefix) {
var params = {
weights: weightMap[prefix + "/scale/weights"],
biases: weightMap[prefix + "/scale/biases"]
};
if (!isTensor_1.isTensor1D(params.weights)) {
throw new Error("expected weightMap[" + prefix + "/scale/weights] to be a Tensor1D, instead have " + params.weights);
}
if (!isTensor_1.isTensor1D(params.biases)) {
throw new Error("expected weightMap[" + prefix + "/scale/biases] to be a Tensor1D, instead have " + params.biases);
}
return params;
var weights = extractWeightEntry(prefix + "/scale/weights", 1);
var biases = extractWeightEntry(prefix + "/scale/biases", 1);
return { weights: weights, biases: biases };
}
function extractConvLayerParams(prefix) {
var params = {
filters: weightMap[prefix + "/conv/filters"],
bias: weightMap[prefix + "/conv/bias"]
};
if (!isTensor_1.isTensor4D(params.filters)) {
throw new Error("expected weightMap[" + prefix + "/conv/filters] to be a Tensor1D, instead have " + params.filters);
}
if (!isTensor_1.isTensor1D(params.bias)) {
throw new Error("expected weightMap[" + prefix + "/conv/bias] to be a Tensor1D, instead have " + params.bias);
}
return {
conv: params,
scale: extractScaleLayerParams(prefix)
};
var filters = extractWeightEntry(prefix + "/conv/filters", 4);
var bias = extractWeightEntry(prefix + "/conv/bias", 1);
var scale = extractScaleLayerParams(prefix);
return { conv: { filters: filters, bias: bias }, scale: scale };
}
function extractResidualLayerParams(prefix) {
return {
......@@ -47,13 +32,14 @@ function extractorsFactory(weightMap) {
}
function loadQuantizedParams(uri) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var weightMap, _a, extractConvLayerParams, extractResidualLayerParams, conv32_down, conv32_1, conv32_2, conv32_3, conv64_down, conv64_1, conv64_2, conv64_3, conv128_down, conv128_1, conv128_2, conv256_down, conv256_1, conv256_2, conv256_down_out, fc;
var weightMap, paramMappings, _a, extractConvLayerParams, extractResidualLayerParams, conv32_down, conv32_1, conv32_2, conv32_3, conv64_down, conv64_1, conv64_2, conv64_3, conv128_down, conv128_1, conv128_2, conv256_down, conv256_1, conv256_2, conv256_down_out, fc, params;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap_1.loadWeightMap(uri, DEFAULT_MODEL_NAME)];
case 1:
weightMap = _b.sent();
_a = extractorsFactory(weightMap), extractConvLayerParams = _a.extractConvLayerParams, extractResidualLayerParams = _a.extractResidualLayerParams;
paramMappings = [];
_a = extractorsFactory(weightMap, paramMappings), extractConvLayerParams = _a.extractConvLayerParams, extractResidualLayerParams = _a.extractResidualLayerParams;
conv32_down = extractConvLayerParams('conv32_down');
conv32_1 = extractResidualLayerParams('conv32_1');
conv32_2 = extractResidualLayerParams('conv32_2');
......@@ -70,10 +56,11 @@ function loadQuantizedParams(uri) {
conv256_2 = extractResidualLayerParams('conv256_2');
conv256_down_out = extractResidualLayerParams('conv256_down_out');
fc = weightMap['fc'];
paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });
if (!isTensor_1.isTensor2D(fc)) {
throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc);
}
return [2 /*return*/, {
params = {
conv32_down: conv32_down,
conv32_1: conv32_1,
conv32_2: conv32_2,
......@@ -90,7 +77,9 @@ function loadQuantizedParams(uri) {
conv256_2: conv256_2,
conv256_down_out: conv256_down_out,
fc: fc
}];
};
disposeUnusedWeightTensors_1.disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
}
});
});
......
{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/loadQuantizedParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/loadQuantizedParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
......@@ -271,9 +271,6 @@
function isTensor(tensor$$1, dim) {
return tensor$$1 instanceof Tensor && tensor$$1.shape.length === dim;
}
function isTensor1D(tensor$$1) {
return isTensor(tensor$$1, 1);
}
function isTensor2D(tensor$$1) {
return isTensor(tensor$$1, 2);
}
......@@ -663,6 +660,10 @@
}
return new Rect(x, y, width, height);
};
Rect.prototype.pad = function (padX, padY) {
var _a = this, x = _a.x, y = _a.y, width = _a.width, height = _a.height;
return new Rect(x - (padX / 2), y - (padY / 2), width + padX, height + padY);
};
Rect.prototype.floor = function () {
return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height));
};
......@@ -955,6 +956,128 @@
});
}
var NeuralNetwork = /** @class */ (function () {
function NeuralNetwork(_name) {
this._name = _name;
this._params = undefined;
this._paramMappings = [];
}
Object.defineProperty(NeuralNetwork.prototype, "params", {
get: function () {
return this._params;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NeuralNetwork.prototype, "paramMappings", {
get: function () {
return this._paramMappings;
},
enumerable: true,
configurable: true
});
NeuralNetwork.prototype.getParamFromPath = function (paramPath) {
var _a = this.traversePropertyPath(paramPath), obj = _a.obj, objProp = _a.objProp;
return obj[objProp];
};
NeuralNetwork.prototype.reassignParamFromPath = function (paramPath, tensor$$1) {
var _a = this.traversePropertyPath(paramPath), obj = _a.obj, objProp = _a.objProp;
obj[objProp].dispose();
obj[objProp] = tensor$$1;
};
NeuralNetwork.prototype.getParamList = function () {
var _this = this;
return this._paramMappings.map(function (_a) {
var paramPath = _a.paramPath;
return ({
path: paramPath,
tensor: _this.getParamFromPath(paramPath)
});
});
};
NeuralNetwork.prototype.getTrainableParams = function () {
return this.getParamList().filter(function (param) { return param.tensor instanceof Variable; });
};
NeuralNetwork.prototype.getFrozenParams = function () {
return this.getParamList().filter(function (param) { return !(param.tensor instanceof Variable); });
};
NeuralNetwork.prototype.variable = function () {
var _this = this;
this.getFrozenParams().forEach(function (_a) {
var path = _a.path, tensor$$1 = _a.tensor;
_this.reassignParamFromPath(path, variable(tensor$$1));
});
};
NeuralNetwork.prototype.freeze = function () {
var _this = this;
this.getTrainableParams().forEach(function (_a) {
var path = _a.path, tensor$$1 = _a.tensor;
_this.reassignParamFromPath(path, tensor(tensor$$1));
});
};
NeuralNetwork.prototype.dispose = function (throwOnRedispose) {
if (throwOnRedispose === void 0) { throwOnRedispose = true; }
this.getParamList().forEach(function (param) {
if (throwOnRedispose && param.tensor.isDisposed) {
throw new Error("param tensor has already been disposed for path " + param.path);
}
param.tensor.dispose();
});
this._params = undefined;
};
NeuralNetwork.prototype.load = function (weightsOrUrl) {
return __awaiter$1(this, void 0, void 0, function () {
var _a, paramMappings, params;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error(this._name + ".load - expected model uri, or weights as Float32Array");
}
return [4 /*yield*/, this.loadQuantizedParams(weightsOrUrl)];
case 1:
_a = _b.sent(), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
return [2 /*return*/];
}
});
});
};
NeuralNetwork.prototype.extractWeights = function (weights) {
var _a = this.extractParams(weights), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
};
NeuralNetwork.prototype.traversePropertyPath = function (paramPath) {
if (!this.params) {
throw new Error("traversePropertyPath - model has no loaded params");
}
var result = paramPath.split('/').reduce(function (res, objProp) {
if (!res.nextObj.hasOwnProperty(objProp)) {
throw new Error("traversePropertyPath - object does not have property " + objProp + ", for path " + paramPath);
}
return { obj: res.nextObj, objProp: objProp, nextObj: res.nextObj[objProp] };
}, { nextObj: this.params });
var obj = result.obj, objProp = result.objProp;
if (!obj || !objProp || !(obj[objProp] instanceof Tensor)) {
throw new Error("traversePropertyPath - parameter is not a tensor, for path " + paramPath);
}
return { obj: obj, objProp: objProp };
};
NeuralNetwork.prototype.loadQuantizedParams = function (_) {
throw new Error(this._name + ".loadQuantizedParams - not implemented");
};
NeuralNetwork.prototype.extractParams = function (_) {
throw new Error(this._name + ".extractParams - not implemented");
};
return NeuralNetwork;
}());
function extractWeightsFactory(weights) {
var remainingWeights = weights;
function extractWeights(numWeights) {
......@@ -971,13 +1094,14 @@
};
}
function extractorsFactory(extractWeights) {
function extractDepthwiseConvParams(numChannels) {
function extractorsFactory(extractWeights, paramMappings) {
function extractDepthwiseConvParams(numChannels, mappedPrefix) {
var filters = tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);
var batch_norm_scale = tensor1d(extractWeights(numChannels));
var batch_norm_offset = tensor1d(extractWeights(numChannels));
var batch_norm_mean = tensor1d(extractWeights(numChannels));
var batch_norm_variance = tensor1d(extractWeights(numChannels));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/batch_norm_scale" }, { paramPath: mappedPrefix + "/batch_norm_offset" }, { paramPath: mappedPrefix + "/batch_norm_mean" }, { paramPath: mappedPrefix + "/batch_norm_variance" });
return {
filters: filters,
batch_norm_scale: batch_norm_scale,
......@@ -986,115 +1110,116 @@
batch_norm_variance: batch_norm_variance
};
}
function extractConvParams(channelsIn, channelsOut, filterSize) {
function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, isPointwiseConv) {
var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tensor1d(extractWeights(channelsOut));
return {
filters: filters,
bias: bias
};
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/" + (isPointwiseConv ? 'batch_norm_offset' : 'bias') });
return { filters: filters, bias: bias };
}
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize) {
var _a = extractConvParams(channelsIn, channelsOut, filterSize), filters = _a.filters, bias = _a.bias;
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
var _a = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true), filters = _a.filters, bias = _a.bias;
return {
filters: filters,
batch_norm_offset: bias
};
}
function extractConvPairParams(channelsIn, channelsOut) {
var depthwise_conv_params = extractDepthwiseConvParams(channelsIn);
var pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1);
return {
depthwise_conv_params: depthwise_conv_params,
pointwise_conv_params: pointwise_conv_params
};
function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) {
var depthwise_conv = extractDepthwiseConvParams(channelsIn, mappedPrefix + "/depthwise_conv");
var pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, mappedPrefix + "/pointwise_conv");
return { depthwise_conv: depthwise_conv, pointwise_conv: pointwise_conv };
}
function extractMobilenetV1Params() {
var conv_0_params = extractPointwiseConvParams(3, 32, 3);
var channelNumPairs = [
[32, 64],
[64, 128],
[128, 128],
[128, 256],
[256, 256],
[256, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 1024],
[1024, 1024]
];
var conv_pair_params = channelNumPairs.map(function (_a) {
var channelsIn = _a[0], channelsOut = _a[1];
return extractConvPairParams(channelsIn, channelsOut);
});
var conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');
var conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');
var conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');
var conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');
var conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');
var conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');
var conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');
var conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');
var conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');
var conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');
var conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');
var conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');
var conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');
var conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');
return {
conv_0_params: conv_0_params,
conv_pair_params: conv_pair_params
conv_0: conv_0,
conv_1: conv_1,
conv_2: conv_2,
conv_3: conv_3,
conv_4: conv_4,
conv_5: conv_5,
conv_6: conv_6,
conv_7: conv_7,
conv_8: conv_8,
conv_9: conv_9,
conv_10: conv_10,
conv_11: conv_11,
conv_12: conv_12,
conv_13: conv_13
};
}
function extractPredictionLayerParams() {
var conv_0_params = extractPointwiseConvParams(1024, 256, 1);
var conv_1_params = extractPointwiseConvParams(256, 512, 3);
var conv_2_params = extractPointwiseConvParams(512, 128, 1);
var conv_3_params = extractPointwiseConvParams(128, 256, 3);
var conv_4_params = extractPointwiseConvParams(256, 128, 1);
var conv_5_params = extractPointwiseConvParams(128, 256, 3);
var conv_6_params = extractPointwiseConvParams(256, 64, 1);
var conv_7_params = extractPointwiseConvParams(64, 128, 3);
var box_encoding_0_predictor_params = extractConvParams(512, 12, 1);
var class_predictor_0_params = extractConvParams(512, 9, 1);
var box_encoding_1_predictor_params = extractConvParams(1024, 24, 1);
var class_predictor_1_params = extractConvParams(1024, 18, 1);
var box_encoding_2_predictor_params = extractConvParams(512, 24, 1);
var class_predictor_2_params = extractConvParams(512, 18, 1);
var box_encoding_3_predictor_params = extractConvParams(256, 24, 1);
var class_predictor_3_params = extractConvParams(256, 18, 1);
var box_encoding_4_predictor_params = extractConvParams(256, 24, 1);
var class_predictor_4_params = extractConvParams(256, 18, 1);
var box_encoding_5_predictor_params = extractConvParams(128, 24, 1);
var class_predictor_5_params = extractConvParams(128, 18, 1);
var box_predictor_0_params = {
box_encoding_predictor_params: box_encoding_0_predictor_params,
class_predictor_params: class_predictor_0_params
};
var box_predictor_1_params = {
box_encoding_predictor_params: box_encoding_1_predictor_params,
class_predictor_params: class_predictor_1_params
};
var box_predictor_2_params = {
box_encoding_predictor_params: box_encoding_2_predictor_params,
class_predictor_params: class_predictor_2_params
};
var box_predictor_3_params = {
box_encoding_predictor_params: box_encoding_3_predictor_params,
class_predictor_params: class_predictor_3_params
};
var box_predictor_4_params = {
box_encoding_predictor_params: box_encoding_4_predictor_params,
class_predictor_params: class_predictor_4_params
};
var box_predictor_5_params = {
box_encoding_predictor_params: box_encoding_5_predictor_params,
class_predictor_params: class_predictor_5_params
var conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');
var conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');
var conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');
var conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');
var conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');
var conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');
var conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');
var conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');
var box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');
var class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');
var box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');
var class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');
var box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');
var class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');
var box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');
var class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');
var box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');
var class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');
var box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');
var class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');
var box_predictor_0 = {
box_encoding_predictor: box_encoding_0_predictor,
class_predictor: class_predictor_0
};
var box_predictor_1 = {
box_encoding_predictor: box_encoding_1_predictor,
class_predictor: class_predictor_1
};
var box_predictor_2 = {
box_encoding_predictor: box_encoding_2_predictor,
class_predictor: class_predictor_2
};
var box_predictor_3 = {
box_encoding_predictor: box_encoding_3_predictor,
class_predictor: class_predictor_3
};
var box_predictor_4 = {
box_encoding_predictor: box_encoding_4_predictor,
class_predictor: class_predictor_4
};
var box_predictor_5 = {
box_encoding_predictor: box_encoding_5_predictor,
class_predictor: class_predictor_5
};
return {
conv_0_params: conv_0_params,
conv_1_params: conv_1_params,
conv_2_params: conv_2_params,
conv_3_params: conv_3_params,
conv_4_params: conv_4_params,
conv_5_params: conv_5_params,
conv_6_params: conv_6_params,
conv_7_params: conv_7_params,
box_predictor_0_params: box_predictor_0_params,
box_predictor_1_params: box_predictor_1_params,
box_predictor_2_params: box_predictor_2_params,
box_predictor_3_params: box_predictor_3_params,
box_predictor_4_params: box_predictor_4_params,
box_predictor_5_params: box_predictor_5_params
conv_0: conv_0,
conv_1: conv_1,
conv_2: conv_2,
conv_3: conv_3,
conv_4: conv_4,
conv_5: conv_5,
conv_6: conv_6,
conv_7: conv_7,
box_predictor_0: box_predictor_0,
box_predictor_1: box_predictor_1,
box_predictor_2: box_predictor_2,
box_predictor_3: box_predictor_3,
box_predictor_4: box_predictor_4,
box_predictor_5: box_predictor_5
};
}
return {
......@@ -1103,21 +1228,45 @@
};
}
function extractParams(weights) {
var paramMappings = [];
var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory(extractWeights), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams;
var mobilenetv1_params = extractMobilenetV1Params();
var prediction_layer_params = extractPredictionLayerParams();
var _b = extractorsFactory(extractWeights, paramMappings), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams;
var mobilenetv1 = extractMobilenetV1Params();
var prediction_layer = extractPredictionLayerParams();
var extra_dim = tensor3d(extractWeights(5118 * 4), [1, 5118, 4]);
var output_layer_params = {
var output_layer = {
extra_dim: extra_dim
};
paramMappings.push({ paramPath: 'output_layer/extra_dim' });
if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length);
}
return {
mobilenetv1_params: mobilenetv1_params,
prediction_layer_params: prediction_layer_params,
output_layer_params: output_layer_params
params: {
mobilenetv1: mobilenetv1,
prediction_layer: prediction_layer,
output_layer: output_layer
},
paramMappings: paramMappings
};
}
function disposeUnusedWeightTensors(weightMap, paramMappings) {
Object.keys(weightMap).forEach(function (path) {
if (!paramMappings.some(function (pm) { return pm.originalPath === path; })) {
weightMap[path].dispose();
}
});
}
function extractWeightEntryFactory(weightMap, paramMappings) {
return function (originalPath, paramRank, mappedPath) {
var tensor = weightMap[originalPath];
if (!isTensor(tensor, paramRank)) {
throw new Error("expected weightMap[" + originalPath + "] to be a Tensor" + paramRank + "D, instead have " + tensor);
}
paramMappings.push({ originalPath: originalPath, paramPath: mappedPath || originalPath });
return tensor;
};
}
......@@ -1152,95 +1301,78 @@
}
var DEFAULT_MODEL_NAME = 'face_detection_model';
function extractorsFactory$1(weightMap) {
function extractPointwiseConvParams(prefix, idx) {
var pointwise_conv_params = {
filters: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/weights"],
batch_norm_offset: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset"]
};
if (!isTensor4D(pointwise_conv_params.filters)) {
throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/weights] to be a Tensor4D, instead have " + pointwise_conv_params.filters);
}
if (!isTensor1D(pointwise_conv_params.batch_norm_offset)) {
throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset] to be a Tensor1D, instead have " + pointwise_conv_params.batch_norm_offset);
}
return pointwise_conv_params;
function extractorsFactory$1(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);
function extractPointwiseConvParams(prefix, idx, mappedPrefix) {
var filters = extractWeightEntry(prefix + "/Conv2d_" + idx + "_pointwise/weights", 4, mappedPrefix + "/filters");
var batch_norm_offset = extractWeightEntry(prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset", 1, mappedPrefix + "/batch_norm_offset");
return { filters: filters, batch_norm_offset: batch_norm_offset };
}
function extractConvPairParams(idx) {
var depthwise_conv_params = {
filters: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights"],
batch_norm_scale: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma"],
batch_norm_offset: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta"],
batch_norm_mean: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean"],
batch_norm_variance: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance"],
};
if (!isTensor4D(depthwise_conv_params.filters)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights] to be a Tensor4D, instead have " + depthwise_conv_params.filters);
}
if (!isTensor1D(depthwise_conv_params.batch_norm_scale)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_scale);
}
if (!isTensor1D(depthwise_conv_params.batch_norm_offset)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_offset);
}
if (!isTensor1D(depthwise_conv_params.batch_norm_mean)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_mean);
}
if (!isTensor1D(depthwise_conv_params.batch_norm_variance)) {
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_variance);
}
var mappedPrefix = "mobilenetv1/conv_" + idx;
var prefixDepthwiseConv = "MobilenetV1/Conv2d_" + idx + "_depthwise";
var mappedPrefixDepthwiseConv = mappedPrefix + "/depthwise_conv";
var mappedPrefixPointwiseConv = mappedPrefix + "/pointwise_conv";
var filters = extractWeightEntry(prefixDepthwiseConv + "/depthwise_weights", 4, mappedPrefixDepthwiseConv + "/filters");
var batch_norm_scale = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/gamma", 1, mappedPrefixDepthwiseConv + "/batch_norm_scale");
var batch_norm_offset = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/beta", 1, mappedPrefixDepthwiseConv + "/batch_norm_offset");
var batch_norm_mean = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_mean", 1, mappedPrefixDepthwiseConv + "/batch_norm_mean");
var batch_norm_variance = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_variance", 1, mappedPrefixDepthwiseConv + "/batch_norm_variance");
return {
depthwise_conv_params: depthwise_conv_params,
pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx)
depthwise_conv: {
filters: filters,
batch_norm_scale: batch_norm_scale,
batch_norm_offset: batch_norm_offset,
batch_norm_mean: batch_norm_mean,
batch_norm_variance: batch_norm_variance
},
pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv)
};
}
function extractMobilenetV1Params() {
return {
conv_0_params: extractPointwiseConvParams('MobilenetV1', 0),
conv_pair_params: Array(13).fill(0).map(function (_, i) { return extractConvPairParams(i + 1); })
};
}
function extractBoxPredictorParams(idx) {
var params = {
box_encoding_predictor_params: {
filters: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights"],
bias: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases"]
},
class_predictor_params: {
filters: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights"],
bias: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases"]
}
conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
conv_1: extractConvPairParams(1),
conv_2: extractConvPairParams(2),
conv_3: extractConvPairParams(3),
conv_4: extractConvPairParams(4),
conv_5: extractConvPairParams(5),
conv_6: extractConvPairParams(6),
conv_7: extractConvPairParams(7),
conv_8: extractConvPairParams(8),
conv_9: extractConvPairParams(9),
conv_10: extractConvPairParams(10),
conv_11: extractConvPairParams(11),
conv_12: extractConvPairParams(12),
conv_13: extractConvPairParams(13)
};
if (!isTensor4D(params.box_encoding_predictor_params.filters)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights] to be a Tensor4D, instead have " + params.box_encoding_predictor_params.filters);
}
if (!isTensor1D(params.box_encoding_predictor_params.bias)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases] to be a Tensor1D, instead have " + params.box_encoding_predictor_params.bias);
}
if (!isTensor4D(params.class_predictor_params.filters)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights] to be a Tensor4D, instead have " + params.class_predictor_params.filters);
}
if (!isTensor1D(params.class_predictor_params.bias)) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases] to be a Tensor1D, instead have " + params.class_predictor_params.bias);
function extractConvParams(prefix, mappedPrefix) {
var filters = extractWeightEntry(prefix + "/weights", 4, mappedPrefix + "/filters");
var bias = extractWeightEntry(prefix + "/biases", 1, mappedPrefix + "/bias");
return { filters: filters, bias: bias };
}
return params;
function extractBoxPredictorParams(idx) {
var box_encoding_predictor = extractConvParams("Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor", "prediction_layer/box_predictor_" + idx + "/box_encoding_predictor");
var class_predictor = extractConvParams("Prediction/BoxPredictor_" + idx + "/ClassPredictor", "prediction_layer/box_predictor_" + idx + "/class_predictor");
return { box_encoding_predictor: box_encoding_predictor, class_predictor: class_predictor };
}
function extractPredictionLayerParams() {
return {
conv_0_params: extractPointwiseConvParams('Prediction', 0),
conv_1_params: extractPointwiseConvParams('Prediction', 1),
conv_2_params: extractPointwiseConvParams('Prediction', 2),
conv_3_params: extractPointwiseConvParams('Prediction', 3),
conv_4_params: extractPointwiseConvParams('Prediction', 4),
conv_5_params: extractPointwiseConvParams('Prediction', 5),
conv_6_params: extractPointwiseConvParams('Prediction', 6),
conv_7_params: extractPointwiseConvParams('Prediction', 7),
box_predictor_0_params: extractBoxPredictorParams(0),
box_predictor_1_params: extractBoxPredictorParams(1),
box_predictor_2_params: extractBoxPredictorParams(2),
box_predictor_3_params: extractBoxPredictorParams(3),
box_predictor_4_params: extractBoxPredictorParams(4),
box_predictor_5_params: extractBoxPredictorParams(5)
conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
box_predictor_0: extractBoxPredictorParams(0),
box_predictor_1: extractBoxPredictorParams(1),
box_predictor_2: extractBoxPredictorParams(2),
box_predictor_3: extractBoxPredictorParams(3),
box_predictor_4: extractBoxPredictorParams(4),
box_predictor_5: extractBoxPredictorParams(5)
};
}
return {
......@@ -1250,24 +1382,28 @@
}
function loadQuantizedParams(uri) {
return __awaiter$1(this, void 0, void 0, function () {
var weightMap, _a, extractMobilenetV1Params, extractPredictionLayerParams, extra_dim;
var weightMap, paramMappings, _a, extractMobilenetV1Params, extractPredictionLayerParams, extra_dim, params;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)];
case 1:
weightMap = _b.sent();
_a = extractorsFactory$1(weightMap), extractMobilenetV1Params = _a.extractMobilenetV1Params, extractPredictionLayerParams = _a.extractPredictionLayerParams;
paramMappings = [];
_a = extractorsFactory$1(weightMap, paramMappings), extractMobilenetV1Params = _a.extractMobilenetV1Params, extractPredictionLayerParams = _a.extractPredictionLayerParams;
extra_dim = weightMap['Output/extra_dim'];
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });
if (!isTensor3D(extra_dim)) {
throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim);
}
return [2 /*return*/, {
mobilenetv1_params: extractMobilenetV1Params(),
prediction_layer_params: extractPredictionLayerParams(),
output_layer_params: {
params = {
mobilenetv1: extractMobilenetV1Params(),
prediction_layer: extractPredictionLayerParams(),
output_layer: {
extra_dim: extra_dim
}
}];
};
disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
}
});
});
......@@ -1295,12 +1431,27 @@
function mobileNetV1(x, params) {
return tidy(function () {
var conv11 = null;
var out = pointwiseConvLayer(x, params.conv_0_params, [2, 2]);
params.conv_pair_params.forEach(function (param, i) {
var out = pointwiseConvLayer(x, params.conv_0, [2, 2]);
var convPairParams = [
params.conv_1,
params.conv_2,
params.conv_3,
params.conv_4,
params.conv_5,
params.conv_6,
params.conv_7,
params.conv_8,
params.conv_9,
params.conv_10,
params.conv_11,
params.conv_12,
params.conv_13
];
convPairParams.forEach(function (param, i) {
var layerIdx = i + 1;
var depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides);
out = pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]);
out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
if (layerIdx === 11) {
conv11 = out;
}
......@@ -1426,8 +1577,8 @@
function boxPredictionLayer(x, params) {
return tidy(function () {
var batchSize = x.shape[0];
var boxPredictionEncoding = reshape(convLayer(x, params.box_encoding_predictor_params), [batchSize, -1, 1, 4]);
var classPrediction = reshape(convLayer(x, params.class_predictor_params), [batchSize, -1, 3]);
var boxPredictionEncoding = reshape(convLayer(x, params.box_encoding_predictor), [batchSize, -1, 1, 4]);
var classPrediction = reshape(convLayer(x, params.class_predictor), [batchSize, -1, 3]);
return {
boxPredictionEncoding: boxPredictionEncoding,
classPrediction: classPrediction
......@@ -1437,20 +1588,20 @@
function predictionLayer(x, conv11, params) {
return tidy(function () {
var conv0 = pointwiseConvLayer(x, params.conv_0_params, [1, 1]);
var conv1 = pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]);
var conv2 = pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]);
var conv3 = pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]);
var conv4 = pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]);
var conv5 = pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]);
var conv6 = pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]);
var conv7 = pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]);
var boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0_params);
var boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1_params);
var boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2_params);
var boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3_params);
var boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4_params);
var boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5_params);
var conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]);
var conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]);
var conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]);
var conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2]);
var conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]);
var conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]);
var conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]);
var conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]);
var boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0);
var boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1);
var boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2);
var boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3);
var boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4);
var boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5);
var boxPredictions = concat([
boxPrediction0.boxPredictionEncoding,
boxPrediction1.boxPredictionEncoding,
......@@ -1474,45 +1625,22 @@
});
}
var FaceDetectionNet = /** @class */ (function () {
var FaceDetectionNet = /** @class */ (function (_super) {
__extends$1(FaceDetectionNet, _super);
function FaceDetectionNet() {
return _super.call(this, 'FaceDetectionNet') || this;
}
FaceDetectionNet.prototype.load = function (weightsOrUrl) {
return __awaiter$1(this, void 0, void 0, function () {
var _a;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array');
}
_a = this;
return [4 /*yield*/, loadQuantizedParams(weightsOrUrl)];
case 1:
_a._params = _b.sent();
return [2 /*return*/];
}
});
});
};
FaceDetectionNet.prototype.extractWeights = function (weights) {
this._params = extractParams(weights);
};
FaceDetectionNet.prototype.forwardInput = function (input) {
var _this = this;
if (!this._params) {
var params = this.params;
if (!params) {
throw new Error('FaceDetectionNet - load model before inference');
}
return tidy(function () {
var batchTensor = input.toBatchTensor(512, false);
var x = sub(mul(batchTensor, scalar(0.007843137718737125)), scalar(1));
var features = mobileNetV1(x, _this._params.mobilenetv1_params);
var _a = predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params);
var features = mobileNetV1(x, params.mobilenetv1);
var _a = predictionLayer(features.out, features.conv11, params.prediction_layer), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer(boxPredictions, classPredictions, params.output_layer);
});
};
FaceDetectionNet.prototype.forward = function (input) {
......@@ -1575,8 +1703,14 @@
});
});
};
FaceDetectionNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams(uri);
};
FaceDetectionNet.prototype.extractParams = function (weights) {
return extractParams(weights);
};
return FaceDetectionNet;
}());
}(NeuralNetwork));
function faceDetectionNet(weights) {
var net = new FaceDetectionNet();
......@@ -1584,103 +1718,15 @@
return net;
}
var NeuralNetwork = /** @class */ (function () {
function NeuralNetwork() {
this._params = undefined;
this._paramMappings = [];
}
Object.defineProperty(NeuralNetwork.prototype, "params", {
get: function () {
return this._params;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NeuralNetwork.prototype, "paramMappings", {
get: function () {
return this._paramMappings;
},
enumerable: true,
configurable: true
});
NeuralNetwork.prototype.getParamFromPath = function (paramPath) {
var _a = this.traversePropertyPath(paramPath), obj = _a.obj, objProp = _a.objProp;
return obj[objProp];
};
NeuralNetwork.prototype.reassignParamFromPath = function (paramPath, tensor$$1) {
var _a = this.traversePropertyPath(paramPath), obj = _a.obj, objProp = _a.objProp;
obj[objProp].dispose();
obj[objProp] = tensor$$1;
};
NeuralNetwork.prototype.getParamList = function () {
var _this = this;
return this._paramMappings.map(function (_a) {
var paramPath = _a.paramPath;
return ({
path: paramPath,
tensor: _this.getParamFromPath(paramPath)
});
});
};
NeuralNetwork.prototype.getTrainableParams = function () {
return this.getParamList().filter(function (param) { return param.tensor instanceof Variable; });
};
NeuralNetwork.prototype.getFrozenParams = function () {
return this.getParamList().filter(function (param) { return !(param.tensor instanceof Variable); });
};
NeuralNetwork.prototype.variable = function () {
var _this = this;
this.getFrozenParams().forEach(function (_a) {
var path = _a.path, tensor$$1 = _a.tensor;
_this.reassignParamFromPath(path, variable(tensor$$1));
});
};
NeuralNetwork.prototype.freeze = function () {
var _this = this;
this.getTrainableParams().forEach(function (_a) {
var path = _a.path, tensor$$1 = _a.tensor;
_this.reassignParamFromPath(path, tensor(tensor$$1));
});
};
NeuralNetwork.prototype.dispose = function () {
this.getParamList().forEach(function (param) { return param.tensor.dispose(); });
this._params = undefined;
};
NeuralNetwork.prototype.traversePropertyPath = function (paramPath) {
if (!this.params) {
throw new Error("traversePropertyPath - model has no loaded params");
}
var result = paramPath.split('/').reduce(function (res, objProp) {
if (!res.nextObj.hasOwnProperty(objProp)) {
throw new Error("traversePropertyPath - object does not have property " + objProp + ", for path " + paramPath);
}
return { obj: res.nextObj, objProp: objProp, nextObj: res.nextObj[objProp] };
}, { nextObj: this.params });
var obj = result.obj, objProp = result.objProp;
if (!obj || !objProp || !(obj[objProp] instanceof Tensor)) {
throw new Error("traversePropertyPath - parameter is not a tensor, for path " + paramPath);
}
return { obj: obj, objProp: objProp };
};
return NeuralNetwork;
}());
function extractConvParamsFactory(extractWeights, paramMappings) {
return function (channelsIn, channelsOut, filterSize, mappedPrefix) {
function extractParams$1(weights) {
var paramMappings = [];
var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tensor1d(extractWeights(channelsOut));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/bias" });
return {
filters: filters,
bias: bias
};
};
return { filters: filters, bias: bias };
}
function extractParams$1(weights) {
var paramMappings = [];
var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);
function extractFcParams(channelsIn, channelsOut, mappedPrefix) {
var fc_weights = tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);
var fc_bias = tensor1d(extractWeights(channelsOut));
......@@ -1690,32 +1736,32 @@
bias: fc_bias
};
}
var conv0_params = extractConvParams(3, 32, 3, 'conv0_params');
var conv1_params = extractConvParams(32, 64, 3, 'conv1_params');
var conv2_params = extractConvParams(64, 64, 3, 'conv2_params');
var conv3_params = extractConvParams(64, 64, 3, 'conv3_params');
var conv4_params = extractConvParams(64, 64, 3, 'conv4_params');
var conv5_params = extractConvParams(64, 128, 3, 'conv5_params');
var conv6_params = extractConvParams(128, 128, 3, 'conv6_params');
var conv7_params = extractConvParams(128, 256, 3, 'conv7_params');
var fc0_params = extractFcParams(6400, 1024, 'fc0_params');
var fc1_params = extractFcParams(1024, 136, 'fc1_params');
var conv0 = extractConvParams(3, 32, 3, 'conv0');
var conv1 = extractConvParams(32, 64, 3, 'conv1');
var conv2 = extractConvParams(64, 64, 3, 'conv2');
var conv3 = extractConvParams(64, 64, 3, 'conv3');
var conv4 = extractConvParams(64, 64, 3, 'conv4');
var conv5 = extractConvParams(64, 128, 3, 'conv5');
var conv6 = extractConvParams(128, 128, 3, 'conv6');
var conv7 = extractConvParams(128, 256, 3, 'conv7');
var fc0 = extractFcParams(6400, 1024, 'fc0');
var fc1 = extractFcParams(1024, 136, 'fc1');
if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length);
}
return {
paramMappings: paramMappings,
params: {
conv0_params: conv0_params,
conv1_params: conv1_params,
conv2_params: conv2_params,
conv3_params: conv3_params,
conv4_params: conv4_params,
conv5_params: conv5_params,
conv6_params: conv6_params,
conv7_params: conv7_params,
fc0_params: fc0_params,
fc1_params: fc1_params
conv0: conv0,
conv1: conv1,
conv2: conv2,
conv3: conv3,
conv4: conv4,
conv5: conv5,
conv6: conv6,
conv7: conv7,
fc0: fc0,
fc1: fc1
}
};
}
......@@ -1826,33 +1872,18 @@
});
}
function extractWeightEntry(weightMap, path, paramRank) {
var tensor = weightMap[path];
if (!isTensor(tensor, paramRank)) {
throw new Error("expected weightMap[" + path + "] to be a Tensor" + paramRank + "D, instead have " + tensor);
}
return { path: path, tensor: tensor };
}
var DEFAULT_MODEL_NAME$1 = 'face_landmark_68_model';
function extractorsFactory$2(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);
function extractConvParams(prefix, mappedPrefix) {
var filtersEntry = extractWeightEntry(weightMap, prefix + "/kernel", 4);
var biasEntry = extractWeightEntry(weightMap, prefix + "/bias", 1);
paramMappings.push({ originalPath: filtersEntry.path, paramPath: mappedPrefix + "/filters" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" });
return {
filters: filtersEntry.tensor,
bias: biasEntry.tensor
};
var filters = extractWeightEntry(prefix + "/kernel", 4, mappedPrefix + "/filters");
var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
return { filters: filters, bias: bias };
}
function extractFcParams(prefix, mappedPrefix) {
var weightsEntry = extractWeightEntry(weightMap, prefix + "/kernel", 2);
var biasEntry = extractWeightEntry(weightMap, prefix + "/bias", 1);
paramMappings.push({ originalPath: weightsEntry.path, paramPath: mappedPrefix + "/weights" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" });
return {
weights: weightsEntry.tensor,
bias: biasEntry.tensor
};
var weights = extractWeightEntry(prefix + "/kernel", 2, mappedPrefix + "/weights");
var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
return { weights: weights, bias: bias };
}
return {
extractConvParams: extractConvParams,
......@@ -1870,17 +1901,18 @@
paramMappings = [];
_a = extractorsFactory$2(weightMap, paramMappings), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams;
params = {
conv0_params: extractConvParams('conv2d_0', 'conv0_params'),
conv1_params: extractConvParams('conv2d_1', 'conv1_params'),
conv2_params: extractConvParams('conv2d_2', 'conv2_params'),
conv3_params: extractConvParams('conv2d_3', 'conv3_params'),
conv4_params: extractConvParams('conv2d_4', 'conv4_params'),
conv5_params: extractConvParams('conv2d_5', 'conv5_params'),
conv6_params: extractConvParams('conv2d_6', 'conv6_params'),
conv7_params: extractConvParams('conv2d_7', 'conv7_params'),
fc0_params: extractFcParams('dense', 'fc0_params'),
fc1_params: extractFcParams('logits', 'fc1_params')
};
conv0: extractConvParams('conv2d_0', 'conv0'),
conv1: extractConvParams('conv2d_1', 'conv1'),
conv2: extractConvParams('conv2d_2', 'conv2'),
conv3: extractConvParams('conv2d_3', 'conv3'),
conv4: extractConvParams('conv2d_4', 'conv4'),
conv5: extractConvParams('conv2d_5', 'conv5'),
conv6: extractConvParams('conv2d_6', 'conv6'),
conv7: extractConvParams('conv2d_7', 'conv7'),
fc0: extractFcParams('dense', 'fc0'),
fc1: extractFcParams('logits', 'fc1')
};
disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
}
});
......@@ -1897,57 +1929,29 @@
var FaceLandmarkNet = /** @class */ (function (_super) {
__extends$1(FaceLandmarkNet, _super);
function FaceLandmarkNet() {
return _super !== null && _super.apply(this, arguments) || this;
}
FaceLandmarkNet.prototype.load = function (weightsOrUrl) {
return __awaiter$1(this, void 0, void 0, function () {
var _a, paramMappings, params;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array');
return _super.call(this, 'FaceLandmarkNet') || this;
}
return [4 /*yield*/, loadQuantizedParams$1(weightsOrUrl)];
case 1:
_a = _b.sent(), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
return [2 /*return*/];
}
});
});
};
FaceLandmarkNet.prototype.extractWeights = function (weights) {
var _a = extractParams$1(weights), paramMappings = _a.paramMappings, params = _a.params;
this._paramMappings = paramMappings;
this._params = params;
};
FaceLandmarkNet.prototype.forwardInput = function (input) {
var params = this._params;
var params = this.params;
if (!params) {
throw new Error('FaceLandmarkNet - load model before inference');
}
return tidy(function () {
var batchTensor = input.toBatchTensor(128, true);
var out = conv(batchTensor, params.conv0_params);
var out = conv(batchTensor, params.conv0);
out = maxPool$1(out);
out = conv(out, params.conv1_params);
out = conv(out, params.conv2_params);
out = conv(out, params.conv1);
out = conv(out, params.conv2);
out = maxPool$1(out);
out = conv(out, params.conv3_params);
out = conv(out, params.conv4_params);
out = conv(out, params.conv3);
out = conv(out, params.conv4);
out = maxPool$1(out);
out = conv(out, params.conv5_params);
out = conv(out, params.conv6_params);
out = conv(out, params.conv5);
out = conv(out, params.conv6);
out = maxPool$1(out, [1, 1]);
out = conv(out, params.conv7_params);
var fc0 = relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params));
var fc1 = fullyConnectedLayer(fc0, params.fc1_params);
out = conv(out, params.conv7);
var fc0 = relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0));
var fc1 = fullyConnectedLayer(fc0, params.fc1);
var createInterleavedTensor = function (fillX, fillY) {
return stack([
fill([68], fillX),
......@@ -2022,6 +2026,12 @@
});
});
};
FaceLandmarkNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams$1(uri);
};
FaceLandmarkNet.prototype.extractParams = function (weights) {
return extractParams$1(weights);
};
return FaceLandmarkNet;
}(NeuralNetwork));
......@@ -2053,43 +2063,40 @@
return convLayer$1(x, params, [2, 2], true, 'valid');
}
function extractorsFactory$3(extractWeights) {
function extractorsFactory$3(extractWeights, paramMappings) {
function extractFilterValues(numFilterValues, numFilters, filterSize) {
var weights = extractWeights(numFilterValues);
var depth = weights.length / (numFilters * filterSize * filterSize);
if (isFloat(depth)) {
throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize);
}
return transpose(tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]);
return tidy(function () { return transpose(tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]); });
}
function extractScaleLayerParams(numWeights) {
function extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix) {
var filters = extractFilterValues(numFilterValues, numFilters, filterSize);
var bias = tensor1d(extractWeights(numFilters));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/bias" });
return { filters: filters, bias: bias };
}
function extractScaleLayerParams(numWeights, mappedPrefix) {
var weights = tensor1d(extractWeights(numWeights));
var biases = tensor1d(extractWeights(numWeights));
paramMappings.push({ paramPath: mappedPrefix + "/weights" }, { paramPath: mappedPrefix + "/biases" });
return {
weights: weights,
biases: biases
};
}
function extractConvLayerParams(numFilterValues, numFilters, filterSize) {
var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize);
var conv_bias = tensor1d(extractWeights(numFilters));
var scale = extractScaleLayerParams(numFilters);
return {
conv: {
filters: conv_filters,
bias: conv_bias
},
scale: scale
};
function extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix) {
var conv = extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv");
var scale = extractScaleLayerParams(numFilters, mappedPrefix + "/scale");
return { conv: conv, scale: scale };
}
function extractResidualLayerParams(numFilterValues, numFilters, filterSize, isDown) {
function extractResidualLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix, isDown) {
if (isDown === void 0) { isDown = false; }
var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize);
var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize);
return {
conv1: conv1,
conv2: conv2
};
var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, mappedPrefix + "/conv1");
var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv2");
return { conv1: conv1, conv2: conv2 };
}
return {
extractConvLayerParams: extractConvLayerParams,
......@@ -2098,27 +2105,29 @@
}
function extractParams$2(weights) {
var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory$3(extractWeights), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams;
var conv32_down = extractConvLayerParams(4704, 32, 7);
var conv32_1 = extractResidualLayerParams(9216, 32, 3);
var conv32_2 = extractResidualLayerParams(9216, 32, 3);
var conv32_3 = extractResidualLayerParams(9216, 32, 3);
var conv64_down = extractResidualLayerParams(36864, 64, 3, true);
var conv64_1 = extractResidualLayerParams(36864, 64, 3);
var conv64_2 = extractResidualLayerParams(36864, 64, 3);
var conv64_3 = extractResidualLayerParams(36864, 64, 3);
var conv128_down = extractResidualLayerParams(147456, 128, 3, true);
var conv128_1 = extractResidualLayerParams(147456, 128, 3);
var conv128_2 = extractResidualLayerParams(147456, 128, 3);
var conv256_down = extractResidualLayerParams(589824, 256, 3, true);
var conv256_1 = extractResidualLayerParams(589824, 256, 3);
var conv256_2 = extractResidualLayerParams(589824, 256, 3);
var conv256_down_out = extractResidualLayerParams(589824, 256, 3);
var fc = transpose(tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]);
var paramMappings = [];
var _b = extractorsFactory$3(extractWeights, paramMappings), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams;
var conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');
var conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');
var conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');
var conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');
var conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);
var conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');
var conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');
var conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');
var conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);
var conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');
var conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');
var conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);
var conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');
var conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');
var conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out');
var fc = tidy(function () { return transpose(tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]); });
paramMappings.push({ paramPath: "fc" });
if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length);
}
return {
var params = {
conv32_down: conv32_down,
conv32_1: conv32_1,
conv32_2: conv32_2,
......@@ -2136,38 +2145,22 @@
conv256_down_out: conv256_down_out,
fc: fc
};
return { params: params, paramMappings: paramMappings };
}
var DEFAULT_MODEL_NAME$2 = 'face_recognition_model';
function extractorsFactory$4(weightMap) {
function extractorsFactory$4(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);
function extractScaleLayerParams(prefix) {
var params = {
weights: weightMap[prefix + "/scale/weights"],
biases: weightMap[prefix + "/scale/biases"]
};
if (!isTensor1D(params.weights)) {
throw new Error("expected weightMap[" + prefix + "/scale/weights] to be a Tensor1D, instead have " + params.weights);
}
if (!isTensor1D(params.biases)) {
throw new Error("expected weightMap[" + prefix + "/scale/biases] to be a Tensor1D, instead have " + params.biases);
}
return params;
var weights = extractWeightEntry(prefix + "/scale/weights", 1);
var biases = extractWeightEntry(prefix + "/scale/biases", 1);
return { weights: weights, biases: biases };
}
function extractConvLayerParams(prefix) {
var params = {
filters: weightMap[prefix + "/conv/filters"],
bias: weightMap[prefix + "/conv/bias"]
};
if (!isTensor4D(params.filters)) {
throw new Error("expected weightMap[" + prefix + "/conv/filters] to be a Tensor1D, instead have " + params.filters);
}
if (!isTensor1D(params.bias)) {
throw new Error("expected weightMap[" + prefix + "/conv/bias] to be a Tensor1D, instead have " + params.bias);
}
return {
conv: params,
scale: extractScaleLayerParams(prefix)
};
var filters = extractWeightEntry(prefix + "/conv/filters", 4);
var bias = extractWeightEntry(prefix + "/conv/bias", 1);
var scale = extractScaleLayerParams(prefix);
return { conv: { filters: filters, bias: bias }, scale: scale };
}
function extractResidualLayerParams(prefix) {
return {
......@@ -2182,13 +2175,14 @@
}
function loadQuantizedParams$2(uri) {
return __awaiter$1(this, void 0, void 0, function () {
var weightMap, _a, extractConvLayerParams, extractResidualLayerParams, conv32_down, conv32_1, conv32_2, conv32_3, conv64_down, conv64_1, conv64_2, conv64_3, conv128_down, conv128_1, conv128_2, conv256_down, conv256_1, conv256_2, conv256_down_out, fc;
var weightMap, paramMappings, _a, extractConvLayerParams, extractResidualLayerParams, conv32_down, conv32_1, conv32_2, conv32_3, conv64_down, conv64_1, conv64_2, conv64_3, conv128_down, conv128_1, conv128_2, conv256_down, conv256_1, conv256_2, conv256_down_out, fc, params;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME$2)];
case 1:
weightMap = _b.sent();
_a = extractorsFactory$4(weightMap), extractConvLayerParams = _a.extractConvLayerParams, extractResidualLayerParams = _a.extractResidualLayerParams;
paramMappings = [];
_a = extractorsFactory$4(weightMap, paramMappings), extractConvLayerParams = _a.extractConvLayerParams, extractResidualLayerParams = _a.extractResidualLayerParams;
conv32_down = extractConvLayerParams('conv32_down');
conv32_1 = extractResidualLayerParams('conv32_1');
conv32_2 = extractResidualLayerParams('conv32_2');
......@@ -2205,10 +2199,11 @@
conv256_2 = extractResidualLayerParams('conv256_2');
conv256_down_out = extractResidualLayerParams('conv256_down_out');
fc = weightMap['fc'];
paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });
if (!isTensor2D(fc)) {
throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc);
}
return [2 /*return*/, {
params = {
conv32_down: conv32_down,
conv32_1: conv32_1,
conv32_2: conv32_2,
......@@ -2225,7 +2220,9 @@
conv256_2: conv256_2,
conv256_down_out: conv256_down_out,
fc: fc
}];
};
disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
}
});
});
......@@ -2271,60 +2268,37 @@
return out;
}
var FaceRecognitionNet = /** @class */ (function () {
var FaceRecognitionNet = /** @class */ (function (_super) {
__extends$1(FaceRecognitionNet, _super);
function FaceRecognitionNet() {
return _super.call(this, 'FaceRecognitionNet') || this;
}
FaceRecognitionNet.prototype.load = function (weightsOrUrl) {
return __awaiter$1(this, void 0, void 0, function () {
var _a;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0:
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl);
return [2 /*return*/];
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array');
}
_a = this;
return [4 /*yield*/, loadQuantizedParams$2(weightsOrUrl)];
case 1:
_a._params = _b.sent();
return [2 /*return*/];
}
});
});
};
FaceRecognitionNet.prototype.extractWeights = function (weights) {
this._params = extractParams$2(weights);
};
FaceRecognitionNet.prototype.forwardInput = function (input) {
var _this = this;
if (!this._params) {
var params = this.params;
if (!params) {
throw new Error('FaceRecognitionNet - load model before inference');
}
return tidy(function () {
var batchTensor = input.toBatchTensor(150, true);
var normalized = normalize(batchTensor);
var out = convDown(normalized, _this._params.conv32_down);
var out = convDown(normalized, params.conv32_down);
out = maxPool(out, 3, 2, 'valid');
out = residual(out, _this._params.conv32_1);
out = residual(out, _this._params.conv32_2);
out = residual(out, _this._params.conv32_3);
out = residualDown(out, _this._params.conv64_down);
out = residual(out, _this._params.conv64_1);
out = residual(out, _this._params.conv64_2);
out = residual(out, _this._params.conv64_3);
out = residualDown(out, _this._params.conv128_down);
out = residual(out, _this._params.conv128_1);
out = residual(out, _this._params.conv128_2);
out = residualDown(out, _this._params.conv256_down);
out = residual(out, _this._params.conv256_1);
out = residual(out, _this._params.conv256_2);
out = residualDown(out, _this._params.conv256_down_out);
out = residual(out, params.conv32_1);
out = residual(out, params.conv32_2);
out = residual(out, params.conv32_3);
out = residualDown(out, params.conv64_down);
out = residual(out, params.conv64_1);
out = residual(out, params.conv64_2);
out = residual(out, params.conv64_3);
out = residualDown(out, params.conv128_down);
out = residual(out, params.conv128_1);
out = residual(out, params.conv128_2);
out = residualDown(out, params.conv256_down);
out = residual(out, params.conv256_1);
out = residual(out, params.conv256_2);
out = residualDown(out, params.conv256_down_out);
var globalAvg = out.mean([1, 2]);
var fullyConnected = matMul(globalAvg, _this._params.fc);
var fullyConnected = matMul(globalAvg, params.fc);
return fullyConnected;
});
};
......@@ -2362,8 +2336,14 @@
});
});
};
FaceRecognitionNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams$2(uri);
};
FaceRecognitionNet.prototype.extractParams = function (weights) {
return extractParams$2(weights);
};
return FaceRecognitionNet;
}());
}(NeuralNetwork));
function faceRecognitionNet(weights) {
var net = new FaceRecognitionNet();
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -32,6 +32,11 @@ export class Rect implements IRect {
return new Rect(x, y, width, height)
}
public pad(padX: number, padY: number): Rect {
let { x, y, width, height } = this
return new Rect(x - (padX / 2), y - (padY / 2), width + padX, height + padY)
}
public floor(): Rect {
return new Rect(
Math.floor(this.x),
......
......@@ -7,6 +7,8 @@ export class NeuralNetwork<TNetParams> {
protected _params: TNetParams | undefined = undefined
protected _paramMappings: ParamMapping[] = []
constructor(private _name: string) {}
public get params(): TNetParams | undefined {
return this._params
}
......@@ -53,11 +55,44 @@ export class NeuralNetwork<TNetParams> {
})
}
public dispose() {
this.getParamList().forEach(param => param.tensor.dispose())
public dispose(throwOnRedispose: boolean = true) {
this.getParamList().forEach(param => {
if (throwOnRedispose && param.tensor.isDisposed) {
throw new Error(`param tensor has already been disposed for path ${param.path}`)
}
param.tensor.dispose()
})
this._params = undefined
}
public async load(weightsOrUrl: Float32Array | string | undefined): Promise<void> {
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl)
return
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error(`${this._name}.load - expected model uri, or weights as Float32Array`)
}
const {
paramMappings,
params
} = await this.loadQuantizedParams(weightsOrUrl)
this._paramMappings = paramMappings
this._params = params
}
public extractWeights(weights: Float32Array) {
const {
paramMappings,
params
} = this.extractParams(weights)
this._paramMappings = paramMappings
this._params = params
}
private traversePropertyPath(paramPath: string) {
if (!this.params) {
throw new Error(`traversePropertyPath - model has no loaded params`)
......@@ -78,4 +113,12 @@ export class NeuralNetwork<TNetParams> {
return { obj, objProp }
}
protected loadQuantizedParams(_: any): Promise<{ params: TNetParams, paramMappings: ParamMapping[] }> {
throw new Error(`${this._name}.loadQuantizedParams - not implemented`)
}
protected extractParams(_: any): { params: TNetParams, paramMappings: ParamMapping[] } {
throw new Error(`${this._name}.extractParams - not implemented`)
}
}
\ No newline at end of file
import { ParamMapping } from './types';
export function disposeUnusedWeightTensors(weightMap: any, paramMappings: ParamMapping[]) {
Object.keys(weightMap).forEach(path => {
if (!paramMappings.some(pm => pm.originalPath === path)) {
weightMap[path].dispose()
}
})
}
import * as tf from '@tensorflow/tfjs-core';
import { ConvParams, ExtractWeightsFunction, ParamMapping } from './types';
export function extractConvParamsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {
return function (
channelsIn: number,
channelsOut: number,
filterSize: number,
mappedPrefix: string
): ConvParams {
const filters = tf.tensor4d(
extractWeights(channelsIn * channelsOut * filterSize * filterSize),
[filterSize, filterSize, channelsIn, channelsOut]
)
const bias = tf.tensor1d(extractWeights(channelsOut))
paramMappings.push(
{ paramPath: `${mappedPrefix}/filters` },
{ paramPath: `${mappedPrefix}/bias` }
)
return {
filters,
bias
}
}
}
\ No newline at end of file
import { isTensor } from './isTensor';
export function extractWeightEntry(weightMap: any, path: string, paramRank: number) {
const tensor = weightMap[path]
if (!isTensor(tensor, paramRank)) {
throw new Error(`expected weightMap[${path}] to be a Tensor${paramRank}D, instead have ${tensor}`)
}
return { path, tensor }
}
\ No newline at end of file
import { isTensor } from './isTensor';
import { ParamMapping } from './types';
export function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]) {
return function<T> (originalPath: string, paramRank: number, mappedPath?: string): T {
const tensor = weightMap[originalPath]
if (!isTensor(tensor, paramRank)) {
throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor}`)
}
paramMappings.push(
{ originalPath, paramPath: mappedPath || originalPath }
)
return tensor
}
}
import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput';
import { Rect } from '../Rect';
import { toNetInput } from '../toNetInput';
......@@ -13,28 +14,17 @@ import { outputLayer } from './outputLayer';
import { predictionLayer } from './predictionLayer';
import { NetParams } from './types';
export class FaceDetectionNet {
export class FaceDetectionNet extends NeuralNetwork<NetParams> {
private _params: NetParams
public async load(weightsOrUrl?: Float32Array | string): Promise<void> {
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl)
return
constructor() {
super('FaceDetectionNet')
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array')
}
this._params = await loadQuantizedParams(weightsOrUrl)
}
public forwardInput(input: NetInput) {
public extractWeights(weights: Float32Array) {
this._params = extractParams(weights)
}
const { params } = this
public forwardInput(input: NetInput) {
if (!this._params) {
if (!params) {
throw new Error('FaceDetectionNet - load model before inference')
}
......@@ -42,14 +32,14 @@ export class FaceDetectionNet {
const batchTensor = input.toBatchTensor(512, false)
const x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1)) as tf.Tensor4D
const features = mobileNetV1(x, this._params.mobilenetv1_params)
const features = mobileNetV1(x, params.mobilenetv1)
const {
boxPredictions,
classPredictions
} = predictionLayer(features.out, features.conv11, this._params.prediction_layer_params)
} = predictionLayer(features.out, features.conv11, params.prediction_layer)
return outputLayer(boxPredictions, classPredictions, this._params.output_layer_params)
return outputLayer(boxPredictions, classPredictions, params.output_layer)
})
}
......@@ -91,7 +81,6 @@ export class FaceDetectionNet {
minConfidence
)
const paddedHeightRelative = (netInput.getPaddings(0).y + netInput.getInputHeight(0)) / netInput.getInputHeight(0)
const paddedWidthRelative = (netInput.getPaddings(0).x + netInput.getInputWidth(0)) / netInput.getInputWidth(0)
......@@ -125,4 +114,12 @@ export class FaceDetectionNet {
return results
}
protected loadQuantizedParams(uri: string | undefined) {
return loadQuantizedParams(uri)
}
protected extractParams(weights: Float32Array) {
return extractParams(weights)
}
}
\ No newline at end of file
......@@ -13,11 +13,11 @@ export function boxPredictionLayer(
const batchSize = x.shape[0]
const boxPredictionEncoding = tf.reshape(
convLayer(x, params.box_encoding_predictor_params),
convLayer(x, params.box_encoding_predictor),
[batchSize, -1, 1, 4]
)
const classPrediction = tf.reshape(
convLayer(x, params.class_predictor_params),
convLayer(x, params.class_predictor),
[batchSize, -1, 3]
)
......
import * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory } from '../commons/extractWeightsFactory';
import { ConvParams } from '../commons/types';
import { ConvParams, ExtractWeightsFunction, ParamMapping } from '../commons/types';
import { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';
function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) {
function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {
function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {
function extractDepthwiseConvParams(numChannels: number): MobileNetV1.DepthwiseConvParams {
const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1])
const batch_norm_scale = tf.tensor1d(extractWeights(numChannels))
const batch_norm_offset = tf.tensor1d(extractWeights(numChannels))
const batch_norm_mean = tf.tensor1d(extractWeights(numChannels))
const batch_norm_variance = tf.tensor1d(extractWeights(numChannels))
paramMappings.push(
{ paramPath: `${mappedPrefix}/filters` },
{ paramPath: `${mappedPrefix}/batch_norm_scale` },
{ paramPath: `${mappedPrefix}/batch_norm_offset` },
{ paramPath: `${mappedPrefix}/batch_norm_mean` },
{ paramPath: `${mappedPrefix}/batch_norm_variance` }
)
return {
filters,
batch_norm_scale,
......@@ -25,29 +34,36 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array)
function extractConvParams(
channelsIn: number,
channelsOut: number,
filterSize: number
filterSize: number,
mappedPrefix: string,
isPointwiseConv?: boolean
): ConvParams {
const filters = tf.tensor4d(
extractWeights(channelsIn * channelsOut * filterSize * filterSize),
[filterSize, filterSize, channelsIn, channelsOut]
)
const bias = tf.tensor1d(extractWeights(channelsOut))
return {
filters,
bias
}
paramMappings.push(
{ paramPath: `${mappedPrefix}/filters` },
{ paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` }
)
return { filters, bias }
}
function extractPointwiseConvParams(
channelsIn: number,
channelsOut: number,
filterSize: number
filterSize: number,
mappedPrefix: string
): PointwiseConvParams {
const {
filters,
bias
} = extractConvParams(channelsIn, channelsOut, filterSize)
} = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true)
return {
filters,
......@@ -57,115 +73,118 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array)
function extractConvPairParams(
channelsIn: number,
channelsOut: number
channelsOut: number,
mappedPrefix: string
): MobileNetV1.ConvPairParams {
const depthwise_conv_params = extractDepthwiseConvParams(channelsIn)
const pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1)
return {
depthwise_conv_params,
pointwise_conv_params
}
const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`)
const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`)
return { depthwise_conv, pointwise_conv }
}
function extractMobilenetV1Params(): MobileNetV1.Params {
const conv_0_params = extractPointwiseConvParams(3, 32, 3)
const channelNumPairs = [
[32, 64],
[64, 128],
[128, 128],
[128, 256],
[256, 256],
[256, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 512],
[512, 1024],
[1024, 1024]
]
const conv_pair_params = channelNumPairs.map(
([channelsIn, channelsOut]) => extractConvPairParams(channelsIn, channelsOut)
)
const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0')
const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1')
const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2')
const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3')
const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4')
const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5')
const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6')
const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7')
const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8')
const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9')
const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10')
const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11')
const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12')
const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13')
return {
conv_0_params,
conv_pair_params
conv_0,
conv_1,
conv_2,
conv_3,
conv_4,
conv_5,
conv_6,
conv_7,
conv_8,
conv_9,
conv_10,
conv_11,
conv_12,
conv_13
}
}
function extractPredictionLayerParams(): PredictionLayerParams {
const conv_0_params = extractPointwiseConvParams(1024, 256, 1)
const conv_1_params = extractPointwiseConvParams(256, 512, 3)
const conv_2_params = extractPointwiseConvParams(512, 128, 1)
const conv_3_params = extractPointwiseConvParams(128, 256, 3)
const conv_4_params = extractPointwiseConvParams(256, 128, 1)
const conv_5_params = extractPointwiseConvParams(128, 256, 3)
const conv_6_params = extractPointwiseConvParams(256, 64, 1)
const conv_7_params = extractPointwiseConvParams(64, 128, 3)
const box_encoding_0_predictor_params = extractConvParams(512, 12, 1)
const class_predictor_0_params = extractConvParams(512, 9, 1)
const box_encoding_1_predictor_params = extractConvParams(1024, 24, 1)
const class_predictor_1_params = extractConvParams(1024, 18, 1)
const box_encoding_2_predictor_params = extractConvParams(512, 24, 1)
const class_predictor_2_params = extractConvParams(512, 18, 1)
const box_encoding_3_predictor_params = extractConvParams(256, 24, 1)
const class_predictor_3_params = extractConvParams(256, 18, 1)
const box_encoding_4_predictor_params = extractConvParams(256, 24, 1)
const class_predictor_4_params = extractConvParams(256, 18, 1)
const box_encoding_5_predictor_params = extractConvParams(128, 24, 1)
const class_predictor_5_params = extractConvParams(128, 18, 1)
const box_predictor_0_params = {
box_encoding_predictor_params: box_encoding_0_predictor_params,
class_predictor_params: class_predictor_0_params
}
const box_predictor_1_params = {
box_encoding_predictor_params: box_encoding_1_predictor_params,
class_predictor_params: class_predictor_1_params
}
const box_predictor_2_params = {
box_encoding_predictor_params: box_encoding_2_predictor_params,
class_predictor_params: class_predictor_2_params
}
const box_predictor_3_params = {
box_encoding_predictor_params: box_encoding_3_predictor_params,
class_predictor_params: class_predictor_3_params
}
const box_predictor_4_params = {
box_encoding_predictor_params: box_encoding_4_predictor_params,
class_predictor_params: class_predictor_4_params
}
const box_predictor_5_params = {
box_encoding_predictor_params: box_encoding_5_predictor_params,
class_predictor_params: class_predictor_5_params
const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0')
const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1')
const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2')
const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3')
const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4')
const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5')
const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6')
const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7')
const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor')
const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor')
const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor')
const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor')
const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor')
const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor')
const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor')
const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor')
const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor')
const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor')
const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor')
const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor')
const box_predictor_0 = {
box_encoding_predictor: box_encoding_0_predictor,
class_predictor: class_predictor_0
}
const box_predictor_1 = {
box_encoding_predictor: box_encoding_1_predictor,
class_predictor: class_predictor_1
}
const box_predictor_2 = {
box_encoding_predictor: box_encoding_2_predictor,
class_predictor: class_predictor_2
}
const box_predictor_3 = {
box_encoding_predictor: box_encoding_3_predictor,
class_predictor: class_predictor_3
}
const box_predictor_4 = {
box_encoding_predictor: box_encoding_4_predictor,
class_predictor: class_predictor_4
}
const box_predictor_5 = {
box_encoding_predictor: box_encoding_5_predictor,
class_predictor: class_predictor_5
}
return {
conv_0_params,
conv_1_params,
conv_2_params,
conv_3_params,
conv_4_params,
conv_5_params,
conv_6_params,
conv_7_params,
box_predictor_0_params,
box_predictor_1_params,
box_predictor_2_params,
box_predictor_3_params,
box_predictor_4_params,
box_predictor_5_params
conv_0,
conv_1,
conv_2,
conv_3,
conv_4,
conv_5,
conv_6,
conv_7,
box_predictor_0,
box_predictor_1,
box_predictor_2,
box_predictor_3,
box_predictor_4,
box_predictor_5
}
}
return {
extractMobilenetV1Params,
extractPredictionLayerParams
......@@ -173,7 +192,10 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array)
}
export function extractParams(weights: Float32Array): NetParams {
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {
const paramMappings: ParamMapping[] = []
const {
extractWeights,
getRemainingWeights
......@@ -182,25 +204,30 @@ export function extractParams(weights: Float32Array): NetParams {
const {
extractMobilenetV1Params,
extractPredictionLayerParams
} = extractorsFactory(extractWeights)
} = extractorsFactory(extractWeights, paramMappings)
const mobilenetv1_params = extractMobilenetV1Params()
const prediction_layer_params = extractPredictionLayerParams()
const mobilenetv1 = extractMobilenetV1Params()
const prediction_layer = extractPredictionLayerParams()
const extra_dim = tf.tensor3d(
extractWeights(5118 * 4),
[1, 5118, 4]
)
const output_layer_params = {
const output_layer = {
extra_dim
}
paramMappings.push({ paramPath: 'output_layer/extra_dim' })
if (getRemainingWeights().length !== 0) {
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)
}
return {
mobilenetv1_params,
prediction_layer_params,
output_layer_params
params: {
mobilenetv1,
prediction_layer,
output_layer
},
paramMappings
}
}
\ No newline at end of file
import { isTensor1D, isTensor4D, isTensor3D } from '../commons/isTensor';
import { tf } from '..';
import { disposeUnusedWeightTensors } from '../commons/disposeUnusedWeightTensors';
import { extractWeightEntryFactory } from '../commons/extractWeightEntryFactory';
import { isTensor1D, isTensor3D, isTensor4D } from '../commons/isTensor';
import { loadWeightMap } from '../commons/loadWeightMap';
import { BoxPredictionParams, MobileNetV1, PointwiseConvParams, PredictionLayerParams } from './types';
import { ConvParams, ParamMapping } from '../commons/types';
import { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';
const DEFAULT_MODEL_NAME = 'face_detection_model'
function extractorsFactory(weightMap: any) {
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
function extractPointwiseConvParams(prefix: string, idx: number): PointwiseConvParams {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
const pointwise_conv_params = {
filters: weightMap[`${prefix}/Conv2d_${idx}_pointwise/weights`],
batch_norm_offset: weightMap[`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`]
}
if (!isTensor4D(pointwise_conv_params.filters)) {
throw new Error(`expected weightMap[${prefix}/Conv2d_${idx}_pointwise/weights] to be a Tensor4D, instead have ${pointwise_conv_params.filters}`)
}
function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {
if (!isTensor1D(pointwise_conv_params.batch_norm_offset)) {
throw new Error(`expected weightMap[${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset] to be a Tensor1D, instead have ${pointwise_conv_params.batch_norm_offset}`)
}
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`)
const batch_norm_offset = extractWeightEntry<tf.Tensor1D>(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`)
return pointwise_conv_params
return { filters, batch_norm_offset }
}
function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams {
const depthwise_conv_params = {
filters: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/depthwise_weights`],
batch_norm_scale: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/gamma`],
batch_norm_offset: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/beta`],
batch_norm_mean: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_mean`],
batch_norm_variance: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_variance`],
}
if (!isTensor4D(depthwise_conv_params.filters)) {
throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/depthwise_weights] to be a Tensor4D, instead have ${depthwise_conv_params.filters}`)
}
if (!isTensor1D(depthwise_conv_params.batch_norm_scale)) {
throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_scale}`)
}
if (!isTensor1D(depthwise_conv_params.batch_norm_offset)) {
throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/beta] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_offset}`)
}
if (!isTensor1D(depthwise_conv_params.batch_norm_mean)) {
throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_mean}`)
}
const mappedPrefix = `mobilenetv1/conv_${idx}`
const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`
const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`
const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`
if (!isTensor1D(depthwise_conv_params.batch_norm_variance)) {
throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_variance}`)
}
const filters = extractWeightEntry<tf.Tensor4D>(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`)
const batch_norm_scale = extractWeightEntry<tf.Tensor1D>(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`)
const batch_norm_offset = extractWeightEntry<tf.Tensor1D>(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`)
const batch_norm_mean = extractWeightEntry<tf.Tensor1D>(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`)
const batch_norm_variance = extractWeightEntry<tf.Tensor1D>(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`)
return {
depthwise_conv_params,
pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx)
depthwise_conv: {
filters,
batch_norm_scale,
batch_norm_offset,
batch_norm_mean,
batch_norm_variance
},
pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv)
}
}
function extractMobilenetV1Params(): MobileNetV1.Params {
return {
conv_0_params: extractPointwiseConvParams('MobilenetV1', 0),
conv_pair_params: Array(13).fill(0).map((_, i) => extractConvPairParams(i + 1))
}
}
function extractBoxPredictorParams(idx: number): BoxPredictionParams {
const params = {
box_encoding_predictor_params: {
filters: weightMap[`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/weights`],
bias: weightMap[`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/biases`]
},
class_predictor_params: {
filters: weightMap[`Prediction/BoxPredictor_${idx}/ClassPredictor/weights`],
bias: weightMap[`Prediction/BoxPredictor_${idx}/ClassPredictor/biases`]
conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
conv_1: extractConvPairParams(1),
conv_2: extractConvPairParams(2),
conv_3: extractConvPairParams(3),
conv_4: extractConvPairParams(4),
conv_5: extractConvPairParams(5),
conv_6: extractConvPairParams(6),
conv_7: extractConvPairParams(7),
conv_8: extractConvPairParams(8),
conv_9: extractConvPairParams(9),
conv_10: extractConvPairParams(10),
conv_11: extractConvPairParams(11),
conv_12: extractConvPairParams(12),
conv_13: extractConvPairParams(13)
}
}
if (!isTensor4D(params.box_encoding_predictor_params.filters)) {
throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/weights] to be a Tensor4D, instead have ${params.box_encoding_predictor_params.filters}`)
}
function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/weights`, 4, `${mappedPrefix}/filters`)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/biases`, 1, `${mappedPrefix}/bias`)
if (!isTensor1D(params.box_encoding_predictor_params.bias)) {
throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/biases] to be a Tensor1D, instead have ${params.box_encoding_predictor_params.bias}`)
return { filters, bias }
}
if (!isTensor4D(params.class_predictor_params.filters)) {
throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/ClassPredictor/weights] to be a Tensor4D, instead have ${params.class_predictor_params.filters}`)
}
function extractBoxPredictorParams(idx: number): BoxPredictionParams {
if (!isTensor1D(params.class_predictor_params.bias)) {
throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/ClassPredictor/biases] to be a Tensor1D, instead have ${params.class_predictor_params.bias}`)
}
const box_encoding_predictor = extractConvParams(
`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,
`prediction_layer/box_predictor_${idx}/box_encoding_predictor`
)
const class_predictor = extractConvParams(
`Prediction/BoxPredictor_${idx}/ClassPredictor`,
`prediction_layer/box_predictor_${idx}/class_predictor`
)
return params
return { box_encoding_predictor, class_predictor }
}
function extractPredictionLayerParams(): PredictionLayerParams {
return {
conv_0_params: extractPointwiseConvParams('Prediction', 0),
conv_1_params: extractPointwiseConvParams('Prediction', 1),
conv_2_params: extractPointwiseConvParams('Prediction', 2),
conv_3_params: extractPointwiseConvParams('Prediction', 3),
conv_4_params: extractPointwiseConvParams('Prediction', 4),
conv_5_params: extractPointwiseConvParams('Prediction', 5),
conv_6_params: extractPointwiseConvParams('Prediction', 6),
conv_7_params: extractPointwiseConvParams('Prediction', 7),
box_predictor_0_params: extractBoxPredictorParams(0),
box_predictor_1_params: extractBoxPredictorParams(1),
box_predictor_2_params: extractBoxPredictorParams(2),
box_predictor_3_params: extractBoxPredictorParams(3),
box_predictor_4_params: extractBoxPredictorParams(4),
box_predictor_5_params: extractBoxPredictorParams(5)
conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
box_predictor_0: extractBoxPredictorParams(0),
box_predictor_1: extractBoxPredictorParams(1),
box_predictor_2: extractBoxPredictorParams(2),
box_predictor_3: extractBoxPredictorParams(3),
box_predictor_4: extractBoxPredictorParams(4),
box_predictor_5: extractBoxPredictorParams(5)
}
}
......@@ -124,24 +110,34 @@ function extractorsFactory(weightMap: any) {
}
}
export async function loadQuantizedParams(uri: string | undefined): Promise<any> {//Promise<NetParams> {
export async function loadQuantizedParams(
uri: string | undefined
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = []
const {
extractMobilenetV1Params,
extractPredictionLayerParams
} = extractorsFactory(weightMap)
} = extractorsFactory(weightMap, paramMappings)
const extra_dim = weightMap['Output/extra_dim']
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' })
if (!isTensor3D(extra_dim)) {
throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`)
}
return {
mobilenetv1_params: extractMobilenetV1Params(),
prediction_layer_params: extractPredictionLayerParams(),
output_layer_params: {
const params = {
mobilenetv1: extractMobilenetV1Params(),
prediction_layer: extractPredictionLayerParams(),
output_layer: {
extra_dim
}
}
disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings }
}
\ No newline at end of file
......@@ -34,13 +34,29 @@ export function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {
return tf.tidy(() => {
let conv11 = null
let out = pointwiseConvLayer(x, params.conv_0_params, [2, 2])
let out = pointwiseConvLayer(x, params.conv_0, [2, 2])
params.conv_pair_params.forEach((param, i) => {
const convPairParams = [
params.conv_1,
params.conv_2,
params.conv_3,
params.conv_4,
params.conv_5,
params.conv_6,
params.conv_7,
params.conv_8,
params.conv_9,
params.conv_10,
params.conv_11,
params.conv_12,
params.conv_13
]
convPairParams.forEach((param, i) => {
const layerIdx = i + 1
const depthwiseConvStrides = getStridesForLayerIdx(layerIdx)
out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides)
out = pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1])
out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides)
out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1])
if (layerIdx === 11) {
conv11 = out
}
......
......@@ -11,21 +11,21 @@ export function predictionLayer(
) {
return tf.tidy(() => {
const conv0 = pointwiseConvLayer(x, params.conv_0_params, [1, 1])
const conv1 = pointwiseConvLayer(conv0, params.conv_1_params, [2, 2])
const conv2 = pointwiseConvLayer(conv1, params.conv_2_params, [1, 1])
const conv3 = pointwiseConvLayer(conv2, params.conv_3_params, [2, 2])
const conv4 = pointwiseConvLayer(conv3, params.conv_4_params, [1, 1])
const conv5 = pointwiseConvLayer(conv4, params.conv_5_params, [2, 2])
const conv6 = pointwiseConvLayer(conv5, params.conv_6_params, [1, 1])
const conv7 = pointwiseConvLayer(conv6, params.conv_7_params, [2, 2])
const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1])
const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2])
const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1])
const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2])
const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1])
const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2])
const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1])
const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2])
const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0_params)
const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1_params)
const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2_params)
const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3_params)
const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4_params)
const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5_params)
const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0)
const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1)
const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2)
const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3)
const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4)
const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5)
const boxPredictions = tf.concat([
boxPrediction0.boxPredictionEncoding,
......
......@@ -18,37 +18,49 @@ export namespace MobileNetV1 {
}
export type ConvPairParams = {
depthwise_conv_params: DepthwiseConvParams
pointwise_conv_params: PointwiseConvParams
depthwise_conv: DepthwiseConvParams
pointwise_conv: PointwiseConvParams
}
export type Params = {
conv_0_params: PointwiseConvParams
conv_pair_params: ConvPairParams[]
conv_0: PointwiseConvParams
conv_1: ConvPairParams
conv_2: ConvPairParams
conv_3: ConvPairParams
conv_4: ConvPairParams
conv_5: ConvPairParams
conv_6: ConvPairParams
conv_7: ConvPairParams
conv_8: ConvPairParams
conv_9: ConvPairParams
conv_10: ConvPairParams
conv_11: ConvPairParams
conv_12: ConvPairParams
conv_13: ConvPairParams
}
}
export type BoxPredictionParams = {
box_encoding_predictor_params: ConvParams
class_predictor_params: ConvParams
box_encoding_predictor: ConvParams
class_predictor: ConvParams
}
export type PredictionLayerParams = {
conv_0_params: PointwiseConvParams
conv_1_params: PointwiseConvParams
conv_2_params: PointwiseConvParams
conv_3_params: PointwiseConvParams
conv_4_params: PointwiseConvParams
conv_5_params: PointwiseConvParams
conv_6_params: PointwiseConvParams
conv_7_params: PointwiseConvParams
box_predictor_0_params: BoxPredictionParams
box_predictor_1_params: BoxPredictionParams
box_predictor_2_params: BoxPredictionParams
box_predictor_3_params: BoxPredictionParams
box_predictor_4_params: BoxPredictionParams
box_predictor_5_params: BoxPredictionParams
conv_0: PointwiseConvParams
conv_1: PointwiseConvParams
conv_2: PointwiseConvParams
conv_3: PointwiseConvParams
conv_4: PointwiseConvParams
conv_5: PointwiseConvParams
conv_6: PointwiseConvParams
conv_7: PointwiseConvParams
box_predictor_0: BoxPredictionParams
box_predictor_1: BoxPredictionParams
box_predictor_2: BoxPredictionParams
box_predictor_3: BoxPredictionParams
box_predictor_4: BoxPredictionParams
box_predictor_5: BoxPredictionParams
}
export type OutputLayerParams = {
......@@ -56,7 +68,7 @@ export type OutputLayerParams = {
}
export type NetParams = {
mobilenetv1_params: MobileNetV1.Params,
prediction_layer_params: PredictionLayerParams,
output_layer_params: OutputLayerParams
mobilenetv1: MobileNetV1.Params,
prediction_layer: PredictionLayerParams,
output_layer: OutputLayerParams
}
......@@ -24,36 +24,13 @@ function maxPool(x: tf.Tensor4D, strides: [number, number] = [2, 2]): tf.Tensor4
export class FaceLandmarkNet extends NeuralNetwork<NetParams> {
public async load(weightsOrUrl: Float32Array | string | undefined): Promise<void> {
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl)
return
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array')
}
const {
paramMappings,
params
} = await loadQuantizedParams(weightsOrUrl)
this._paramMappings = paramMappings
this._params = params
}
public extractWeights(weights: Float32Array) {
const {
paramMappings,
params
} = extractParams(weights)
this._paramMappings = paramMappings
this._params = params
constructor() {
super('FaceLandmarkNet')
}
public forwardInput(input: NetInput): tf.Tensor2D {
const params = this._params
const { params } = this
if (!params) {
throw new Error('FaceLandmarkNet - load model before inference')
......@@ -62,20 +39,20 @@ export class FaceLandmarkNet extends NeuralNetwork<NetParams> {
return tf.tidy(() => {
const batchTensor = input.toBatchTensor(128, true)
let out = conv(batchTensor, params.conv0_params)
let out = conv(batchTensor, params.conv0)
out = maxPool(out)
out = conv(out, params.conv1_params)
out = conv(out, params.conv2_params)
out = conv(out, params.conv1)
out = conv(out, params.conv2)
out = maxPool(out)
out = conv(out, params.conv3_params)
out = conv(out, params.conv4_params)
out = conv(out, params.conv3)
out = conv(out, params.conv4)
out = maxPool(out)
out = conv(out, params.conv5_params)
out = conv(out, params.conv6_params)
out = conv(out, params.conv5)
out = conv(out, params.conv6)
out = maxPool(out, [1, 1])
out = conv(out, params.conv7_params)
const fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params))
const fc1 = fullyConnectedLayer(fc0, params.fc1_params)
out = conv(out, params.conv7)
const fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0))
const fc1 = fullyConnectedLayer(fc0, params.fc1)
const createInterleavedTensor = (fillX: number, fillY: number) =>
tf.stack([
......@@ -145,4 +122,12 @@ export class FaceLandmarkNet extends NeuralNetwork<NetParams> {
? landmarksForBatch
: landmarksForBatch[0]
}
protected loadQuantizedParams(uri: string | undefined) {
return loadQuantizedParams(uri)
}
protected extractParams(weights: Float32Array) {
return extractParams(weights)
}
}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { extractConvParamsFactory } from '../commons/extractConvParamsFactory';
import { extractWeightsFactory } from '../commons/extractWeightsFactory';
import { ParamMapping } from '../commons/types';
import { ConvParams, ParamMapping } from '../commons/types';
import { FCParams, NetParams } from './types';
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {
const paramMappings: ParamMapping[] = []
const {
......@@ -13,9 +13,29 @@ export function extractParams(weights: Float32Array): { params: NetParams, param
getRemainingWeights
} = extractWeightsFactory(weights)
const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings)
function extractConvParams(
channelsIn: number,
channelsOut: number,
filterSize: number,
mappedPrefix: string
): ConvParams {
const filters = tf.tensor4d(
extractWeights(channelsIn * channelsOut * filterSize * filterSize),
[filterSize, filterSize, channelsIn, channelsOut]
)
const bias = tf.tensor1d(extractWeights(channelsOut))
paramMappings.push(
{ paramPath: `${mappedPrefix}/filters` },
{ paramPath: `${mappedPrefix}/bias` }
)
return { filters, bias }
}
function extractFcParams(channelsIn: number, channelsOut: number, mappedPrefix: string): FCParams {
const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut])
const fc_bias = tf.tensor1d(extractWeights(channelsOut))
......@@ -30,16 +50,16 @@ export function extractParams(weights: Float32Array): { params: NetParams, param
}
}
const conv0_params = extractConvParams(3, 32, 3, 'conv0_params')
const conv1_params = extractConvParams(32, 64, 3, 'conv1_params')
const conv2_params = extractConvParams(64, 64, 3, 'conv2_params')
const conv3_params = extractConvParams(64, 64, 3, 'conv3_params')
const conv4_params = extractConvParams(64, 64, 3, 'conv4_params')
const conv5_params = extractConvParams(64, 128, 3, 'conv5_params')
const conv6_params = extractConvParams(128, 128, 3, 'conv6_params')
const conv7_params = extractConvParams(128, 256, 3, 'conv7_params')
const fc0_params = extractFcParams(6400, 1024, 'fc0_params')
const fc1_params = extractFcParams(1024, 136, 'fc1_params')
const conv0 = extractConvParams(3, 32, 3, 'conv0')
const conv1 = extractConvParams(32, 64, 3, 'conv1')
const conv2 = extractConvParams(64, 64, 3, 'conv2')
const conv3 = extractConvParams(64, 64, 3, 'conv3')
const conv4 = extractConvParams(64, 64, 3, 'conv4')
const conv5 = extractConvParams(64, 128, 3, 'conv5')
const conv6 = extractConvParams(128, 128, 3, 'conv6')
const conv7 = extractConvParams(128, 256, 3, 'conv7')
const fc0 = extractFcParams(6400, 1024, 'fc0')
const fc1 = extractFcParams(1024, 136, 'fc1')
if (getRemainingWeights().length !== 0) {
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)
......@@ -48,16 +68,16 @@ export function extractParams(weights: Float32Array): { params: NetParams, param
return {
paramMappings,
params: {
conv0_params,
conv1_params,
conv2_params,
conv3_params,
conv4_params,
conv5_params,
conv6_params,
conv7_params,
fc0_params,
fc1_params
conv0,
conv1,
conv2,
conv3,
conv4,
conv5,
conv6,
conv7,
fc0,
fc1
}
}
}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { extractWeightEntry } from '../commons/extractWeightEntry';
import { disposeUnusedWeightTensors } from '../commons/disposeUnusedWeightTensors';
import { extractWeightEntryFactory } from '../commons/extractWeightEntryFactory';
import { loadWeightMap } from '../commons/loadWeightMap';
import { ConvParams, ParamMapping } from '../commons/types';
import { FCParams, NetParams } from './types';
......@@ -9,30 +10,20 @@ const DEFAULT_MODEL_NAME = 'face_landmark_68_model'
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {
const filtersEntry = extractWeightEntry(weightMap, `${prefix}/kernel`, 4)
const biasEntry = extractWeightEntry(weightMap, `${prefix}/bias`, 1)
paramMappings.push(
{ originalPath: filtersEntry.path, paramPath: `${mappedPrefix}/filters` },
{ originalPath: biasEntry.path, paramPath: `${mappedPrefix}/bias` }
)
return {
filters: filtersEntry.tensor as tf.Tensor4D,
bias: biasEntry.tensor as tf.Tensor1D
}
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/kernel`, 4, `${mappedPrefix}/filters`)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1, `${mappedPrefix}/bias`)
return { filters, bias }
}
function extractFcParams(prefix: string, mappedPrefix: string): FCParams {
const weightsEntry = extractWeightEntry(weightMap, `${prefix}/kernel`, 2)
const biasEntry = extractWeightEntry(weightMap, `${prefix}/bias`, 1)
paramMappings.push(
{ originalPath: weightsEntry.path, paramPath: `${mappedPrefix}/weights` },
{ originalPath: biasEntry.path, paramPath: `${mappedPrefix}/bias` }
)
return {
weights: weightsEntry.tensor as tf.Tensor2D,
bias: biasEntry.tensor as tf.Tensor1D
}
const weights = extractWeightEntry<tf.Tensor2D>(`${prefix}/kernel`, 2, `${mappedPrefix}/weights`)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1, `${mappedPrefix}/bias`)
return { weights, bias }
}
return {
......@@ -54,17 +45,19 @@ export async function loadQuantizedParams(
} = extractorsFactory(weightMap, paramMappings)
const params = {
conv0_params: extractConvParams('conv2d_0', 'conv0_params'),
conv1_params: extractConvParams('conv2d_1', 'conv1_params'),
conv2_params: extractConvParams('conv2d_2', 'conv2_params'),
conv3_params: extractConvParams('conv2d_3', 'conv3_params'),
conv4_params: extractConvParams('conv2d_4', 'conv4_params'),
conv5_params: extractConvParams('conv2d_5', 'conv5_params'),
conv6_params: extractConvParams('conv2d_6', 'conv6_params'),
conv7_params: extractConvParams('conv2d_7', 'conv7_params'),
fc0_params: extractFcParams('dense', 'fc0_params'),
fc1_params: extractFcParams('logits', 'fc1_params')
conv0: extractConvParams('conv2d_0', 'conv0'),
conv1: extractConvParams('conv2d_1', 'conv1'),
conv2: extractConvParams('conv2d_2', 'conv2'),
conv3: extractConvParams('conv2d_3', 'conv3'),
conv4: extractConvParams('conv2d_4', 'conv4'),
conv5: extractConvParams('conv2d_5', 'conv5'),
conv6: extractConvParams('conv2d_6', 'conv6'),
conv7: extractConvParams('conv2d_7', 'conv7'),
fc0: extractFcParams('dense', 'fc0'),
fc1: extractFcParams('logits', 'fc1')
}
disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings }
}
\ No newline at end of file
......@@ -8,14 +8,14 @@ export type FCParams = {
}
export type NetParams = {
conv0_params: ConvParams
conv1_params: ConvParams
conv2_params: ConvParams
conv3_params: ConvParams
conv4_params: ConvParams
conv5_params: ConvParams
conv6_params: ConvParams
conv7_params: ConvParams
fc0_params: FCParams
fc1_params: FCParams
conv0: ConvParams
conv1: ConvParams
conv2: ConvParams
conv3: ConvParams
conv4: ConvParams
conv5: ConvParams
conv6: ConvParams
conv7: ConvParams
fc0: FCParams
fc1: FCParams
}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput';
import { toNetInput } from '../toNetInput';
import { TNetInput } from '../types';
......@@ -10,28 +11,17 @@ import { normalize } from './normalize';
import { residual, residualDown } from './residualLayer';
import { NetParams } from './types';
export class FaceRecognitionNet {
export class FaceRecognitionNet extends NeuralNetwork<NetParams> {
private _params: NetParams
public async load(weightsOrUrl: Float32Array | string | undefined): Promise<void> {
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl)
return
constructor() {
super('FaceRecognitionNet')
}
if (weightsOrUrl && typeof weightsOrUrl !== 'string') {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array')
}
this._params = await loadQuantizedParams(weightsOrUrl)
}
public forwardInput(input: NetInput): tf.Tensor2D {
public extractWeights(weights: Float32Array) {
this._params = extractParams(weights)
}
const { params } = this
public forwardInput(input: NetInput): tf.Tensor2D {
if (!this._params) {
if (!params) {
throw new Error('FaceRecognitionNet - load model before inference')
}
......@@ -40,29 +30,29 @@ export class FaceRecognitionNet {
const normalized = normalize(batchTensor)
let out = convDown(normalized, this._params.conv32_down)
let out = convDown(normalized, params.conv32_down)
out = tf.maxPool(out, 3, 2, 'valid')
out = residual(out, this._params.conv32_1)
out = residual(out, this._params.conv32_2)
out = residual(out, this._params.conv32_3)
out = residual(out, params.conv32_1)
out = residual(out, params.conv32_2)
out = residual(out, params.conv32_3)
out = residualDown(out, this._params.conv64_down)
out = residual(out, this._params.conv64_1)
out = residual(out, this._params.conv64_2)
out = residual(out, this._params.conv64_3)
out = residualDown(out, params.conv64_down)
out = residual(out, params.conv64_1)
out = residual(out, params.conv64_2)
out = residual(out, params.conv64_3)
out = residualDown(out, this._params.conv128_down)
out = residual(out, this._params.conv128_1)
out = residual(out, this._params.conv128_2)
out = residualDown(out, params.conv128_down)
out = residual(out, params.conv128_1)
out = residual(out, params.conv128_2)
out = residualDown(out, this._params.conv256_down)
out = residual(out, this._params.conv256_1)
out = residual(out, this._params.conv256_2)
out = residualDown(out, this._params.conv256_down_out)
out = residualDown(out, params.conv256_down)
out = residual(out, params.conv256_1)
out = residual(out, params.conv256_2)
out = residualDown(out, params.conv256_down_out)
const globalAvg = out.mean([1, 2]) as tf.Tensor2D
const fullyConnected = tf.matMul(globalAvg, this._params.fc)
const fullyConnected = tf.matMul(globalAvg, params.fc)
return fullyConnected
})
......@@ -89,4 +79,12 @@ export class FaceRecognitionNet {
? faceDescriptorsForBatch
: faceDescriptorsForBatch[0]
}
protected loadQuantizedParams(uri: string | undefined) {
return loadQuantizedParams(uri)
}
protected extractParams(weights: Float32Array) {
return extractParams(weights)
}
}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory } from '../commons/extractWeightsFactory';
import { ExtractWeightsFunction } from '../commons/types';
import { ConvParams, ExtractWeightsFunction, ParamMapping } from '../commons/types';
import { isFloat } from '../utils';
import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';
function extractorsFactory(extractWeights: ExtractWeightsFunction) {
function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {
function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {
const weights = extractWeights(numFilterValues)
......@@ -15,15 +15,42 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) {
throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`)
}
return tf.transpose(
return tf.tidy(
() => tf.transpose(
tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),
[2, 3, 1, 0]
)
)
}
function extractScaleLayerParams(numWeights: number): ScaleLayerParams {
function extractConvParams(
numFilterValues: number,
numFilters: number,
filterSize: number,
mappedPrefix: string
): ConvParams {
const filters = extractFilterValues(numFilterValues, numFilters, filterSize)
const bias = tf.tensor1d(extractWeights(numFilters))
paramMappings.push(
{ paramPath: `${mappedPrefix}/filters` },
{ paramPath: `${mappedPrefix}/bias` }
)
return { filters, bias }
}
function extractScaleLayerParams(numWeights: number, mappedPrefix: string): ScaleLayerParams {
const weights = tf.tensor1d(extractWeights(numWeights))
const biases = tf.tensor1d(extractWeights(numWeights))
paramMappings.push(
{ paramPath: `${mappedPrefix}/weights` },
{ paramPath: `${mappedPrefix}/biases` }
)
return {
weights,
biases
......@@ -33,34 +60,28 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) {
function extractConvLayerParams(
numFilterValues: number,
numFilters: number,
filterSize: number
filterSize: number,
mappedPrefix: string
): ConvLayerParams {
const conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize)
const conv_bias = tf.tensor1d(extractWeights(numFilters))
const scale = extractScaleLayerParams(numFilters)
return {
conv: {
filters: conv_filters,
bias: conv_bias
},
scale
}
const conv = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`)
const scale = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`)
return { conv, scale }
}
function extractResidualLayerParams(
numFilterValues: number,
numFilters: number,
filterSize: number,
mappedPrefix: string,
isDown: boolean = false
): ResidualLayerParams {
const conv1: ConvLayerParams = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize)
const conv2: ConvLayerParams = extractConvLayerParams(numFilterValues, numFilters, filterSize)
return {
conv1,
conv2
}
const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`)
const conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`)
return { conv1, conv2 }
}
return {
......@@ -70,43 +91,49 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) {
}
export function extractParams(weights: Float32Array): NetParams {
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {
const {
extractWeights,
getRemainingWeights
} = extractWeightsFactory(weights)
const paramMappings: ParamMapping[] = []
const {
extractConvLayerParams,
extractResidualLayerParams
} = extractorsFactory(extractWeights)
} = extractorsFactory(extractWeights, paramMappings)
const conv32_down = extractConvLayerParams(4704, 32, 7)
const conv32_1 = extractResidualLayerParams(9216, 32, 3)
const conv32_2 = extractResidualLayerParams(9216, 32, 3)
const conv32_3 = extractResidualLayerParams(9216, 32, 3)
const conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down')
const conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1')
const conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2')
const conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3')
const conv64_down = extractResidualLayerParams(36864, 64, 3, true)
const conv64_1 = extractResidualLayerParams(36864, 64, 3)
const conv64_2 = extractResidualLayerParams(36864, 64, 3)
const conv64_3 = extractResidualLayerParams(36864, 64, 3)
const conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true)
const conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1')
const conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2')
const conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3')
const conv128_down = extractResidualLayerParams(147456, 128, 3, true)
const conv128_1 = extractResidualLayerParams(147456, 128, 3)
const conv128_2 = extractResidualLayerParams(147456, 128, 3)
const conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true)
const conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1')
const conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2')
const conv256_down = extractResidualLayerParams(589824, 256, 3, true)
const conv256_1 = extractResidualLayerParams(589824, 256, 3)
const conv256_2 = extractResidualLayerParams(589824, 256, 3)
const conv256_down_out = extractResidualLayerParams(589824, 256, 3)
const conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true)
const conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1')
const conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2')
const conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out')
const fc = tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0])
const fc = tf.tidy(
() => tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0])
)
paramMappings.push({ paramPath: `fc` })
if (getRemainingWeights().length !== 0) {
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)
}
return {
const params = {
conv32_down,
conv32_1,
conv32_2,
......@@ -124,4 +151,6 @@ export function extractParams(weights: Float32Array): NetParams {
conv256_down_out,
fc
}
return { params, paramMappings }
}
\ No newline at end of file
import { isTensor1D, isTensor2D, isTensor4D } from '../commons/isTensor';
import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors } from '../commons/disposeUnusedWeightTensors';
import { extractWeightEntryFactory } from '../commons/extractWeightEntryFactory';
import { isTensor2D } from '../commons/isTensor';
import { loadWeightMap } from '../commons/loadWeightMap';
import { ConvLayerParams, ResidualLayerParams, ScaleLayerParams } from './types';
import { ParamMapping } from '../commons/types';
import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';
const DEFAULT_MODEL_NAME = 'face_recognition_model'
function extractorsFactory(weightMap: any) {
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
function extractScaleLayerParams(prefix: string): ScaleLayerParams {
const params = {
weights: weightMap[`${prefix}/scale/weights`],
biases: weightMap[`${prefix}/scale/biases`]
}
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
if (!isTensor1D(params.weights)) {
throw new Error(`expected weightMap[${prefix}/scale/weights] to be a Tensor1D, instead have ${params.weights}`)
}
function extractScaleLayerParams(prefix: string): ScaleLayerParams {
if (!isTensor1D(params.biases)) {
throw new Error(`expected weightMap[${prefix}/scale/biases] to be a Tensor1D, instead have ${params.biases}`)
}
const weights = extractWeightEntry<tf.Tensor1D>(`${prefix}/scale/weights`, 1)
const biases = extractWeightEntry<tf.Tensor1D>(`${prefix}/scale/biases`, 1)
return params
return { weights, biases }
}
function extractConvLayerParams(prefix: string): ConvLayerParams {
const params = {
filters: weightMap[`${prefix}/conv/filters`],
bias: weightMap[`${prefix}/conv/bias`]
}
if (!isTensor4D(params.filters)) {
throw new Error(`expected weightMap[${prefix}/conv/filters] to be a Tensor1D, instead have ${params.filters}`)
}
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/conv/filters`, 4)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/conv/bias`, 1)
const scale = extractScaleLayerParams(prefix)
if (!isTensor1D(params.bias)) {
throw new Error(`expected weightMap[${prefix}/conv/bias] to be a Tensor1D, instead have ${params.bias}`)
}
return {
conv: params,
scale: extractScaleLayerParams(prefix)
}
return { conv: { filters, bias }, scale }
}
function extractResidualLayerParams(prefix: string): ResidualLayerParams {
......@@ -57,13 +44,17 @@ function extractorsFactory(weightMap: any) {
}
export async function loadQuantizedParams(uri: string | undefined): Promise<any> {
export async function loadQuantizedParams(
uri: string | undefined
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = []
const {
extractConvLayerParams,
extractResidualLayerParams
} = extractorsFactory(weightMap)
} = extractorsFactory(weightMap, paramMappings)
const conv32_down = extractConvLayerParams('conv32_down')
const conv32_1 = extractResidualLayerParams('conv32_1')
......@@ -85,12 +76,13 @@ export async function loadQuantizedParams(uri: string | undefined): Promise<any>
const conv256_down_out = extractResidualLayerParams('conv256_down_out')
const fc = weightMap['fc']
paramMappings.push({ originalPath: 'fc', paramPath: 'fc' })
if (!isTensor2D(fc)) {
throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`)
}
return {
const params = {
conv32_down,
conv32_1,
conv32_2,
......@@ -108,4 +100,8 @@ export async function loadQuantizedParams(uri: string | undefined): Promise<any>
conv256_down_out,
fc
}
disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings }
}
\ No newline at end of file
import { NeuralNetwork } from '../../../src/commons/NeuralNetwork';
import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../../../src/commons/NeuralNetwork';
class FakeNeuralNetwork extends NeuralNetwork<any> {
constructor(
convFilter: tf.Tensor = tf.tensor(0),
convBias: tf.Tensor = tf.tensor(0),
fcWeights: tf.Tensor = tf.tensor(0)
) {
super()
super('FakeNeuralNetwork')
this._params = {
conv: {
filter: convFilter,
......
import * as faceapi from '../../../src';
import { FaceDetection } from '../../../src/faceDetectionNet/FaceDetection';
import { IRect } from '../../../src/Rect';
import { expectMaxDelta } from '../../utils';
import { describeWithNets, expectAllTensorsReleased, expectMaxDelta } from '../../utils';
function expectRectClose(
result: IRect,
......@@ -33,19 +33,11 @@ describe('faceDetectionNet', () => {
imgEl = await faceapi.bufferToImage(img)
})
describe('uncompressed weights', () => {
let faceDetectionNet: faceapi.FaceDetectionNet
describeWithNets('uncompressed weights', { withFaceDetectionNet: { quantized: false } }, ({ faceDetectionNet }) => {
const expectedScores = [0.98, 0.89, 0.82, 0.75, 0.58, 0.55]
const maxBoxDelta = 1
beforeAll(async () => {
const res = await fetch('base/weights/uncompressed/face_detection_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
faceDetectionNet = faceapi.faceDetectionNet(weights)
})
it('scores > 0.8', async () => {
const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[]
......@@ -72,18 +64,11 @@ describe('faceDetectionNet', () => {
})
describe('quantized weights', () => {
let faceDetectionNet: faceapi.FaceDetectionNet
describeWithNets('quantized weights', { withFaceDetectionNet: { quantized: true } }, ({ faceDetectionNet }) => {
const expectedScores = [0.97, 0.88, 0.83, 0.82, 0.59, 0.52]
const maxBoxDelta = 5
beforeAll(async () => {
faceDetectionNet = new faceapi.FaceDetectionNet()
await faceDetectionNet.load('base/weights')
})
it('scores > 0.8', async () => {
const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[]
......@@ -110,4 +95,33 @@ describe('faceDetectionNet', () => {
})
describe('no memory leaks', () => {
describe('NeuralNetwork, uncompressed model', () => {
it('disposes all param tensors', async () => {
await expectAllTensorsReleased(async () => {
const res = await fetch('base/weights/uncompressed/face_detection_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
const net = faceapi.faceDetectionNet(weights)
net.dispose()
})
})
})
describe('NeuralNetwork, quantized model', () => {
it('disposes all param tensors', async () => {
await expectAllTensorsReleased(async () => {
const net = new faceapi.FaceDetectionNet()
await net.load('base/weights')
net.dispose()
})
})
})
})
})
\ No newline at end of file
......@@ -5,7 +5,7 @@ import { isTensor3D } from '../../../src/commons/isTensor';
import { FaceLandmarks } from '../../../src/faceLandmarkNet/FaceLandmarks';
import { Point } from '../../../src/Point';
import { Dimensions, TMediaElement } from '../../../src/types';
import { expectMaxDelta, expectAllTensorsReleased, tensor3D } from '../../utils';
import { expectMaxDelta, expectAllTensorsReleased, tensor3D, describeWithNets } from '../../utils';
import { NetInput } from '../../../src/NetInput';
import { toNetInput } from '../../../src';
......@@ -38,15 +38,7 @@ describe('faceLandmarkNet', () => {
faceLandmarkPositionsRect = await (await fetch('base/test/data/faceLandmarkPositionsRect.json')).json()
})
describe('uncompressed weights', () => {
let faceLandmarkNet: faceapi.FaceLandmarkNet
beforeAll(async () => {
const res = await fetch('base/weights/uncompressed/face_landmark_68_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
faceLandmarkNet = faceapi.faceLandmarkNet(weights)
})
describeWithNets('uncompressed weights', { withFaceLandmarkNet: { quantized: false } }, ({ faceLandmarkNet }) => {
it('computes face landmarks for squared input', async () => {
const { width, height } = imgEl1
......@@ -78,14 +70,7 @@ describe('faceLandmarkNet', () => {
})
describe('quantized weights', () => {
let faceLandmarkNet: faceapi.FaceLandmarkNet
beforeAll(async () => {
faceLandmarkNet = new faceapi.FaceLandmarkNet()
await faceLandmarkNet.load('base/weights')
})
describeWithNets('quantized weights', { withFaceLandmarkNet: { quantized: true } }, ({ faceLandmarkNet }) => {
it('computes face landmarks for squared input', async () => {
const { width, height } = imgEl1
......@@ -117,15 +102,7 @@ describe('faceLandmarkNet', () => {
})
describe('batch inputs', () => {
let faceLandmarkNet: faceapi.FaceLandmarkNet
beforeAll(async () => {
const res = await fetch('base/weights/uncompressed/face_landmark_68_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
faceLandmarkNet = faceapi.faceLandmarkNet(weights)
})
describeWithNets('batch inputs', { withFaceLandmarkNet: { quantized: false } }, ({ faceLandmarkNet }) => {
it('computes face landmarks for batch of image elements', async () => {
const inputs = [imgEl1, imgEl2, imgElRect]
......@@ -229,13 +206,31 @@ describe('faceLandmarkNet', () => {
})
describe('no memory leaks', () => {
describeWithNets('no memory leaks', { withFaceLandmarkNet: { quantized: true } }, ({ faceLandmarkNet }) => {
let faceLandmarkNet: faceapi.FaceLandmarkNet
describe('NeuralNetwork, uncompressed model', () => {
it('disposes all param tensors', async () => {
await expectAllTensorsReleased(async () => {
const res = await fetch('base/weights/uncompressed/face_landmark_68_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
const net = faceapi.faceLandmarkNet(weights)
net.dispose()
})
})
})
describe('NeuralNetwork, quantized model', () => {
it('disposes all param tensors', async () => {
await expectAllTensorsReleased(async () => {
const net = new faceapi.FaceLandmarkNet()
await net.load('base/weights')
net.dispose()
})
})
beforeAll(async () => {
faceLandmarkNet = new faceapi.FaceLandmarkNet()
await faceLandmarkNet.load('base/weights')
})
describe('forwardInput', () => {
......
......@@ -2,7 +2,7 @@ import * as tf from '@tensorflow/tfjs-core';
import * as faceapi from '../../../src';
import { NetInput } from '../../../src/NetInput';
import { expectAllTensorsReleased } from '../../utils';
import { expectAllTensorsReleased, describeWithNets } from '../../utils';
import { toNetInput } from '../../../src';
describe('faceRecognitionNet', () => {
......@@ -26,15 +26,7 @@ describe('faceRecognitionNet', () => {
faceDescriptorRect = await (await fetch('base/test/data/faceDescriptorRect.json')).json()
})
describe('uncompressed weights', () => {
let faceRecognitionNet: faceapi.FaceRecognitionNet
beforeAll(async () => {
const res = await fetch('base/weights/uncompressed/face_recognition_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
faceRecognitionNet = faceapi.faceRecognitionNet(weights)
})
describeWithNets('uncompressed weights', { withFaceRecognitionNet: { quantized: false } }, ({ faceRecognitionNet }) => {
it('computes face descriptor for squared input', async () => {
const result = await faceRecognitionNet.computeFaceDescriptor(imgEl1) as Float32Array
......@@ -52,14 +44,7 @@ describe('faceRecognitionNet', () => {
// TODO: figure out why descriptors return NaN in the test cases
/*
describe('quantized weights', () => {
let faceRecognitionNet: faceapi.FaceRecognitionNet
beforeAll(async () => {
faceRecognitionNet = new faceapi.FaceRecognitionNet()
await faceRecognitionNet.load('base/weights')
})
describeWithNets('quantized weights', { withFaceRecognitionNet: { quantized: true } }, ({ faceRecognitionNet }) => {
it('computes face descriptor for squared input', async () => {
const result = await faceRecognitionNet.computeFaceDescriptor(imgEl1) as Float32Array
......@@ -76,15 +61,7 @@ describe('faceRecognitionNet', () => {
})
*/
describe('batch inputs', () => {
let faceRecognitionNet: faceapi.FaceRecognitionNet
beforeAll(async () => {
const res = await fetch('base/weights/uncompressed/face_recognition_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
faceRecognitionNet = faceapi.faceRecognitionNet(weights)
})
describeWithNets('batch inputs', { withFaceRecognitionNet: { quantized: false } }, ({ faceRecognitionNet }) => {
it('computes face descriptors for batch of image elements', async () => {
const inputs = [imgEl1, imgEl2, imgElRect]
......@@ -156,14 +133,31 @@ describe('faceRecognitionNet', () => {
})
describe('no memory leaks', () => {
describeWithNets('no memory leaks', { withFaceRecognitionNet: { quantized: false } }, ({ faceRecognitionNet }) => {
let faceRecognitionNet: faceapi.FaceRecognitionNet
describe('NeuralNetwork, uncompressed model', () => {
beforeAll(async () => {
it('disposes all param tensors', async () => {
await expectAllTensorsReleased(async () => {
const res = await fetch('base/weights/uncompressed/face_recognition_model.weights')
const weights = new Float32Array(await res.arrayBuffer())
faceRecognitionNet = faceapi.faceRecognitionNet(weights)
const net = faceapi.faceRecognitionNet(weights)
net.dispose()
})
})
})
describe('NeuralNetwork, quantized model', () => {
it('disposes all param tensors', async () => {
await expectAllTensorsReleased(async () => {
const net = new faceapi.FaceRecognitionNet()
await net.load('base/weights')
net.dispose()
})
})
})
describe('forwardInput', () => {
......@@ -292,5 +286,4 @@ describe('faceRecognitionNet', () => {
})
})
})
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import * as faceapi from '../src/';
import { NeuralNetwork } from '../src/commons/NeuralNetwork';
export function zeros(length: number): Float32Array {
return new Float32Array(length)
}
......@@ -21,3 +24,84 @@ export async function expectAllTensorsReleased(fn: () => any) {
export function tensor3D() {
return tf.tensor3d([[[0]]])
}
export type WithNetOptions = {
quantized?: boolean
}
export type InjectNetArgs = {
faceDetectionNet: faceapi.FaceDetectionNet
faceLandmarkNet: faceapi.FaceLandmarkNet
faceRecognitionNet: faceapi.FaceRecognitionNet
}
export type DescribeWithNetsOptions = {
withFaceDetectionNet?: WithNetOptions
withFaceLandmarkNet?: WithNetOptions
withFaceRecognitionNet?: WithNetOptions
}
async function loadNetWeights(uri: string): Promise<Float32Array> {
return new Float32Array(await (await fetch(uri)).arrayBuffer())
}
async function initNet<TNet extends NeuralNetwork<any>>(
net: TNet,
uncompressedFilename: string | boolean
) {
await net.load(
uncompressedFilename
? await loadNetWeights(`base/weights/uncompressed/${uncompressedFilename}`)
: 'base/weights'
)
}
export function describeWithNets(
description: string,
options: DescribeWithNetsOptions,
specDefinitions: (nets: InjectNetArgs) => void
) {
describe(description, () => {
let faceDetectionNet: faceapi.FaceDetectionNet = new faceapi.FaceDetectionNet()
let faceLandmarkNet: faceapi.FaceLandmarkNet = new faceapi.FaceLandmarkNet()
let faceRecognitionNet: faceapi.FaceRecognitionNet = new faceapi.FaceRecognitionNet()
beforeAll(async () => {
const {
withFaceDetectionNet,
withFaceLandmarkNet,
withFaceRecognitionNet
} = options
if (withFaceDetectionNet) {
await initNet<faceapi.FaceDetectionNet>(
faceDetectionNet,
!withFaceDetectionNet.quantized && 'face_detection_model.weights'
)
}
if (withFaceLandmarkNet) {
await initNet<faceapi.FaceLandmarkNet>(
faceLandmarkNet,
!withFaceLandmarkNet.quantized && 'face_landmark_68_model.weights'
)
}
if (withFaceRecognitionNet) {
await initNet<faceapi.FaceRecognitionNet>(
faceRecognitionNet,
!withFaceRecognitionNet.quantized && 'face_recognition_model.weights'
)
}
})
afterAll(() => {
faceDetectionNet && faceDetectionNet.dispose()
faceLandmarkNet && faceLandmarkNet.dispose()
faceRecognitionNet && faceRecognitionNet.dispose()
})
specDefinitions({ faceDetectionNet, faceLandmarkNet, faceRecognitionNet })
})
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment