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 { ...@@ -11,5 +11,6 @@ export declare class Rect implements IRect {
height: number; height: number;
constructor(x: number, y: number, width: number, height: number); constructor(x: number, y: number, width: number, height: number);
toSquare(): Rect; toSquare(): Rect;
pad(padX: number, padY: number): Rect;
floor(): Rect; floor(): Rect;
} }
...@@ -20,6 +20,10 @@ var Rect = /** @class */ (function () { ...@@ -20,6 +20,10 @@ var Rect = /** @class */ (function () {
} }
return new Rect(x, y, width, height); 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 () { Rect.prototype.floor = function () {
return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height)); 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"} {"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 \ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ParamMapping } from './types'; import { ParamMapping } from './types';
export declare class NeuralNetwork<TNetParams> { export declare class NeuralNetwork<TNetParams> {
private _name;
protected _params: TNetParams | undefined; protected _params: TNetParams | undefined;
protected _paramMappings: ParamMapping[]; protected _paramMappings: ParamMapping[];
constructor(_name: string);
readonly params: TNetParams | undefined; readonly params: TNetParams | undefined;
readonly paramMappings: ParamMapping[]; readonly paramMappings: ParamMapping[];
getParamFromPath(paramPath: string): tf.Tensor; getParamFromPath(paramPath: string): tf.Tensor;
...@@ -21,6 +23,16 @@ export declare class NeuralNetwork<TNetParams> { ...@@ -21,6 +23,16 @@ export declare class NeuralNetwork<TNetParams> {
}[]; }[];
variable(): void; variable(): void;
freeze(): void; freeze(): void;
dispose(): void; dispose(throwOnRedispose?: boolean): void;
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>;
extractWeights(weights: Float32Array): void;
private traversePropertyPath(paramPath); private traversePropertyPath(paramPath);
protected loadQuantizedParams(_: any): Promise<{
params: TNetParams;
paramMappings: ParamMapping[];
}>;
protected extractParams(_: any): {
params: TNetParams;
paramMappings: ParamMapping[];
};
} }
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core"); var tf = require("@tensorflow/tfjs-core");
var NeuralNetwork = /** @class */ (function () { var NeuralNetwork = /** @class */ (function () {
function NeuralNetwork() { function NeuralNetwork(_name) {
this._name = _name;
this._params = undefined; this._params = undefined;
this._paramMappings = []; this._paramMappings = [];
} }
...@@ -59,10 +61,44 @@ var NeuralNetwork = /** @class */ (function () { ...@@ -59,10 +61,44 @@ var NeuralNetwork = /** @class */ (function () {
_this.reassignParamFromPath(path, tf.tensor(tensor)); _this.reassignParamFromPath(path, tf.tensor(tensor));
}); });
}; };
NeuralNetwork.prototype.dispose = function () { NeuralNetwork.prototype.dispose = function (throwOnRedispose) {
this.getParamList().forEach(function (param) { return param.tensor.dispose(); }); 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; 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) { NeuralNetwork.prototype.traversePropertyPath = function (paramPath) {
if (!this.params) { if (!this.params) {
throw new Error("traversePropertyPath - model has no loaded params"); throw new Error("traversePropertyPath - model has no loaded params");
...@@ -79,6 +115,12 @@ var NeuralNetwork = /** @class */ (function () { ...@@ -79,6 +115,12 @@ var NeuralNetwork = /** @class */ (function () {
} }
return { obj: obj, objProp: objProp }; 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; return NeuralNetwork;
}()); }());
exports.NeuralNetwork = NeuralNetwork; exports.NeuralNetwork = NeuralNetwork;
......
{"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../../src/commons/NeuralNetwork.ts"],"names":[],"mappings":"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"} {"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../../src/commons/NeuralNetwork.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ 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 * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput'; import { NetInput } from '../NetInput';
import { TNetInput } from '../types'; import { TNetInput } from '../types';
import { FaceDetection } from './FaceDetection'; import { FaceDetection } from './FaceDetection';
export declare class FaceDetectionNet { import { NetParams } from './types';
private _params; export declare class FaceDetectionNet extends NeuralNetwork<NetParams> {
load(weightsOrUrl?: Float32Array | string): Promise<void>; constructor();
extractWeights(weights: Float32Array): void;
forwardInput(input: NetInput): { forwardInput(input: NetInput): {
boxes: tf.Tensor<tf.Rank.R2>[]; boxes: tf.Tensor<tf.Rank.R2>[];
scores: tf.Tensor<tf.Rank.R1>[]; scores: tf.Tensor<tf.Rank.R1>[];
...@@ -15,4 +15,18 @@ export declare class FaceDetectionNet { ...@@ -15,4 +15,18 @@ export declare class FaceDetectionNet {
scores: tf.Tensor<tf.Rank.R1>[]; scores: tf.Tensor<tf.Rank.R1>[];
}>; }>;
locateFaces(input: TNetInput, minConfidence?: number, maxResults?: number): Promise<FaceDetection[]>; 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 @@ ...@@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib"); var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core"); var tf = require("@tensorflow/tfjs-core");
var NeuralNetwork_1 = require("../commons/NeuralNetwork");
var Rect_1 = require("../Rect"); var Rect_1 = require("../Rect");
var toNetInput_1 = require("../toNetInput"); var toNetInput_1 = require("../toNetInput");
var extractParams_1 = require("./extractParams"); var extractParams_1 = require("./extractParams");
...@@ -11,45 +12,22 @@ var mobileNetV1_1 = require("./mobileNetV1"); ...@@ -11,45 +12,22 @@ var mobileNetV1_1 = require("./mobileNetV1");
var nonMaxSuppression_1 = require("./nonMaxSuppression"); var nonMaxSuppression_1 = require("./nonMaxSuppression");
var outputLayer_1 = require("./outputLayer"); var outputLayer_1 = require("./outputLayer");
var predictionLayer_1 = require("./predictionLayer"); var predictionLayer_1 = require("./predictionLayer");
var FaceDetectionNet = /** @class */ (function () { var FaceDetectionNet = /** @class */ (function (_super) {
tslib_1.__extends(FaceDetectionNet, _super);
function FaceDetectionNet() { 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) { FaceDetectionNet.prototype.forwardInput = function (input) {
var _this = this; var params = this.params;
if (!this._params) { if (!params) {
throw new Error('FaceDetectionNet - load model before inference'); throw new Error('FaceDetectionNet - load model before inference');
} }
return tf.tidy(function () { return tf.tidy(function () {
var batchTensor = input.toBatchTensor(512, false); var batchTensor = input.toBatchTensor(512, false);
var x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1)); 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 features = mobileNetV1_1.mobileNetV1(x, params.mobilenetv1);
var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, params.prediction_layer), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer_1.outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params); return outputLayer_1.outputLayer(boxPredictions, classPredictions, params.output_layer);
}); });
}; };
FaceDetectionNet.prototype.forward = function (input) { FaceDetectionNet.prototype.forward = function (input) {
...@@ -112,7 +90,13 @@ var FaceDetectionNet = /** @class */ (function () { ...@@ -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; return FaceDetectionNet;
}()); }(NeuralNetwork_1.NeuralNetwork));
exports.FaceDetectionNet = FaceDetectionNet; exports.FaceDetectionNet = FaceDetectionNet;
//# sourceMappingURL=FaceDetectionNet.js.map //# 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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"} {"version":3,"file":"FaceDetectionNet.js","sourceRoot":"","sources":["../../src/faceDetectionNet/FaceDetectionNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
...@@ -5,8 +5,8 @@ var convLayer_1 = require("../commons/convLayer"); ...@@ -5,8 +5,8 @@ var convLayer_1 = require("../commons/convLayer");
function boxPredictionLayer(x, params) { function boxPredictionLayer(x, params) {
return tf.tidy(function () { return tf.tidy(function () {
var batchSize = x.shape[0]; var batchSize = x.shape[0];
var boxPredictionEncoding = tf.reshape(convLayer_1.convLayer(x, params.box_encoding_predictor_params), [batchSize, -1, 1, 4]); 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_params), [batchSize, -1, 3]); var classPrediction = tf.reshape(convLayer_1.convLayer(x, params.class_predictor), [batchSize, -1, 3]);
return { return {
boxPredictionEncoding: boxPredictionEncoding, boxPredictionEncoding: boxPredictionEncoding,
classPrediction: classPrediction 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"} {"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 \ No newline at end of file
import { ParamMapping } from '../commons/types';
import { NetParams } from './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 @@ ...@@ -2,13 +2,14 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core"); var tf = require("@tensorflow/tfjs-core");
var extractWeightsFactory_1 = require("../commons/extractWeightsFactory"); var extractWeightsFactory_1 = require("../commons/extractWeightsFactory");
function extractorsFactory(extractWeights) { function extractorsFactory(extractWeights, paramMappings) {
function extractDepthwiseConvParams(numChannels) { function extractDepthwiseConvParams(numChannels, mappedPrefix) {
var filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]); var filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);
var batch_norm_scale = tf.tensor1d(extractWeights(numChannels)); var batch_norm_scale = tf.tensor1d(extractWeights(numChannels));
var batch_norm_offset = tf.tensor1d(extractWeights(numChannels)); var batch_norm_offset = tf.tensor1d(extractWeights(numChannels));
var batch_norm_mean = tf.tensor1d(extractWeights(numChannels)); var batch_norm_mean = tf.tensor1d(extractWeights(numChannels));
var batch_norm_variance = 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 { return {
filters: filters, filters: filters,
batch_norm_scale: batch_norm_scale, batch_norm_scale: batch_norm_scale,
...@@ -17,115 +18,116 @@ function extractorsFactory(extractWeights) { ...@@ -17,115 +18,116 @@ function extractorsFactory(extractWeights) {
batch_norm_variance: batch_norm_variance 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 filters = tf.tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tf.tensor1d(extractWeights(channelsOut)); var bias = tf.tensor1d(extractWeights(channelsOut));
return { paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/" + (isPointwiseConv ? 'batch_norm_offset' : 'bias') });
filters: filters, return { filters: filters, bias: bias };
bias: bias
};
} }
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize) { function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
var _a = extractConvParams(channelsIn, channelsOut, filterSize), filters = _a.filters, bias = _a.bias; var _a = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true), filters = _a.filters, bias = _a.bias;
return { return {
filters: filters, filters: filters,
batch_norm_offset: bias batch_norm_offset: bias
}; };
} }
function extractConvPairParams(channelsIn, channelsOut) { function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) {
var depthwise_conv_params = extractDepthwiseConvParams(channelsIn); var depthwise_conv = extractDepthwiseConvParams(channelsIn, mappedPrefix + "/depthwise_conv");
var pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1); var pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, mappedPrefix + "/pointwise_conv");
return { return { depthwise_conv: depthwise_conv, pointwise_conv: pointwise_conv };
depthwise_conv_params: depthwise_conv_params,
pointwise_conv_params: pointwise_conv_params
};
} }
function extractMobilenetV1Params() { function extractMobilenetV1Params() {
var conv_0_params = extractPointwiseConvParams(3, 32, 3); var conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');
var channelNumPairs = [ var conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');
[32, 64], var conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');
[64, 128], var conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');
[128, 128], var conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');
[128, 256], var conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');
[256, 256], var conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');
[256, 512], var conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');
[512, 512], var conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');
[512, 512], var conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');
[512, 512], var conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');
[512, 512], var conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');
[512, 512], var conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');
[512, 1024], var conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');
[1024, 1024]
];
var conv_pair_params = channelNumPairs.map(function (_a) {
var channelsIn = _a[0], channelsOut = _a[1];
return extractConvPairParams(channelsIn, channelsOut);
});
return { return {
conv_0_params: conv_0_params, conv_0: conv_0,
conv_pair_params: conv_pair_params 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() { function extractPredictionLayerParams() {
var conv_0_params = extractPointwiseConvParams(1024, 256, 1); var conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');
var conv_1_params = extractPointwiseConvParams(256, 512, 3); var conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');
var conv_2_params = extractPointwiseConvParams(512, 128, 1); var conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');
var conv_3_params = extractPointwiseConvParams(128, 256, 3); var conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');
var conv_4_params = extractPointwiseConvParams(256, 128, 1); var conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');
var conv_5_params = extractPointwiseConvParams(128, 256, 3); var conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');
var conv_6_params = extractPointwiseConvParams(256, 64, 1); var conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');
var conv_7_params = extractPointwiseConvParams(64, 128, 3); var conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');
var box_encoding_0_predictor_params = extractConvParams(512, 12, 1); var box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');
var class_predictor_0_params = extractConvParams(512, 9, 1); var class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');
var box_encoding_1_predictor_params = extractConvParams(1024, 24, 1); var box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');
var class_predictor_1_params = extractConvParams(1024, 18, 1); var class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');
var box_encoding_2_predictor_params = extractConvParams(512, 24, 1); var box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');
var class_predictor_2_params = extractConvParams(512, 18, 1); var class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');
var box_encoding_3_predictor_params = extractConvParams(256, 24, 1); var box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');
var class_predictor_3_params = extractConvParams(256, 18, 1); var class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');
var box_encoding_4_predictor_params = extractConvParams(256, 24, 1); var box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');
var class_predictor_4_params = extractConvParams(256, 18, 1); var class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');
var box_encoding_5_predictor_params = extractConvParams(128, 24, 1); var box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');
var class_predictor_5_params = extractConvParams(128, 18, 1); var class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');
var box_predictor_0_params = { var box_predictor_0 = {
box_encoding_predictor_params: box_encoding_0_predictor_params, box_encoding_predictor: box_encoding_0_predictor,
class_predictor_params: class_predictor_0_params class_predictor: class_predictor_0
}; };
var box_predictor_1_params = { var box_predictor_1 = {
box_encoding_predictor_params: box_encoding_1_predictor_params, box_encoding_predictor: box_encoding_1_predictor,
class_predictor_params: class_predictor_1_params class_predictor: class_predictor_1
}; };
var box_predictor_2_params = { var box_predictor_2 = {
box_encoding_predictor_params: box_encoding_2_predictor_params, box_encoding_predictor: box_encoding_2_predictor,
class_predictor_params: class_predictor_2_params class_predictor: class_predictor_2
}; };
var box_predictor_3_params = { var box_predictor_3 = {
box_encoding_predictor_params: box_encoding_3_predictor_params, box_encoding_predictor: box_encoding_3_predictor,
class_predictor_params: class_predictor_3_params class_predictor: class_predictor_3
}; };
var box_predictor_4_params = { var box_predictor_4 = {
box_encoding_predictor_params: box_encoding_4_predictor_params, box_encoding_predictor: box_encoding_4_predictor,
class_predictor_params: class_predictor_4_params class_predictor: class_predictor_4
}; };
var box_predictor_5_params = { var box_predictor_5 = {
box_encoding_predictor_params: box_encoding_5_predictor_params, box_encoding_predictor: box_encoding_5_predictor,
class_predictor_params: class_predictor_5_params class_predictor: class_predictor_5
}; };
return { return {
conv_0_params: conv_0_params, conv_0: conv_0,
conv_1_params: conv_1_params, conv_1: conv_1,
conv_2_params: conv_2_params, conv_2: conv_2,
conv_3_params: conv_3_params, conv_3: conv_3,
conv_4_params: conv_4_params, conv_4: conv_4,
conv_5_params: conv_5_params, conv_5: conv_5,
conv_6_params: conv_6_params, conv_6: conv_6,
conv_7_params: conv_7_params, conv_7: conv_7,
box_predictor_0_params: box_predictor_0_params, box_predictor_0: box_predictor_0,
box_predictor_1_params: box_predictor_1_params, box_predictor_1: box_predictor_1,
box_predictor_2_params: box_predictor_2_params, box_predictor_2: box_predictor_2,
box_predictor_3_params: box_predictor_3_params, box_predictor_3: box_predictor_3,
box_predictor_4_params: box_predictor_4_params, box_predictor_4: box_predictor_4,
box_predictor_5_params: box_predictor_5_params box_predictor_5: box_predictor_5
}; };
} }
return { return {
...@@ -134,21 +136,26 @@ function extractorsFactory(extractWeights) { ...@@ -134,21 +136,26 @@ function extractorsFactory(extractWeights) {
}; };
} }
function extractParams(weights) { function extractParams(weights) {
var paramMappings = [];
var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory(extractWeights), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams; var _b = extractorsFactory(extractWeights, paramMappings), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams;
var mobilenetv1_params = extractMobilenetV1Params(); var mobilenetv1 = extractMobilenetV1Params();
var prediction_layer_params = extractPredictionLayerParams(); var prediction_layer = extractPredictionLayerParams();
var extra_dim = tf.tensor3d(extractWeights(5118 * 4), [1, 5118, 4]); var extra_dim = tf.tensor3d(extractWeights(5118 * 4), [1, 5118, 4]);
var output_layer_params = { var output_layer = {
extra_dim: extra_dim extra_dim: extra_dim
}; };
paramMappings.push({ paramPath: 'output_layer/extra_dim' });
if (getRemainingWeights().length !== 0) { if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length); throw new Error("weights remaing after extract: " + getRemainingWeights().length);
} }
return { return {
mobilenetv1_params: mobilenetv1_params, params: {
prediction_layer_params: prediction_layer_params, mobilenetv1: mobilenetv1,
output_layer_params: output_layer_params prediction_layer: prediction_layer,
output_layer: output_layer
},
paramMappings: paramMappings
}; };
} }
exports.extractParams = extractParams; exports.extractParams = extractParams;
......
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/extractParams.ts"],"names":[],"mappings":"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"} {"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/extractParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ 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"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib"); var tslib_1 = require("tslib");
var disposeUnusedWeightTensors_1 = require("../commons/disposeUnusedWeightTensors");
var extractWeightEntryFactory_1 = require("../commons/extractWeightEntryFactory");
var isTensor_1 = require("../commons/isTensor"); var isTensor_1 = require("../commons/isTensor");
var loadWeightMap_1 = require("../commons/loadWeightMap"); var loadWeightMap_1 = require("../commons/loadWeightMap");
var DEFAULT_MODEL_NAME = 'face_detection_model'; var DEFAULT_MODEL_NAME = 'face_detection_model';
function extractorsFactory(weightMap) { function extractorsFactory(weightMap, paramMappings) {
function extractPointwiseConvParams(prefix, idx) { var extractWeightEntry = extractWeightEntryFactory_1.extractWeightEntryFactory(weightMap, paramMappings);
var pointwise_conv_params = { function extractPointwiseConvParams(prefix, idx, mappedPrefix) {
filters: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/weights"], var filters = extractWeightEntry(prefix + "/Conv2d_" + idx + "_pointwise/weights", 4, mappedPrefix + "/filters");
batch_norm_offset: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset"] 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 };
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 extractConvPairParams(idx) { function extractConvPairParams(idx) {
var depthwise_conv_params = { var mappedPrefix = "mobilenetv1/conv_" + idx;
filters: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights"], var prefixDepthwiseConv = "MobilenetV1/Conv2d_" + idx + "_depthwise";
batch_norm_scale: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma"], var mappedPrefixDepthwiseConv = mappedPrefix + "/depthwise_conv";
batch_norm_offset: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta"], var mappedPrefixPointwiseConv = mappedPrefix + "/pointwise_conv";
batch_norm_mean: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean"], var filters = extractWeightEntry(prefixDepthwiseConv + "/depthwise_weights", 4, mappedPrefixDepthwiseConv + "/filters");
batch_norm_variance: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance"], 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");
if (!isTensor_1.isTensor4D(depthwise_conv_params.filters)) { var batch_norm_mean = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_mean", 1, mappedPrefixDepthwiseConv + "/batch_norm_mean");
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights] to be a Tensor4D, instead have " + depthwise_conv_params.filters); var batch_norm_variance = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_variance", 1, mappedPrefixDepthwiseConv + "/batch_norm_variance");
}
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);
}
return { return {
depthwise_conv_params: depthwise_conv_params, depthwise_conv: {
pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx) 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() { function extractMobilenetV1Params() {
return { return {
conv_0_params: extractPointwiseConvParams('MobilenetV1', 0), conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
conv_pair_params: Array(13).fill(0).map(function (_, i) { return extractConvPairParams(i + 1); }) 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) { function extractConvParams(prefix, mappedPrefix) {
var params = { var filters = extractWeightEntry(prefix + "/weights", 4, mappedPrefix + "/filters");
box_encoding_predictor_params: { var bias = extractWeightEntry(prefix + "/biases", 1, mappedPrefix + "/bias");
filters: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights"], return { filters: filters, bias: bias };
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);
} }
if (!isTensor_1.isTensor4D(params.class_predictor_params.filters)) { function extractBoxPredictorParams(idx) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights] to be a Tensor4D, instead have " + params.class_predictor_params.filters); 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");
if (!isTensor_1.isTensor1D(params.class_predictor_params.bias)) { return { box_encoding_predictor: box_encoding_predictor, class_predictor: class_predictor };
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases] to be a Tensor1D, instead have " + params.class_predictor_params.bias);
}
return params;
} }
function extractPredictionLayerParams() { function extractPredictionLayerParams() {
return { return {
conv_0_params: extractPointwiseConvParams('Prediction', 0), conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
conv_1_params: extractPointwiseConvParams('Prediction', 1), conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
conv_2_params: extractPointwiseConvParams('Prediction', 2), conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
conv_3_params: extractPointwiseConvParams('Prediction', 3), conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
conv_4_params: extractPointwiseConvParams('Prediction', 4), conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
conv_5_params: extractPointwiseConvParams('Prediction', 5), conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
conv_6_params: extractPointwiseConvParams('Prediction', 6), conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
conv_7_params: extractPointwiseConvParams('Prediction', 7), conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
box_predictor_0_params: extractBoxPredictorParams(0), box_predictor_0: extractBoxPredictorParams(0),
box_predictor_1_params: extractBoxPredictorParams(1), box_predictor_1: extractBoxPredictorParams(1),
box_predictor_2_params: extractBoxPredictorParams(2), box_predictor_2: extractBoxPredictorParams(2),
box_predictor_3_params: extractBoxPredictorParams(3), box_predictor_3: extractBoxPredictorParams(3),
box_predictor_4_params: extractBoxPredictorParams(4), box_predictor_4: extractBoxPredictorParams(4),
box_predictor_5_params: extractBoxPredictorParams(5) box_predictor_5: extractBoxPredictorParams(5)
}; };
} }
return { return {
...@@ -102,24 +87,28 @@ function extractorsFactory(weightMap) { ...@@ -102,24 +87,28 @@ function extractorsFactory(weightMap) {
} }
function loadQuantizedParams(uri) { function loadQuantizedParams(uri) {
return tslib_1.__awaiter(this, void 0, void 0, function () { 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) { return tslib_1.__generator(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap_1.loadWeightMap(uri, DEFAULT_MODEL_NAME)]; case 0: return [4 /*yield*/, loadWeightMap_1.loadWeightMap(uri, DEFAULT_MODEL_NAME)];
case 1: case 1:
weightMap = _b.sent(); 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']; extra_dim = weightMap['Output/extra_dim'];
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });
if (!isTensor_1.isTensor3D(extra_dim)) { if (!isTensor_1.isTensor3D(extra_dim)) {
throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim); throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim);
} }
return [2 /*return*/, { params = {
mobilenetv1_params: extractMobilenetV1Params(), mobilenetv1: extractMobilenetV1Params(),
prediction_layer_params: extractPredictionLayerParams(), prediction_layer: extractPredictionLayerParams(),
output_layer_params: { output_layer: {
extra_dim: extra_dim 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":";;;AAAA,gDAAyE;AACzE,0DAAyD;AAGzD,IAAM,kBAAkB,GAAG,sBAAsB,CAAA;AAEjD,2BAA2B,SAAc;IAEvC,oCAAoC,MAAc,EAAE,GAAW;QAE7D,IAAM,qBAAqB,GAAG;YAC5B,OAAO,EAAE,SAAS,CAAI,MAAM,gBAAW,GAAG,uBAAoB,CAAC;YAC/D,iBAAiB,EAAE,SAAS,CAAI,MAAM,gBAAW,GAAG,qCAAkC,CAAC;SACxF,CAAA;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,gBAAW,GAAG,2DAAsD,qBAAqB,CAAC,OAAS,CAAC,CAAA;SACjJ;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,gBAAW,GAAG,yEAAoE,qBAAqB,CAAC,iBAAmB,CAAC,CAAA;SACzK;QAED,OAAO,qBAAqB,CAAA;IAC9B,CAAC;IAED,+BAA+B,GAAW;QAExC,IAAM,qBAAqB,GAAG;YAC5B,OAAO,EAAE,SAAS,CAAC,wBAAsB,GAAG,iCAA8B,CAAC;YAC3E,gBAAgB,EAAE,SAAS,CAAC,wBAAsB,GAAG,+BAA4B,CAAC;YAClF,iBAAiB,EAAE,SAAS,CAAC,wBAAsB,GAAG,8BAA2B,CAAC;YAClF,eAAe,EAAE,SAAS,CAAC,wBAAsB,GAAG,qCAAkC,CAAC;YACvF,mBAAmB,EAAE,SAAS,CAAC,wBAAsB,GAAG,yCAAsC,CAAC;SAChG,CAAA;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,qEAAgE,qBAAqB,CAAC,OAAS,CAAC,CAAA;SAC7J;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,EAAE;YACvD,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,mEAA8D,qBAAqB,CAAC,gBAAkB,CAAC,CAAA;SACpK;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,kEAA6D,qBAAqB,CAAC,iBAAmB,CAAC,CAAA;SACpK;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,yEAAoE,qBAAqB,CAAC,eAAiB,CAAC,CAAA;SACzK;QAED,IAAI,CAAC,qBAAU,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,EAAE;YAC1D,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,6EAAwE,qBAAqB,CAAC,mBAAqB,CAAC,CAAA;SACjL;QAED,OAAO;YACL,qBAAqB,uBAAA;YACrB,qBAAqB,EAAE,0BAA0B,CAAC,aAAa,EAAE,GAAG,CAAC;SACtE,CAAA;IACH,CAAC;IAED;QACE,OAAO;YACL,aAAa,EAAE,0BAA0B,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,EAA5B,CAA4B,CAAC;SAChF,CAAA;IACH,CAAC;IAED,mCAAmC,GAAW;QAE5C,IAAM,MAAM,GAAG;YACb,6BAA6B,EAAE;gBAC7B,OAAO,EAAE,SAAS,CAAC,6BAA2B,GAAG,kCAA+B,CAAC;gBACjF,IAAI,EAAE,SAAS,CAAC,6BAA2B,GAAG,iCAA8B,CAAC;aAC9E;YACD,sBAAsB,EAAE;gBACtB,OAAO,EAAE,SAAS,CAAC,6BAA2B,GAAG,4BAAyB,CAAC;gBAC3E,IAAI,EAAE,SAAS,CAAC,6BAA2B,GAAG,2BAAwB,CAAC;aACxE;SACF,CAAA;QAED,IAAI,CAAC,qBAAU,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,sEAAiE,MAAM,CAAC,6BAA6B,CAAC,OAAS,CAAC,CAAA;SAClL;QAED,IAAI,CAAC,qBAAU,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,qEAAgE,MAAM,CAAC,6BAA6B,CAAC,IAAM,CAAC,CAAA;SAC9K;QAED,IAAI,CAAC,qBAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,gEAA2D,MAAM,CAAC,sBAAsB,CAAC,OAAS,CAAC,CAAA;SACrK;QAED,IAAI,CAAC,qBAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,+DAA0D,MAAM,CAAC,sBAAsB,CAAC,IAAM,CAAC,CAAA;SACjK;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;QACE,OAAO;YACL,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;SACrD,CAAA;IACH,CAAC;IAED,OAAO;QACL,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;KAC7B,CAAA;AACH,CAAC;AAED,6BAA0C,GAAuB;;;;;wBAC7C,qBAAM,6BAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAA;;oBAAxD,SAAS,GAAG,SAA4C;oBAExD,KAGF,iBAAiB,CAAC,SAAS,CAAC,EAF9B,wBAAwB,8BAAA,EACxB,4BAA4B,kCAAA,CACE;oBAE1B,SAAS,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAA;oBAC/C,IAAI,CAAC,qBAAU,CAAC,SAAS,CAAC,EAAE;wBAC1B,MAAM,IAAI,KAAK,CAAC,2EAAyE,SAAW,CAAC,CAAA;qBACtG;oBAED,sBAAO;4BACL,kBAAkB,EAAE,wBAAwB,EAAE;4BAC9C,uBAAuB,EAAE,4BAA4B,EAAE;4BACvD,mBAAmB,EAAE;gCACnB,SAAS,WAAA;6BACV;yBACF,EAAA;;;;CACF;AApBD,kDAoBC"} {"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/loadQuantizedParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
...@@ -16,12 +16,27 @@ function getStridesForLayerIdx(layerIdx) { ...@@ -16,12 +16,27 @@ function getStridesForLayerIdx(layerIdx) {
function mobileNetV1(x, params) { function mobileNetV1(x, params) {
return tf.tidy(function () { return tf.tidy(function () {
var conv11 = null; var conv11 = null;
var out = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0_params, [2, 2]); var out = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0, [2, 2]);
params.conv_pair_params.forEach(function (param, i) { 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 layerIdx = i + 1;
var depthwiseConvStrides = getStridesForLayerIdx(layerIdx); var depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides); out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
out = pointwiseConvLayer_1.pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]); out = pointwiseConvLayer_1.pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
if (layerIdx === 11) { if (layerIdx === 11) {
conv11 = out; 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"} {"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 \ No newline at end of file
...@@ -5,20 +5,20 @@ var boxPredictionLayer_1 = require("./boxPredictionLayer"); ...@@ -5,20 +5,20 @@ var boxPredictionLayer_1 = require("./boxPredictionLayer");
var pointwiseConvLayer_1 = require("./pointwiseConvLayer"); var pointwiseConvLayer_1 = require("./pointwiseConvLayer");
function predictionLayer(x, conv11, params) { function predictionLayer(x, conv11, params) {
return tf.tidy(function () { return tf.tidy(function () {
var conv0 = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0_params, [1, 1]); var conv0 = pointwiseConvLayer_1.pointwiseConvLayer(x, params.conv_0, [1, 1]);
var conv1 = pointwiseConvLayer_1.pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]); var conv1 = pointwiseConvLayer_1.pointwiseConvLayer(conv0, params.conv_1, [2, 2]);
var conv2 = pointwiseConvLayer_1.pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]); var conv2 = pointwiseConvLayer_1.pointwiseConvLayer(conv1, params.conv_2, [1, 1]);
var conv3 = pointwiseConvLayer_1.pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]); var conv3 = pointwiseConvLayer_1.pointwiseConvLayer(conv2, params.conv_3, [2, 2]);
var conv4 = pointwiseConvLayer_1.pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]); var conv4 = pointwiseConvLayer_1.pointwiseConvLayer(conv3, params.conv_4, [1, 1]);
var conv5 = pointwiseConvLayer_1.pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]); var conv5 = pointwiseConvLayer_1.pointwiseConvLayer(conv4, params.conv_5, [2, 2]);
var conv6 = pointwiseConvLayer_1.pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]); var conv6 = pointwiseConvLayer_1.pointwiseConvLayer(conv5, params.conv_6, [1, 1]);
var conv7 = pointwiseConvLayer_1.pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]); var conv7 = pointwiseConvLayer_1.pointwiseConvLayer(conv6, params.conv_7, [2, 2]);
var boxPrediction0 = boxPredictionLayer_1.boxPredictionLayer(conv11, params.box_predictor_0_params); var boxPrediction0 = boxPredictionLayer_1.boxPredictionLayer(conv11, params.box_predictor_0);
var boxPrediction1 = boxPredictionLayer_1.boxPredictionLayer(x, params.box_predictor_1_params); var boxPrediction1 = boxPredictionLayer_1.boxPredictionLayer(x, params.box_predictor_1);
var boxPrediction2 = boxPredictionLayer_1.boxPredictionLayer(conv1, params.box_predictor_2_params); var boxPrediction2 = boxPredictionLayer_1.boxPredictionLayer(conv1, params.box_predictor_2);
var boxPrediction3 = boxPredictionLayer_1.boxPredictionLayer(conv3, params.box_predictor_3_params); var boxPrediction3 = boxPredictionLayer_1.boxPredictionLayer(conv3, params.box_predictor_3);
var boxPrediction4 = boxPredictionLayer_1.boxPredictionLayer(conv5, params.box_predictor_4_params); var boxPrediction4 = boxPredictionLayer_1.boxPredictionLayer(conv5, params.box_predictor_4);
var boxPrediction5 = boxPredictionLayer_1.boxPredictionLayer(conv7, params.box_predictor_5_params); var boxPrediction5 = boxPredictionLayer_1.boxPredictionLayer(conv7, params.box_predictor_5);
var boxPredictions = tf.concat([ var boxPredictions = tf.concat([
boxPrediction0.boxPredictionEncoding, boxPrediction0.boxPredictionEncoding,
boxPrediction1.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"} {"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 \ No newline at end of file
...@@ -13,39 +13,51 @@ export declare namespace MobileNetV1 { ...@@ -13,39 +13,51 @@ export declare namespace MobileNetV1 {
batch_norm_variance: tf.Tensor1D; batch_norm_variance: tf.Tensor1D;
}; };
type ConvPairParams = { type ConvPairParams = {
depthwise_conv_params: DepthwiseConvParams; depthwise_conv: DepthwiseConvParams;
pointwise_conv_params: PointwiseConvParams; pointwise_conv: PointwiseConvParams;
}; };
type Params = { type Params = {
conv_0_params: PointwiseConvParams; conv_0: PointwiseConvParams;
conv_pair_params: ConvPairParams[]; 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 = { export declare type BoxPredictionParams = {
box_encoding_predictor_params: ConvParams; box_encoding_predictor: ConvParams;
class_predictor_params: ConvParams; class_predictor: ConvParams;
}; };
export declare type PredictionLayerParams = { export declare type PredictionLayerParams = {
conv_0_params: PointwiseConvParams; conv_0: PointwiseConvParams;
conv_1_params: PointwiseConvParams; conv_1: PointwiseConvParams;
conv_2_params: PointwiseConvParams; conv_2: PointwiseConvParams;
conv_3_params: PointwiseConvParams; conv_3: PointwiseConvParams;
conv_4_params: PointwiseConvParams; conv_4: PointwiseConvParams;
conv_5_params: PointwiseConvParams; conv_5: PointwiseConvParams;
conv_6_params: PointwiseConvParams; conv_6: PointwiseConvParams;
conv_7_params: PointwiseConvParams; conv_7: PointwiseConvParams;
box_predictor_0_params: BoxPredictionParams; box_predictor_0: BoxPredictionParams;
box_predictor_1_params: BoxPredictionParams; box_predictor_1: BoxPredictionParams;
box_predictor_2_params: BoxPredictionParams; box_predictor_2: BoxPredictionParams;
box_predictor_3_params: BoxPredictionParams; box_predictor_3: BoxPredictionParams;
box_predictor_4_params: BoxPredictionParams; box_predictor_4: BoxPredictionParams;
box_predictor_5_params: BoxPredictionParams; box_predictor_5: BoxPredictionParams;
}; };
export declare type OutputLayerParams = { export declare type OutputLayerParams = {
extra_dim: tf.Tensor3D; extra_dim: tf.Tensor3D;
}; };
export declare type NetParams = { export declare type NetParams = {
mobilenetv1_params: MobileNetV1.Params; mobilenetv1: MobileNetV1.Params;
prediction_layer_params: PredictionLayerParams; prediction_layer: PredictionLayerParams;
output_layer_params: OutputLayerParams; output_layer: OutputLayerParams;
}; };
...@@ -5,9 +5,22 @@ import { TNetInput } from '../types'; ...@@ -5,9 +5,22 @@ import { TNetInput } from '../types';
import { FaceLandmarks } from './FaceLandmarks'; import { FaceLandmarks } from './FaceLandmarks';
import { NetParams } from './types'; import { NetParams } from './types';
export declare class FaceLandmarkNet extends NeuralNetwork<NetParams> { export declare class FaceLandmarkNet extends NeuralNetwork<NetParams> {
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>; constructor();
extractWeights(weights: Float32Array): void;
forwardInput(input: NetInput): tf.Tensor2D; forwardInput(input: NetInput): tf.Tensor2D;
forward(input: TNetInput): Promise<tf.Tensor2D>; forward(input: TNetInput): Promise<tf.Tensor2D>;
detectLandmarks(input: TNetInput): Promise<FaceLandmarks | FaceLandmarks[]>; 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) { ...@@ -21,57 +21,29 @@ function maxPool(x, strides) {
var FaceLandmarkNet = /** @class */ (function (_super) { var FaceLandmarkNet = /** @class */ (function (_super) {
tslib_1.__extends(FaceLandmarkNet, _super); tslib_1.__extends(FaceLandmarkNet, _super);
function FaceLandmarkNet() { 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) { FaceLandmarkNet.prototype.forwardInput = function (input) {
var params = this._params; var params = this.params;
if (!params) { if (!params) {
throw new Error('FaceLandmarkNet - load model before inference'); throw new Error('FaceLandmarkNet - load model before inference');
} }
return tf.tidy(function () { return tf.tidy(function () {
var batchTensor = input.toBatchTensor(128, true); var batchTensor = input.toBatchTensor(128, true);
var out = conv(batchTensor, params.conv0_params); var out = conv(batchTensor, params.conv0);
out = maxPool(out); out = maxPool(out);
out = conv(out, params.conv1_params); out = conv(out, params.conv1);
out = conv(out, params.conv2_params); out = conv(out, params.conv2);
out = maxPool(out); out = maxPool(out);
out = conv(out, params.conv3_params); out = conv(out, params.conv3);
out = conv(out, params.conv4_params); out = conv(out, params.conv4);
out = maxPool(out); out = maxPool(out);
out = conv(out, params.conv5_params); out = conv(out, params.conv5);
out = conv(out, params.conv6_params); out = conv(out, params.conv6);
out = maxPool(out, [1, 1]); out = maxPool(out, [1, 1]);
out = conv(out, params.conv7_params); out = conv(out, params.conv7);
var fc0 = tf.relu(fullyConnectedLayer_1.fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)); var fc0 = tf.relu(fullyConnectedLayer_1.fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0));
var fc1 = fullyConnectedLayer_1.fullyConnectedLayer(fc0, params.fc1_params); var fc1 = fullyConnectedLayer_1.fullyConnectedLayer(fc0, params.fc1);
var createInterleavedTensor = function (fillX, fillY) { var createInterleavedTensor = function (fillX, fillY) {
return tf.stack([ return tf.stack([
tf.fill([68], fillX), tf.fill([68], fillX),
...@@ -146,6 +118,12 @@ var FaceLandmarkNet = /** @class */ (function (_super) { ...@@ -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; return FaceLandmarkNet;
}(NeuralNetwork_1.NeuralNetwork)); }(NeuralNetwork_1.NeuralNetwork));
exports.FaceLandmarkNet = FaceLandmarkNet; exports.FaceLandmarkNet = FaceLandmarkNet;
......
{"version":3,"file":"FaceLandmarkNet.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/FaceLandmarkNet.ts"],"names":[],"mappings":"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"} {"version":3,"file":"FaceLandmarkNet.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/FaceLandmarkNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core"); var tf = require("@tensorflow/tfjs-core");
var extractConvParamsFactory_1 = require("../commons/extractConvParamsFactory");
var extractWeightsFactory_1 = require("../commons/extractWeightsFactory"); var extractWeightsFactory_1 = require("../commons/extractWeightsFactory");
function extractParams(weights) { function extractParams(weights) {
var paramMappings = []; var paramMappings = [];
var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; 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) { function extractFcParams(channelsIn, channelsOut, mappedPrefix) {
var fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]); var fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);
var fc_bias = tf.tensor1d(extractWeights(channelsOut)); var fc_bias = tf.tensor1d(extractWeights(channelsOut));
...@@ -16,32 +20,32 @@ function extractParams(weights) { ...@@ -16,32 +20,32 @@ function extractParams(weights) {
bias: fc_bias bias: fc_bias
}; };
} }
var conv0_params = extractConvParams(3, 32, 3, 'conv0_params'); var conv0 = extractConvParams(3, 32, 3, 'conv0');
var conv1_params = extractConvParams(32, 64, 3, 'conv1_params'); var conv1 = extractConvParams(32, 64, 3, 'conv1');
var conv2_params = extractConvParams(64, 64, 3, 'conv2_params'); var conv2 = extractConvParams(64, 64, 3, 'conv2');
var conv3_params = extractConvParams(64, 64, 3, 'conv3_params'); var conv3 = extractConvParams(64, 64, 3, 'conv3');
var conv4_params = extractConvParams(64, 64, 3, 'conv4_params'); var conv4 = extractConvParams(64, 64, 3, 'conv4');
var conv5_params = extractConvParams(64, 128, 3, 'conv5_params'); var conv5 = extractConvParams(64, 128, 3, 'conv5');
var conv6_params = extractConvParams(128, 128, 3, 'conv6_params'); var conv6 = extractConvParams(128, 128, 3, 'conv6');
var conv7_params = extractConvParams(128, 256, 3, 'conv7_params'); var conv7 = extractConvParams(128, 256, 3, 'conv7');
var fc0_params = extractFcParams(6400, 1024, 'fc0_params'); var fc0 = extractFcParams(6400, 1024, 'fc0');
var fc1_params = extractFcParams(1024, 136, 'fc1_params'); var fc1 = extractFcParams(1024, 136, 'fc1');
if (getRemainingWeights().length !== 0) { if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length); throw new Error("weights remaing after extract: " + getRemainingWeights().length);
} }
return { return {
paramMappings: paramMappings, paramMappings: paramMappings,
params: { params: {
conv0_params: conv0_params, conv0: conv0,
conv1_params: conv1_params, conv1: conv1,
conv2_params: conv2_params, conv2: conv2,
conv3_params: conv3_params, conv3: conv3,
conv4_params: conv4_params, conv4: conv4,
conv5_params: conv5_params, conv5: conv5,
conv6_params: conv6_params, conv6: conv6,
conv7_params: conv7_params, conv7: conv7,
fc0_params: fc0_params, fc0: fc0,
fc1_params: fc1_params 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"} {"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/extractParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib"); 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 loadWeightMap_1 = require("../commons/loadWeightMap");
var DEFAULT_MODEL_NAME = 'face_landmark_68_model'; var DEFAULT_MODEL_NAME = 'face_landmark_68_model';
function extractorsFactory(weightMap, paramMappings) { function extractorsFactory(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory_1.extractWeightEntryFactory(weightMap, paramMappings);
function extractConvParams(prefix, mappedPrefix) { function extractConvParams(prefix, mappedPrefix) {
var filtersEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/kernel", 4); var filters = extractWeightEntry(prefix + "/kernel", 4, mappedPrefix + "/filters");
var biasEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/bias", 1); var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
paramMappings.push({ originalPath: filtersEntry.path, paramPath: mappedPrefix + "/filters" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" }); return { filters: filters, bias: bias };
return {
filters: filtersEntry.tensor,
bias: biasEntry.tensor
};
} }
function extractFcParams(prefix, mappedPrefix) { function extractFcParams(prefix, mappedPrefix) {
var weightsEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/kernel", 2); var weights = extractWeightEntry(prefix + "/kernel", 2, mappedPrefix + "/weights");
var biasEntry = extractWeightEntry_1.extractWeightEntry(weightMap, prefix + "/bias", 1); var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
paramMappings.push({ originalPath: weightsEntry.path, paramPath: mappedPrefix + "/weights" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" }); return { weights: weights, bias: bias };
return {
weights: weightsEntry.tensor,
bias: biasEntry.tensor
};
} }
return { return {
extractConvParams: extractConvParams, extractConvParams: extractConvParams,
...@@ -39,17 +33,18 @@ function loadQuantizedParams(uri) { ...@@ -39,17 +33,18 @@ function loadQuantizedParams(uri) {
paramMappings = []; paramMappings = [];
_a = extractorsFactory(weightMap, paramMappings), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams; _a = extractorsFactory(weightMap, paramMappings), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams;
params = { params = {
conv0_params: extractConvParams('conv2d_0', 'conv0_params'), conv0: extractConvParams('conv2d_0', 'conv0'),
conv1_params: extractConvParams('conv2d_1', 'conv1_params'), conv1: extractConvParams('conv2d_1', 'conv1'),
conv2_params: extractConvParams('conv2d_2', 'conv2_params'), conv2: extractConvParams('conv2d_2', 'conv2'),
conv3_params: extractConvParams('conv2d_3', 'conv3_params'), conv3: extractConvParams('conv2d_3', 'conv3'),
conv4_params: extractConvParams('conv2d_4', 'conv4_params'), conv4: extractConvParams('conv2d_4', 'conv4'),
conv5_params: extractConvParams('conv2d_5', 'conv5_params'), conv5: extractConvParams('conv2d_5', 'conv5'),
conv6_params: extractConvParams('conv2d_6', 'conv6_params'), conv6: extractConvParams('conv2d_6', 'conv6'),
conv7_params: extractConvParams('conv2d_7', 'conv7_params'), conv7: extractConvParams('conv2d_7', 'conv7'),
fc0_params: extractFcParams('dense', 'fc0_params'), fc0: extractFcParams('dense', 'fc0'),
fc1_params: extractFcParams('logits', 'fc1_params') fc1: extractFcParams('logits', 'fc1')
}; };
disposeUnusedWeightTensors_1.disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: 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"} {"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 \ No newline at end of file
...@@ -5,14 +5,14 @@ export declare type FCParams = { ...@@ -5,14 +5,14 @@ export declare type FCParams = {
bias: tf.Tensor1D; bias: tf.Tensor1D;
}; };
export declare type NetParams = { export declare type NetParams = {
conv0_params: ConvParams; conv0: ConvParams;
conv1_params: ConvParams; conv1: ConvParams;
conv2_params: ConvParams; conv2: ConvParams;
conv3_params: ConvParams; conv3: ConvParams;
conv4_params: ConvParams; conv4: ConvParams;
conv5_params: ConvParams; conv5: ConvParams;
conv6_params: ConvParams; conv6: ConvParams;
conv7_params: ConvParams; conv7: ConvParams;
fc0_params: FCParams; fc0: FCParams;
fc1_params: FCParams; fc1: FCParams;
}; };
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput'; import { NetInput } from '../NetInput';
import { TNetInput } from '../types'; import { TNetInput } from '../types';
export declare class FaceRecognitionNet { import { NetParams } from './types';
private _params; export declare class FaceRecognitionNet extends NeuralNetwork<NetParams> {
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>; constructor();
extractWeights(weights: Float32Array): void;
forwardInput(input: NetInput): tf.Tensor2D; forwardInput(input: NetInput): tf.Tensor2D;
forward(input: TNetInput): Promise<tf.Tensor2D>; forward(input: TNetInput): Promise<tf.Tensor2D>;
computeFaceDescriptor(input: TNetInput): Promise<Float32Array | Float32Array[]>; 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 @@ ...@@ -2,66 +2,44 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib"); var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core"); var tf = require("@tensorflow/tfjs-core");
var NeuralNetwork_1 = require("../commons/NeuralNetwork");
var toNetInput_1 = require("../toNetInput"); var toNetInput_1 = require("../toNetInput");
var convLayer_1 = require("./convLayer"); var convLayer_1 = require("./convLayer");
var extractParams_1 = require("./extractParams"); var extractParams_1 = require("./extractParams");
var loadQuantizedParams_1 = require("./loadQuantizedParams"); var loadQuantizedParams_1 = require("./loadQuantizedParams");
var normalize_1 = require("./normalize"); var normalize_1 = require("./normalize");
var residualLayer_1 = require("./residualLayer"); var residualLayer_1 = require("./residualLayer");
var FaceRecognitionNet = /** @class */ (function () { var FaceRecognitionNet = /** @class */ (function (_super) {
tslib_1.__extends(FaceRecognitionNet, _super);
function FaceRecognitionNet() { 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) { FaceRecognitionNet.prototype.forwardInput = function (input) {
var _this = this; var params = this.params;
if (!this._params) { if (!params) {
throw new Error('FaceRecognitionNet - load model before inference'); throw new Error('FaceRecognitionNet - load model before inference');
} }
return tf.tidy(function () { return tf.tidy(function () {
var batchTensor = input.toBatchTensor(150, true); var batchTensor = input.toBatchTensor(150, true);
var normalized = normalize_1.normalize(batchTensor); 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 = tf.maxPool(out, 3, 2, 'valid');
out = residualLayer_1.residual(out, _this._params.conv32_1); out = residualLayer_1.residual(out, params.conv32_1);
out = residualLayer_1.residual(out, _this._params.conv32_2); out = residualLayer_1.residual(out, params.conv32_2);
out = residualLayer_1.residual(out, _this._params.conv32_3); out = residualLayer_1.residual(out, params.conv32_3);
out = residualLayer_1.residualDown(out, _this._params.conv64_down); out = residualLayer_1.residualDown(out, params.conv64_down);
out = residualLayer_1.residual(out, _this._params.conv64_1); out = residualLayer_1.residual(out, params.conv64_1);
out = residualLayer_1.residual(out, _this._params.conv64_2); out = residualLayer_1.residual(out, params.conv64_2);
out = residualLayer_1.residual(out, _this._params.conv64_3); out = residualLayer_1.residual(out, params.conv64_3);
out = residualLayer_1.residualDown(out, _this._params.conv128_down); out = residualLayer_1.residualDown(out, params.conv128_down);
out = residualLayer_1.residual(out, _this._params.conv128_1); out = residualLayer_1.residual(out, params.conv128_1);
out = residualLayer_1.residual(out, _this._params.conv128_2); out = residualLayer_1.residual(out, params.conv128_2);
out = residualLayer_1.residualDown(out, _this._params.conv256_down); out = residualLayer_1.residualDown(out, params.conv256_down);
out = residualLayer_1.residual(out, _this._params.conv256_1); out = residualLayer_1.residual(out, params.conv256_1);
out = residualLayer_1.residual(out, _this._params.conv256_2); out = residualLayer_1.residual(out, params.conv256_2);
out = residualLayer_1.residualDown(out, _this._params.conv256_down_out); out = residualLayer_1.residualDown(out, params.conv256_down_out);
var globalAvg = out.mean([1, 2]); var globalAvg = out.mean([1, 2]);
var fullyConnected = tf.matMul(globalAvg, _this._params.fc); var fullyConnected = tf.matMul(globalAvg, params.fc);
return fullyConnected; return fullyConnected;
}); });
}; };
...@@ -99,7 +77,13 @@ var FaceRecognitionNet = /** @class */ (function () { ...@@ -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; return FaceRecognitionNet;
}()); }(NeuralNetwork_1.NeuralNetwork));
exports.FaceRecognitionNet = FaceRecognitionNet; exports.FaceRecognitionNet = FaceRecognitionNet;
//# sourceMappingURL=FaceRecognitionNet.js.map //# 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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"} {"version":3,"file":"FaceRecognitionNet.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/FaceRecognitionNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
import { ParamMapping } from '../commons/types';
import { NetParams } from './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 }); ...@@ -3,43 +3,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core"); var tf = require("@tensorflow/tfjs-core");
var extractWeightsFactory_1 = require("../commons/extractWeightsFactory"); var extractWeightsFactory_1 = require("../commons/extractWeightsFactory");
var utils_1 = require("../utils"); var utils_1 = require("../utils");
function extractorsFactory(extractWeights) { function extractorsFactory(extractWeights, paramMappings) {
function extractFilterValues(numFilterValues, numFilters, filterSize) { function extractFilterValues(numFilterValues, numFilters, filterSize) {
var weights = extractWeights(numFilterValues); var weights = extractWeights(numFilterValues);
var depth = weights.length / (numFilters * filterSize * filterSize); var depth = weights.length / (numFilters * filterSize * filterSize);
if (utils_1.isFloat(depth)) { if (utils_1.isFloat(depth)) {
throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize); 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 weights = tf.tensor1d(extractWeights(numWeights));
var biases = tf.tensor1d(extractWeights(numWeights)); var biases = tf.tensor1d(extractWeights(numWeights));
paramMappings.push({ paramPath: mappedPrefix + "/weights" }, { paramPath: mappedPrefix + "/biases" });
return { return {
weights: weights, weights: weights,
biases: biases biases: biases
}; };
} }
function extractConvLayerParams(numFilterValues, numFilters, filterSize) { function extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix) {
var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize); var conv = extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv");
var conv_bias = tf.tensor1d(extractWeights(numFilters)); var scale = extractScaleLayerParams(numFilters, mappedPrefix + "/scale");
var scale = extractScaleLayerParams(numFilters); return { conv: conv, scale: scale };
return {
conv: {
filters: conv_filters,
bias: conv_bias
},
scale: scale
};
} }
function extractResidualLayerParams(numFilterValues, numFilters, filterSize, isDown) { function extractResidualLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix, isDown) {
if (isDown === void 0) { isDown = false; } if (isDown === void 0) { isDown = false; }
var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize); var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, mappedPrefix + "/conv1");
var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize); var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv2");
return { return { conv1: conv1, conv2: conv2 };
conv1: conv1,
conv2: conv2
};
} }
return { return {
extractConvLayerParams: extractConvLayerParams, extractConvLayerParams: extractConvLayerParams,
...@@ -48,27 +45,29 @@ function extractorsFactory(extractWeights) { ...@@ -48,27 +45,29 @@ function extractorsFactory(extractWeights) {
} }
function extractParams(weights) { function extractParams(weights) {
var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; var _a = extractWeightsFactory_1.extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory(extractWeights), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams; var paramMappings = [];
var conv32_down = extractConvLayerParams(4704, 32, 7); var _b = extractorsFactory(extractWeights, paramMappings), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams;
var conv32_1 = extractResidualLayerParams(9216, 32, 3); var conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');
var conv32_2 = extractResidualLayerParams(9216, 32, 3); var conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');
var conv32_3 = extractResidualLayerParams(9216, 32, 3); var conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');
var conv64_down = extractResidualLayerParams(36864, 64, 3, true); var conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');
var conv64_1 = extractResidualLayerParams(36864, 64, 3); var conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);
var conv64_2 = extractResidualLayerParams(36864, 64, 3); var conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');
var conv64_3 = extractResidualLayerParams(36864, 64, 3); var conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');
var conv128_down = extractResidualLayerParams(147456, 128, 3, true); var conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');
var conv128_1 = extractResidualLayerParams(147456, 128, 3); var conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);
var conv128_2 = extractResidualLayerParams(147456, 128, 3); var conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');
var conv256_down = extractResidualLayerParams(589824, 256, 3, true); var conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');
var conv256_1 = extractResidualLayerParams(589824, 256, 3); var conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);
var conv256_2 = extractResidualLayerParams(589824, 256, 3); var conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');
var conv256_down_out = extractResidualLayerParams(589824, 256, 3); var conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');
var fc = tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]); 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) { if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length); throw new Error("weights remaing after extract: " + getRemainingWeights().length);
} }
return { var params = {
conv32_down: conv32_down, conv32_down: conv32_down,
conv32_1: conv32_1, conv32_1: conv32_1,
conv32_2: conv32_2, conv32_2: conv32_2,
...@@ -86,6 +85,7 @@ function extractParams(weights) { ...@@ -86,6 +85,7 @@ function extractParams(weights) {
conv256_down_out: conv256_down_out, conv256_down_out: conv256_down_out,
fc: fc fc: fc
}; };
return { params: params, paramMappings: paramMappings };
} }
exports.extractParams = extractParams; exports.extractParams = extractParams;
//# sourceMappingURL=extractParams.js.map //# sourceMappingURL=extractParams.js.map
\ No newline at end of file
{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/extractParams.ts"],"names":[],"mappings":"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"} {"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/extractParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ 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"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib"); var tslib_1 = require("tslib");
var disposeUnusedWeightTensors_1 = require("../commons/disposeUnusedWeightTensors");
var extractWeightEntryFactory_1 = require("../commons/extractWeightEntryFactory");
var isTensor_1 = require("../commons/isTensor"); var isTensor_1 = require("../commons/isTensor");
var loadWeightMap_1 = require("../commons/loadWeightMap"); var loadWeightMap_1 = require("../commons/loadWeightMap");
var DEFAULT_MODEL_NAME = 'face_recognition_model'; var DEFAULT_MODEL_NAME = 'face_recognition_model';
function extractorsFactory(weightMap) { function extractorsFactory(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory_1.extractWeightEntryFactory(weightMap, paramMappings);
function extractScaleLayerParams(prefix) { function extractScaleLayerParams(prefix) {
var params = { var weights = extractWeightEntry(prefix + "/scale/weights", 1);
weights: weightMap[prefix + "/scale/weights"], var biases = extractWeightEntry(prefix + "/scale/biases", 1);
biases: weightMap[prefix + "/scale/biases"] return { weights: weights, biases: 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;
} }
function extractConvLayerParams(prefix) { function extractConvLayerParams(prefix) {
var params = { var filters = extractWeightEntry(prefix + "/conv/filters", 4);
filters: weightMap[prefix + "/conv/filters"], var bias = extractWeightEntry(prefix + "/conv/bias", 1);
bias: weightMap[prefix + "/conv/bias"] var scale = extractScaleLayerParams(prefix);
}; return { conv: { filters: filters, bias: bias }, scale: scale };
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)
};
} }
function extractResidualLayerParams(prefix) { function extractResidualLayerParams(prefix) {
return { return {
...@@ -47,13 +32,14 @@ function extractorsFactory(weightMap) { ...@@ -47,13 +32,14 @@ function extractorsFactory(weightMap) {
} }
function loadQuantizedParams(uri) { function loadQuantizedParams(uri) {
return tslib_1.__awaiter(this, void 0, void 0, function () { 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) { return tslib_1.__generator(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap_1.loadWeightMap(uri, DEFAULT_MODEL_NAME)]; case 0: return [4 /*yield*/, loadWeightMap_1.loadWeightMap(uri, DEFAULT_MODEL_NAME)];
case 1: case 1:
weightMap = _b.sent(); 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_down = extractConvLayerParams('conv32_down');
conv32_1 = extractResidualLayerParams('conv32_1'); conv32_1 = extractResidualLayerParams('conv32_1');
conv32_2 = extractResidualLayerParams('conv32_2'); conv32_2 = extractResidualLayerParams('conv32_2');
...@@ -70,10 +56,11 @@ function loadQuantizedParams(uri) { ...@@ -70,10 +56,11 @@ function loadQuantizedParams(uri) {
conv256_2 = extractResidualLayerParams('conv256_2'); conv256_2 = extractResidualLayerParams('conv256_2');
conv256_down_out = extractResidualLayerParams('conv256_down_out'); conv256_down_out = extractResidualLayerParams('conv256_down_out');
fc = weightMap['fc']; fc = weightMap['fc'];
paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });
if (!isTensor_1.isTensor2D(fc)) { if (!isTensor_1.isTensor2D(fc)) {
throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc); throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc);
} }
return [2 /*return*/, { params = {
conv32_down: conv32_down, conv32_down: conv32_down,
conv32_1: conv32_1, conv32_1: conv32_1,
conv32_2: conv32_2, conv32_2: conv32_2,
...@@ -90,7 +77,9 @@ function loadQuantizedParams(uri) { ...@@ -90,7 +77,9 @@ function loadQuantizedParams(uri) {
conv256_2: conv256_2, conv256_2: conv256_2,
conv256_down_out: conv256_down_out, conv256_down_out: conv256_down_out,
fc: fc 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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"} {"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/loadQuantizedParams.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
...@@ -271,9 +271,6 @@ ...@@ -271,9 +271,6 @@
function isTensor(tensor$$1, dim) { function isTensor(tensor$$1, dim) {
return tensor$$1 instanceof Tensor && tensor$$1.shape.length === dim; return tensor$$1 instanceof Tensor && tensor$$1.shape.length === dim;
} }
function isTensor1D(tensor$$1) {
return isTensor(tensor$$1, 1);
}
function isTensor2D(tensor$$1) { function isTensor2D(tensor$$1) {
return isTensor(tensor$$1, 2); return isTensor(tensor$$1, 2);
} }
...@@ -663,6 +660,10 @@ ...@@ -663,6 +660,10 @@
} }
return new Rect(x, y, width, height); 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 () { Rect.prototype.floor = function () {
return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height)); return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height));
}; };
...@@ -955,6 +956,128 @@ ...@@ -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) { function extractWeightsFactory(weights) {
var remainingWeights = weights; var remainingWeights = weights;
function extractWeights(numWeights) { function extractWeights(numWeights) {
...@@ -971,13 +1094,14 @@ ...@@ -971,13 +1094,14 @@
}; };
} }
function extractorsFactory(extractWeights) { function extractorsFactory(extractWeights, paramMappings) {
function extractDepthwiseConvParams(numChannels) { function extractDepthwiseConvParams(numChannels, mappedPrefix) {
var filters = tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]); var filters = tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);
var batch_norm_scale = tensor1d(extractWeights(numChannels)); var batch_norm_scale = tensor1d(extractWeights(numChannels));
var batch_norm_offset = tensor1d(extractWeights(numChannels)); var batch_norm_offset = tensor1d(extractWeights(numChannels));
var batch_norm_mean = tensor1d(extractWeights(numChannels)); var batch_norm_mean = tensor1d(extractWeights(numChannels));
var batch_norm_variance = 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 { return {
filters: filters, filters: filters,
batch_norm_scale: batch_norm_scale, batch_norm_scale: batch_norm_scale,
...@@ -986,115 +1110,116 @@ ...@@ -986,115 +1110,116 @@
batch_norm_variance: batch_norm_variance 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 filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tensor1d(extractWeights(channelsOut)); var bias = tensor1d(extractWeights(channelsOut));
return { paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/" + (isPointwiseConv ? 'batch_norm_offset' : 'bias') });
filters: filters, return { filters: filters, bias: bias };
bias: bias
};
} }
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize) { function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
var _a = extractConvParams(channelsIn, channelsOut, filterSize), filters = _a.filters, bias = _a.bias; var _a = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true), filters = _a.filters, bias = _a.bias;
return { return {
filters: filters, filters: filters,
batch_norm_offset: bias batch_norm_offset: bias
}; };
} }
function extractConvPairParams(channelsIn, channelsOut) { function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) {
var depthwise_conv_params = extractDepthwiseConvParams(channelsIn); var depthwise_conv = extractDepthwiseConvParams(channelsIn, mappedPrefix + "/depthwise_conv");
var pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1); var pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, mappedPrefix + "/pointwise_conv");
return { return { depthwise_conv: depthwise_conv, pointwise_conv: pointwise_conv };
depthwise_conv_params: depthwise_conv_params,
pointwise_conv_params: pointwise_conv_params
};
} }
function extractMobilenetV1Params() { function extractMobilenetV1Params() {
var conv_0_params = extractPointwiseConvParams(3, 32, 3); var conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');
var channelNumPairs = [ var conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');
[32, 64], var conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');
[64, 128], var conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');
[128, 128], var conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');
[128, 256], var conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');
[256, 256], var conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');
[256, 512], var conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');
[512, 512], var conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');
[512, 512], var conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');
[512, 512], var conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');
[512, 512], var conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');
[512, 512], var conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');
[512, 1024], var conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');
[1024, 1024]
];
var conv_pair_params = channelNumPairs.map(function (_a) {
var channelsIn = _a[0], channelsOut = _a[1];
return extractConvPairParams(channelsIn, channelsOut);
});
return { return {
conv_0_params: conv_0_params, conv_0: conv_0,
conv_pair_params: conv_pair_params 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() { function extractPredictionLayerParams() {
var conv_0_params = extractPointwiseConvParams(1024, 256, 1); var conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');
var conv_1_params = extractPointwiseConvParams(256, 512, 3); var conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');
var conv_2_params = extractPointwiseConvParams(512, 128, 1); var conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');
var conv_3_params = extractPointwiseConvParams(128, 256, 3); var conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');
var conv_4_params = extractPointwiseConvParams(256, 128, 1); var conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');
var conv_5_params = extractPointwiseConvParams(128, 256, 3); var conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');
var conv_6_params = extractPointwiseConvParams(256, 64, 1); var conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');
var conv_7_params = extractPointwiseConvParams(64, 128, 3); var conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');
var box_encoding_0_predictor_params = extractConvParams(512, 12, 1); var box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');
var class_predictor_0_params = extractConvParams(512, 9, 1); var class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');
var box_encoding_1_predictor_params = extractConvParams(1024, 24, 1); var box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');
var class_predictor_1_params = extractConvParams(1024, 18, 1); var class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');
var box_encoding_2_predictor_params = extractConvParams(512, 24, 1); var box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');
var class_predictor_2_params = extractConvParams(512, 18, 1); var class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');
var box_encoding_3_predictor_params = extractConvParams(256, 24, 1); var box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');
var class_predictor_3_params = extractConvParams(256, 18, 1); var class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');
var box_encoding_4_predictor_params = extractConvParams(256, 24, 1); var box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');
var class_predictor_4_params = extractConvParams(256, 18, 1); var class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');
var box_encoding_5_predictor_params = extractConvParams(128, 24, 1); var box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');
var class_predictor_5_params = extractConvParams(128, 18, 1); var class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');
var box_predictor_0_params = { var box_predictor_0 = {
box_encoding_predictor_params: box_encoding_0_predictor_params, box_encoding_predictor: box_encoding_0_predictor,
class_predictor_params: class_predictor_0_params class_predictor: class_predictor_0
}; };
var box_predictor_1_params = { var box_predictor_1 = {
box_encoding_predictor_params: box_encoding_1_predictor_params, box_encoding_predictor: box_encoding_1_predictor,
class_predictor_params: class_predictor_1_params class_predictor: class_predictor_1
}; };
var box_predictor_2_params = { var box_predictor_2 = {
box_encoding_predictor_params: box_encoding_2_predictor_params, box_encoding_predictor: box_encoding_2_predictor,
class_predictor_params: class_predictor_2_params class_predictor: class_predictor_2
}; };
var box_predictor_3_params = { var box_predictor_3 = {
box_encoding_predictor_params: box_encoding_3_predictor_params, box_encoding_predictor: box_encoding_3_predictor,
class_predictor_params: class_predictor_3_params class_predictor: class_predictor_3
}; };
var box_predictor_4_params = { var box_predictor_4 = {
box_encoding_predictor_params: box_encoding_4_predictor_params, box_encoding_predictor: box_encoding_4_predictor,
class_predictor_params: class_predictor_4_params class_predictor: class_predictor_4
}; };
var box_predictor_5_params = { var box_predictor_5 = {
box_encoding_predictor_params: box_encoding_5_predictor_params, box_encoding_predictor: box_encoding_5_predictor,
class_predictor_params: class_predictor_5_params class_predictor: class_predictor_5
}; };
return { return {
conv_0_params: conv_0_params, conv_0: conv_0,
conv_1_params: conv_1_params, conv_1: conv_1,
conv_2_params: conv_2_params, conv_2: conv_2,
conv_3_params: conv_3_params, conv_3: conv_3,
conv_4_params: conv_4_params, conv_4: conv_4,
conv_5_params: conv_5_params, conv_5: conv_5,
conv_6_params: conv_6_params, conv_6: conv_6,
conv_7_params: conv_7_params, conv_7: conv_7,
box_predictor_0_params: box_predictor_0_params, box_predictor_0: box_predictor_0,
box_predictor_1_params: box_predictor_1_params, box_predictor_1: box_predictor_1,
box_predictor_2_params: box_predictor_2_params, box_predictor_2: box_predictor_2,
box_predictor_3_params: box_predictor_3_params, box_predictor_3: box_predictor_3,
box_predictor_4_params: box_predictor_4_params, box_predictor_4: box_predictor_4,
box_predictor_5_params: box_predictor_5_params box_predictor_5: box_predictor_5
}; };
} }
return { return {
...@@ -1103,21 +1228,45 @@ ...@@ -1103,21 +1228,45 @@
}; };
} }
function extractParams(weights) { function extractParams(weights) {
var paramMappings = [];
var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory(extractWeights), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams; var _b = extractorsFactory(extractWeights, paramMappings), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams;
var mobilenetv1_params = extractMobilenetV1Params(); var mobilenetv1 = extractMobilenetV1Params();
var prediction_layer_params = extractPredictionLayerParams(); var prediction_layer = extractPredictionLayerParams();
var extra_dim = tensor3d(extractWeights(5118 * 4), [1, 5118, 4]); var extra_dim = tensor3d(extractWeights(5118 * 4), [1, 5118, 4]);
var output_layer_params = { var output_layer = {
extra_dim: extra_dim extra_dim: extra_dim
}; };
paramMappings.push({ paramPath: 'output_layer/extra_dim' });
if (getRemainingWeights().length !== 0) { if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length); throw new Error("weights remaing after extract: " + getRemainingWeights().length);
} }
return { return {
mobilenetv1_params: mobilenetv1_params, params: {
prediction_layer_params: prediction_layer_params, mobilenetv1: mobilenetv1,
output_layer_params: output_layer_params 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 @@ ...@@ -1152,95 +1301,78 @@
} }
var DEFAULT_MODEL_NAME = 'face_detection_model'; var DEFAULT_MODEL_NAME = 'face_detection_model';
function extractorsFactory$1(weightMap) { function extractorsFactory$1(weightMap, paramMappings) {
function extractPointwiseConvParams(prefix, idx) { var extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);
var pointwise_conv_params = { function extractPointwiseConvParams(prefix, idx, mappedPrefix) {
filters: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/weights"], var filters = extractWeightEntry(prefix + "/Conv2d_" + idx + "_pointwise/weights", 4, mappedPrefix + "/filters");
batch_norm_offset: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset"] 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 };
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 extractConvPairParams(idx) { function extractConvPairParams(idx) {
var depthwise_conv_params = { var mappedPrefix = "mobilenetv1/conv_" + idx;
filters: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights"], var prefixDepthwiseConv = "MobilenetV1/Conv2d_" + idx + "_depthwise";
batch_norm_scale: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma"], var mappedPrefixDepthwiseConv = mappedPrefix + "/depthwise_conv";
batch_norm_offset: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta"], var mappedPrefixPointwiseConv = mappedPrefix + "/pointwise_conv";
batch_norm_mean: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean"], var filters = extractWeightEntry(prefixDepthwiseConv + "/depthwise_weights", 4, mappedPrefixDepthwiseConv + "/filters");
batch_norm_variance: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance"], 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");
if (!isTensor4D(depthwise_conv_params.filters)) { var batch_norm_mean = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_mean", 1, mappedPrefixDepthwiseConv + "/batch_norm_mean");
throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights] to be a Tensor4D, instead have " + depthwise_conv_params.filters); var batch_norm_variance = extractWeightEntry(prefixDepthwiseConv + "/BatchNorm/moving_variance", 1, mappedPrefixDepthwiseConv + "/batch_norm_variance");
}
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);
}
return { return {
depthwise_conv_params: depthwise_conv_params, depthwise_conv: {
pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx) 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() { function extractMobilenetV1Params() {
return { return {
conv_0_params: extractPointwiseConvParams('MobilenetV1', 0), conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
conv_pair_params: Array(13).fill(0).map(function (_, i) { return extractConvPairParams(i + 1); }) conv_1: extractConvPairParams(1),
}; conv_2: extractConvPairParams(2),
} conv_3: extractConvPairParams(3),
function extractBoxPredictorParams(idx) { conv_4: extractConvPairParams(4),
var params = { conv_5: extractConvPairParams(5),
box_encoding_predictor_params: { conv_6: extractConvPairParams(6),
filters: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights"], conv_7: extractConvPairParams(7),
bias: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases"] conv_8: extractConvPairParams(8),
}, conv_9: extractConvPairParams(9),
class_predictor_params: { conv_10: extractConvPairParams(10),
filters: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights"], conv_11: extractConvPairParams(11),
bias: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases"] 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)) { function extractConvParams(prefix, mappedPrefix) {
throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases] to be a Tensor1D, instead have " + params.class_predictor_params.bias); 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() { function extractPredictionLayerParams() {
return { return {
conv_0_params: extractPointwiseConvParams('Prediction', 0), conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
conv_1_params: extractPointwiseConvParams('Prediction', 1), conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
conv_2_params: extractPointwiseConvParams('Prediction', 2), conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
conv_3_params: extractPointwiseConvParams('Prediction', 3), conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
conv_4_params: extractPointwiseConvParams('Prediction', 4), conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
conv_5_params: extractPointwiseConvParams('Prediction', 5), conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
conv_6_params: extractPointwiseConvParams('Prediction', 6), conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
conv_7_params: extractPointwiseConvParams('Prediction', 7), conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
box_predictor_0_params: extractBoxPredictorParams(0), box_predictor_0: extractBoxPredictorParams(0),
box_predictor_1_params: extractBoxPredictorParams(1), box_predictor_1: extractBoxPredictorParams(1),
box_predictor_2_params: extractBoxPredictorParams(2), box_predictor_2: extractBoxPredictorParams(2),
box_predictor_3_params: extractBoxPredictorParams(3), box_predictor_3: extractBoxPredictorParams(3),
box_predictor_4_params: extractBoxPredictorParams(4), box_predictor_4: extractBoxPredictorParams(4),
box_predictor_5_params: extractBoxPredictorParams(5) box_predictor_5: extractBoxPredictorParams(5)
}; };
} }
return { return {
...@@ -1250,24 +1382,28 @@ ...@@ -1250,24 +1382,28 @@
} }
function loadQuantizedParams(uri) { function loadQuantizedParams(uri) {
return __awaiter$1(this, void 0, void 0, function () { 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) { return __generator$1(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)]; case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)];
case 1: case 1:
weightMap = _b.sent(); 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']; extra_dim = weightMap['Output/extra_dim'];
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });
if (!isTensor3D(extra_dim)) { if (!isTensor3D(extra_dim)) {
throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim); throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim);
} }
return [2 /*return*/, { params = {
mobilenetv1_params: extractMobilenetV1Params(), mobilenetv1: extractMobilenetV1Params(),
prediction_layer_params: extractPredictionLayerParams(), prediction_layer: extractPredictionLayerParams(),
output_layer_params: { output_layer: {
extra_dim: extra_dim extra_dim: extra_dim
} }
}]; };
disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
} }
}); });
}); });
...@@ -1295,12 +1431,27 @@ ...@@ -1295,12 +1431,27 @@
function mobileNetV1(x, params) { function mobileNetV1(x, params) {
return tidy(function () { return tidy(function () {
var conv11 = null; var conv11 = null;
var out = pointwiseConvLayer(x, params.conv_0_params, [2, 2]); var out = pointwiseConvLayer(x, params.conv_0, [2, 2]);
params.conv_pair_params.forEach(function (param, i) { 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 layerIdx = i + 1;
var depthwiseConvStrides = getStridesForLayerIdx(layerIdx); var depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides); out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
out = pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]); out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
if (layerIdx === 11) { if (layerIdx === 11) {
conv11 = out; conv11 = out;
} }
...@@ -1426,8 +1577,8 @@ ...@@ -1426,8 +1577,8 @@
function boxPredictionLayer(x, params) { function boxPredictionLayer(x, params) {
return tidy(function () { return tidy(function () {
var batchSize = x.shape[0]; var batchSize = x.shape[0];
var boxPredictionEncoding = reshape(convLayer(x, params.box_encoding_predictor_params), [batchSize, -1, 1, 4]); var boxPredictionEncoding = reshape(convLayer(x, params.box_encoding_predictor), [batchSize, -1, 1, 4]);
var classPrediction = reshape(convLayer(x, params.class_predictor_params), [batchSize, -1, 3]); var classPrediction = reshape(convLayer(x, params.class_predictor), [batchSize, -1, 3]);
return { return {
boxPredictionEncoding: boxPredictionEncoding, boxPredictionEncoding: boxPredictionEncoding,
classPrediction: classPrediction classPrediction: classPrediction
...@@ -1437,20 +1588,20 @@ ...@@ -1437,20 +1588,20 @@
function predictionLayer(x, conv11, params) { function predictionLayer(x, conv11, params) {
return tidy(function () { return tidy(function () {
var conv0 = pointwiseConvLayer(x, params.conv_0_params, [1, 1]); var conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]);
var conv1 = pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]); var conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]);
var conv2 = pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]); var conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]);
var conv3 = pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]); var conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2]);
var conv4 = pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]); var conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]);
var conv5 = pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]); var conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]);
var conv6 = pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]); var conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]);
var conv7 = pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]); var conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]);
var boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0_params); var boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0);
var boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1_params); var boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1);
var boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2_params); var boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2);
var boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3_params); var boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3);
var boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4_params); var boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4);
var boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5_params); var boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5);
var boxPredictions = concat([ var boxPredictions = concat([
boxPrediction0.boxPredictionEncoding, boxPrediction0.boxPredictionEncoding,
boxPrediction1.boxPredictionEncoding, boxPrediction1.boxPredictionEncoding,
...@@ -1474,45 +1625,22 @@ ...@@ -1474,45 +1625,22 @@
}); });
} }
var FaceDetectionNet = /** @class */ (function () { var FaceDetectionNet = /** @class */ (function (_super) {
__extends$1(FaceDetectionNet, _super);
function FaceDetectionNet() { 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) { FaceDetectionNet.prototype.forwardInput = function (input) {
var _this = this; var params = this.params;
if (!this._params) { if (!params) {
throw new Error('FaceDetectionNet - load model before inference'); throw new Error('FaceDetectionNet - load model before inference');
} }
return tidy(function () { return tidy(function () {
var batchTensor = input.toBatchTensor(512, false); var batchTensor = input.toBatchTensor(512, false);
var x = sub(mul(batchTensor, scalar(0.007843137718737125)), scalar(1)); var x = sub(mul(batchTensor, scalar(0.007843137718737125)), scalar(1));
var features = mobileNetV1(x, _this._params.mobilenetv1_params); var features = mobileNetV1(x, params.mobilenetv1);
var _a = predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; var _a = predictionLayer(features.out, features.conv11, params.prediction_layer), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params); return outputLayer(boxPredictions, classPredictions, params.output_layer);
}); });
}; };
FaceDetectionNet.prototype.forward = function (input) { FaceDetectionNet.prototype.forward = function (input) {
...@@ -1575,8 +1703,14 @@ ...@@ -1575,8 +1703,14 @@
}); });
}); });
}; };
FaceDetectionNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams(uri);
};
FaceDetectionNet.prototype.extractParams = function (weights) {
return extractParams(weights);
};
return FaceDetectionNet; return FaceDetectionNet;
}()); }(NeuralNetwork));
function faceDetectionNet(weights) { function faceDetectionNet(weights) {
var net = new FaceDetectionNet(); var net = new FaceDetectionNet();
...@@ -1584,103 +1718,15 @@ ...@@ -1584,103 +1718,15 @@
return net; return net;
} }
var NeuralNetwork = /** @class */ (function () { function extractParams$1(weights) {
function NeuralNetwork() { var paramMappings = [];
this._params = undefined; var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
this._paramMappings = []; function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
}
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) {
var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
var bias = tensor1d(extractWeights(channelsOut)); var bias = tensor1d(extractWeights(channelsOut));
paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/bias" }); paramMappings.push({ paramPath: mappedPrefix + "/filters" }, { paramPath: mappedPrefix + "/bias" });
return { return { filters: filters, bias: bias };
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) { function extractFcParams(channelsIn, channelsOut, mappedPrefix) {
var fc_weights = tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]); var fc_weights = tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);
var fc_bias = tensor1d(extractWeights(channelsOut)); var fc_bias = tensor1d(extractWeights(channelsOut));
...@@ -1690,32 +1736,32 @@ ...@@ -1690,32 +1736,32 @@
bias: fc_bias bias: fc_bias
}; };
} }
var conv0_params = extractConvParams(3, 32, 3, 'conv0_params'); var conv0 = extractConvParams(3, 32, 3, 'conv0');
var conv1_params = extractConvParams(32, 64, 3, 'conv1_params'); var conv1 = extractConvParams(32, 64, 3, 'conv1');
var conv2_params = extractConvParams(64, 64, 3, 'conv2_params'); var conv2 = extractConvParams(64, 64, 3, 'conv2');
var conv3_params = extractConvParams(64, 64, 3, 'conv3_params'); var conv3 = extractConvParams(64, 64, 3, 'conv3');
var conv4_params = extractConvParams(64, 64, 3, 'conv4_params'); var conv4 = extractConvParams(64, 64, 3, 'conv4');
var conv5_params = extractConvParams(64, 128, 3, 'conv5_params'); var conv5 = extractConvParams(64, 128, 3, 'conv5');
var conv6_params = extractConvParams(128, 128, 3, 'conv6_params'); var conv6 = extractConvParams(128, 128, 3, 'conv6');
var conv7_params = extractConvParams(128, 256, 3, 'conv7_params'); var conv7 = extractConvParams(128, 256, 3, 'conv7');
var fc0_params = extractFcParams(6400, 1024, 'fc0_params'); var fc0 = extractFcParams(6400, 1024, 'fc0');
var fc1_params = extractFcParams(1024, 136, 'fc1_params'); var fc1 = extractFcParams(1024, 136, 'fc1');
if (getRemainingWeights().length !== 0) { if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length); throw new Error("weights remaing after extract: " + getRemainingWeights().length);
} }
return { return {
paramMappings: paramMappings, paramMappings: paramMappings,
params: { params: {
conv0_params: conv0_params, conv0: conv0,
conv1_params: conv1_params, conv1: conv1,
conv2_params: conv2_params, conv2: conv2,
conv3_params: conv3_params, conv3: conv3,
conv4_params: conv4_params, conv4: conv4,
conv5_params: conv5_params, conv5: conv5,
conv6_params: conv6_params, conv6: conv6,
conv7_params: conv7_params, conv7: conv7,
fc0_params: fc0_params, fc0: fc0,
fc1_params: fc1_params fc1: fc1
} }
}; };
} }
...@@ -1826,33 +1872,18 @@ ...@@ -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'; var DEFAULT_MODEL_NAME$1 = 'face_landmark_68_model';
function extractorsFactory$2(weightMap, paramMappings) { function extractorsFactory$2(weightMap, paramMappings) {
var extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);
function extractConvParams(prefix, mappedPrefix) { function extractConvParams(prefix, mappedPrefix) {
var filtersEntry = extractWeightEntry(weightMap, prefix + "/kernel", 4); var filters = extractWeightEntry(prefix + "/kernel", 4, mappedPrefix + "/filters");
var biasEntry = extractWeightEntry(weightMap, prefix + "/bias", 1); var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
paramMappings.push({ originalPath: filtersEntry.path, paramPath: mappedPrefix + "/filters" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" }); return { filters: filters, bias: bias };
return {
filters: filtersEntry.tensor,
bias: biasEntry.tensor
};
} }
function extractFcParams(prefix, mappedPrefix) { function extractFcParams(prefix, mappedPrefix) {
var weightsEntry = extractWeightEntry(weightMap, prefix + "/kernel", 2); var weights = extractWeightEntry(prefix + "/kernel", 2, mappedPrefix + "/weights");
var biasEntry = extractWeightEntry(weightMap, prefix + "/bias", 1); var bias = extractWeightEntry(prefix + "/bias", 1, mappedPrefix + "/bias");
paramMappings.push({ originalPath: weightsEntry.path, paramPath: mappedPrefix + "/weights" }, { originalPath: biasEntry.path, paramPath: mappedPrefix + "/bias" }); return { weights: weights, bias: bias };
return {
weights: weightsEntry.tensor,
bias: biasEntry.tensor
};
} }
return { return {
extractConvParams: extractConvParams, extractConvParams: extractConvParams,
...@@ -1870,17 +1901,18 @@ ...@@ -1870,17 +1901,18 @@
paramMappings = []; paramMappings = [];
_a = extractorsFactory$2(weightMap, paramMappings), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams; _a = extractorsFactory$2(weightMap, paramMappings), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams;
params = { params = {
conv0_params: extractConvParams('conv2d_0', 'conv0_params'), conv0: extractConvParams('conv2d_0', 'conv0'),
conv1_params: extractConvParams('conv2d_1', 'conv1_params'), conv1: extractConvParams('conv2d_1', 'conv1'),
conv2_params: extractConvParams('conv2d_2', 'conv2_params'), conv2: extractConvParams('conv2d_2', 'conv2'),
conv3_params: extractConvParams('conv2d_3', 'conv3_params'), conv3: extractConvParams('conv2d_3', 'conv3'),
conv4_params: extractConvParams('conv2d_4', 'conv4_params'), conv4: extractConvParams('conv2d_4', 'conv4'),
conv5_params: extractConvParams('conv2d_5', 'conv5_params'), conv5: extractConvParams('conv2d_5', 'conv5'),
conv6_params: extractConvParams('conv2d_6', 'conv6_params'), conv6: extractConvParams('conv2d_6', 'conv6'),
conv7_params: extractConvParams('conv2d_7', 'conv7_params'), conv7: extractConvParams('conv2d_7', 'conv7'),
fc0_params: extractFcParams('dense', 'fc0_params'), fc0: extractFcParams('dense', 'fc0'),
fc1_params: extractFcParams('logits', 'fc1_params') fc1: extractFcParams('logits', 'fc1')
}; };
disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }]; return [2 /*return*/, { params: params, paramMappings: paramMappings }];
} }
}); });
...@@ -1897,57 +1929,29 @@ ...@@ -1897,57 +1929,29 @@
var FaceLandmarkNet = /** @class */ (function (_super) { var FaceLandmarkNet = /** @class */ (function (_super) {
__extends$1(FaceLandmarkNet, _super); __extends$1(FaceLandmarkNet, _super);
function FaceLandmarkNet() { function FaceLandmarkNet() {
return _super !== null && _super.apply(this, arguments) || this; return _super.call(this, 'FaceLandmarkNet') || 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 [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) { FaceLandmarkNet.prototype.forwardInput = function (input) {
var params = this._params; var params = this.params;
if (!params) { if (!params) {
throw new Error('FaceLandmarkNet - load model before inference'); throw new Error('FaceLandmarkNet - load model before inference');
} }
return tidy(function () { return tidy(function () {
var batchTensor = input.toBatchTensor(128, true); var batchTensor = input.toBatchTensor(128, true);
var out = conv(batchTensor, params.conv0_params); var out = conv(batchTensor, params.conv0);
out = maxPool$1(out); out = maxPool$1(out);
out = conv(out, params.conv1_params); out = conv(out, params.conv1);
out = conv(out, params.conv2_params); out = conv(out, params.conv2);
out = maxPool$1(out); out = maxPool$1(out);
out = conv(out, params.conv3_params); out = conv(out, params.conv3);
out = conv(out, params.conv4_params); out = conv(out, params.conv4);
out = maxPool$1(out); out = maxPool$1(out);
out = conv(out, params.conv5_params); out = conv(out, params.conv5);
out = conv(out, params.conv6_params); out = conv(out, params.conv6);
out = maxPool$1(out, [1, 1]); out = maxPool$1(out, [1, 1]);
out = conv(out, params.conv7_params); out = conv(out, params.conv7);
var fc0 = relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)); var fc0 = relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0));
var fc1 = fullyConnectedLayer(fc0, params.fc1_params); var fc1 = fullyConnectedLayer(fc0, params.fc1);
var createInterleavedTensor = function (fillX, fillY) { var createInterleavedTensor = function (fillX, fillY) {
return stack([ return stack([
fill([68], fillX), fill([68], fillX),
...@@ -2022,6 +2026,12 @@ ...@@ -2022,6 +2026,12 @@
}); });
}); });
}; };
FaceLandmarkNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams$1(uri);
};
FaceLandmarkNet.prototype.extractParams = function (weights) {
return extractParams$1(weights);
};
return FaceLandmarkNet; return FaceLandmarkNet;
}(NeuralNetwork)); }(NeuralNetwork));
...@@ -2053,43 +2063,40 @@ ...@@ -2053,43 +2063,40 @@
return convLayer$1(x, params, [2, 2], true, 'valid'); return convLayer$1(x, params, [2, 2], true, 'valid');
} }
function extractorsFactory$3(extractWeights) { function extractorsFactory$3(extractWeights, paramMappings) {
function extractFilterValues(numFilterValues, numFilters, filterSize) { function extractFilterValues(numFilterValues, numFilters, filterSize) {
var weights = extractWeights(numFilterValues); var weights = extractWeights(numFilterValues);
var depth = weights.length / (numFilters * filterSize * filterSize); var depth = weights.length / (numFilters * filterSize * filterSize);
if (isFloat(depth)) { if (isFloat(depth)) {
throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize); 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 weights = tensor1d(extractWeights(numWeights));
var biases = tensor1d(extractWeights(numWeights)); var biases = tensor1d(extractWeights(numWeights));
paramMappings.push({ paramPath: mappedPrefix + "/weights" }, { paramPath: mappedPrefix + "/biases" });
return { return {
weights: weights, weights: weights,
biases: biases biases: biases
}; };
} }
function extractConvLayerParams(numFilterValues, numFilters, filterSize) { function extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix) {
var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize); var conv = extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv");
var conv_bias = tensor1d(extractWeights(numFilters)); var scale = extractScaleLayerParams(numFilters, mappedPrefix + "/scale");
var scale = extractScaleLayerParams(numFilters); return { conv: conv, scale: scale };
return {
conv: {
filters: conv_filters,
bias: conv_bias
},
scale: scale
};
} }
function extractResidualLayerParams(numFilterValues, numFilters, filterSize, isDown) { function extractResidualLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix, isDown) {
if (isDown === void 0) { isDown = false; } if (isDown === void 0) { isDown = false; }
var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize); var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, mappedPrefix + "/conv1");
var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize); var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix + "/conv2");
return { return { conv1: conv1, conv2: conv2 };
conv1: conv1,
conv2: conv2
};
} }
return { return {
extractConvLayerParams: extractConvLayerParams, extractConvLayerParams: extractConvLayerParams,
...@@ -2098,27 +2105,29 @@ ...@@ -2098,27 +2105,29 @@
} }
function extractParams$2(weights) { function extractParams$2(weights) {
var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights;
var _b = extractorsFactory$3(extractWeights), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams; var paramMappings = [];
var conv32_down = extractConvLayerParams(4704, 32, 7); var _b = extractorsFactory$3(extractWeights, paramMappings), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams;
var conv32_1 = extractResidualLayerParams(9216, 32, 3); var conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');
var conv32_2 = extractResidualLayerParams(9216, 32, 3); var conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');
var conv32_3 = extractResidualLayerParams(9216, 32, 3); var conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');
var conv64_down = extractResidualLayerParams(36864, 64, 3, true); var conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');
var conv64_1 = extractResidualLayerParams(36864, 64, 3); var conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);
var conv64_2 = extractResidualLayerParams(36864, 64, 3); var conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');
var conv64_3 = extractResidualLayerParams(36864, 64, 3); var conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');
var conv128_down = extractResidualLayerParams(147456, 128, 3, true); var conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');
var conv128_1 = extractResidualLayerParams(147456, 128, 3); var conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);
var conv128_2 = extractResidualLayerParams(147456, 128, 3); var conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');
var conv256_down = extractResidualLayerParams(589824, 256, 3, true); var conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');
var conv256_1 = extractResidualLayerParams(589824, 256, 3); var conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);
var conv256_2 = extractResidualLayerParams(589824, 256, 3); var conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');
var conv256_down_out = extractResidualLayerParams(589824, 256, 3); var conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');
var fc = transpose(tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]); 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) { if (getRemainingWeights().length !== 0) {
throw new Error("weights remaing after extract: " + getRemainingWeights().length); throw new Error("weights remaing after extract: " + getRemainingWeights().length);
} }
return { var params = {
conv32_down: conv32_down, conv32_down: conv32_down,
conv32_1: conv32_1, conv32_1: conv32_1,
conv32_2: conv32_2, conv32_2: conv32_2,
...@@ -2136,38 +2145,22 @@ ...@@ -2136,38 +2145,22 @@
conv256_down_out: conv256_down_out, conv256_down_out: conv256_down_out,
fc: fc fc: fc
}; };
return { params: params, paramMappings: paramMappings };
} }
var DEFAULT_MODEL_NAME$2 = 'face_recognition_model'; 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) { function extractScaleLayerParams(prefix) {
var params = { var weights = extractWeightEntry(prefix + "/scale/weights", 1);
weights: weightMap[prefix + "/scale/weights"], var biases = extractWeightEntry(prefix + "/scale/biases", 1);
biases: weightMap[prefix + "/scale/biases"] return { weights: weights, biases: 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;
} }
function extractConvLayerParams(prefix) { function extractConvLayerParams(prefix) {
var params = { var filters = extractWeightEntry(prefix + "/conv/filters", 4);
filters: weightMap[prefix + "/conv/filters"], var bias = extractWeightEntry(prefix + "/conv/bias", 1);
bias: weightMap[prefix + "/conv/bias"] var scale = extractScaleLayerParams(prefix);
}; return { conv: { filters: filters, bias: bias }, scale: scale };
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)
};
} }
function extractResidualLayerParams(prefix) { function extractResidualLayerParams(prefix) {
return { return {
...@@ -2182,13 +2175,14 @@ ...@@ -2182,13 +2175,14 @@
} }
function loadQuantizedParams$2(uri) { function loadQuantizedParams$2(uri) {
return __awaiter$1(this, void 0, void 0, function () { 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) { return __generator$1(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME$2)]; case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME$2)];
case 1: case 1:
weightMap = _b.sent(); 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_down = extractConvLayerParams('conv32_down');
conv32_1 = extractResidualLayerParams('conv32_1'); conv32_1 = extractResidualLayerParams('conv32_1');
conv32_2 = extractResidualLayerParams('conv32_2'); conv32_2 = extractResidualLayerParams('conv32_2');
...@@ -2205,10 +2199,11 @@ ...@@ -2205,10 +2199,11 @@
conv256_2 = extractResidualLayerParams('conv256_2'); conv256_2 = extractResidualLayerParams('conv256_2');
conv256_down_out = extractResidualLayerParams('conv256_down_out'); conv256_down_out = extractResidualLayerParams('conv256_down_out');
fc = weightMap['fc']; fc = weightMap['fc'];
paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });
if (!isTensor2D(fc)) { if (!isTensor2D(fc)) {
throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc); throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc);
} }
return [2 /*return*/, { params = {
conv32_down: conv32_down, conv32_down: conv32_down,
conv32_1: conv32_1, conv32_1: conv32_1,
conv32_2: conv32_2, conv32_2: conv32_2,
...@@ -2225,7 +2220,9 @@ ...@@ -2225,7 +2220,9 @@
conv256_2: conv256_2, conv256_2: conv256_2,
conv256_down_out: conv256_down_out, conv256_down_out: conv256_down_out,
fc: fc fc: fc
}]; };
disposeUnusedWeightTensors(weightMap, paramMappings);
return [2 /*return*/, { params: params, paramMappings: paramMappings }];
} }
}); });
}); });
...@@ -2271,60 +2268,37 @@ ...@@ -2271,60 +2268,37 @@
return out; return out;
} }
var FaceRecognitionNet = /** @class */ (function () { var FaceRecognitionNet = /** @class */ (function (_super) {
__extends$1(FaceRecognitionNet, _super);
function FaceRecognitionNet() { 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) { FaceRecognitionNet.prototype.forwardInput = function (input) {
var _this = this; var params = this.params;
if (!this._params) { if (!params) {
throw new Error('FaceRecognitionNet - load model before inference'); throw new Error('FaceRecognitionNet - load model before inference');
} }
return tidy(function () { return tidy(function () {
var batchTensor = input.toBatchTensor(150, true); var batchTensor = input.toBatchTensor(150, true);
var normalized = normalize(batchTensor); 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 = maxPool(out, 3, 2, 'valid');
out = residual(out, _this._params.conv32_1); out = residual(out, params.conv32_1);
out = residual(out, _this._params.conv32_2); out = residual(out, params.conv32_2);
out = residual(out, _this._params.conv32_3); out = residual(out, params.conv32_3);
out = residualDown(out, _this._params.conv64_down); out = residualDown(out, params.conv64_down);
out = residual(out, _this._params.conv64_1); out = residual(out, params.conv64_1);
out = residual(out, _this._params.conv64_2); out = residual(out, params.conv64_2);
out = residual(out, _this._params.conv64_3); out = residual(out, params.conv64_3);
out = residualDown(out, _this._params.conv128_down); out = residualDown(out, params.conv128_down);
out = residual(out, _this._params.conv128_1); out = residual(out, params.conv128_1);
out = residual(out, _this._params.conv128_2); out = residual(out, params.conv128_2);
out = residualDown(out, _this._params.conv256_down); out = residualDown(out, params.conv256_down);
out = residual(out, _this._params.conv256_1); out = residual(out, params.conv256_1);
out = residual(out, _this._params.conv256_2); out = residual(out, params.conv256_2);
out = residualDown(out, _this._params.conv256_down_out); out = residualDown(out, params.conv256_down_out);
var globalAvg = out.mean([1, 2]); var globalAvg = out.mean([1, 2]);
var fullyConnected = matMul(globalAvg, _this._params.fc); var fullyConnected = matMul(globalAvg, params.fc);
return fullyConnected; return fullyConnected;
}); });
}; };
...@@ -2362,8 +2336,14 @@ ...@@ -2362,8 +2336,14 @@
}); });
}); });
}; };
FaceRecognitionNet.prototype.loadQuantizedParams = function (uri) {
return loadQuantizedParams$2(uri);
};
FaceRecognitionNet.prototype.extractParams = function (weights) {
return extractParams$2(weights);
};
return FaceRecognitionNet; return FaceRecognitionNet;
}()); }(NeuralNetwork));
function faceRecognitionNet(weights) { function faceRecognitionNet(weights) {
var net = new FaceRecognitionNet(); 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 { ...@@ -32,6 +32,11 @@ export class Rect implements IRect {
return new Rect(x, y, width, height) 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 { public floor(): Rect {
return new Rect( return new Rect(
Math.floor(this.x), Math.floor(this.x),
......
...@@ -7,6 +7,8 @@ export class NeuralNetwork<TNetParams> { ...@@ -7,6 +7,8 @@ export class NeuralNetwork<TNetParams> {
protected _params: TNetParams | undefined = undefined protected _params: TNetParams | undefined = undefined
protected _paramMappings: ParamMapping[] = [] protected _paramMappings: ParamMapping[] = []
constructor(private _name: string) {}
public get params(): TNetParams | undefined { public get params(): TNetParams | undefined {
return this._params return this._params
} }
...@@ -53,11 +55,44 @@ export class NeuralNetwork<TNetParams> { ...@@ -53,11 +55,44 @@ export class NeuralNetwork<TNetParams> {
}) })
} }
public dispose() { public dispose(throwOnRedispose: boolean = true) {
this.getParamList().forEach(param => param.tensor.dispose()) 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 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) { private traversePropertyPath(paramPath: string) {
if (!this.params) { if (!this.params) {
throw new Error(`traversePropertyPath - model has no loaded params`) throw new Error(`traversePropertyPath - model has no loaded params`)
...@@ -78,4 +113,12 @@ export class NeuralNetwork<TNetParams> { ...@@ -78,4 +113,12 @@ export class NeuralNetwork<TNetParams> {
return { obj, objProp } 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 * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput'; import { NetInput } from '../NetInput';
import { Rect } from '../Rect'; import { Rect } from '../Rect';
import { toNetInput } from '../toNetInput'; import { toNetInput } from '../toNetInput';
...@@ -13,28 +14,17 @@ import { outputLayer } from './outputLayer'; ...@@ -13,28 +14,17 @@ import { outputLayer } from './outputLayer';
import { predictionLayer } from './predictionLayer'; import { predictionLayer } from './predictionLayer';
import { NetParams } from './types'; import { NetParams } from './types';
export class FaceDetectionNet { export class FaceDetectionNet extends NeuralNetwork<NetParams> {
private _params: NetParams constructor() {
super('FaceDetectionNet')
public async load(weightsOrUrl?: Float32Array | string): Promise<void> {
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl)
return
} }
if (weightsOrUrl && typeof weightsOrUrl !== 'string') { public forwardInput(input: NetInput) {
throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array')
}
this._params = await loadQuantizedParams(weightsOrUrl)
}
public extractWeights(weights: Float32Array) { const { params } = this
this._params = extractParams(weights)
}
public forwardInput(input: NetInput) { if (!params) {
if (!this._params) {
throw new Error('FaceDetectionNet - load model before inference') throw new Error('FaceDetectionNet - load model before inference')
} }
...@@ -42,14 +32,14 @@ export class FaceDetectionNet { ...@@ -42,14 +32,14 @@ export class FaceDetectionNet {
const batchTensor = input.toBatchTensor(512, false) const batchTensor = input.toBatchTensor(512, false)
const x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1)) as tf.Tensor4D 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 { const {
boxPredictions, boxPredictions,
classPredictions 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 { ...@@ -91,7 +81,6 @@ export class FaceDetectionNet {
minConfidence minConfidence
) )
const paddedHeightRelative = (netInput.getPaddings(0).y + netInput.getInputHeight(0)) / netInput.getInputHeight(0) const paddedHeightRelative = (netInput.getPaddings(0).y + netInput.getInputHeight(0)) / netInput.getInputHeight(0)
const paddedWidthRelative = (netInput.getPaddings(0).x + netInput.getInputWidth(0)) / netInput.getInputWidth(0) const paddedWidthRelative = (netInput.getPaddings(0).x + netInput.getInputWidth(0)) / netInput.getInputWidth(0)
...@@ -125,4 +114,12 @@ export class FaceDetectionNet { ...@@ -125,4 +114,12 @@ export class FaceDetectionNet {
return results 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( ...@@ -13,11 +13,11 @@ export function boxPredictionLayer(
const batchSize = x.shape[0] const batchSize = x.shape[0]
const boxPredictionEncoding = tf.reshape( const boxPredictionEncoding = tf.reshape(
convLayer(x, params.box_encoding_predictor_params), convLayer(x, params.box_encoding_predictor),
[batchSize, -1, 1, 4] [batchSize, -1, 1, 4]
) )
const classPrediction = tf.reshape( const classPrediction = tf.reshape(
convLayer(x, params.class_predictor_params), convLayer(x, params.class_predictor),
[batchSize, -1, 3] [batchSize, -1, 3]
) )
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory } from '../commons/extractWeightsFactory'; import { extractWeightsFactory } from '../commons/extractWeightsFactory';
import { ConvParams } from '../commons/types'; import { ConvParams, ExtractWeightsFunction, ParamMapping } from '../commons/types';
import { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './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 filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1])
const batch_norm_scale = tf.tensor1d(extractWeights(numChannels)) const batch_norm_scale = tf.tensor1d(extractWeights(numChannels))
const batch_norm_offset = tf.tensor1d(extractWeights(numChannels)) const batch_norm_offset = tf.tensor1d(extractWeights(numChannels))
const batch_norm_mean = tf.tensor1d(extractWeights(numChannels)) const batch_norm_mean = tf.tensor1d(extractWeights(numChannels))
const batch_norm_variance = 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 { return {
filters, filters,
batch_norm_scale, batch_norm_scale,
...@@ -25,29 +34,36 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) ...@@ -25,29 +34,36 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array)
function extractConvParams( function extractConvParams(
channelsIn: number, channelsIn: number,
channelsOut: number, channelsOut: number,
filterSize: number filterSize: number,
mappedPrefix: string,
isPointwiseConv?: boolean
): ConvParams { ): ConvParams {
const filters = tf.tensor4d( const filters = tf.tensor4d(
extractWeights(channelsIn * channelsOut * filterSize * filterSize), extractWeights(channelsIn * channelsOut * filterSize * filterSize),
[filterSize, filterSize, channelsIn, channelsOut] [filterSize, filterSize, channelsIn, channelsOut]
) )
const bias = tf.tensor1d(extractWeights(channelsOut)) const bias = tf.tensor1d(extractWeights(channelsOut))
return { paramMappings.push(
filters, { paramPath: `${mappedPrefix}/filters` },
bias { paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` }
} )
return { filters, bias }
} }
function extractPointwiseConvParams( function extractPointwiseConvParams(
channelsIn: number, channelsIn: number,
channelsOut: number, channelsOut: number,
filterSize: number filterSize: number,
mappedPrefix: string
): PointwiseConvParams { ): PointwiseConvParams {
const { const {
filters, filters,
bias bias
} = extractConvParams(channelsIn, channelsOut, filterSize) } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true)
return { return {
filters, filters,
...@@ -57,115 +73,118 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) ...@@ -57,115 +73,118 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array)
function extractConvPairParams( function extractConvPairParams(
channelsIn: number, channelsIn: number,
channelsOut: number channelsOut: number,
mappedPrefix: string
): MobileNetV1.ConvPairParams { ): MobileNetV1.ConvPairParams {
const depthwise_conv_params = extractDepthwiseConvParams(channelsIn)
const pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1)
return { const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`)
depthwise_conv_params, const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`)
pointwise_conv_params
} return { depthwise_conv, pointwise_conv }
} }
function extractMobilenetV1Params(): MobileNetV1.Params { function extractMobilenetV1Params(): MobileNetV1.Params {
const conv_0_params = extractPointwiseConvParams(3, 32, 3) const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0')
const channelNumPairs = [ const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1')
[32, 64], const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2')
[64, 128], const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3')
[128, 128], const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4')
[128, 256], const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5')
[256, 256], const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6')
[256, 512], const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7')
[512, 512], const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8')
[512, 512], const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9')
[512, 512], const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10')
[512, 512], const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11')
[512, 512], const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12')
[512, 1024], const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13')
[1024, 1024]
]
const conv_pair_params = channelNumPairs.map(
([channelsIn, channelsOut]) => extractConvPairParams(channelsIn, channelsOut)
)
return { return {
conv_0_params, conv_0,
conv_pair_params 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 { function extractPredictionLayerParams(): PredictionLayerParams {
const conv_0_params = extractPointwiseConvParams(1024, 256, 1) const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0')
const conv_1_params = extractPointwiseConvParams(256, 512, 3) const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1')
const conv_2_params = extractPointwiseConvParams(512, 128, 1) const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2')
const conv_3_params = extractPointwiseConvParams(128, 256, 3) const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3')
const conv_4_params = extractPointwiseConvParams(256, 128, 1) const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4')
const conv_5_params = extractPointwiseConvParams(128, 256, 3) const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5')
const conv_6_params = extractPointwiseConvParams(256, 64, 1) const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6')
const conv_7_params = extractPointwiseConvParams(64, 128, 3) const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7')
const box_encoding_0_predictor_params = extractConvParams(512, 12, 1) const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor')
const class_predictor_0_params = extractConvParams(512, 9, 1) const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor')
const box_encoding_1_predictor_params = extractConvParams(1024, 24, 1) const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor')
const class_predictor_1_params = extractConvParams(1024, 18, 1) const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor')
const box_encoding_2_predictor_params = extractConvParams(512, 24, 1) const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor')
const class_predictor_2_params = extractConvParams(512, 18, 1) const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor')
const box_encoding_3_predictor_params = extractConvParams(256, 24, 1) const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor')
const class_predictor_3_params = extractConvParams(256, 18, 1) const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor')
const box_encoding_4_predictor_params = extractConvParams(256, 24, 1) const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor')
const class_predictor_4_params = extractConvParams(256, 18, 1) const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor')
const box_encoding_5_predictor_params = extractConvParams(128, 24, 1) const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor')
const class_predictor_5_params = extractConvParams(128, 18, 1) const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor')
const box_predictor_0_params = { const box_predictor_0 = {
box_encoding_predictor_params: box_encoding_0_predictor_params, box_encoding_predictor: box_encoding_0_predictor,
class_predictor_params: class_predictor_0_params class_predictor: class_predictor_0
} }
const box_predictor_1_params = { const box_predictor_1 = {
box_encoding_predictor_params: box_encoding_1_predictor_params, box_encoding_predictor: box_encoding_1_predictor,
class_predictor_params: class_predictor_1_params class_predictor: class_predictor_1
} }
const box_predictor_2_params = { const box_predictor_2 = {
box_encoding_predictor_params: box_encoding_2_predictor_params, box_encoding_predictor: box_encoding_2_predictor,
class_predictor_params: class_predictor_2_params class_predictor: class_predictor_2
} }
const box_predictor_3_params = { const box_predictor_3 = {
box_encoding_predictor_params: box_encoding_3_predictor_params, box_encoding_predictor: box_encoding_3_predictor,
class_predictor_params: class_predictor_3_params class_predictor: class_predictor_3
} }
const box_predictor_4_params = { const box_predictor_4 = {
box_encoding_predictor_params: box_encoding_4_predictor_params, box_encoding_predictor: box_encoding_4_predictor,
class_predictor_params: class_predictor_4_params class_predictor: class_predictor_4
} }
const box_predictor_5_params = { const box_predictor_5 = {
box_encoding_predictor_params: box_encoding_5_predictor_params, box_encoding_predictor: box_encoding_5_predictor,
class_predictor_params: class_predictor_5_params class_predictor: class_predictor_5
} }
return { return {
conv_0_params, conv_0,
conv_1_params, conv_1,
conv_2_params, conv_2,
conv_3_params, conv_3,
conv_4_params, conv_4,
conv_5_params, conv_5,
conv_6_params, conv_6,
conv_7_params, conv_7,
box_predictor_0_params, box_predictor_0,
box_predictor_1_params, box_predictor_1,
box_predictor_2_params, box_predictor_2,
box_predictor_3_params, box_predictor_3,
box_predictor_4_params, box_predictor_4,
box_predictor_5_params box_predictor_5
} }
} }
return { return {
extractMobilenetV1Params, extractMobilenetV1Params,
extractPredictionLayerParams extractPredictionLayerParams
...@@ -173,7 +192,10 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) ...@@ -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 { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
...@@ -182,25 +204,30 @@ export function extractParams(weights: Float32Array): NetParams { ...@@ -182,25 +204,30 @@ export function extractParams(weights: Float32Array): NetParams {
const { const {
extractMobilenetV1Params, extractMobilenetV1Params,
extractPredictionLayerParams extractPredictionLayerParams
} = extractorsFactory(extractWeights) } = extractorsFactory(extractWeights, paramMappings)
const mobilenetv1_params = extractMobilenetV1Params() const mobilenetv1 = extractMobilenetV1Params()
const prediction_layer_params = extractPredictionLayerParams() const prediction_layer = extractPredictionLayerParams()
const extra_dim = tf.tensor3d( const extra_dim = tf.tensor3d(
extractWeights(5118 * 4), extractWeights(5118 * 4),
[1, 5118, 4] [1, 5118, 4]
) )
const output_layer_params = { const output_layer = {
extra_dim extra_dim
} }
paramMappings.push({ paramPath: 'output_layer/extra_dim' })
if (getRemainingWeights().length !== 0) { if (getRemainingWeights().length !== 0) {
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`) throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)
} }
return { return {
mobilenetv1_params, params: {
prediction_layer_params, mobilenetv1,
output_layer_params 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 { 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' 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 = { function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {
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)) { const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`)
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 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 { function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams {
const depthwise_conv_params = { const mappedPrefix = `mobilenetv1/conv_${idx}`
filters: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/depthwise_weights`], const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`
batch_norm_scale: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/gamma`], const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`
batch_norm_offset: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/beta`], const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`
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)) { const filters = extractWeightEntry<tf.Tensor4D>(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`)
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 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 { return {
depthwise_conv_params, depthwise_conv: {
pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx) filters,
batch_norm_scale,
batch_norm_offset,
batch_norm_mean,
batch_norm_variance
},
pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv)
} }
} }
function extractMobilenetV1Params(): MobileNetV1.Params { function extractMobilenetV1Params(): MobileNetV1.Params {
return { return {
conv_0_params: extractPointwiseConvParams('MobilenetV1', 0), conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
conv_pair_params: Array(13).fill(0).map((_, i) => extractConvPairParams(i + 1)) conv_1: extractConvPairParams(1),
} conv_2: extractConvPairParams(2),
} conv_3: extractConvPairParams(3),
conv_4: extractConvPairParams(4),
function extractBoxPredictorParams(idx: number): BoxPredictionParams { conv_5: extractConvPairParams(5),
conv_6: extractConvPairParams(6),
const params = { conv_7: extractConvPairParams(7),
box_encoding_predictor_params: { conv_8: extractConvPairParams(8),
filters: weightMap[`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/weights`], conv_9: extractConvPairParams(9),
bias: weightMap[`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/biases`] conv_10: extractConvPairParams(10),
}, conv_11: extractConvPairParams(11),
class_predictor_params: { conv_12: extractConvPairParams(12),
filters: weightMap[`Prediction/BoxPredictor_${idx}/ClassPredictor/weights`], conv_13: extractConvPairParams(13)
bias: weightMap[`Prediction/BoxPredictor_${idx}/ClassPredictor/biases`]
} }
} }
if (!isTensor4D(params.box_encoding_predictor_params.filters)) { function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {
throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/weights] to be a Tensor4D, instead have ${params.box_encoding_predictor_params.filters}`) 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)) { return { filters, 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)) { function extractBoxPredictorParams(idx: number): BoxPredictionParams {
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)) { const box_encoding_predictor = extractConvParams(
throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/ClassPredictor/biases] to be a Tensor1D, instead have ${params.class_predictor_params.bias}`) `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 { function extractPredictionLayerParams(): PredictionLayerParams {
return { return {
conv_0_params: extractPointwiseConvParams('Prediction', 0), conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
conv_1_params: extractPointwiseConvParams('Prediction', 1), conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
conv_2_params: extractPointwiseConvParams('Prediction', 2), conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
conv_3_params: extractPointwiseConvParams('Prediction', 3), conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
conv_4_params: extractPointwiseConvParams('Prediction', 4), conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
conv_5_params: extractPointwiseConvParams('Prediction', 5), conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
conv_6_params: extractPointwiseConvParams('Prediction', 6), conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
conv_7_params: extractPointwiseConvParams('Prediction', 7), conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
box_predictor_0_params: extractBoxPredictorParams(0), box_predictor_0: extractBoxPredictorParams(0),
box_predictor_1_params: extractBoxPredictorParams(1), box_predictor_1: extractBoxPredictorParams(1),
box_predictor_2_params: extractBoxPredictorParams(2), box_predictor_2: extractBoxPredictorParams(2),
box_predictor_3_params: extractBoxPredictorParams(3), box_predictor_3: extractBoxPredictorParams(3),
box_predictor_4_params: extractBoxPredictorParams(4), box_predictor_4: extractBoxPredictorParams(4),
box_predictor_5_params: extractBoxPredictorParams(5) box_predictor_5: extractBoxPredictorParams(5)
} }
} }
...@@ -124,24 +110,34 @@ function extractorsFactory(weightMap: any) { ...@@ -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 weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = []
const { const {
extractMobilenetV1Params, extractMobilenetV1Params,
extractPredictionLayerParams extractPredictionLayerParams
} = extractorsFactory(weightMap) } = extractorsFactory(weightMap, paramMappings)
const extra_dim = weightMap['Output/extra_dim'] const extra_dim = weightMap['Output/extra_dim']
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' })
if (!isTensor3D(extra_dim)) { if (!isTensor3D(extra_dim)) {
throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`) throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`)
} }
return { const params = {
mobilenetv1_params: extractMobilenetV1Params(), mobilenetv1: extractMobilenetV1Params(),
prediction_layer_params: extractPredictionLayerParams(), prediction_layer: extractPredictionLayerParams(),
output_layer_params: { output_layer: {
extra_dim 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) { ...@@ -34,13 +34,29 @@ export function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {
return tf.tidy(() => { return tf.tidy(() => {
let conv11 = null 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 layerIdx = i + 1
const depthwiseConvStrides = getStridesForLayerIdx(layerIdx) const depthwiseConvStrides = getStridesForLayerIdx(layerIdx)
out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides) out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides)
out = pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]) out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1])
if (layerIdx === 11) { if (layerIdx === 11) {
conv11 = out conv11 = out
} }
......
...@@ -11,21 +11,21 @@ export function predictionLayer( ...@@ -11,21 +11,21 @@ export function predictionLayer(
) { ) {
return tf.tidy(() => { return tf.tidy(() => {
const conv0 = pointwiseConvLayer(x, params.conv_0_params, [1, 1]) const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1])
const conv1 = pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]) const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2])
const conv2 = pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]) const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1])
const conv3 = pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]) const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2])
const conv4 = pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]) const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1])
const conv5 = pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]) const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2])
const conv6 = pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]) const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1])
const conv7 = pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]) const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2])
const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0_params) const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0)
const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1_params) const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1)
const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2_params) const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2)
const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3_params) const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3)
const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4_params) const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4)
const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5_params) const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5)
const boxPredictions = tf.concat([ const boxPredictions = tf.concat([
boxPrediction0.boxPredictionEncoding, boxPrediction0.boxPredictionEncoding,
......
...@@ -18,37 +18,49 @@ export namespace MobileNetV1 { ...@@ -18,37 +18,49 @@ export namespace MobileNetV1 {
} }
export type ConvPairParams = { export type ConvPairParams = {
depthwise_conv_params: DepthwiseConvParams depthwise_conv: DepthwiseConvParams
pointwise_conv_params: PointwiseConvParams pointwise_conv: PointwiseConvParams
} }
export type Params = { export type Params = {
conv_0_params: PointwiseConvParams conv_0: PointwiseConvParams
conv_pair_params: ConvPairParams[] 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 = { export type BoxPredictionParams = {
box_encoding_predictor_params: ConvParams box_encoding_predictor: ConvParams
class_predictor_params: ConvParams class_predictor: ConvParams
} }
export type PredictionLayerParams = { export type PredictionLayerParams = {
conv_0_params: PointwiseConvParams conv_0: PointwiseConvParams
conv_1_params: PointwiseConvParams conv_1: PointwiseConvParams
conv_2_params: PointwiseConvParams conv_2: PointwiseConvParams
conv_3_params: PointwiseConvParams conv_3: PointwiseConvParams
conv_4_params: PointwiseConvParams conv_4: PointwiseConvParams
conv_5_params: PointwiseConvParams conv_5: PointwiseConvParams
conv_6_params: PointwiseConvParams conv_6: PointwiseConvParams
conv_7_params: PointwiseConvParams conv_7: PointwiseConvParams
box_predictor_0_params: BoxPredictionParams box_predictor_0: BoxPredictionParams
box_predictor_1_params: BoxPredictionParams box_predictor_1: BoxPredictionParams
box_predictor_2_params: BoxPredictionParams box_predictor_2: BoxPredictionParams
box_predictor_3_params: BoxPredictionParams box_predictor_3: BoxPredictionParams
box_predictor_4_params: BoxPredictionParams box_predictor_4: BoxPredictionParams
box_predictor_5_params: BoxPredictionParams box_predictor_5: BoxPredictionParams
} }
export type OutputLayerParams = { export type OutputLayerParams = {
...@@ -56,7 +68,7 @@ export type OutputLayerParams = { ...@@ -56,7 +68,7 @@ export type OutputLayerParams = {
} }
export type NetParams = { export type NetParams = {
mobilenetv1_params: MobileNetV1.Params, mobilenetv1: MobileNetV1.Params,
prediction_layer_params: PredictionLayerParams, prediction_layer: PredictionLayerParams,
output_layer_params: OutputLayerParams output_layer: OutputLayerParams
} }
...@@ -24,36 +24,13 @@ function maxPool(x: tf.Tensor4D, strides: [number, number] = [2, 2]): tf.Tensor4 ...@@ -24,36 +24,13 @@ function maxPool(x: tf.Tensor4D, strides: [number, number] = [2, 2]): tf.Tensor4
export class FaceLandmarkNet extends NeuralNetwork<NetParams> { export class FaceLandmarkNet extends NeuralNetwork<NetParams> {
public async load(weightsOrUrl: Float32Array | string | undefined): Promise<void> { constructor() {
if (weightsOrUrl instanceof Float32Array) { super('FaceLandmarkNet')
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
} }
public forwardInput(input: NetInput): tf.Tensor2D { public forwardInput(input: NetInput): tf.Tensor2D {
const params = this._params
const { params } = this
if (!params) { if (!params) {
throw new Error('FaceLandmarkNet - load model before inference') throw new Error('FaceLandmarkNet - load model before inference')
...@@ -62,20 +39,20 @@ export class FaceLandmarkNet extends NeuralNetwork<NetParams> { ...@@ -62,20 +39,20 @@ export class FaceLandmarkNet extends NeuralNetwork<NetParams> {
return tf.tidy(() => { return tf.tidy(() => {
const batchTensor = input.toBatchTensor(128, true) const batchTensor = input.toBatchTensor(128, true)
let out = conv(batchTensor, params.conv0_params) let out = conv(batchTensor, params.conv0)
out = maxPool(out) out = maxPool(out)
out = conv(out, params.conv1_params) out = conv(out, params.conv1)
out = conv(out, params.conv2_params) out = conv(out, params.conv2)
out = maxPool(out) out = maxPool(out)
out = conv(out, params.conv3_params) out = conv(out, params.conv3)
out = conv(out, params.conv4_params) out = conv(out, params.conv4)
out = maxPool(out) out = maxPool(out)
out = conv(out, params.conv5_params) out = conv(out, params.conv5)
out = conv(out, params.conv6_params) out = conv(out, params.conv6)
out = maxPool(out, [1, 1]) out = maxPool(out, [1, 1])
out = conv(out, params.conv7_params) out = conv(out, params.conv7)
const fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)) const fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0))
const fc1 = fullyConnectedLayer(fc0, params.fc1_params) const fc1 = fullyConnectedLayer(fc0, params.fc1)
const createInterleavedTensor = (fillX: number, fillY: number) => const createInterleavedTensor = (fillX: number, fillY: number) =>
tf.stack([ tf.stack([
...@@ -145,4 +122,12 @@ export class FaceLandmarkNet extends NeuralNetwork<NetParams> { ...@@ -145,4 +122,12 @@ export class FaceLandmarkNet extends NeuralNetwork<NetParams> {
? landmarksForBatch ? landmarksForBatch
: landmarksForBatch[0] : 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 * as tf from '@tensorflow/tfjs-core';
import { extractConvParamsFactory } from '../commons/extractConvParamsFactory';
import { extractWeightsFactory } from '../commons/extractWeightsFactory'; import { extractWeightsFactory } from '../commons/extractWeightsFactory';
import { ParamMapping } from '../commons/types'; import { ConvParams, ParamMapping } from '../commons/types';
import { FCParams, NetParams } from './types'; import { FCParams, NetParams } from './types';
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } { export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: ParamMapping[] = []
const { const {
...@@ -13,9 +13,29 @@ export function extractParams(weights: Float32Array): { params: NetParams, param ...@@ -13,9 +13,29 @@ export function extractParams(weights: Float32Array): { params: NetParams, param
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = 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 { function extractFcParams(channelsIn: number, channelsOut: number, mappedPrefix: string): FCParams {
const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]) const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut])
const fc_bias = tf.tensor1d(extractWeights(channelsOut)) const fc_bias = tf.tensor1d(extractWeights(channelsOut))
...@@ -30,16 +50,16 @@ export function extractParams(weights: Float32Array): { params: NetParams, param ...@@ -30,16 +50,16 @@ export function extractParams(weights: Float32Array): { params: NetParams, param
} }
} }
const conv0_params = extractConvParams(3, 32, 3, 'conv0_params') const conv0 = extractConvParams(3, 32, 3, 'conv0')
const conv1_params = extractConvParams(32, 64, 3, 'conv1_params') const conv1 = extractConvParams(32, 64, 3, 'conv1')
const conv2_params = extractConvParams(64, 64, 3, 'conv2_params') const conv2 = extractConvParams(64, 64, 3, 'conv2')
const conv3_params = extractConvParams(64, 64, 3, 'conv3_params') const conv3 = extractConvParams(64, 64, 3, 'conv3')
const conv4_params = extractConvParams(64, 64, 3, 'conv4_params') const conv4 = extractConvParams(64, 64, 3, 'conv4')
const conv5_params = extractConvParams(64, 128, 3, 'conv5_params') const conv5 = extractConvParams(64, 128, 3, 'conv5')
const conv6_params = extractConvParams(128, 128, 3, 'conv6_params') const conv6 = extractConvParams(128, 128, 3, 'conv6')
const conv7_params = extractConvParams(128, 256, 3, 'conv7_params') const conv7 = extractConvParams(128, 256, 3, 'conv7')
const fc0_params = extractFcParams(6400, 1024, 'fc0_params') const fc0 = extractFcParams(6400, 1024, 'fc0')
const fc1_params = extractFcParams(1024, 136, 'fc1_params') const fc1 = extractFcParams(1024, 136, 'fc1')
if (getRemainingWeights().length !== 0) { if (getRemainingWeights().length !== 0) {
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`) throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)
...@@ -48,16 +68,16 @@ export function extractParams(weights: Float32Array): { params: NetParams, param ...@@ -48,16 +68,16 @@ export function extractParams(weights: Float32Array): { params: NetParams, param
return { return {
paramMappings, paramMappings,
params: { params: {
conv0_params, conv0,
conv1_params, conv1,
conv2_params, conv2,
conv3_params, conv3,
conv4_params, conv4,
conv5_params, conv5,
conv6_params, conv6,
conv7_params, conv7,
fc0_params, fc0,
fc1_params fc1
} }
} }
} }
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; 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 { loadWeightMap } from '../commons/loadWeightMap';
import { ConvParams, ParamMapping } from '../commons/types'; import { ConvParams, ParamMapping } from '../commons/types';
import { FCParams, NetParams } from './types'; import { FCParams, NetParams } from './types';
...@@ -9,30 +10,20 @@ const DEFAULT_MODEL_NAME = 'face_landmark_68_model' ...@@ -9,30 +10,20 @@ const DEFAULT_MODEL_NAME = 'face_landmark_68_model'
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
function extractConvParams(prefix: string, mappedPrefix: string): ConvParams { function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {
const filtersEntry = extractWeightEntry(weightMap, `${prefix}/kernel`, 4) const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/kernel`, 4, `${mappedPrefix}/filters`)
const biasEntry = extractWeightEntry(weightMap, `${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1, `${mappedPrefix}/bias`)
paramMappings.push(
{ originalPath: filtersEntry.path, paramPath: `${mappedPrefix}/filters` }, return { filters, bias }
{ originalPath: biasEntry.path, paramPath: `${mappedPrefix}/bias` }
)
return {
filters: filtersEntry.tensor as tf.Tensor4D,
bias: biasEntry.tensor as tf.Tensor1D
}
} }
function extractFcParams(prefix: string, mappedPrefix: string): FCParams { function extractFcParams(prefix: string, mappedPrefix: string): FCParams {
const weightsEntry = extractWeightEntry(weightMap, `${prefix}/kernel`, 2) const weights = extractWeightEntry<tf.Tensor2D>(`${prefix}/kernel`, 2, `${mappedPrefix}/weights`)
const biasEntry = extractWeightEntry(weightMap, `${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1, `${mappedPrefix}/bias`)
paramMappings.push(
{ originalPath: weightsEntry.path, paramPath: `${mappedPrefix}/weights` }, return { weights, bias }
{ originalPath: biasEntry.path, paramPath: `${mappedPrefix}/bias` }
)
return {
weights: weightsEntry.tensor as tf.Tensor2D,
bias: biasEntry.tensor as tf.Tensor1D
}
} }
return { return {
...@@ -54,17 +45,19 @@ export async function loadQuantizedParams( ...@@ -54,17 +45,19 @@ export async function loadQuantizedParams(
} = extractorsFactory(weightMap, paramMappings) } = extractorsFactory(weightMap, paramMappings)
const params = { const params = {
conv0_params: extractConvParams('conv2d_0', 'conv0_params'), conv0: extractConvParams('conv2d_0', 'conv0'),
conv1_params: extractConvParams('conv2d_1', 'conv1_params'), conv1: extractConvParams('conv2d_1', 'conv1'),
conv2_params: extractConvParams('conv2d_2', 'conv2_params'), conv2: extractConvParams('conv2d_2', 'conv2'),
conv3_params: extractConvParams('conv2d_3', 'conv3_params'), conv3: extractConvParams('conv2d_3', 'conv3'),
conv4_params: extractConvParams('conv2d_4', 'conv4_params'), conv4: extractConvParams('conv2d_4', 'conv4'),
conv5_params: extractConvParams('conv2d_5', 'conv5_params'), conv5: extractConvParams('conv2d_5', 'conv5'),
conv6_params: extractConvParams('conv2d_6', 'conv6_params'), conv6: extractConvParams('conv2d_6', 'conv6'),
conv7_params: extractConvParams('conv2d_7', 'conv7_params'), conv7: extractConvParams('conv2d_7', 'conv7'),
fc0_params: extractFcParams('dense', 'fc0_params'), fc0: extractFcParams('dense', 'fc0'),
fc1_params: extractFcParams('logits', 'fc1_params') fc1: extractFcParams('logits', 'fc1')
} }
disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings } return { params, paramMappings }
} }
\ No newline at end of file
...@@ -8,14 +8,14 @@ export type FCParams = { ...@@ -8,14 +8,14 @@ export type FCParams = {
} }
export type NetParams = { export type NetParams = {
conv0_params: ConvParams conv0: ConvParams
conv1_params: ConvParams conv1: ConvParams
conv2_params: ConvParams conv2: ConvParams
conv3_params: ConvParams conv3: ConvParams
conv4_params: ConvParams conv4: ConvParams
conv5_params: ConvParams conv5: ConvParams
conv6_params: ConvParams conv6: ConvParams
conv7_params: ConvParams conv7: ConvParams
fc0_params: FCParams fc0: FCParams
fc1_params: FCParams fc1: FCParams
} }
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../commons/NeuralNetwork';
import { NetInput } from '../NetInput'; import { NetInput } from '../NetInput';
import { toNetInput } from '../toNetInput'; import { toNetInput } from '../toNetInput';
import { TNetInput } from '../types'; import { TNetInput } from '../types';
...@@ -10,28 +11,17 @@ import { normalize } from './normalize'; ...@@ -10,28 +11,17 @@ import { normalize } from './normalize';
import { residual, residualDown } from './residualLayer'; import { residual, residualDown } from './residualLayer';
import { NetParams } from './types'; import { NetParams } from './types';
export class FaceRecognitionNet { export class FaceRecognitionNet extends NeuralNetwork<NetParams> {
private _params: NetParams constructor() {
super('FaceRecognitionNet')
public async load(weightsOrUrl: Float32Array | string | undefined): Promise<void> {
if (weightsOrUrl instanceof Float32Array) {
this.extractWeights(weightsOrUrl)
return
} }
if (weightsOrUrl && typeof weightsOrUrl !== 'string') { public forwardInput(input: NetInput): tf.Tensor2D {
throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array')
}
this._params = await loadQuantizedParams(weightsOrUrl)
}
public extractWeights(weights: Float32Array) { const { params } = this
this._params = extractParams(weights)
}
public forwardInput(input: NetInput): tf.Tensor2D { if (!params) {
if (!this._params) {
throw new Error('FaceRecognitionNet - load model before inference') throw new Error('FaceRecognitionNet - load model before inference')
} }
...@@ -40,29 +30,29 @@ export class FaceRecognitionNet { ...@@ -40,29 +30,29 @@ export class FaceRecognitionNet {
const normalized = normalize(batchTensor) 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 = tf.maxPool(out, 3, 2, 'valid')
out = residual(out, this._params.conv32_1) out = residual(out, params.conv32_1)
out = residual(out, this._params.conv32_2) out = residual(out, params.conv32_2)
out = residual(out, this._params.conv32_3) out = residual(out, params.conv32_3)
out = residualDown(out, this._params.conv64_down) out = residualDown(out, params.conv64_down)
out = residual(out, this._params.conv64_1) out = residual(out, params.conv64_1)
out = residual(out, this._params.conv64_2) out = residual(out, params.conv64_2)
out = residual(out, this._params.conv64_3) out = residual(out, params.conv64_3)
out = residualDown(out, this._params.conv128_down) out = residualDown(out, params.conv128_down)
out = residual(out, this._params.conv128_1) out = residual(out, params.conv128_1)
out = residual(out, this._params.conv128_2) out = residual(out, params.conv128_2)
out = residualDown(out, this._params.conv256_down) out = residualDown(out, params.conv256_down)
out = residual(out, this._params.conv256_1) out = residual(out, params.conv256_1)
out = residual(out, this._params.conv256_2) out = residual(out, params.conv256_2)
out = residualDown(out, this._params.conv256_down_out) out = residualDown(out, params.conv256_down_out)
const globalAvg = out.mean([1, 2]) as tf.Tensor2D 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 return fullyConnected
}) })
...@@ -89,4 +79,12 @@ export class FaceRecognitionNet { ...@@ -89,4 +79,12 @@ export class FaceRecognitionNet {
? faceDescriptorsForBatch ? faceDescriptorsForBatch
: faceDescriptorsForBatch[0] : 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 * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory } from '../commons/extractWeightsFactory'; import { extractWeightsFactory } from '../commons/extractWeightsFactory';
import { ExtractWeightsFunction } from '../commons/types'; import { ConvParams, ExtractWeightsFunction, ParamMapping } from '../commons/types';
import { isFloat } from '../utils'; import { isFloat } from '../utils';
import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types'; 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 { function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {
const weights = extractWeights(numFilterValues) const weights = extractWeights(numFilterValues)
...@@ -15,15 +15,42 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { ...@@ -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}`) 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]), tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),
[2, 3, 1, 0] [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 weights = tf.tensor1d(extractWeights(numWeights))
const biases = tf.tensor1d(extractWeights(numWeights)) const biases = tf.tensor1d(extractWeights(numWeights))
paramMappings.push(
{ paramPath: `${mappedPrefix}/weights` },
{ paramPath: `${mappedPrefix}/biases` }
)
return { return {
weights, weights,
biases biases
...@@ -33,34 +60,28 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { ...@@ -33,34 +60,28 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) {
function extractConvLayerParams( function extractConvLayerParams(
numFilterValues: number, numFilterValues: number,
numFilters: number, numFilters: number,
filterSize: number filterSize: number,
mappedPrefix: string
): ConvLayerParams { ): ConvLayerParams {
const conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize)
const conv_bias = tf.tensor1d(extractWeights(numFilters))
const scale = extractScaleLayerParams(numFilters)
return { const conv = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`)
conv: { const scale = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`)
filters: conv_filters,
bias: conv_bias return { conv, scale }
},
scale
}
} }
function extractResidualLayerParams( function extractResidualLayerParams(
numFilterValues: number, numFilterValues: number,
numFilters: number, numFilters: number,
filterSize: number, filterSize: number,
mappedPrefix: string,
isDown: boolean = false isDown: boolean = false
): ResidualLayerParams { ): ResidualLayerParams {
const conv1: ConvLayerParams = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize)
const conv2: ConvLayerParams = extractConvLayerParams(numFilterValues, numFilters, filterSize)
return { const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`)
conv1, const conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`)
conv2
} return { conv1, conv2 }
} }
return { return {
...@@ -70,43 +91,49 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { ...@@ -70,43 +91,49 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) {
} }
export function extractParams(weights: Float32Array): NetParams { export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = extractWeightsFactory(weights)
const paramMappings: ParamMapping[] = []
const { const {
extractConvLayerParams, extractConvLayerParams,
extractResidualLayerParams extractResidualLayerParams
} = extractorsFactory(extractWeights) } = extractorsFactory(extractWeights, paramMappings)
const conv32_down = extractConvLayerParams(4704, 32, 7) const conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down')
const conv32_1 = extractResidualLayerParams(9216, 32, 3) const conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1')
const conv32_2 = extractResidualLayerParams(9216, 32, 3) const conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2')
const conv32_3 = extractResidualLayerParams(9216, 32, 3) const conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3')
const conv64_down = extractResidualLayerParams(36864, 64, 3, true) const conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true)
const conv64_1 = extractResidualLayerParams(36864, 64, 3) const conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1')
const conv64_2 = extractResidualLayerParams(36864, 64, 3) const conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2')
const conv64_3 = extractResidualLayerParams(36864, 64, 3) const conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3')
const conv128_down = extractResidualLayerParams(147456, 128, 3, true) const conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true)
const conv128_1 = extractResidualLayerParams(147456, 128, 3) const conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1')
const conv128_2 = extractResidualLayerParams(147456, 128, 3) const conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2')
const conv256_down = extractResidualLayerParams(589824, 256, 3, true) const conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true)
const conv256_1 = extractResidualLayerParams(589824, 256, 3) const conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1')
const conv256_2 = extractResidualLayerParams(589824, 256, 3) const conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2')
const conv256_down_out = extractResidualLayerParams(589824, 256, 3) 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) { if (getRemainingWeights().length !== 0) {
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`) throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)
} }
return { const params = {
conv32_down, conv32_down,
conv32_1, conv32_1,
conv32_2, conv32_2,
...@@ -124,4 +151,6 @@ export function extractParams(weights: Float32Array): NetParams { ...@@ -124,4 +151,6 @@ export function extractParams(weights: Float32Array): NetParams {
conv256_down_out, conv256_down_out,
fc 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 { 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' const DEFAULT_MODEL_NAME = 'face_recognition_model'
function extractorsFactory(weightMap: any) { function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
function extractScaleLayerParams(prefix: string): ScaleLayerParams { const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
const params = {
weights: weightMap[`${prefix}/scale/weights`],
biases: weightMap[`${prefix}/scale/biases`]
}
if (!isTensor1D(params.weights)) { function extractScaleLayerParams(prefix: string): ScaleLayerParams {
throw new Error(`expected weightMap[${prefix}/scale/weights] to be a Tensor1D, instead have ${params.weights}`)
}
if (!isTensor1D(params.biases)) { const weights = extractWeightEntry<tf.Tensor1D>(`${prefix}/scale/weights`, 1)
throw new Error(`expected weightMap[${prefix}/scale/biases] to be a Tensor1D, instead have ${params.biases}`) const biases = extractWeightEntry<tf.Tensor1D>(`${prefix}/scale/biases`, 1)
}
return params return { weights, biases }
} }
function extractConvLayerParams(prefix: string): ConvLayerParams { function extractConvLayerParams(prefix: string): ConvLayerParams {
const params = {
filters: weightMap[`${prefix}/conv/filters`],
bias: weightMap[`${prefix}/conv/bias`]
}
if (!isTensor4D(params.filters)) { const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/conv/filters`, 4)
throw new Error(`expected weightMap[${prefix}/conv/filters] to be a Tensor1D, instead have ${params.filters}`) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/conv/bias`, 1)
} const scale = extractScaleLayerParams(prefix)
if (!isTensor1D(params.bias)) { return { conv: { filters, bias }, scale }
throw new Error(`expected weightMap[${prefix}/conv/bias] to be a Tensor1D, instead have ${params.bias}`)
}
return {
conv: params,
scale: extractScaleLayerParams(prefix)
}
} }
function extractResidualLayerParams(prefix: string): ResidualLayerParams { function extractResidualLayerParams(prefix: string): ResidualLayerParams {
...@@ -57,13 +44,17 @@ function extractorsFactory(weightMap: any) { ...@@ -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 weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = []
const { const {
extractConvLayerParams, extractConvLayerParams,
extractResidualLayerParams extractResidualLayerParams
} = extractorsFactory(weightMap) } = extractorsFactory(weightMap, paramMappings)
const conv32_down = extractConvLayerParams('conv32_down') const conv32_down = extractConvLayerParams('conv32_down')
const conv32_1 = extractResidualLayerParams('conv32_1') const conv32_1 = extractResidualLayerParams('conv32_1')
...@@ -85,12 +76,13 @@ export async function loadQuantizedParams(uri: string | undefined): Promise<any> ...@@ -85,12 +76,13 @@ export async function loadQuantizedParams(uri: string | undefined): Promise<any>
const conv256_down_out = extractResidualLayerParams('conv256_down_out') const conv256_down_out = extractResidualLayerParams('conv256_down_out')
const fc = weightMap['fc'] const fc = weightMap['fc']
paramMappings.push({ originalPath: 'fc', paramPath: 'fc' })
if (!isTensor2D(fc)) { if (!isTensor2D(fc)) {
throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`) throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`)
} }
return { const params = {
conv32_down, conv32_down,
conv32_1, conv32_1,
conv32_2, conv32_2,
...@@ -108,4 +100,8 @@ export async function loadQuantizedParams(uri: string | undefined): Promise<any> ...@@ -108,4 +100,8 @@ export async function loadQuantizedParams(uri: string | undefined): Promise<any>
conv256_down_out, conv256_down_out,
fc 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 * as tf from '@tensorflow/tfjs-core';
import { NeuralNetwork } from '../../../src/commons/NeuralNetwork';
class FakeNeuralNetwork extends NeuralNetwork<any> { class FakeNeuralNetwork extends NeuralNetwork<any> {
constructor( constructor(
convFilter: tf.Tensor = tf.tensor(0), convFilter: tf.Tensor = tf.tensor(0),
convBias: tf.Tensor = tf.tensor(0), convBias: tf.Tensor = tf.tensor(0),
fcWeights: tf.Tensor = tf.tensor(0) fcWeights: tf.Tensor = tf.tensor(0)
) { ) {
super() super('FakeNeuralNetwork')
this._params = { this._params = {
conv: { conv: {
filter: convFilter, filter: convFilter,
......
import * as faceapi from '../../../src'; import * as faceapi from '../../../src';
import { FaceDetection } from '../../../src/faceDetectionNet/FaceDetection'; import { FaceDetection } from '../../../src/faceDetectionNet/FaceDetection';
import { IRect } from '../../../src/Rect'; import { IRect } from '../../../src/Rect';
import { expectMaxDelta } from '../../utils'; import { describeWithNets, expectAllTensorsReleased, expectMaxDelta } from '../../utils';
function expectRectClose( function expectRectClose(
result: IRect, result: IRect,
...@@ -33,19 +33,11 @@ describe('faceDetectionNet', () => { ...@@ -33,19 +33,11 @@ describe('faceDetectionNet', () => {
imgEl = await faceapi.bufferToImage(img) imgEl = await faceapi.bufferToImage(img)
}) })
describe('uncompressed weights', () => { describeWithNets('uncompressed weights', { withFaceDetectionNet: { quantized: false } }, ({ faceDetectionNet }) => {
let faceDetectionNet: faceapi.FaceDetectionNet
const expectedScores = [0.98, 0.89, 0.82, 0.75, 0.58, 0.55] const expectedScores = [0.98, 0.89, 0.82, 0.75, 0.58, 0.55]
const maxBoxDelta = 1 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 () => { it('scores > 0.8', async () => {
const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[] const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[]
...@@ -72,18 +64,11 @@ describe('faceDetectionNet', () => { ...@@ -72,18 +64,11 @@ describe('faceDetectionNet', () => {
}) })
describe('quantized weights', () => { describeWithNets('quantized weights', { withFaceDetectionNet: { quantized: true } }, ({ faceDetectionNet }) => {
let faceDetectionNet: faceapi.FaceDetectionNet
const expectedScores = [0.97, 0.88, 0.83, 0.82, 0.59, 0.52] const expectedScores = [0.97, 0.88, 0.83, 0.82, 0.59, 0.52]
const maxBoxDelta = 5 const maxBoxDelta = 5
beforeAll(async () => {
faceDetectionNet = new faceapi.FaceDetectionNet()
await faceDetectionNet.load('base/weights')
})
it('scores > 0.8', async () => { it('scores > 0.8', async () => {
const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[] const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[]
...@@ -110,4 +95,33 @@ describe('faceDetectionNet', () => { ...@@ -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'; ...@@ -5,7 +5,7 @@ import { isTensor3D } from '../../../src/commons/isTensor';
import { FaceLandmarks } from '../../../src/faceLandmarkNet/FaceLandmarks'; import { FaceLandmarks } from '../../../src/faceLandmarkNet/FaceLandmarks';
import { Point } from '../../../src/Point'; import { Point } from '../../../src/Point';
import { Dimensions, TMediaElement } from '../../../src/types'; 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 { NetInput } from '../../../src/NetInput';
import { toNetInput } from '../../../src'; import { toNetInput } from '../../../src';
...@@ -38,15 +38,7 @@ describe('faceLandmarkNet', () => { ...@@ -38,15 +38,7 @@ describe('faceLandmarkNet', () => {
faceLandmarkPositionsRect = await (await fetch('base/test/data/faceLandmarkPositionsRect.json')).json() faceLandmarkPositionsRect = await (await fetch('base/test/data/faceLandmarkPositionsRect.json')).json()
}) })
describe('uncompressed weights', () => { describeWithNets('uncompressed weights', { withFaceLandmarkNet: { quantized: false } }, ({ faceLandmarkNet }) => {
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)
})
it('computes face landmarks for squared input', async () => { it('computes face landmarks for squared input', async () => {
const { width, height } = imgEl1 const { width, height } = imgEl1
...@@ -78,14 +70,7 @@ describe('faceLandmarkNet', () => { ...@@ -78,14 +70,7 @@ describe('faceLandmarkNet', () => {
}) })
describe('quantized weights', () => { describeWithNets('quantized weights', { withFaceLandmarkNet: { quantized: true } }, ({ faceLandmarkNet }) => {
let faceLandmarkNet: faceapi.FaceLandmarkNet
beforeAll(async () => {
faceLandmarkNet = new faceapi.FaceLandmarkNet()
await faceLandmarkNet.load('base/weights')
})
it('computes face landmarks for squared input', async () => { it('computes face landmarks for squared input', async () => {
const { width, height } = imgEl1 const { width, height } = imgEl1
...@@ -117,15 +102,7 @@ describe('faceLandmarkNet', () => { ...@@ -117,15 +102,7 @@ describe('faceLandmarkNet', () => {
}) })
describe('batch inputs', () => { describeWithNets('batch inputs', { withFaceLandmarkNet: { quantized: false } }, ({ faceLandmarkNet }) => {
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)
})
it('computes face landmarks for batch of image elements', async () => { it('computes face landmarks for batch of image elements', async () => {
const inputs = [imgEl1, imgEl2, imgElRect] const inputs = [imgEl1, imgEl2, imgElRect]
...@@ -229,13 +206,31 @@ describe('faceLandmarkNet', () => { ...@@ -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', () => { describe('forwardInput', () => {
......
...@@ -2,7 +2,7 @@ import * as tf from '@tensorflow/tfjs-core'; ...@@ -2,7 +2,7 @@ import * as tf from '@tensorflow/tfjs-core';
import * as faceapi from '../../../src'; import * as faceapi from '../../../src';
import { NetInput } from '../../../src/NetInput'; import { NetInput } from '../../../src/NetInput';
import { expectAllTensorsReleased } from '../../utils'; import { expectAllTensorsReleased, describeWithNets } from '../../utils';
import { toNetInput } from '../../../src'; import { toNetInput } from '../../../src';
describe('faceRecognitionNet', () => { describe('faceRecognitionNet', () => {
...@@ -26,15 +26,7 @@ describe('faceRecognitionNet', () => { ...@@ -26,15 +26,7 @@ describe('faceRecognitionNet', () => {
faceDescriptorRect = await (await fetch('base/test/data/faceDescriptorRect.json')).json() faceDescriptorRect = await (await fetch('base/test/data/faceDescriptorRect.json')).json()
}) })
describe('uncompressed weights', () => { describeWithNets('uncompressed weights', { withFaceRecognitionNet: { quantized: false } }, ({ faceRecognitionNet }) => {
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)
})
it('computes face descriptor for squared input', async () => { it('computes face descriptor for squared input', async () => {
const result = await faceRecognitionNet.computeFaceDescriptor(imgEl1) as Float32Array const result = await faceRecognitionNet.computeFaceDescriptor(imgEl1) as Float32Array
...@@ -52,14 +44,7 @@ describe('faceRecognitionNet', () => { ...@@ -52,14 +44,7 @@ describe('faceRecognitionNet', () => {
// TODO: figure out why descriptors return NaN in the test cases // TODO: figure out why descriptors return NaN in the test cases
/* /*
describe('quantized weights', () => { describeWithNets('quantized weights', { withFaceRecognitionNet: { quantized: true } }, ({ faceRecognitionNet }) => {
let faceRecognitionNet: faceapi.FaceRecognitionNet
beforeAll(async () => {
faceRecognitionNet = new faceapi.FaceRecognitionNet()
await faceRecognitionNet.load('base/weights')
})
it('computes face descriptor for squared input', async () => { it('computes face descriptor for squared input', async () => {
const result = await faceRecognitionNet.computeFaceDescriptor(imgEl1) as Float32Array const result = await faceRecognitionNet.computeFaceDescriptor(imgEl1) as Float32Array
...@@ -76,15 +61,7 @@ describe('faceRecognitionNet', () => { ...@@ -76,15 +61,7 @@ describe('faceRecognitionNet', () => {
}) })
*/ */
describe('batch inputs', () => { describeWithNets('batch inputs', { withFaceRecognitionNet: { quantized: false } }, ({ faceRecognitionNet }) => {
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)
})
it('computes face descriptors for batch of image elements', async () => { it('computes face descriptors for batch of image elements', async () => {
const inputs = [imgEl1, imgEl2, imgElRect] const inputs = [imgEl1, imgEl2, imgElRect]
...@@ -156,14 +133,31 @@ describe('faceRecognitionNet', () => { ...@@ -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 res = await fetch('base/weights/uncompressed/face_recognition_model.weights')
const weights = new Float32Array(await res.arrayBuffer()) 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', () => { describe('forwardInput', () => {
...@@ -292,5 +286,4 @@ describe('faceRecognitionNet', () => { ...@@ -292,5 +286,4 @@ describe('faceRecognitionNet', () => {
}) })
}) })
}) })
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import * as faceapi from '../src/';
import { NeuralNetwork } from '../src/commons/NeuralNetwork';
export function zeros(length: number): Float32Array { export function zeros(length: number): Float32Array {
return new Float32Array(length) return new Float32Array(length)
} }
...@@ -21,3 +24,84 @@ export async function expectAllTensorsReleased(fn: () => any) { ...@@ -21,3 +24,84 @@ export async function expectAllTensorsReleased(fn: () => any) {
export function tensor3D() { export function tensor3D() {
return tf.tensor3d([[[0]]]) 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