Commit 4caa0f1a by vincent

check in latest build

parent cff49661
import { Dimensions, TMediaElement } from './types'; import * as tf from '@tensorflow/tfjs-core';
import { Point } from './Point';
import { TResolvedNetInput } from './types';
export declare class NetInput { export declare class NetInput {
private _canvases; private _inputs;
constructor(medias: Array<TMediaElement>, dims?: Dimensions); private _isManaged;
private initCanvas(media, dims?); private _inputDimensions;
readonly canvases: HTMLCanvasElement[]; private _paddings;
readonly width: number; constructor(inputs: tf.Tensor4D | Array<TResolvedNetInput>);
readonly height: number; readonly inputs: tf.Tensor3D[];
readonly dims: Dimensions | null; readonly isManaged: boolean;
readonly batchSize: number;
readonly inputDimensions: number[][];
readonly paddings: Point[];
getInputDimensions(batchIdx: number): number[];
getInputHeight(batchIdx: number): number;
getInputWidth(batchIdx: number): number;
getPaddings(batchIdx: number): Point;
toBatchTensor(inputSize: number, isCenterInputs?: boolean): tf.Tensor4D;
/**
* By setting the isManaged flag, all newly created tensors will be automatically
* automatically disposed after the batch tensor has been created
*/
managed(): this;
dispose(): void;
} }
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core");
var isTensor_1 = require("./commons/isTensor");
var padToSquare_1 = require("./padToSquare");
var Point_1 = require("./Point");
var utils_1 = require("./utils"); var utils_1 = require("./utils");
var NetInput = /** @class */ (function () { var NetInput = /** @class */ (function () {
function NetInput(medias, dims) { function NetInput(inputs) {
var _this = this; this._inputs = [];
this._canvases = []; this._isManaged = false;
medias.forEach(function (m) { return _this.initCanvas(m, dims); }); this._inputDimensions = [];
this._paddings = [];
if (isTensor_1.isTensor4D(inputs)) {
this._inputs = tf.unstack(inputs);
} }
NetInput.prototype.initCanvas = function (media, dims) { if (Array.isArray(inputs)) {
if (media instanceof HTMLCanvasElement) { this._inputs = inputs.map(function (input) {
this._canvases.push(media); if (isTensor_1.isTensor3D(input)) {
return; // TODO: make sure not to dispose original tensors passed in by the user
return tf.clone(input);
} }
// if input is batch type, make sure every canvas has the same dimensions return tf.fromPixels(input instanceof HTMLCanvasElement ? input : utils_1.createCanvasFromMedia(input));
var canvasDims = this.dims || dims; });
this._canvases.push(utils_1.createCanvasFromMedia(media, canvasDims)); }
}; this._inputDimensions = this._inputs.map(function (t) { return t.shape; });
Object.defineProperty(NetInput.prototype, "canvases", { }
Object.defineProperty(NetInput.prototype, "inputs", {
get: function () { get: function () {
return this._canvases; return this._inputs;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "width", { Object.defineProperty(NetInput.prototype, "isManaged", {
get: function () { get: function () {
return (this._canvases[0] || {}).width; return this._isManaged;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "height", { Object.defineProperty(NetInput.prototype, "batchSize", {
get: function () { get: function () {
return (this._canvases[0] || {}).height; return this._inputs.length;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "dims", { Object.defineProperty(NetInput.prototype, "inputDimensions", {
get: function () { get: function () {
var _a = this, width = _a.width, height = _a.height; return this._inputDimensions;
return (width > 0 && height > 0) ? { width: width, height: height } : null;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "paddings", {
get: function () {
return this._paddings;
},
enumerable: true,
configurable: true
});
NetInput.prototype.getInputDimensions = function (batchIdx) {
return this._inputDimensions[batchIdx];
};
NetInput.prototype.getInputHeight = function (batchIdx) {
return this._inputDimensions[batchIdx][0];
};
NetInput.prototype.getInputWidth = function (batchIdx) {
return this._inputDimensions[batchIdx][1];
};
NetInput.prototype.getPaddings = function (batchIdx) {
return this._paddings[batchIdx];
};
NetInput.prototype.toBatchTensor = function (inputSize, isCenterInputs) {
var _this = this;
if (isCenterInputs === void 0) { isCenterInputs = true; }
return tf.tidy(function () {
var inputTensors = _this._inputs.map(function (inputTensor) {
var _a = inputTensor.shape, originalHeight = _a[0], originalWidth = _a[1];
var imgTensor = inputTensor.expandDims().toFloat();
imgTensor = padToSquare_1.padToSquare(imgTensor, isCenterInputs);
var _b = imgTensor.shape.slice(1), heightAfterPadding = _b[0], widthAfterPadding = _b[1];
if (heightAfterPadding !== inputSize || widthAfterPadding !== inputSize) {
imgTensor = tf.image.resizeBilinear(imgTensor, [inputSize, inputSize]);
}
_this._paddings.push(new Point_1.Point(widthAfterPadding - originalWidth, heightAfterPadding - originalHeight));
return imgTensor;
});
var batchTensor = tf.stack(inputTensors).as4D(_this.batchSize, inputSize, inputSize, 3);
if (_this.isManaged) {
_this.dispose();
}
return batchTensor;
});
};
/**
* By setting the isManaged flag, all newly created tensors will be automatically
* automatically disposed after the batch tensor has been created
*/
NetInput.prototype.managed = function () {
this._isManaged = true;
return this;
};
NetInput.prototype.dispose = function () {
this._inputs.forEach(function (t) { return t.dispose(); });
};
return NetInput; return NetInput;
}()); }());
exports.NetInput = NetInput; exports.NetInput = NetInput;
......
{"version":3,"file":"NetInput.js","sourceRoot":"","sources":["../src/NetInput.ts"],"names":[],"mappings":";;AACA,iCAAgD;AAEhD;IAGE,kBACE,MAA4B,EAC5B,IAAiB;QAFnB,iBAMC;QAFC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,MAAM,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,KAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAxB,CAAwB,CAAC,CAAA;IAC/C,CAAC;IAEO,6BAAU,GAAlB,UAAmB,KAAoB,EAAE,IAAiB;QACxD,IAAI,KAAK,YAAY,iBAAiB,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC1B,OAAM;SACP;QAED,yEAAyE;QACzE,IAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,6BAAqB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,sBAAW,8BAAQ;aAAnB;YACE,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;;;OAAA;IAED,sBAAW,2BAAK;aAAhB;YACE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAA;QACxC,CAAC;;;OAAA;IAED,sBAAW,4BAAM;aAAjB;YACE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QACzC,CAAC;;;OAAA;IAED,sBAAW,0BAAI;aAAf;YACQ,IAAA,SAAwB,EAAtB,gBAAK,EAAE,kBAAM,CAAS;YAC9B,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC7D,CAAC;;;OAAA;IACH,eAAC;AAAD,CAAC,AAtCD,IAsCC;AAtCY,4BAAQ"} {"version":3,"file":"NetInput.js","sourceRoot":"","sources":["../src/NetInput.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet'; import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet';
import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet'; import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet';
import { FaceRecognitionNet } from './faceRecognitionNet/FaceRecognitionNet'; import { FaceRecognitionNet } from './faceRecognitionNet/FaceRecognitionNet';
import { FullFaceDescription } from './FullFaceDescription'; import { FullFaceDescription } from './FullFaceDescription';
import { NetInput } from './NetInput'; import { TNetInput } from './types';
export declare function allFacesFactory(detectionNet: FaceDetectionNet, landmarkNet: FaceLandmarkNet, recognitionNet: FaceRecognitionNet): (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor<tf.Rank> | NetInput, minConfidence: number) => Promise<FullFaceDescription[]>; export declare function allFacesFactory(detectionNet: FaceDetectionNet, landmarkNet: FaceLandmarkNet, recognitionNet: FaceRecognitionNet): (input: TNetInput, minConfidence: number) => Promise<FullFaceDescription[]>;
...@@ -12,21 +12,25 @@ function allFacesFactory(detectionNet, landmarkNet, recognitionNet) { ...@@ -12,21 +12,25 @@ function allFacesFactory(detectionNet, landmarkNet, recognitionNet) {
case 0: return [4 /*yield*/, detectionNet.locateFaces(input, minConfidence)]; case 0: return [4 /*yield*/, detectionNet.locateFaces(input, minConfidence)];
case 1: case 1:
detections = _a.sent(); detections = _a.sent();
return [4 /*yield*/, extractFaceTensors_1.extractFaceTensors(input, detections)]; return [4 /*yield*/, extractFaceTensors_1.extractFaceTensors(input, detections)
/**
const faceLandmarksByFace = await Promise.all(faceTensors.map(
faceTensor => landmarkNet.detectLandmarks(faceTensor)
)) as FaceLandmarks[]
*/
];
case 2: case 2:
faceTensors = _a.sent(); faceTensors = _a.sent();
return [4 /*yield*/, Promise.all(faceTensors.map(function (faceTensor) { return landmarkNet.detectLandmarks(faceTensor); }))]; return [4 /*yield*/, landmarkNet.detectLandmarks(faceTensors)];
case 3: case 3:
faceLandmarksByFace = _a.sent(); faceLandmarksByFace = _a.sent();
faceTensors.forEach(function (t) { return t.dispose(); }); faceTensors.forEach(function (t) { return t.dispose(); });
return [4 /*yield*/, Promise.all(faceLandmarksByFace.map(function (landmarks, i) { return landmarks.align(detections[i].getBox()); }))]; alignedFaceBoxes = faceLandmarksByFace.map(function (landmarks, i) { return landmarks.align(detections[i].getBox()); });
case 4:
alignedFaceBoxes = _a.sent();
return [4 /*yield*/, extractFaceTensors_1.extractFaceTensors(input, alignedFaceBoxes)]; return [4 /*yield*/, extractFaceTensors_1.extractFaceTensors(input, alignedFaceBoxes)];
case 5: case 4:
alignedFaceTensors = _a.sent(); alignedFaceTensors = _a.sent();
return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))]; return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))];
case 6: case 5:
descriptors = _a.sent(); descriptors = _a.sent();
alignedFaceTensors.forEach(function (t) { return t.dispose(); }); alignedFaceTensors.forEach(function (t) { return t.dispose(); });
return [2 /*return*/, detections.map(function (detection, i) { return [2 /*return*/, detections.map(function (detection, i) {
......
{"version":3,"file":"allFacesFactory.js","sourceRoot":"","sources":["../src/allFacesFactory.ts"],"names":[],"mappings":";;;AAEA,2DAA0D;AAI1D,6DAA4D;AAI5D,yBACE,YAA8B,EAC9B,WAA4B,EAC5B,cAAkC;IAElC,OAAO,UACL,KAAuC,EACvC,aAAqB;;;;;4BAGF,qBAAM,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,EAAA;;wBAAjE,UAAU,GAAG,SAAoD;wBAEnD,qBAAM,uCAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,EAAA;;wBAAzD,WAAW,GAAG,SAA2C;wBACnC,qBAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAC3D,UAAA,UAAU,IAAI,OAAA,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,EAAvC,CAAuC,CACtD,CAAC,EAAA;;wBAFI,mBAAmB,GAAG,SAE1B;wBACF,WAAW,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,EAAE,EAAX,CAAW,CAAC,CAAA;wBAEZ,qBAAM,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAChE,UAAC,SAAS,EAAE,CAAC,IAAK,OAAA,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAvC,CAAuC,CAC1D,CAAC,EAAA;;wBAFI,gBAAgB,GAAG,SAEvB;wBACyB,qBAAM,uCAAkB,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAA;;wBAAtE,kBAAkB,GAAG,SAAiD;wBAExD,qBAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAC1D,UAAA,UAAU,IAAI,OAAA,cAAc,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAhD,CAAgD,CAC/D,CAAC,EAAA;;wBAFI,WAAW,GAAG,SAElB;wBACF,kBAAkB,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,EAAE,EAAX,CAAW,CAAC,CAAA;wBAE5C,sBAAO,UAAU,CAAC,GAAG,CAAC,UAAC,SAAS,EAAE,CAAC;gCACjC,OAAA,IAAI,yCAAmB,CACrB,SAAS,EACT,mBAAmB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EACvD,WAAW,CAAC,CAAC,CAAC,CACf;4BAJD,CAIC,CACF,EAAA;;;;KAEF,CAAA;AACH,CAAC;AArCD,0CAqCC"} {"version":3,"file":"allFacesFactory.js","sourceRoot":"","sources":["../src/allFacesFactory.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAK1D,6DAA4D;AAG5D,yBACE,YAA8B,EAC9B,WAA4B,EAC5B,cAAkC;IAElC,OAAO,UACL,KAAgB,EAChB,aAAqB;;;;;4BAGF,qBAAM,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,EAAA;;wBAAjE,UAAU,GAAG,SAAoD;wBAEnD,qBAAM,uCAAkB,CAAC,KAAK,EAAE,UAAU,CAAC;4BAC/D;;;;+BAIG;0BAL4D;;wBAAzD,WAAW,GAAG,SAA2C;wBAMnC,qBAAM,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,EAAA;;wBAApE,mBAAmB,GAAG,SAAiE;wBAE7F,WAAW,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,EAAE,EAAX,CAAW,CAAC,CAAA;wBAE/B,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAC9C,UAAC,SAAS,EAAE,CAAC,IAAK,OAAA,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAvC,CAAuC,CAC1D,CAAA;wBAC0B,qBAAM,uCAAkB,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAA;;wBAAtE,kBAAkB,GAAG,SAAiD;wBAExD,qBAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAC1D,UAAA,UAAU,IAAI,OAAA,cAAc,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAhD,CAAgD,CAC/D,CAAC,EAAA;;wBAFI,WAAW,GAAG,SAElB;wBACF,kBAAkB,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,EAAE,EAAX,CAAW,CAAC,CAAA;wBAE5C,sBAAO,UAAU,CAAC,GAAG,CAAC,UAAC,SAAS,EAAE,CAAC;gCACjC,OAAA,IAAI,yCAAmB,CACrB,SAAS,EACT,mBAAmB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EACvD,WAAW,CAAC,CAAC,CAAC,CACf;4BAJD,CAIC,CACF,EAAA;;;;KAEF,CAAA;AACH,CAAC;AAzCD,0CAyCC"}
\ No newline at end of file \ No newline at end of file
...@@ -2,21 +2,19 @@ ...@@ -2,21 +2,19 @@
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 NetInput_1 = require("../NetInput"); var NetInput_1 = require("../NetInput");
var tensorTo4D_1 = require("./tensorTo4D");
function getImageTensor(input) { function getImageTensor(input) {
return tf.tidy(function () { return tf.tidy(function () {
if (input instanceof tf.Tensor) { if (input instanceof tf.Tensor) {
var rank = input.shape.length; return tensorTo4D_1.tensorTo4D(input);
if (rank !== 3 && rank !== 4) {
throw new Error('input tensor must be of rank 3 or 4');
}
return (rank === 3 ? input.expandDims(0) : input).toFloat();
} }
if (!(input instanceof NetInput_1.NetInput)) { if (!(input instanceof NetInput_1.NetInput)) {
throw new Error('getImageTensor - expected input to be a tensor or an instance of NetInput'); throw new Error('getImageTensor - expected input to be a tensor or an instance of NetInput');
} }
return tf.concat(input.canvases.map(function (canvas) { if (input.canvases.length > 1) {
return tf.fromPixels(canvas).expandDims(0).toFloat(); throw new Error('getImageTensor - batch input is not accepted here');
})); }
return tf.fromPixels(input.canvases[0]).expandDims(0).toFloat();
}); });
} }
exports.getImageTensor = getImageTensor; exports.getImageTensor = getImageTensor;
......
{"version":3,"file":"getImageTensor.js","sourceRoot":"","sources":["../../src/commons/getImageTensor.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,wCAAuC;AAEvC,wBAA+B,KAA2B;IACxD,OAAO,EAAE,CAAC,IAAI,CAAC;QACb,IAAI,KAAK,YAAY,EAAE,CAAC,MAAM,EAAE;YAC9B,IAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA;YAC/B,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;gBAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;aACvD;YAED,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAiB,CAAA;SAC3E;QAED,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAQ,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;SAC7F;QAED,OAAO,EAAE,CAAC,MAAM,CACd,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAA,MAAM;YACvB,OAAA,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;QAA7C,CAA6C,CAC9C,CACa,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC;AArBD,wCAqBC"} {"version":3,"file":"getImageTensor.js","sourceRoot":"","sources":["../../src/commons/getImageTensor.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,wCAAuC;AACvC,2CAA0C;AAE1C,wBAA+B,KAA2B;IACxD,OAAO,EAAE,CAAC,IAAI,CAAC;QACb,IAAI,KAAK,YAAY,EAAE,CAAC,MAAM,EAAE;YAC9B,OAAO,uBAAU,CAAC,KAAK,CAAC,CAAA;SACzB;QAED,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAQ,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;SAC7F;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;SACrE;QAED,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAiB,CAAA;IAChF,CAAC,CAAC,CAAA;AACJ,CAAC;AAhBD,wCAgBC"}
\ No newline at end of file \ No newline at end of file
export declare function isMediaElement(input: any): boolean;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function isMediaElement(input) {
return input instanceof HTMLImageElement
|| input instanceof HTMLVideoElement
|| input instanceof HTMLCanvasElement;
}
exports.isMediaElement = isMediaElement;
//# sourceMappingURL=isMediaElement.js.map
\ No newline at end of file
{"version":3,"file":"isMediaElement.js","sourceRoot":"","sources":["../../src/commons/isMediaElement.ts"],"names":[],"mappings":";;AAAA,wBAA+B,KAAU;IACvC,OAAO,KAAK,YAAY,gBAAgB;WACnC,KAAK,YAAY,gBAAgB;WACjC,KAAK,YAAY,iBAAiB,CAAA;AACzC,CAAC;AAJD,wCAIC"}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; export declare function isTensor(tensor: any, dim: number): boolean;
export declare function isTensor(tensor: tf.Tensor, dim: number): boolean; export declare function isTensor1D(tensor: any): boolean;
export declare function isTensor1D(tensor: tf.Tensor): boolean; export declare function isTensor2D(tensor: any): boolean;
export declare function isTensor2D(tensor: tf.Tensor): boolean; export declare function isTensor3D(tensor: any): boolean;
export declare function isTensor3D(tensor: tf.Tensor): boolean; export declare function isTensor4D(tensor: any): boolean;
export declare function isTensor4D(tensor: tf.Tensor): boolean;
{"version":3,"file":"isTensor.js","sourceRoot":"","sources":["../../src/commons/isTensor.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,kBAAyB,MAAiB,EAAE,GAAW;IACrD,OAAO,MAAM,YAAY,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAA;AACnE,CAAC;AAFD,4BAEC;AAED,oBAA2B,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC;AAED,oBAA2B,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC;AAED,oBAA2B,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC;AAED,oBAA2B,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC"} {"version":3,"file":"isTensor.js","sourceRoot":"","sources":["../../src/commons/isTensor.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,kBAAyB,MAAW,EAAE,GAAW;IAC/C,OAAO,MAAM,YAAY,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAA;AACnE,CAAC;AAFD,4BAEC;AAED,oBAA2B,MAAW;IACpC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC;AAED,oBAA2B,MAAW;IACpC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC;AAED,oBAA2B,MAAW;IACpC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC;AAED,oBAA2B,MAAW;IACpC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAFD,gCAEC"}
\ No newline at end of file \ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
export declare function tensorTo4D(input: tf.Tensor): tf.Tensor4D;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core");
function tensorTo4D(input) {
if (input.rank !== 3 && input.rank !== 4) {
throw new Error('tensorTo4D - input tensor must be of rank 3 or 4');
}
return tf.tidy(function () { return input.rank === 3 ? input.expandDims(0) : input; });
}
exports.tensorTo4D = tensorTo4D;
//# sourceMappingURL=tensorTo4D.js.map
\ No newline at end of file
{"version":3,"file":"tensorTo4D.js","sourceRoot":"","sources":["../../src/commons/tensorTo4D.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,oBAA2B,KAAgB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;KACpE;IACD,OAAO,EAAE,CAAC,IAAI,CACZ,cAAM,OAAA,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAA9C,CAA8C,CACtC,CAAA;AAClB,CAAC;AAPD,gCAOC"}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { NetInput } from '../NetInput';
import { BatchReshapeInfo } from './types';
export declare function toInputTensor(input: tf.Tensor | tf.Tensor[] | NetInput, inputSize: number, center?: boolean): {
batchTensor: tf.Tensor4D;
batchInfo: BatchReshapeInfo[];
};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tf = require("@tensorflow/tfjs-core");
var NetInput_1 = require("../NetInput");
var padToSquare_1 = require("../padToSquare");
var tensorTo4D_1 = require("./tensorTo4D");
function toInputTensor(input, inputSize, center) {
if (center === void 0) { center = true; }
if (!(input instanceof tf.Tensor) && !(input instanceof NetInput_1.NetInput)) {
throw new Error('toInputTensor - expected input to be a tensor of an instance of NetInput');
}
return tf.tidy(function () {
var inputTensors = input instanceof NetInput_1.NetInput
? input.canvases.map(function (c) { return tf.expandDims(tf.fromPixels(c)); })
: [tensorTo4D_1.tensorTo4D(input)];
var preprocessedTensors = [];
var batchInfo = [];
inputTensors.forEach(function (inputTensor) {
var _a = inputTensor.shape.slice(1), originalHeight = _a[0], originalWidth = _a[1];
var imgTensor = padToSquare_1.padToSquare(inputTensor.toFloat(), center);
var _b = imgTensor.shape.slice(1), heightAfterPadding = _b[0], widthAfterPadding = _b[1];
if (heightAfterPadding !== inputSize || widthAfterPadding !== inputSize) {
imgTensor = tf.image.resizeBilinear(imgTensor, [inputSize, inputSize]);
}
preprocessedTensors.push(imgTensor);
batchInfo.push({
originalWidth: originalWidth,
originalHeight: originalHeight,
paddingX: widthAfterPadding - originalWidth,
paddingY: heightAfterPadding - originalHeight
});
});
var batchSize = inputTensors.length;
return {
batchTensor: tf.stack(preprocessedTensors).as4D(batchSize, inputSize, inputSize, 3),
batchInfo: batchInfo
};
});
}
exports.toInputTensor = toInputTensor;
//# sourceMappingURL=toInputTensor.js.map
\ No newline at end of file
{"version":3,"file":"toInputTensor.js","sourceRoot":"","sources":["../../src/commons/toInputTensor.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C,wCAAuC;AACvC,8CAA6C;AAC7C,2CAA0C;AAG1C,uBACE,KAAyC,EACzC,SAAiB,EACjB,MAAsB;IAAtB,uBAAA,EAAA,aAAsB;IAGtB,IAAI,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAQ,CAAC,EAAE;QACjE,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;KAC5F;IAED,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,YAAY,GAAG,KAAK,YAAY,mBAAQ;YAC5C,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAA/B,CAA+B,CAAC;YAC1D,CAAC,CAAC,CAAC,uBAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAEvB,IAAM,mBAAmB,GAAkB,EAAE,CAAA;QAC7C,IAAM,SAAS,GAAuB,EAAE,CAAA;QAExC,YAAY,CAAC,OAAO,CAAC,UAAC,WAAwB;YACtC,IAAA,+BAA4D,EAA3D,sBAAc,EAAE,qBAAa,CAA8B;YAElE,IAAI,SAAS,GAAG,yBAAW,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;YACpD,IAAA,6BAAkE,EAAjE,0BAAkB,EAAE,yBAAiB,CAA4B;YAExE,IAAI,kBAAkB,KAAK,SAAS,IAAI,iBAAiB,KAAK,SAAS,EAAE;gBACvE,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;aACvE;YAED,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACnC,SAAS,CAAC,IAAI,CAAC;gBACb,aAAa,eAAA;gBACb,cAAc,gBAAA;gBACd,QAAQ,EAAE,iBAAiB,GAAG,aAAa;gBAC3C,QAAQ,EAAE,kBAAkB,GAAG,cAAc;aAC9C,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAA;QAErC,OAAO;YACL,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YACnF,SAAS,WAAA;SACV,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AA7CD,sCA6CC"}
\ No newline at end of file
...@@ -4,3 +4,9 @@ export declare type ConvParams = { ...@@ -4,3 +4,9 @@ export declare type ConvParams = {
bias: tf.Tensor1D; bias: tf.Tensor1D;
}; };
export declare type ExtractWeightsFunction = (numWeights: number) => Float32Array; export declare type ExtractWeightsFunction = (numWeights: number) => Float32Array;
export declare type BatchReshapeInfo = {
originalWidth: number;
originalHeight: number;
paddingX: number;
paddingY: number;
};
...@@ -26,7 +26,7 @@ function drawText(ctx, x, y, text, options) { ...@@ -26,7 +26,7 @@ function drawText(ctx, x, y, text, options) {
} }
exports.drawText = drawText; exports.drawText = drawText;
function drawDetection(canvasArg, detection, options) { function drawDetection(canvasArg, detection, options) {
var canvas = utils_1.getElement(canvasArg); var canvas = utils_1.resolveInput(canvasArg);
if (!(canvas instanceof HTMLCanvasElement)) { if (!(canvas instanceof HTMLCanvasElement)) {
throw new Error('drawBox - expected canvas to be of type: HTMLCanvasElement'); throw new Error('drawBox - expected canvas to be of type: HTMLCanvasElement');
} }
...@@ -66,7 +66,7 @@ function drawContour(ctx, points, isClosed) { ...@@ -66,7 +66,7 @@ function drawContour(ctx, points, isClosed) {
ctx.stroke(); ctx.stroke();
} }
function drawLandmarks(canvasArg, faceLandmarks, options) { function drawLandmarks(canvasArg, faceLandmarks, options) {
var canvas = utils_1.getElement(canvasArg); var canvas = utils_1.resolveInput(canvasArg);
if (!(canvas instanceof HTMLCanvasElement)) { if (!(canvas instanceof HTMLCanvasElement)) {
throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement'); throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement');
} }
......
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drawing/index.ts"],"names":[],"mappings":";;AAGA,kCAAkE;AAGlE;IACE,OAAO;QACL,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,SAAS;KACrB,CAAA;AACH,CAAC;AAPD,sDAOC;AAED,iBACE,GAA6B,EAC7B,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAS,EACT,OAAuB;IAEvB,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,qBAAqB,EAAE,EACvB,CAAC,OAAO,IAAI,EAAE,CAAC,CAChB,CAAA;IAED,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAA;IACnC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAA;IACrC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAhBD,0BAgBC;AAED,kBACE,GAA6B,EAC7B,CAAS,EACT,CAAS,EACT,IAAY,EACZ,OAAwB;IAExB,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,qBAAqB,EAAE,EACvB,CAAC,OAAO,IAAI,EAAE,CAAC,CAChB,CAAA;IAED,IAAM,OAAO,GAAG,CAAC,GAAG,WAAW,CAAC,SAAS,CAAA;IAEzC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAA;IACjC,GAAG,CAAC,IAAI,GAAM,WAAW,CAAC,QAAQ,WAAM,WAAW,CAAC,SAAW,CAAA;IAC/D,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,WAAW,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAA;AAC7E,CAAC;AAjBD,4BAiBC;AAED,uBACE,SAAqC,EACrC,SAA0C,EAC1C,OAAmE;IAEnE,IAAM,MAAM,GAAG,kBAAU,CAAC,SAAS,CAAC,CAAA;IACpC,IAAI,CAAC,CAAC,MAAM,YAAY,iBAAiB,CAAC,EAAE;QAC1C,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;KAC9E;IAED,IAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAC7C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAEf,cAAc,CAAC,OAAO,CAAC,UAAC,GAAG;QACnB,IAAA,iBAKU,EAJd,QAAC,EACD,QAAC,EACD,gBAAK,EACL,kBAAM,CACQ;QAEhB,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,qBAAqB,EAAE,EACvB,CAAC,OAAO,IAAI,EAAE,CAAC,CAChB,CAAA;QAEO,IAAA,yEAAS,CAAwD;QAEzE,IAAM,GAAG,GAAG,2BAAmB,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,CACL,GAAG,EACH,CAAC,EACD,CAAC,EACD,KAAK,EACL,MAAM,EACN,WAAW,CACZ,CAAA;QACD,IAAI,SAAS,EAAE;YACb,QAAQ,CACN,GAAG,EACH,CAAC,EACD,CAAC,EACD,KAAG,aAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAG,EAC1B,WAAW,CACZ,CAAA;SACF;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAhDD,sCAgDC;AAED,qBACE,GAA6B,EAC7B,MAAe,EACf,QAAyB;IAAzB,yBAAA,EAAA,gBAAyB;IAEzB,GAAG,CAAC,SAAS,EAAE,CAAA;IAEf,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAC,EAAQ,EAAE,OAAO;YAAf,QAAC,EAAE,QAAC;QAC7B,IAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;QAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,IAAI,QAAQ,EAAE;QACZ,IAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACtC,IAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE;YAChB,OAAM;SACP;QAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;KACvB;IAED,GAAG,CAAC,MAAM,EAAE,CAAA;AACd,CAAC;AAED,uBACE,SAAqC,EACrC,aAA8C,EAC9C,OAAuD;IAEvD,IAAM,MAAM,GAAG,kBAAU,CAAC,SAAS,CAAC,CAAA;IACpC,IAAI,CAAC,CAAC,MAAM,YAAY,iBAAiB,CAAC,EAAE;QAC1C,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;KACpF;IAED,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,qBAAqB,EAAE,EACvB,CAAC,OAAO,IAAI,EAAE,CAAC,CAChB,CAAA;IAEO,IAAA,0EAAS,CAAyD;IAE1E,IAAM,GAAG,GAAG,2BAAmB,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAA,iCAAS,EAAE,yBAAK,CAAgB;IAExC,IAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;IAEzF,kBAAkB,CAAC,OAAO,CAAC,UAAA,SAAS;QAClC,IAAI,SAAS,EAAE;YACb,GAAG,CAAC,WAAW,GAAG,KAAK,CAAA;YACvB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAA;YACzB,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAA;YAC3C,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAA;YAC5C,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,eAAe,EAAE,CAAC,CAAA;YAC7C,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;YACrC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,CAAA;YAC9C,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAA;YAC/C,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAA;YAC5C,OAAM;SACP;QAED,mBAAmB;QACnB,IAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAA;QAC9B,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;QACrB,SAAS,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,UAAA,EAAE,IAAI,OAAA,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAApE,CAAoE,CAAC,CAAA;IAC9G,CAAC,CAAC,CAAA;AACJ,CAAC;AAzCD,sCAyCC"} {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drawing/index.ts"],"names":[],"mappings":"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"}
\ 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 { FaceDetection } from './faceDetectionNet/FaceDetection'; import { FaceDetection } from './faceDetectionNet/FaceDetection';
import { NetInput } from './NetInput';
import { Rect } from './Rect'; import { Rect } from './Rect';
import { TNetInput } from './types'; import { TNetInput } from './types';
/** /**
...@@ -13,4 +12,4 @@ import { TNetInput } from './types'; ...@@ -13,4 +12,4 @@ import { TNetInput } from './types';
* @param detections The face detection results or face bounding boxes for that image. * @param detections The face detection results or face bounding boxes for that image.
* @returns Tensors of the corresponding image region for each detected face. * @returns Tensors of the corresponding image region for each detected face.
*/ */
export declare function extractFaceTensors(input: tf.Tensor | NetInput | TNetInput, detections: Array<FaceDetection | Rect>): Promise<tf.Tensor4D[]>; export declare function extractFaceTensors(input: TNetInput, detections: Array<FaceDetection | Rect>): Promise<tf.Tensor4D[]>;
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
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 getImageTensor_1 = require("./commons/getImageTensor");
var FaceDetection_1 = require("./faceDetectionNet/FaceDetection"); var FaceDetection_1 = require("./faceDetectionNet/FaceDetection");
var toNetInput_1 = require("./toNetInput"); var toNetInput_1 = require("./toNetInput");
/** /**
...@@ -17,23 +16,21 @@ var toNetInput_1 = require("./toNetInput"); ...@@ -17,23 +16,21 @@ var toNetInput_1 = require("./toNetInput");
*/ */
function extractFaceTensors(input, detections) { function extractFaceTensors(input, detections) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var image, _a; var netInput;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_a) {
switch (_b.label) { switch (_a.label) {
case 0: case 0: return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1]; case 1:
_a = input; netInput = _a.sent();
return [3 /*break*/, 3]; if (netInput.batchSize > 1) {
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)]; if (netInput.isManaged) {
case 2: netInput.dispose();
_a = _b.sent(); }
_b.label = 3; throw new Error('extractFaceTensors - batchSize > 1 not supported');
case 3: }
image = _a;
return [2 /*return*/, tf.tidy(function () { return [2 /*return*/, tf.tidy(function () {
var imgTensor = getImageTensor_1.getImageTensor(image); var imgTensor = netInput.inputs[0].expandDims().toFloat();
// TODO handle batches var _a = imgTensor.shape.slice(1), imgHeight = _a[0], imgWidth = _a[1], numChannels = _a[2];
var _a = imgTensor.shape, batchSize = _a[0], imgHeight = _a[1], imgWidth = _a[2], numChannels = _a[3];
var boxes = detections.map(function (det) { return det instanceof FaceDetection_1.FaceDetection var boxes = detections.map(function (det) { return det instanceof FaceDetection_1.FaceDetection
? det.forSize(imgWidth, imgHeight).getBox().floor() ? det.forSize(imgWidth, imgHeight).getBox().floor()
: det; }); : det; });
...@@ -41,6 +38,9 @@ function extractFaceTensors(input, detections) { ...@@ -41,6 +38,9 @@ function extractFaceTensors(input, detections) {
var x = _a.x, y = _a.y, width = _a.width, height = _a.height; var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
return tf.slice(imgTensor, [0, y, x, 0], [1, height, width, numChannels]); return tf.slice(imgTensor, [0, y, x, 0], [1, height, width, numChannels]);
}); });
if (netInput.isManaged) {
netInput.dispose();
}
return faceTensors; return faceTensors;
})]; })];
} }
......
{"version":3,"file":"extractFaceTensors.js","sourceRoot":"","sources":["../src/extractFaceTensors.ts"],"names":[],"mappings":";;;AAAA,0CAA4C;AAE5C,2DAA0D;AAC1D,kEAAiE;AAIjE,2CAA0C;AAE1C;;;;;;;;;GASG;AACH,4BACE,KAAuC,EACvC,UAAqC;;;;;;yBAGvB,CAAA,KAAK,YAAY,EAAE,CAAC,MAAM,CAAA,EAA1B,wBAA0B;oBACpC,KAAA,KAAK,CAAA;;wBACL,qBAAM,uBAAU,CAAC,KAAK,CAAC,EAAA;;oBAAvB,KAAA,SAAuB,CAAA;;;oBAFrB,KAAK,KAEgB;oBAE3B,sBAAO,EAAE,CAAC,IAAI,CAAC;4BACb,IAAM,SAAS,GAAG,+BAAc,CAAC,KAAK,CAAC,CAAA;4BAEvC,sBAAsB;4BAChB,IAAA,oBAA+D,EAA9D,iBAAS,EAAE,iBAAS,EAAE,gBAAQ,EAAE,mBAAW,CAAmB;4BAErE,IAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAC1B,UAAA,GAAG,IAAI,OAAA,GAAG,YAAY,6BAAa;gCACjC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;gCACnD,CAAC,CAAC,GAAG,EAFA,CAEA,CACR,CAAA;4BACD,IAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,EAAuB;oCAArB,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM;gCAClD,OAAA,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;4BAAlE,CAAkE,CACnE,CAAA;4BAED,OAAO,WAAW,CAAA;wBACpB,CAAC,CAAC,EAAA;;;;CACH;AA1BD,gDA0BC"} {"version":3,"file":"extractFaceTensors.js","sourceRoot":"","sources":["../src/extractFaceTensors.ts"],"names":[],"mappings":";;;AAAA,0CAA4C;AAE5C,kEAAiE;AAEjE,2CAA0C;AAG1C;;;;;;;;;GASG;AACH,4BACE,KAAgB,EAChB,UAAuC;;;;;wBAGtB,qBAAM,uBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;;oBAAxC,QAAQ,GAAG,SAA6B;oBAE9C,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE;wBAC1B,IAAI,QAAQ,CAAC,SAAS,EAAE;4BACtB,QAAQ,CAAC,OAAO,EAAE,CAAA;yBACnB;wBACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;qBACpE;oBAED,sBAAO,EAAE,CAAC,IAAI,CAAC;4BACb,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAiB,CAAA;4BAEpE,IAAA,6BAA6D,EAA5D,iBAAS,EAAE,gBAAQ,EAAE,mBAAW,CAA4B;4BAEnE,IAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAC1B,UAAA,GAAG,IAAI,OAAA,GAAG,YAAY,6BAAa;gCACjC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;gCACnD,CAAC,CAAC,GAAG,EAFA,CAEA,CACR,CAAA;4BACD,IAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,EAAuB;oCAArB,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM;gCAClD,OAAA,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;4BAAlE,CAAkE,CACnE,CAAA;4BAED,IAAI,QAAQ,CAAC,SAAS,EAAE;gCACtB,QAAQ,CAAC,OAAO,EAAE,CAAA;6BACnB;4BACD,OAAO,WAAW,CAAA;wBACpB,CAAC,CAAC,EAAA;;;;CACH;AAjCD,gDAiCC"}
\ No newline at end of file \ No newline at end of file
import { FaceDetection } from './faceDetectionNet/FaceDetection'; import { FaceDetection } from './faceDetectionNet/FaceDetection';
import { Rect } from './Rect'; import { Rect } from './Rect';
import { TNetInput } from './types';
/** /**
* Extracts the image regions containing the detected faces. * Extracts the image regions containing the detected faces.
* *
...@@ -7,4 +8,4 @@ import { Rect } from './Rect'; ...@@ -7,4 +8,4 @@ import { Rect } from './Rect';
* @param detections The face detection results or face bounding boxes for that image. * @param detections The face detection results or face bounding boxes for that image.
* @returns The Canvases of the corresponding image region for each detected face. * @returns The Canvases of the corresponding image region for each detected face.
*/ */
export declare function extractFaces(image: HTMLCanvasElement, detections: Array<FaceDetection | Rect>): HTMLCanvasElement[]; export declare function extractFaces(input: TNetInput, detections: Array<FaceDetection | Rect>): Promise<HTMLCanvasElement[]>;
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var FaceDetection_1 = require("./faceDetectionNet/FaceDetection"); var FaceDetection_1 = require("./faceDetectionNet/FaceDetection");
var toNetInput_1 = require("./toNetInput");
var utils_1 = require("./utils"); var utils_1 = require("./utils");
/** /**
* Extracts the image regions containing the detected faces. * Extracts the image regions containing the detected faces.
...@@ -9,17 +11,41 @@ var utils_1 = require("./utils"); ...@@ -9,17 +11,41 @@ var utils_1 = require("./utils");
* @param detections The face detection results or face bounding boxes for that image. * @param detections The face detection results or face bounding boxes for that image.
* @returns The Canvases of the corresponding image region for each detected face. * @returns The Canvases of the corresponding image region for each detected face.
*/ */
function extractFaces(image, detections) { function extractFaces(input, detections) {
var ctx = utils_1.getContext2dOrThrow(image); return tslib_1.__awaiter(this, void 0, void 0, function () {
var boxes = detections.map(function (det) { return det instanceof FaceDetection_1.FaceDetection var canvas, netInput, ctx, boxes;
? det.forSize(image.width, image.height).getBox().floor() return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
canvas = input;
if (!!(input instanceof HTMLCanvasElement)) return [3 /*break*/, 3];
return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
case 1:
netInput = _a.sent();
if (netInput.batchSize > 1) {
if (netInput.isManaged) {
netInput.dispose();
}
throw new Error('extractFaces - batchSize > 1 not supported');
}
return [4 /*yield*/, utils_1.imageTensorToCanvas(netInput.inputs[0])];
case 2:
canvas = _a.sent();
_a.label = 3;
case 3:
ctx = utils_1.getContext2dOrThrow(canvas);
boxes = detections.map(function (det) { return det instanceof FaceDetection_1.FaceDetection
? det.forSize(canvas.width, canvas.height).getBox().floor()
: det; }); : det; });
return boxes.map(function (_a) { return [2 /*return*/, boxes.map(function (_a) {
var x = _a.x, y = _a.y, width = _a.width, height = _a.height; var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
var faceImg = utils_1.createCanvas({ width: width, height: height }); var faceImg = utils_1.createCanvas({ width: width, height: height });
utils_1.getContext2dOrThrow(faceImg) utils_1.getContext2dOrThrow(faceImg)
.putImageData(ctx.getImageData(x, y, width, height), 0, 0); .putImageData(ctx.getImageData(x, y, width, height), 0, 0);
return faceImg; return faceImg;
})];
}
});
}); });
} }
exports.extractFaces = extractFaces; exports.extractFaces = extractFaces;
......
{"version":3,"file":"extractFaces.js","sourceRoot":"","sources":["../src/extractFaces.ts"],"names":[],"mappings":";;AAAA,kEAAiE;AAEjE,iCAA4D;AAE5D;;;;;;GAMG;AACH,sBACE,KAAwB,EACxB,UAAqC;IAErC,IAAM,GAAG,GAAG,2BAAmB,CAAC,KAAK,CAAC,CAAA;IAEtC,IAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAC1B,UAAA,GAAG,IAAI,OAAA,GAAG,YAAY,6BAAa;QACjC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;QACzD,CAAC,CAAC,GAAG,EAFA,CAEA,CACR,CAAA;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,UAAC,EAAuB;YAArB,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM;QACrC,IAAM,OAAO,GAAG,oBAAY,CAAC,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAC,CAAA;QAC/C,2BAAmB,CAAC,OAAO,CAAC;aACzB,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5D,OAAO,OAAO,CAAA;IAChB,CAAC,CAAC,CAAA;AACJ,CAAC;AAjBD,oCAiBC"} {"version":3,"file":"extractFaces.js","sourceRoot":"","sources":["../src/extractFaces.ts"],"names":[],"mappings":";;;AAAA,kEAAiE;AAEjE,2CAA0C;AAE1C,iCAAiF;AAEjF;;;;;;GAMG;AACH,sBACE,KAAgB,EAChB,UAAuC;;;;;;oBAGnC,MAAM,GAAG,KAA0B,CAAA;yBAEnC,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAArC,wBAAqC;oBACtB,qBAAM,uBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;;oBAAxC,QAAQ,GAAG,SAA6B;oBAE9C,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE;wBAC1B,IAAI,QAAQ,CAAC,SAAS,EAAE;4BACtB,QAAQ,CAAC,OAAO,EAAE,CAAA;yBACnB;wBACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;qBAC9D;oBAEQ,qBAAM,2BAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAA;;oBAAtD,MAAM,GAAG,SAA6C,CAAA;;;oBAGlD,GAAG,GAAG,2BAAmB,CAAC,MAAM,CAAC,CAAA;oBAEjC,KAAK,GAAG,UAAU,CAAC,GAAG,CAC1B,UAAA,GAAG,IAAI,OAAA,GAAG,YAAY,6BAAa;wBACjC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;wBAC3D,CAAC,CAAC,GAAG,EAFA,CAEA,CACR,CAAA;oBACD,sBAAO,KAAK,CAAC,GAAG,CAAC,UAAC,EAAuB;gCAArB,QAAC,EAAE,QAAC,EAAE,gBAAK,EAAE,kBAAM;4BACrC,IAAM,OAAO,GAAG,oBAAY,CAAC,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAC,CAAA;4BAC/C,2BAAmB,CAAC,OAAO,CAAC;iCACzB,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;4BAC5D,OAAO,OAAO,CAAA;wBAChB,CAAC,CAAC,EAAA;;;;CACH;AAjCD,oCAiCC"}
\ No newline at end of file \ No newline at end of file
...@@ -6,10 +6,13 @@ export declare class FaceDetectionNet { ...@@ -6,10 +6,13 @@ export declare class FaceDetectionNet {
private _params; private _params;
load(weightsOrUrl?: Float32Array | string): Promise<void>; load(weightsOrUrl?: Float32Array | string): Promise<void>;
extractWeights(weights: Float32Array): void; extractWeights(weights: Float32Array): void;
private forwardTensor(imgTensor); forwardInput(input: NetInput): {
forward(input: tf.Tensor | NetInput | TNetInput): Promise<{ boxes: tf.Tensor<tf.Rank.R2>[];
scores: tf.Tensor<tf.Rank.R1>[];
};
forward(input: TNetInput): Promise<{
boxes: tf.Tensor<tf.Rank.R2>[]; boxes: tf.Tensor<tf.Rank.R2>[];
scores: tf.Tensor<tf.Rank.R1>[]; scores: tf.Tensor<tf.Rank.R1>[];
}>; }>;
locateFaces(input: tf.Tensor | NetInput | TNetInput, minConfidence?: number, maxResults?: number): Promise<FaceDetection[]>; locateFaces(input: TNetInput, minConfidence?: number, maxResults?: number): Promise<FaceDetection[]>;
} }
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
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 getImageTensor_1 = require("../commons/getImageTensor");
var padToSquare_1 = require("../padToSquare");
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");
...@@ -13,7 +11,6 @@ var mobileNetV1_1 = require("./mobileNetV1"); ...@@ -13,7 +11,6 @@ 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 resizeLayer_1 = require("./resizeLayer");
var FaceDetectionNet = /** @class */ (function () { var FaceDetectionNet = /** @class */ (function () {
function FaceDetectionNet() { function FaceDetectionNet() {
} }
...@@ -42,37 +39,28 @@ var FaceDetectionNet = /** @class */ (function () { ...@@ -42,37 +39,28 @@ var FaceDetectionNet = /** @class */ (function () {
FaceDetectionNet.prototype.extractWeights = function (weights) { FaceDetectionNet.prototype.extractWeights = function (weights) {
this._params = extractParams_1.extractParams(weights); this._params = extractParams_1.extractParams(weights);
}; };
FaceDetectionNet.prototype.forwardTensor = function (imgTensor) { FaceDetectionNet.prototype.forwardInput = function (input) {
var _this = this; var _this = this;
if (!this._params) { if (!this._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 resized = resizeLayer_1.resizeLayer(imgTensor); var batchTensor = input.toBatchTensor(512, false);
var features = mobileNetV1_1.mobileNetV1(resized, _this._params.mobilenetv1_params); var x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1));
var features = mobileNetV1_1.mobileNetV1(x, _this._params.mobilenetv1_params);
var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer_1.outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params); return outputLayer_1.outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params);
}); });
}; };
FaceDetectionNet.prototype.forward = function (input) { FaceDetectionNet.prototype.forward = function (input) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this; var _a;
var netInput, _a;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1]; _a = this.forwardInput;
_a = input; return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
return [3 /*break*/, 3]; case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)];
case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [2 /*return*/, tf.tidy(function () {
return _this.forwardTensor(padToSquare_1.padToSquare(getImageTensor_1.getImageTensor(netInput)));
})];
} }
}); });
}); });
...@@ -81,42 +69,27 @@ var FaceDetectionNet = /** @class */ (function () { ...@@ -81,42 +69,27 @@ var FaceDetectionNet = /** @class */ (function () {
if (minConfidence === void 0) { minConfidence = 0.8; } if (minConfidence === void 0) { minConfidence = 0.8; }
if (maxResults === void 0) { maxResults = 100; } if (maxResults === void 0) { maxResults = 100; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this; var netInput, _a, _boxes, _scores, boxes, scores, i, scoresData, _b, _c, iouThreshold, indices, paddedHeightRelative, paddedWidthRelative, results;
var netInput, _a, paddedHeightRelative, paddedWidthRelative, imageDimensions, _b, _boxes, _scores, boxes, scores, i, scoresData, _c, _d, iouThreshold, indices, results; return tslib_1.__generator(this, function (_d) {
return tslib_1.__generator(this, function (_e) { switch (_d.label) {
switch (_e.label) { case 0: return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
case 0: case 1:
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1]; netInput = _d.sent();
_a = input; _a = this.forwardInput(netInput), _boxes = _a.boxes, _scores = _a.scores;
return [3 /*break*/, 3];
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)];
case 2:
_a = _e.sent();
_e.label = 3;
case 3:
netInput = _a;
paddedHeightRelative = 1, paddedWidthRelative = 1;
_b = tf.tidy(function () {
var imgTensor = getImageTensor_1.getImageTensor(netInput);
var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1];
imageDimensions = { width: width, height: height };
imgTensor = padToSquare_1.padToSquare(imgTensor);
paddedHeightRelative = imgTensor.shape[1] / height;
paddedWidthRelative = imgTensor.shape[2] / width;
return _this.forwardTensor(imgTensor);
}), _boxes = _b.boxes, _scores = _b.scores;
boxes = _boxes[0]; boxes = _boxes[0];
scores = _scores[0]; scores = _scores[0];
for (i = 1; i < _boxes.length; i++) { for (i = 1; i < _boxes.length; i++) {
_boxes[i].dispose(); _boxes[i].dispose();
_scores[i].dispose(); _scores[i].dispose();
} }
_d = (_c = Array).from; _c = (_b = Array).from;
return [4 /*yield*/, scores.data()]; return [4 /*yield*/, scores.data()];
case 4: case 2:
scoresData = _d.apply(_c, [_e.sent()]); scoresData = _c.apply(_b, [_d.sent()]);
iouThreshold = 0.5; iouThreshold = 0.5;
indices = nonMaxSuppression_1.nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence); indices = nonMaxSuppression_1.nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence);
paddedHeightRelative = (netInput.getPaddings(0).y + netInput.getInputHeight(0)) / netInput.getInputHeight(0);
paddedWidthRelative = (netInput.getPaddings(0).x + netInput.getInputWidth(0)) / netInput.getInputWidth(0);
results = indices results = indices
.map(function (idx) { .map(function (idx) {
var _a = [ var _a = [
...@@ -127,7 +100,10 @@ var FaceDetectionNet = /** @class */ (function () { ...@@ -127,7 +100,10 @@ var FaceDetectionNet = /** @class */ (function () {
Math.max(0, boxes.get(idx, 1)), Math.max(0, boxes.get(idx, 1)),
Math.min(1.0, boxes.get(idx, 3)) Math.min(1.0, boxes.get(idx, 3))
].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1]; ].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1];
return new FaceDetection_1.FaceDetection(scoresData[idx], new Rect_1.Rect(left, top, right - left, bottom - top), imageDimensions); return new FaceDetection_1.FaceDetection(scoresData[idx], new Rect_1.Rect(left, top, right - left, bottom - top), {
height: netInput.getInputHeight(0),
width: netInput.getInputWidth(0)
});
}); });
boxes.dispose(); boxes.dispose();
scores.dispose(); scores.dispose();
......
{"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
...@@ -6,7 +6,7 @@ export declare class FaceLandmarkNet { ...@@ -6,7 +6,7 @@ export declare class FaceLandmarkNet {
private _params; private _params;
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>; load(weightsOrUrl: Float32Array | string | undefined): Promise<void>;
extractWeights(weights: Float32Array): void; extractWeights(weights: Float32Array): void;
forwardTensor(imgTensor: tf.Tensor4D): tf.Tensor2D; forwardInput(input: NetInput): tf.Tensor2D;
forward(input: tf.Tensor | NetInput | TNetInput): Promise<tf.Tensor2D>; forward(input: TNetInput): Promise<tf.Tensor2D>;
detectLandmarks(input: tf.Tensor | NetInput | TNetInput): Promise<FaceLandmarks>; detectLandmarks(input: TNetInput): Promise<FaceLandmarks | FaceLandmarks[]>;
} }
...@@ -3,8 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); ...@@ -3,8 +3,6 @@ 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 convLayer_1 = require("../commons/convLayer"); var convLayer_1 = require("../commons/convLayer");
var getImageTensor_1 = require("../commons/getImageTensor");
var padToSquare_1 = require("../padToSquare");
var Point_1 = require("../Point"); var Point_1 = require("../Point");
var toNetInput_1 = require("../toNetInput"); var toNetInput_1 = require("../toNetInput");
var utils_1 = require("../utils"); var utils_1 = require("../utils");
...@@ -47,20 +45,14 @@ var FaceLandmarkNet = /** @class */ (function () { ...@@ -47,20 +45,14 @@ var FaceLandmarkNet = /** @class */ (function () {
FaceLandmarkNet.prototype.extractWeights = function (weights) { FaceLandmarkNet.prototype.extractWeights = function (weights) {
this._params = extractParams_1.extractParams(weights); this._params = extractParams_1.extractParams(weights);
}; };
FaceLandmarkNet.prototype.forwardTensor = function (imgTensor) { 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 _a = imgTensor.shape.slice(), batchSize = _a[0], height = _a[1], width = _a[2]; var batchTensor = input.toBatchTensor(128, true);
var x = padToSquare_1.padToSquare(imgTensor, true); var out = conv(batchTensor, params.conv0_params);
var _b = x.shape.slice(1), heightAfterPadding = _b[0], widthAfterPadding = _b[1];
// work with 128 x 128 sized face images
if (heightAfterPadding !== 128 || widthAfterPadding !== 128) {
x = tf.image.resizeBilinear(x, [128, 128]);
}
var out = conv(x, params.conv0_params);
out = maxPool(out); out = maxPool(out);
out = conv(out, params.conv1_params); out = conv(out, params.conv1_params);
out = conv(out, params.conv2_params); out = conv(out, params.conv2_params);
...@@ -78,37 +70,34 @@ var FaceLandmarkNet = /** @class */ (function () { ...@@ -78,37 +70,34 @@ var FaceLandmarkNet = /** @class */ (function () {
return tf.stack([ return tf.stack([
tf.fill([68], fillX), tf.fill([68], fillX),
tf.fill([68], fillY) tf.fill([68], fillY)
], 1).as2D(batchSize, 136); ], 1).as2D(1, 136).as1D();
}; };
/* shift coordinates back, to undo centered padding /* shift coordinates back, to undo centered padding
((x * widthAfterPadding) - shiftX) / width x = ((x * widthAfterPadding) - shiftX) / width
((y * heightAfterPadding) - shiftY) / height y = ((y * heightAfterPadding) - shiftY) / height
*/ */
var shiftX = Math.floor(Math.abs(widthAfterPadding - width) / 2); var landmarkTensors = fc1
var shiftY = Math.floor(Math.abs(heightAfterPadding - height) / 2); .mul(tf.stack(Array.from(Array(input.batchSize), function (_, batchIdx) {
var landmarkTensor = fc1 return createInterleavedTensor(input.getPaddings(batchIdx).x + input.getInputWidth(batchIdx), input.getPaddings(batchIdx).y + input.getInputHeight(batchIdx));
.mul(createInterleavedTensor(widthAfterPadding, heightAfterPadding)) })))
.sub(createInterleavedTensor(shiftX, shiftY)) .sub(tf.stack(Array.from(Array(input.batchSize), function (_, batchIdx) {
.div(createInterleavedTensor(width, height)); return createInterleavedTensor(Math.floor(input.getPaddings(batchIdx).x / 2), Math.floor(input.getPaddings(batchIdx).y / 2));
return landmarkTensor; })))
.div(tf.stack(Array.from(Array(input.batchSize), function (_, batchIdx) {
return createInterleavedTensor(input.getInputWidth(batchIdx), input.getInputHeight(batchIdx));
})));
return landmarkTensors;
}); });
}; };
FaceLandmarkNet.prototype.forward = function (input) { FaceLandmarkNet.prototype.forward = function (input) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var netInput, _a; var _a;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1]; _a = this.forwardInput;
_a = input; return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
return [3 /*break*/, 3]; case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)];
case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [2 /*return*/, this.forwardTensor(getImageTensor_1.getImageTensor(netInput))];
} }
}); });
}); });
...@@ -116,33 +105,35 @@ var FaceLandmarkNet = /** @class */ (function () { ...@@ -116,33 +105,35 @@ var FaceLandmarkNet = /** @class */ (function () {
FaceLandmarkNet.prototype.detectLandmarks = function (input) { FaceLandmarkNet.prototype.detectLandmarks = function (input) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this; var _this = this;
var netInput, _a, imageDimensions, outTensor, faceLandmarksArray, _b, _c, xCoords, yCoords; var netInput, landmarkTensors, landmarksForBatch;
return tslib_1.__generator(this, function (_d) { return tslib_1.__generator(this, function (_a) {
switch (_d.label) { switch (_a.label) {
case 0: return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
case 1:
netInput = _a.sent();
landmarkTensors = tf.unstack(this.forwardInput(netInput));
return [4 /*yield*/, Promise.all(landmarkTensors.map(function (landmarkTensor, batchIdx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var landmarksArray, _a, _b, xCoords, yCoords;
return tslib_1.__generator(this, function (_c) {
switch (_c.label) {
case 0: case 0:
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1]; _b = (_a = Array).from;
_a = input; return [4 /*yield*/, landmarkTensor.data()];
return [3 /*break*/, 3]; case 1:
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)]; landmarksArray = _b.apply(_a, [_c.sent()]);
case 2: xCoords = landmarksArray.filter(function (_, i) { return utils_1.isEven(i); });
_a = _d.sent(); yCoords = landmarksArray.filter(function (_, i) { return !utils_1.isEven(i); });
_d.label = 3; return [2 /*return*/, new FaceLandmarks_1.FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point_1.Point(xCoords[i], yCoords[i]); }), {
case 3: height: netInput.getInputHeight(batchIdx),
netInput = _a; width: netInput.getInputWidth(batchIdx),
outTensor = tf.tidy(function () { })];
var imgTensor = getImageTensor_1.getImageTensor(netInput); }
var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1];
imageDimensions = { width: width, height: height };
return _this.forwardTensor(imgTensor);
}); });
_c = (_b = Array).from; }); }))];
return [4 /*yield*/, outTensor.data()]; case 2:
case 4: landmarksForBatch = _a.sent();
faceLandmarksArray = _c.apply(_b, [_d.sent()]); landmarkTensors.forEach(function (t) { return t.dispose(); });
outTensor.dispose(); return [2 /*return*/, landmarksForBatch.length === 1 ? landmarksForBatch[0] : landmarksForBatch];
xCoords = faceLandmarksArray.filter(function (_, i) { return utils_1.isEven(i); });
yCoords = faceLandmarksArray.filter(function (_, i) { return !utils_1.isEven(i); });
return [2 /*return*/, new FaceLandmarks_1.FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point_1.Point(xCoords[i], yCoords[i]); }), imageDimensions)];
} }
}); });
}); });
......
{"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
...@@ -5,6 +5,7 @@ export declare class FaceRecognitionNet { ...@@ -5,6 +5,7 @@ export declare class FaceRecognitionNet {
private _params; private _params;
load(weightsOrUrl: Float32Array | string | undefined): Promise<void>; load(weightsOrUrl: Float32Array | string | undefined): Promise<void>;
extractWeights(weights: Float32Array): void; extractWeights(weights: Float32Array): void;
forward(input: tf.Tensor | NetInput | TNetInput): Promise<tf.Tensor2D>; forwardInput(input: NetInput): Promise<tf.Tensor2D>;
computeFaceDescriptor(input: tf.Tensor | NetInput | TNetInput): Promise<Float32Array>; forward(input: TNetInput): Promise<tf.Tensor2D>;
computeFaceDescriptor(input: TNetInput): Promise<Float32Array>;
} }
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
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 getImageTensor_1 = require("../commons/getImageTensor");
var padToSquare_1 = require("../padToSquare");
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");
...@@ -38,33 +36,17 @@ var FaceRecognitionNet = /** @class */ (function () { ...@@ -38,33 +36,17 @@ var FaceRecognitionNet = /** @class */ (function () {
FaceRecognitionNet.prototype.extractWeights = function (weights) { FaceRecognitionNet.prototype.extractWeights = function (weights) {
this._params = extractParams_1.extractParams(weights); this._params = extractParams_1.extractParams(weights);
}; };
FaceRecognitionNet.prototype.forward = function (input) { FaceRecognitionNet.prototype.forwardInput = function (input) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this; var _this = this;
var netInput, _a; return tslib_1.__generator(this, function (_a) {
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (!this._params) { if (!this._params) {
throw new Error('FaceRecognitionNet - load model before inference'); throw new Error('FaceRecognitionNet - load model before inference');
} }
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1];
_a = input;
return [3 /*break*/, 3];
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)];
case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [2 /*return*/, tf.tidy(function () { return [2 /*return*/, tf.tidy(function () {
var x = padToSquare_1.padToSquare(getImageTensor_1.getImageTensor(netInput), true); var batchTensor = input.toBatchTensor(150, true);
// work with 150 x 150 sized face images var normalized = normalize_1.normalize(batchTensor);
if (x.shape[1] !== 150 || x.shape[2] !== 150) { var out = convLayer_1.convDown(normalized, _this._params.conv32_down);
x = tf.image.resizeBilinear(x, [150, 150]);
}
x = normalize_1.normalize(x);
var out = convLayer_1.convDown(x, _this._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, _this._params.conv32_1);
out = residualLayer_1.residual(out, _this._params.conv32_2); out = residualLayer_1.residual(out, _this._params.conv32_2);
...@@ -84,30 +66,35 @@ var FaceRecognitionNet = /** @class */ (function () { ...@@ -84,30 +66,35 @@ var FaceRecognitionNet = /** @class */ (function () {
var fullyConnected = tf.matMul(globalAvg, _this._params.fc); var fullyConnected = tf.matMul(globalAvg, _this._params.fc);
return fullyConnected; return fullyConnected;
})]; })];
});
});
};
FaceRecognitionNet.prototype.forward = function (input) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = this.forwardInput;
return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
} }
}); });
}); });
}; };
FaceRecognitionNet.prototype.computeFaceDescriptor = function (input) { FaceRecognitionNet.prototype.computeFaceDescriptor = function (input) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var netInput, _a, result, data; var result, _a, data;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
if (!(input instanceof tf.Tensor)) return [3 /*break*/, 1]; _a = this.forward;
_a = input; return [4 /*yield*/, toNetInput_1.toNetInput(input, true)];
return [3 /*break*/, 3]; case 1: return [4 /*yield*/, _a.apply(this, [_b.sent()])];
case 1: return [4 /*yield*/, toNetInput_1.toNetInput(input)];
case 2: case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [4 /*yield*/, this.forward(netInput)];
case 4:
result = _b.sent(); result = _b.sent();
return [4 /*yield*/, result.data()]; return [4 /*yield*/, result.data()];
case 5: case 3:
data = _b.sent(); data = _b.sent();
result.dispose(); result.dispose();
return [2 /*return*/, data]; return [2 /*return*/, data];
......
{"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":";;;AAAA,0CAA4C;AAG5C,4CAA2C;AAE3C,yCAAuC;AACvC,iDAAgD;AAChD,6DAA4D;AAC5D,yCAAwC;AACxC,iDAAyD;AAGzD;IAAA;IAoEA,CAAC;IAhEc,iCAAI,GAAjB,UAAkB,YAA+C;;;;;;wBAC/D,IAAI,YAAY,YAAY,YAAY,EAAE;4BACxC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;4BACjC,sBAAM;yBACP;wBAED,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;4BACpD,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;yBACzF;wBACD,KAAA,IAAI,CAAA;wBAAW,qBAAM,yCAAmB,CAAC,YAAY,CAAC,EAAA;;wBAAtD,GAAK,OAAO,GAAG,SAAuC,CAAA;;;;;KACvD;IAEM,2CAAc,GAArB,UAAsB,OAAqB;QACzC,IAAI,CAAC,OAAO,GAAG,6BAAa,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAEY,yCAAY,GAAzB,UAA0B,KAAe;;;;gBACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBACjB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;iBACpE;gBAGD,sBAAO,EAAE,CAAC,IAAI,CAAC;wBACb,IAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;wBAElD,IAAM,UAAU,GAAG,qBAAS,CAAC,WAAW,CAAC,CAAA;wBAEzC,IAAI,GAAG,GAAG,oBAAQ,CAAC,UAAU,EAAE,KAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;wBACxD,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;wBAEpC,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBAC1C,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBAC1C,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBAE1C,GAAG,GAAG,4BAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;wBACjD,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBAC1C,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBAC1C,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBAE1C,GAAG,GAAG,4BAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;wBAClD,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;wBAC3C,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;wBAE3C,GAAG,GAAG,4BAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;wBAClD,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;wBAC3C,GAAG,GAAG,wBAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;wBAC3C,GAAG,GAAG,4BAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;wBAEtD,IAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CAAA;wBACjD,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;wBAE5D,OAAO,cAAc,CAAA;oBACvB,CAAC,CAAC,EAAA;;;KACH;IACY,oCAAO,GAApB,UAAqB,KAAgB;;;;;;wBAC5B,KAAA,IAAI,CAAC,YAAY,CAAA;wBAAC,qBAAM,uBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;4BAAtD,sBAAO,SAAA,IAAI,GAAc,SAA6B,EAAC,EAAA;;;;KACxD;IAEY,kDAAqB,GAAlC,UAAmC,KAAgB;;;;;;wBAC5B,KAAA,IAAI,CAAC,OAAO,CAAA;wBAAC,qBAAM,uBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAA;4BAAhD,qBAAM,SAAA,IAAI,GAAS,SAA6B,EAAC,EAAA;;wBAA1D,MAAM,GAAG,SAAiD;wBACnD,qBAAM,MAAM,CAAC,IAAI,EAAE,EAAA;;wBAA1B,IAAI,GAAG,SAAmB;wBAChC,MAAM,CAAC,OAAO,EAAE,CAAA;wBAChB,sBAAO,IAAoB,EAAA;;;;KAC5B;IACH,yBAAC;AAAD,CAAC,AApED,IAoEC;AApEY,gDAAkB"}
\ No newline at end of file \ No newline at end of file
...@@ -4,9 +4,9 @@ import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet'; ...@@ -4,9 +4,9 @@ import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet';
import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet'; import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet';
import { FaceLandmarks } from './faceLandmarkNet/FaceLandmarks'; import { FaceLandmarks } from './faceLandmarkNet/FaceLandmarks';
import { FaceRecognitionNet } from './faceRecognitionNet/FaceRecognitionNet'; import { FaceRecognitionNet } from './faceRecognitionNet/FaceRecognitionNet';
import { FullFaceDescription } from './FullFaceDescription';
import { NetInput } from './NetInput'; import { NetInput } from './NetInput';
import { TNetInput } from './types'; import { TNetInput } from './types';
import { FullFaceDescription } from './FullFaceDescription';
export declare const detectionNet: FaceDetectionNet; export declare const detectionNet: FaceDetectionNet;
export declare const landmarkNet: FaceLandmarkNet; export declare const landmarkNet: FaceLandmarkNet;
export declare const recognitionNet: FaceRecognitionNet; export declare const recognitionNet: FaceRecognitionNet;
...@@ -14,7 +14,7 @@ export declare function loadFaceDetectionModel(url: string): Promise<void>; ...@@ -14,7 +14,7 @@ export declare function loadFaceDetectionModel(url: string): Promise<void>;
export declare function loadFaceLandmarkModel(url: string): Promise<void>; export declare function loadFaceLandmarkModel(url: string): Promise<void>;
export declare function loadFaceRecognitionModel(url: string): Promise<void>; export declare function loadFaceRecognitionModel(url: string): Promise<void>;
export declare function loadModels(url: string): Promise<[void, void, void]>; export declare function loadModels(url: string): Promise<[void, void, void]>;
export declare function locateFaces(input: tf.Tensor | NetInput | TNetInput, minConfidence?: number, maxResults?: number): Promise<FaceDetection[]>; export declare function locateFaces(input: TNetInput, minConfidence?: number, maxResults?: number): Promise<FaceDetection[]>;
export declare function detectLandmarks(input: tf.Tensor | NetInput | TNetInput): Promise<FaceLandmarks>; export declare function detectLandmarks(input: TNetInput): Promise<FaceLandmarks | FaceLandmarks[]>;
export declare function computeFaceDescriptor(input: tf.Tensor | NetInput | TNetInput): Promise<Float32Array>; export declare function computeFaceDescriptor(input: TNetInput): Promise<Float32Array>;
export declare const allFaces: (input: tf.Tensor | NetInput | TNetInput, minConfidence: number) => Promise<FullFaceDescription[]>; export declare const allFaces: (input: tf.Tensor | NetInput | TNetInput, minConfidence: number) => Promise<FullFaceDescription[]>;
{"version":3,"file":"globalApi.js","sourceRoot":"","sources":["../src/globalApi.ts"],"names":[],"mappings":";;AAEA,qDAAoD;AAEpD,wEAAuE;AACvE,qEAAoE;AAEpE,8EAA6E;AAKhE,QAAA,YAAY,GAAG,IAAI,mCAAgB,EAAE,CAAA;AACrC,QAAA,WAAW,GAAG,IAAI,iCAAe,EAAE,CAAA;AACnC,QAAA,cAAc,GAAG,IAAI,uCAAkB,EAAE,CAAA;AAEtD,gCAAuC,GAAW;IAChD,OAAO,oBAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC/B,CAAC;AAFD,wDAEC;AAED,+BAAsC,GAAW;IAC/C,OAAO,mBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAFD,sDAEC;AAED,kCAAyC,GAAW;IAClD,OAAO,sBAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjC,CAAC;AAFD,4DAEC;AAED,oBAA2B,GAAW;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,sBAAsB,CAAC,GAAG,CAAC;QAC3B,qBAAqB,CAAC,GAAG,CAAC;QAC1B,wBAAwB,CAAC,GAAG,CAAC;KAC9B,CAAC,CAAA;AACJ,CAAC;AAND,gCAMC;AAED,qBACE,KAAuC,EACvC,aAAsB,EACtB,UAAmB;IAEnB,OAAO,oBAAY,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;AACnE,CAAC;AAND,kCAMC;AAED,yBACE,KAAuC;IAEvC,OAAO,mBAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;AAC3C,CAAC;AAJD,0CAIC;AAED,+BACE,KAAuC;IAEvC,OAAO,sBAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;AACpD,CAAC;AAJD,sDAIC;AAEY,QAAA,QAAQ,GAGiB,iCAAe,CACnD,oBAAY,EACZ,mBAAW,EACX,sBAAc,CACf,CAAA"} {"version":3,"file":"globalApi.js","sourceRoot":"","sources":["../src/globalApi.ts"],"names":[],"mappings":";;AAEA,qDAAoD;AAEpD,wEAAuE;AACvE,qEAAoE;AAEpE,8EAA6E;AAKhE,QAAA,YAAY,GAAG,IAAI,mCAAgB,EAAE,CAAA;AACrC,QAAA,WAAW,GAAG,IAAI,iCAAe,EAAE,CAAA;AACnC,QAAA,cAAc,GAAG,IAAI,uCAAkB,EAAE,CAAA;AAEtD,gCAAuC,GAAW;IAChD,OAAO,oBAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC/B,CAAC;AAFD,wDAEC;AAED,+BAAsC,GAAW;IAC/C,OAAO,mBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAFD,sDAEC;AAED,kCAAyC,GAAW;IAClD,OAAO,sBAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjC,CAAC;AAFD,4DAEC;AAED,oBAA2B,GAAW;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,sBAAsB,CAAC,GAAG,CAAC;QAC3B,qBAAqB,CAAC,GAAG,CAAC;QAC1B,wBAAwB,CAAC,GAAG,CAAC;KAC9B,CAAC,CAAA;AACJ,CAAC;AAND,gCAMC;AAED,qBACE,KAAgB,EAChB,aAAsB,EACtB,UAAmB;IAEnB,OAAO,oBAAY,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;AACnE,CAAC;AAND,kCAMC;AAED,yBACE,KAAgB;IAEhB,OAAO,mBAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;AAC3C,CAAC;AAJD,0CAIC;AAED,+BACE,KAAgB;IAEhB,OAAO,sBAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;AACpD,CAAC;AAJD,sDAIC;AAEY,QAAA,QAAQ,GAGiB,iCAAe,CACnD,oBAAY,EACZ,mBAAW,EACX,sBAAc,CACf,CAAA"}
\ No newline at end of file \ No newline at end of file
{"version":3,"file":"padToSquare.js","sourceRoot":"","sources":["../src/padToSquare.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAI5C;;;;;;GAMG;AACH,qBACE,SAAsB,EACtB,aAA8B;IAA9B,8BAAA,EAAA,qBAA8B;IAE9B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEP,IAAA,6BAA0C,EAAzC,cAAM,EAAE,aAAK,CAA4B;QAChD,IAAI,MAAM,KAAK,KAAK,EAAE;YACpB,OAAO,SAAS,CAAA;SACjB;QAED,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAA;QACxC,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAE1C,IAAM,mBAAmB,GAAG,UAAC,aAAqB;YAChD,IAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YAClD,kBAAkB,CAAC,WAAW,CAAC,GAAG,aAAa,CAAA;YAC/C,OAAO,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAA;QACvC,CAAC,CAAA;QAED,IAAM,mBAAmB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;QAC9D,IAAM,sBAAsB,GAAG,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAE/E,IAAM,oBAAoB,GAAG,aAAa,IAAI,sBAAsB;YAClE,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAA;QAER,IAAM,cAAc,GAAG;YACrB,oBAAoB;YACpB,SAAS;YACT,mBAAmB;SACpB;aACE,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,KAAK,IAAI,EAAV,CAAU,CAAkB,CAAA;QAC3C,OAAO,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC;AApCD,kCAoCC"} {"version":3,"file":"padToSquare.js","sourceRoot":"","sources":["../src/padToSquare.ts"],"names":[],"mappings":";;AAAA,0CAA4C;AAE5C;;;;;;GAMG;AACH,qBACE,SAAsB,EACtB,aAA8B;IAA9B,8BAAA,EAAA,qBAA8B;IAE9B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEP,IAAA,6BAA0C,EAAzC,cAAM,EAAE,aAAK,CAA4B;QAChD,IAAI,MAAM,KAAK,KAAK,EAAE;YACpB,OAAO,SAAS,CAAA;SACjB;QAED,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAA;QACxC,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAE1C,IAAM,mBAAmB,GAAG,UAAC,aAAqB;YAChD,IAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YAClD,kBAAkB,CAAC,WAAW,CAAC,GAAG,aAAa,CAAA;YAC/C,OAAO,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAA;QACvC,CAAC,CAAA;QAED,IAAM,mBAAmB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;QAC9D,IAAM,sBAAsB,GAAG,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAE/E,IAAM,oBAAoB,GAAG,aAAa,IAAI,sBAAsB;YAClE,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAA;QAER,IAAM,cAAc,GAAG;YACrB,oBAAoB;YACpB,SAAS;YACT,mBAAmB;SACpB;aACE,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,KAAK,IAAI,EAAV,CAAU,CAAkB,CAAA;QAC3C,OAAO,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC;AApCD,kCAoCC"}
\ No newline at end of file \ No newline at end of file
...@@ -5,6 +5,8 @@ import { TNetInput } from './types'; ...@@ -5,6 +5,8 @@ import { TNetInput } from './types';
* to be finished loading. * to be finished loading.
* *
* @param input The input, which can be a media element or an array of different media elements. * @param input The input, which can be a media element or an array of different media elements.
* @param manageCreatedInput If a new NetInput instance is created from the inputs, this flag
* determines, whether to set the NetInput as managed or not.
* @returns A NetInput instance, which can be passed into one of the neural networks. * @returns A NetInput instance, which can be passed into one of the neural networks.
*/ */
export declare function toNetInput(input: NetInput | TNetInput): Promise<NetInput>; export declare function toNetInput(inputs: TNetInput, manageCreatedInput?: boolean): Promise<NetInput>;
"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 isMediaElement_1 = require("./commons/isMediaElement");
var isTensor_1 = require("./commons/isTensor");
var NetInput_1 = require("./NetInput"); var NetInput_1 = require("./NetInput");
var utils_1 = require("./utils"); var utils_1 = require("./utils");
/** /**
...@@ -8,39 +10,61 @@ var utils_1 = require("./utils"); ...@@ -8,39 +10,61 @@ var utils_1 = require("./utils");
* to be finished loading. * to be finished loading.
* *
* @param input The input, which can be a media element or an array of different media elements. * @param input The input, which can be a media element or an array of different media elements.
* @param manageCreatedInput If a new NetInput instance is created from the inputs, this flag
* determines, whether to set the NetInput as managed or not.
* @returns A NetInput instance, which can be passed into one of the neural networks. * @returns A NetInput instance, which can be passed into one of the neural networks.
*/ */
function toNetInput(input) { function toNetInput(inputs, manageCreatedInput) {
if (manageCreatedInput === void 0) { manageCreatedInput = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var mediaArgArray, medias; var afterCreate, inputArgArray, getIdxHint, inputArray;
return tslib_1.__generator(this, function (_a) { return tslib_1.__generator(this, function (_a) {
switch (_a.label) { switch (_a.label) {
case 0: case 0:
if (input instanceof NetInput_1.NetInput) { if (inputs instanceof NetInput_1.NetInput) {
return [2 /*return*/, input]; return [2 /*return*/, inputs];
} }
mediaArgArray = Array.isArray(input) afterCreate = function (netInput) { return manageCreatedInput
? input ? netInput.managed()
: [input]; : netInput; };
if (!mediaArgArray.length) { if (isTensor_1.isTensor4D(inputs)) {
return [2 /*return*/, afterCreate(new NetInput_1.NetInput(inputs))];
}
inputArgArray = Array.isArray(inputs)
? inputs
: [inputs];
if (!inputArgArray.length) {
throw new Error('toNetInput - empty array passed as input'); throw new Error('toNetInput - empty array passed as input');
} }
medias = mediaArgArray.map(utils_1.getElement); getIdxHint = function (idx) { return Array.isArray(inputs) ? " at input index " + idx + ":" : ''; };
medias.forEach(function (media, i) { inputArray = inputArgArray
if (!(media instanceof HTMLImageElement || media instanceof HTMLVideoElement || media instanceof HTMLCanvasElement)) { .map(utils_1.resolveInput)
var idxHint = Array.isArray(input) ? " at input index " + i + ":" : ''; .map(function (input, i) {
if (typeof mediaArgArray[i] === 'string') { if (isTensor_1.isTensor4D(input)) {
throw new Error("toNetInput -" + idxHint + " string passed, but could not resolve HTMLElement for element id"); // if tf.Tensor4D is passed in the input array, the batch size has to be 1
var batchSize = input.shape[0];
if (batchSize !== 1) {
throw new Error("toNetInput -" + getIdxHint(i) + " tf.Tensor4D with batchSize " + batchSize + " passed, but not supported in input array");
}
// to tf.Tensor3D
return input.reshape(input.shape.slice(1));
}
return input;
});
inputArray.forEach(function (input, i) {
if (!isMediaElement_1.isMediaElement(input) && !isTensor_1.isTensor3D(input)) {
if (typeof inputArgArray[i] === 'string') {
throw new Error("toNetInput -" + getIdxHint(i) + " string passed, but could not resolve HTMLElement for element id " + inputArgArray[i]);
} }
throw new Error("toNetInput -" + idxHint + " expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement, or to be an element id"); throw new Error("toNetInput -" + getIdxHint(i) + " expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id");
} }
}); });
// wait for all media elements being loaded // wait for all media elements being loaded
return [4 /*yield*/, Promise.all(medias.map(function (media) { return utils_1.awaitMediaLoaded(media); }))]; return [4 /*yield*/, Promise.all(inputArray.map(function (input) { return isMediaElement_1.isMediaElement(input) && utils_1.awaitMediaLoaded(input); }))];
case 1: case 1:
// wait for all media elements being loaded // wait for all media elements being loaded
_a.sent(); _a.sent();
return [2 /*return*/, new NetInput_1.NetInput(medias)]; return [2 /*return*/, afterCreate(new NetInput_1.NetInput(inputArray))];
} }
}); });
}); });
......
{"version":3,"file":"toNetInput.js","sourceRoot":"","sources":["../src/toNetInput.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AAEtC,iCAAuD;AAEvD;;;;;;GAMG;AACH,oBACE,KAA2B;;;;;;oBAE3B,IAAI,KAAK,YAAY,mBAAQ,EAAE;wBAC7B,sBAAO,KAAK,EAAA;qBACb;oBAEK,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;wBACtC,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;oBAEb,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;wBACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;qBAC5D;oBAEK,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,kBAAU,CAAC,CAAA;oBAE5C,MAAM,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,CAAC;wBACtB,IAAI,CAAC,CAAC,KAAK,YAAY,gBAAgB,IAAI,KAAK,YAAY,gBAAgB,IAAI,KAAK,YAAY,iBAAiB,CAAC,EAAE;4BACnH,IAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAmB,CAAC,MAAG,CAAC,CAAC,CAAC,EAAE,CAAA;4BACnE,IAAI,OAAO,aAAa,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;gCACxC,MAAM,IAAI,KAAK,CAAC,iBAAe,OAAO,qEAAkE,CAAC,CAAA;6BAC1G;4BACD,MAAM,IAAI,KAAK,CAAC,iBAAe,OAAO,kHAA+G,CAAC,CAAA;yBACvJ;oBACH,CAAC,CAAC,CAAA;oBAEF,2CAA2C;oBAC3C,qBAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,UAAA,KAAK,IAAI,OAAA,wBAAgB,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,CAC7C,EAAA;;oBAHD,2CAA2C;oBAC3C,SAEC,CAAA;oBAED,sBAAO,IAAI,mBAAQ,CAAC,MAAM,CAAC,EAAA;;;;CAC5B;AAjCD,gCAiCC"} {"version":3,"file":"toNetInput.js","sourceRoot":"","sources":["../src/toNetInput.ts"],"names":[],"mappings":";;;AAEA,2DAA0D;AAC1D,+CAA4D;AAC5D,uCAAsC;AAEtC,iCAAyD;AAEzD;;;;;;;;GAQG;AACH,oBACE,MAAiB,EACjB,kBAAmC;IAAnC,mCAAA,EAAA,0BAAmC;;;;;;oBAEnC,IAAI,MAAM,YAAY,mBAAQ,EAAE;wBAC9B,sBAAO,MAAM,EAAA;qBACd;oBAEK,WAAW,GAAG,UAAC,QAAkB,IAAK,OAAA,kBAAkB;wBAC5D,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE;wBACpB,CAAC,CAAC,QAAQ,EAFgC,CAEhC,CAAA;oBAEZ,IAAI,qBAAU,CAAC,MAAM,CAAC,EAAE;wBACtB,sBAAO,WAAW,CAAC,IAAI,mBAAQ,CAAC,MAAqB,CAAC,CAAC,EAAA;qBACxD;oBAEG,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;wBACrC,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;oBAEd,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;wBACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;qBAC5D;oBAEK,UAAU,GAAG,UAAC,GAAW,IAAK,OAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,qBAAmB,GAAG,MAAG,CAAC,CAAC,CAAC,EAAE,EAAtD,CAAsD,CAAA;oBAEpF,UAAU,GAAG,aAAa;yBAC7B,GAAG,CAAC,oBAAY,CAAC;yBACjB,GAAG,CAAC,UAAC,KAAK,EAAE,CAAC;wBACZ,IAAI,qBAAU,CAAC,KAAK,CAAC,EAAE;4BACrB,0EAA0E;4BAC1E,IAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;4BAChC,IAAI,SAAS,KAAK,CAAC,EAAE;gCACnB,MAAM,IAAI,KAAK,CAAC,iBAAe,UAAU,CAAC,CAAC,CAAC,oCAA+B,SAAS,8CAA2C,CAAC,CAAA;6BACjI;4BACD,iBAAiB;4BACjB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;yBAC3C;wBACD,OAAO,KAAK,CAAA;oBACd,CAAC,CAAC,CAAA;oBAEJ,UAAU,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,CAAC;wBAC1B,IAAI,CAAC,+BAAc,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAU,CAAC,KAAK,CAAC,EAAE;4BAEhD,IAAI,OAAO,aAAa,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;gCACxC,MAAM,IAAI,KAAK,CAAC,iBAAe,UAAU,CAAC,CAAC,CAAC,yEAAoE,aAAa,CAAC,CAAC,CAAG,CAAC,CAAA;6BACpI;4BAED,MAAM,IAAI,KAAK,CAAC,iBAAe,UAAU,CAAC,CAAC,CAAC,gIAA6H,CAAC,CAAA;yBAC3K;oBACH,CAAC,CAAC,CAAA;oBAEF,2CAA2C;oBAC3C,qBAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,UAAA,KAAK,IAAI,OAAA,+BAAc,CAAC,KAAK,CAAC,IAAI,wBAAgB,CAAC,KAAK,CAAC,EAAhD,CAAgD,CAAC,CAC1E,EAAA;;oBAHD,2CAA2C;oBAC3C,SAEC,CAAA;oBAED,sBAAO,WAAW,CAAC,IAAI,mBAAQ,CAAC,UAAU,CAAC,CAAC,EAAA;;;;CAC7C;AA1DD,gCA0DC"}
\ No newline at end of file \ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
import { NetInput } from './NetInput';
export declare type TMediaElement = HTMLImageElement | HTMLVideoElement | HTMLCanvasElement; export declare type TMediaElement = HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;
export declare type TNetInputArg = string | TMediaElement; export declare type TResolvedNetInput = TMediaElement | tf.Tensor3D | tf.Tensor4D;
export declare type TNetInput = TNetInputArg | Array<TNetInputArg>; export declare type TNetInputArg = string | TResolvedNetInput;
export declare type TNetInput = TNetInputArg | Array<TNetInputArg> | NetInput | tf.Tensor4D;
export declare type Dimensions = { export declare type Dimensions = {
width: number; width: number;
height: number; height: number;
......
...@@ -3,7 +3,7 @@ import { Dimensions } from './types'; ...@@ -3,7 +3,7 @@ import { Dimensions } from './types';
export declare function isFloat(num: number): boolean; export declare function isFloat(num: number): boolean;
export declare function isEven(num: number): boolean; export declare function isEven(num: number): boolean;
export declare function round(num: number): number; export declare function round(num: number): number;
export declare function getElement(arg: string | any): any; export declare function resolveInput(arg: string | any): any;
export declare function isLoaded(media: HTMLImageElement | HTMLVideoElement): boolean; export declare function isLoaded(media: HTMLImageElement | HTMLVideoElement): boolean;
export declare function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement): Promise<{}>; export declare function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement): Promise<{}>;
export declare function getContext2dOrThrow(canvas: HTMLCanvasElement): CanvasRenderingContext2D; export declare function getContext2dOrThrow(canvas: HTMLCanvasElement): CanvasRenderingContext2D;
...@@ -14,4 +14,4 @@ export declare function getMediaDimensions(media: HTMLImageElement | HTMLVideoEl ...@@ -14,4 +14,4 @@ export declare function getMediaDimensions(media: HTMLImageElement | HTMLVideoEl
height: number; height: number;
}; };
export declare function bufferToImage(buf: Blob): Promise<HTMLImageElement>; export declare function bufferToImage(buf: Blob): Promise<HTMLImageElement>;
export declare function imageTensorToCanvas(imgTensor: tf.Tensor4D, canvas?: HTMLCanvasElement): Promise<HTMLCanvasElement>; export declare function imageTensorToCanvas(imgTensor: tf.Tensor, canvas?: HTMLCanvasElement): Promise<HTMLCanvasElement>;
...@@ -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 isTensor_1 = require("./commons/isTensor");
function isFloat(num) { function isFloat(num) {
return num % 1 !== 0; return num % 1 !== 0;
} }
...@@ -14,13 +15,13 @@ function round(num) { ...@@ -14,13 +15,13 @@ function round(num) {
return Math.floor(num * 100) / 100; return Math.floor(num * 100) / 100;
} }
exports.round = round; exports.round = round;
function getElement(arg) { function resolveInput(arg) {
if (typeof arg === 'string') { if (typeof arg === 'string') {
return document.getElementById(arg); return document.getElementById(arg);
} }
return arg; return arg;
} }
exports.getElement = getElement; exports.resolveInput = resolveInput;
function isLoaded(media) { function isLoaded(media) {
return (media instanceof HTMLImageElement && media.complete) return (media instanceof HTMLImageElement && media.complete)
|| (media instanceof HTMLVideoElement && media.readyState >= 3); || (media instanceof HTMLVideoElement && media.readyState >= 3);
...@@ -105,12 +106,12 @@ function bufferToImage(buf) { ...@@ -105,12 +106,12 @@ function bufferToImage(buf) {
exports.bufferToImage = bufferToImage; exports.bufferToImage = bufferToImage;
function imageTensorToCanvas(imgTensor, canvas) { function imageTensorToCanvas(imgTensor, canvas) {
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var targetCanvas, _a, _, height, width, numChannels; var targetCanvas, _a, height, width, numChannels;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
targetCanvas = canvas || document.createElement('canvas'); targetCanvas = canvas || document.createElement('canvas');
_a = imgTensor.shape, _ = _a[0], height = _a[1], width = _a[2], numChannels = _a[3]; _a = imgTensor.shape.slice(isTensor_1.isTensor4D(imgTensor) ? 1 : 0), height = _a[0], width = _a[1], numChannels = _a[2];
return [4 /*yield*/, tf.toPixels(imgTensor.as3D(height, width, numChannels).toInt(), targetCanvas)]; return [4 /*yield*/, tf.toPixels(imgTensor.as3D(height, width, numChannels).toInt(), targetCanvas)];
case 1: case 1:
_b.sent(); _b.sent();
......
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
...@@ -268,6 +268,88 @@ ...@@ -268,6 +268,88 @@
return FullFaceDescription; return FullFaceDescription;
}()); }());
function isTensor(tensor$$1, dim) {
return tensor$$1 instanceof Tensor && tensor$$1.shape.length === dim;
}
function isTensor1D(tensor$$1) {
return isTensor(tensor$$1, 1);
}
function isTensor2D(tensor$$1) {
return isTensor(tensor$$1, 2);
}
function isTensor3D(tensor$$1) {
return isTensor(tensor$$1, 3);
}
function isTensor4D(tensor$$1) {
return isTensor(tensor$$1, 4);
}
/**
* Pads the smaller dimension of an image tensor with zeros, such that width === height.
*
* @param imgTensor The image tensor.
* @param isCenterImage (optional, default: false) If true, add padding on both sides of the image, such that the image.
* @returns The padded tensor with width === height.
*/
function padToSquare(imgTensor, isCenterImage) {
if (isCenterImage === void 0) { isCenterImage = false; }
return tidy(function () {
var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1];
if (height === width) {
return imgTensor;
}
var dimDiff = Math.abs(height - width);
var paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
var paddingAxis = height > width ? 2 : 1;
var createPaddingTensor = function (paddingAmount) {
var paddingTensorShape = imgTensor.shape.slice();
paddingTensorShape[paddingAxis] = paddingAmount;
return fill(paddingTensorShape, 0);
};
var paddingTensorAppend = createPaddingTensor(paddingAmount);
var remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis];
var paddingTensorPrepend = isCenterImage && remainingPaddingAmount
? createPaddingTensor(remainingPaddingAmount)
: null;
var tensorsToStack = [
paddingTensorPrepend,
imgTensor,
paddingTensorAppend
]
.filter(function (t) { return t !== null; });
return concat(tensorsToStack, paddingAxis);
});
}
var Point = /** @class */ (function () {
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.add = function (pt) {
return new Point(this.x + pt.x, this.y + pt.y);
};
Point.prototype.sub = function (pt) {
return new Point(this.x - pt.x, this.y - pt.y);
};
Point.prototype.mul = function (pt) {
return new Point(this.x * pt.x, this.y * pt.y);
};
Point.prototype.div = function (pt) {
return new Point(this.x / pt.x, this.y / pt.y);
};
Point.prototype.abs = function () {
return new Point(Math.abs(this.x), Math.abs(this.y));
};
Point.prototype.magnitude = function () {
return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2));
};
Point.prototype.floor = function () {
return new Point(Math.floor(this.x), Math.floor(this.y));
};
return Point;
}());
/*! ***************************************************************************** /*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved. Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use Licensed under the Apache License, Version 2.0 (the "License"); you may not use
...@@ -329,7 +411,7 @@ ...@@ -329,7 +411,7 @@
function round$1(num) { function round$1(num) {
return Math.floor(num * 100) / 100; return Math.floor(num * 100) / 100;
} }
function getElement(arg) { function resolveInput(arg) {
if (typeof arg === 'string') { if (typeof arg === 'string') {
return document.getElementById(arg); return document.getElementById(arg);
} }
...@@ -412,12 +494,12 @@ ...@@ -412,12 +494,12 @@
} }
function imageTensorToCanvas(imgTensor, canvas) { function imageTensorToCanvas(imgTensor, canvas) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var targetCanvas, _a, _, height, width, numChannels; var targetCanvas, _a, height, width, numChannels;
return __generator$1(this, function (_b) { return __generator$1(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
targetCanvas = canvas || document.createElement('canvas'); targetCanvas = canvas || document.createElement('canvas');
_a = imgTensor.shape, _ = _a[0], height = _a[1], width = _a[2], numChannels = _a[3]; _a = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0), height = _a[0], width = _a[1], numChannels = _a[2];
return [4 /*yield*/, toPixels(imgTensor.as3D(height, width, numChannels).toInt(), targetCanvas)]; return [4 /*yield*/, toPixels(imgTensor.as3D(height, width, numChannels).toInt(), targetCanvas)];
case 1: case 1:
_b.sent(); _b.sent();
...@@ -428,79 +510,106 @@ ...@@ -428,79 +510,106 @@
} }
var NetInput = /** @class */ (function () { var NetInput = /** @class */ (function () {
function NetInput(medias, dims) { function NetInput(inputs) {
var _this = this; this._inputs = [];
this._canvases = []; this._isManaged = false;
medias.forEach(function (m) { return _this.initCanvas(m, dims); }); this._inputDimensions = [];
this._paddings = [];
if (isTensor4D(inputs)) {
this._inputs = unstack(inputs);
} }
NetInput.prototype.initCanvas = function (media, dims) { if (Array.isArray(inputs)) {
if (media instanceof HTMLCanvasElement) { this._inputs = inputs.map(function (input) {
this._canvases.push(media); if (isTensor3D(input)) {
return; // TODO: make sure not to dispose original tensors passed in by the user
return clone(input);
} }
// if input is batch type, make sure every canvas has the same dimensions return fromPixels(input instanceof HTMLCanvasElement ? input : createCanvasFromMedia(input));
var canvasDims = this.dims || dims; });
this._canvases.push(createCanvasFromMedia(media, canvasDims)); }
}; this._inputDimensions = this._inputs.map(function (t) { return t.shape; });
Object.defineProperty(NetInput.prototype, "canvases", { }
Object.defineProperty(NetInput.prototype, "inputs", {
get: function () { get: function () {
return this._canvases; return this._inputs;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "width", { Object.defineProperty(NetInput.prototype, "isManaged", {
get: function () { get: function () {
return (this._canvases[0] || {}).width; return this._isManaged;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "height", { Object.defineProperty(NetInput.prototype, "batchSize", {
get: function () { get: function () {
return (this._canvases[0] || {}).height; return this._inputs.length;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
Object.defineProperty(NetInput.prototype, "dims", { Object.defineProperty(NetInput.prototype, "inputDimensions", {
get: function () { get: function () {
var _a = this, width = _a.width, height = _a.height; return this._inputDimensions;
return (width > 0 && height > 0) ? { width: width, height: height } : null;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
}); });
return NetInput; Object.defineProperty(NetInput.prototype, "paddings", {
}()); get: function () {
return this._paddings;
var Point = /** @class */ (function () { },
function Point(x, y) { enumerable: true,
this.x = x; configurable: true
this.y = y; });
} NetInput.prototype.getInputDimensions = function (batchIdx) {
Point.prototype.add = function (pt) { return this._inputDimensions[batchIdx];
return new Point(this.x + pt.x, this.y + pt.y);
}; };
Point.prototype.sub = function (pt) { NetInput.prototype.getInputHeight = function (batchIdx) {
return new Point(this.x - pt.x, this.y - pt.y); return this._inputDimensions[batchIdx][0];
}; };
Point.prototype.mul = function (pt) { NetInput.prototype.getInputWidth = function (batchIdx) {
return new Point(this.x * pt.x, this.y * pt.y); return this._inputDimensions[batchIdx][1];
}; };
Point.prototype.div = function (pt) { NetInput.prototype.getPaddings = function (batchIdx) {
return new Point(this.x / pt.x, this.y / pt.y); return this._paddings[batchIdx];
}; };
Point.prototype.abs = function () { NetInput.prototype.toBatchTensor = function (inputSize, isCenterInputs) {
return new Point(Math.abs(this.x), Math.abs(this.y)); var _this = this;
if (isCenterInputs === void 0) { isCenterInputs = true; }
return tidy(function () {
var inputTensors = _this._inputs.map(function (inputTensor) {
var _a = inputTensor.shape, originalHeight = _a[0], originalWidth = _a[1];
var imgTensor = inputTensor.expandDims().toFloat();
imgTensor = padToSquare(imgTensor, isCenterInputs);
var _b = imgTensor.shape.slice(1), heightAfterPadding = _b[0], widthAfterPadding = _b[1];
if (heightAfterPadding !== inputSize || widthAfterPadding !== inputSize) {
imgTensor = image.resizeBilinear(imgTensor, [inputSize, inputSize]);
}
_this._paddings.push(new Point(widthAfterPadding - originalWidth, heightAfterPadding - originalHeight));
return imgTensor;
});
var batchTensor = stack(inputTensors).as4D(_this.batchSize, inputSize, inputSize, 3);
if (_this.isManaged) {
_this.dispose();
}
return batchTensor;
});
}; };
Point.prototype.magnitude = function () { /**
return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); * By setting the isManaged flag, all newly created tensors will be automatically
* automatically disposed after the batch tensor has been created
*/
NetInput.prototype.managed = function () {
this._isManaged = true;
return this;
}; };
Point.prototype.floor = function () { NetInput.prototype.dispose = function () {
return new Point(Math.floor(this.x), Math.floor(this.y)); this._inputs.forEach(function (t) { return t.dispose(); });
}; };
return Point; return NetInput;
}()); }());
var Rect = /** @class */ (function () { var Rect = /** @class */ (function () {
...@@ -551,7 +660,7 @@ ...@@ -551,7 +660,7 @@
ctx.fillText(text, x + padText, y + padText + (drawOptions.fontSize * 0.6)); ctx.fillText(text, x + padText, y + padText + (drawOptions.fontSize * 0.6));
} }
function drawDetection(canvasArg, detection, options) { function drawDetection(canvasArg, detection, options) {
var canvas = getElement(canvasArg); var canvas = resolveInput(canvasArg);
if (!(canvas instanceof HTMLCanvasElement)) { if (!(canvas instanceof HTMLCanvasElement)) {
throw new Error('drawBox - expected canvas to be of type: HTMLCanvasElement'); throw new Error('drawBox - expected canvas to be of type: HTMLCanvasElement');
} }
...@@ -590,7 +699,7 @@ ...@@ -590,7 +699,7 @@
ctx.stroke(); ctx.stroke();
} }
function drawLandmarks(canvasArg, faceLandmarks, options) { function drawLandmarks(canvasArg, faceLandmarks, options) {
var canvas = getElement(canvasArg); var canvas = resolveInput(canvasArg);
if (!(canvas instanceof HTMLCanvasElement)) { if (!(canvas instanceof HTMLCanvasElement)) {
throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement'); throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement');
} }
...@@ -658,43 +767,10 @@ ...@@ -658,43 +767,10 @@
return FaceDetection; return FaceDetection;
}()); }());
/** function isMediaElement(input) {
* Extracts the image regions containing the detected faces. return input instanceof HTMLImageElement
* || input instanceof HTMLVideoElement
* @param input The image that face detection has been performed on. || input instanceof HTMLCanvasElement;
* @param detections The face detection results or face bounding boxes for that image.
* @returns The Canvases of the corresponding image region for each detected face.
*/
function extractFaces(image, detections) {
var ctx = getContext2dOrThrow(image);
var boxes = detections.map(function (det) { return det instanceof FaceDetection
? det.forSize(image.width, image.height).getBox().floor()
: det; });
return boxes.map(function (_a) {
var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
var faceImg = createCanvas({ width: width, height: height });
getContext2dOrThrow(faceImg)
.putImageData(ctx.getImageData(x, y, width, height), 0, 0);
return faceImg;
});
}
function getImageTensor(input) {
return tidy(function () {
if (input instanceof Tensor) {
var rank = input.shape.length;
if (rank !== 3 && rank !== 4) {
throw new Error('input tensor must be of rank 3 or 4');
}
return (rank === 3 ? input.expandDims(0) : input).toFloat();
}
if (!(input instanceof NetInput)) {
throw new Error('getImageTensor - expected input to be a tensor or an instance of NetInput');
}
return concat(input.canvases.map(function (canvas) {
return fromPixels(canvas).expandDims(0).toFloat();
}));
});
} }
/** /**
...@@ -702,39 +778,106 @@ ...@@ -702,39 +778,106 @@
* to be finished loading. * to be finished loading.
* *
* @param input The input, which can be a media element or an array of different media elements. * @param input The input, which can be a media element or an array of different media elements.
* @param manageCreatedInput If a new NetInput instance is created from the inputs, this flag
* determines, whether to set the NetInput as managed or not.
* @returns A NetInput instance, which can be passed into one of the neural networks. * @returns A NetInput instance, which can be passed into one of the neural networks.
*/ */
function toNetInput(input) { function toNetInput(inputs, manageCreatedInput) {
if (manageCreatedInput === void 0) { manageCreatedInput = false; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var mediaArgArray, medias; var afterCreate, inputArgArray, getIdxHint, inputArray;
return __generator$1(this, function (_a) { return __generator$1(this, function (_a) {
switch (_a.label) { switch (_a.label) {
case 0: case 0:
if (input instanceof NetInput) { if (inputs instanceof NetInput) {
return [2 /*return*/, input]; return [2 /*return*/, inputs];
} }
mediaArgArray = Array.isArray(input) afterCreate = function (netInput) { return manageCreatedInput
? input ? netInput.managed()
: [input]; : netInput; };
if (!mediaArgArray.length) { if (isTensor4D(inputs)) {
return [2 /*return*/, afterCreate(new NetInput(inputs))];
}
inputArgArray = Array.isArray(inputs)
? inputs
: [inputs];
if (!inputArgArray.length) {
throw new Error('toNetInput - empty array passed as input'); throw new Error('toNetInput - empty array passed as input');
} }
medias = mediaArgArray.map(getElement); getIdxHint = function (idx) { return Array.isArray(inputs) ? " at input index " + idx + ":" : ''; };
medias.forEach(function (media, i) { inputArray = inputArgArray
if (!(media instanceof HTMLImageElement || media instanceof HTMLVideoElement || media instanceof HTMLCanvasElement)) { .map(resolveInput)
var idxHint = Array.isArray(input) ? " at input index " + i + ":" : ''; .map(function (input, i) {
if (typeof mediaArgArray[i] === 'string') { if (isTensor4D(input)) {
throw new Error("toNetInput -" + idxHint + " string passed, but could not resolve HTMLElement for element id"); // if tf.Tensor4D is passed in the input array, the batch size has to be 1
var batchSize = input.shape[0];
if (batchSize !== 1) {
throw new Error("toNetInput -" + getIdxHint(i) + " tf.Tensor4D with batchSize " + batchSize + " passed, but not supported in input array");
}
// to tf.Tensor3D
return input.reshape(input.shape.slice(1));
}
return input;
});
inputArray.forEach(function (input, i) {
if (!isMediaElement(input) && !isTensor3D(input)) {
if (typeof inputArgArray[i] === 'string') {
throw new Error("toNetInput -" + getIdxHint(i) + " string passed, but could not resolve HTMLElement for element id " + inputArgArray[i]);
} }
throw new Error("toNetInput -" + idxHint + " expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement, or to be an element id"); throw new Error("toNetInput -" + getIdxHint(i) + " expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id");
} }
}); });
// wait for all media elements being loaded // wait for all media elements being loaded
return [4 /*yield*/, Promise.all(medias.map(function (media) { return awaitMediaLoaded(media); }))]; return [4 /*yield*/, Promise.all(inputArray.map(function (input) { return isMediaElement(input) && awaitMediaLoaded(input); }))];
case 1: case 1:
// wait for all media elements being loaded // wait for all media elements being loaded
_a.sent(); _a.sent();
return [2 /*return*/, new NetInput(medias)]; return [2 /*return*/, afterCreate(new NetInput(inputArray))];
}
});
});
}
/**
* Extracts the image regions containing the detected faces.
*
* @param input The image that face detection has been performed on.
* @param detections The face detection results or face bounding boxes for that image.
* @returns The Canvases of the corresponding image region for each detected face.
*/
function extractFaces(input, detections) {
return __awaiter$1(this, void 0, void 0, function () {
var canvas, netInput, ctx, boxes;
return __generator$1(this, function (_a) {
switch (_a.label) {
case 0:
canvas = input;
if (!!(input instanceof HTMLCanvasElement)) return [3 /*break*/, 3];
return [4 /*yield*/, toNetInput(input, true)];
case 1:
netInput = _a.sent();
if (netInput.batchSize > 1) {
if (netInput.isManaged) {
netInput.dispose();
}
throw new Error('extractFaces - batchSize > 1 not supported');
}
return [4 /*yield*/, imageTensorToCanvas(netInput.inputs[0])];
case 2:
canvas = _a.sent();
_a.label = 3;
case 3:
ctx = getContext2dOrThrow(canvas);
boxes = detections.map(function (det) { return det instanceof FaceDetection
? det.forSize(canvas.width, canvas.height).getBox().floor()
: det; });
return [2 /*return*/, boxes.map(function (_a) {
var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
var faceImg = createCanvas({ width: width, height: height });
getContext2dOrThrow(faceImg)
.putImageData(ctx.getImageData(x, y, width, height), 0, 0);
return faceImg;
})];
} }
}); });
}); });
...@@ -752,23 +895,21 @@ ...@@ -752,23 +895,21 @@
*/ */
function extractFaceTensors(input, detections) { function extractFaceTensors(input, detections) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var image$$1, _a; var netInput;
return __generator$1(this, function (_b) { return __generator$1(this, function (_a) {
switch (_b.label) { switch (_a.label) {
case 0: case 0: return [4 /*yield*/, toNetInput(input, true)];
if (!(input instanceof Tensor)) return [3 /*break*/, 1]; case 1:
_a = input; netInput = _a.sent();
return [3 /*break*/, 3]; if (netInput.batchSize > 1) {
case 1: return [4 /*yield*/, toNetInput(input)]; if (netInput.isManaged) {
case 2: netInput.dispose();
_a = _b.sent(); }
_b.label = 3; throw new Error('extractFaceTensors - batchSize > 1 not supported');
case 3: }
image$$1 = _a;
return [2 /*return*/, tidy(function () { return [2 /*return*/, tidy(function () {
var imgTensor = getImageTensor(image$$1); var imgTensor = netInput.inputs[0].expandDims().toFloat();
// TODO handle batches var _a = imgTensor.shape.slice(1), imgHeight = _a[0], imgWidth = _a[1], numChannels = _a[2];
var _a = imgTensor.shape, batchSize = _a[0], imgHeight = _a[1], imgWidth = _a[2], numChannels = _a[3];
var boxes = detections.map(function (det) { return det instanceof FaceDetection var boxes = detections.map(function (det) { return det instanceof FaceDetection
? det.forSize(imgWidth, imgHeight).getBox().floor() ? det.forSize(imgWidth, imgHeight).getBox().floor()
: det; }); : det; });
...@@ -776,6 +917,9 @@ ...@@ -776,6 +917,9 @@
var x = _a.x, y = _a.y, width = _a.width, height = _a.height; var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
return slice(imgTensor, [0, y, x, 0], [1, height, width, numChannels]); return slice(imgTensor, [0, y, x, 0], [1, height, width, numChannels]);
}); });
if (netInput.isManaged) {
netInput.dispose();
}
return faceTensors; return faceTensors;
})]; })];
} }
...@@ -783,43 +927,6 @@ ...@@ -783,43 +927,6 @@
}); });
} }
/**
* Pads the smaller dimension of an image tensor with zeros, such that width === height.
*
* @param imgTensor The image tensor.
* @param isCenterImage (optional, default: false) If true, add padding on both sides of the image, such that the image.
* @returns The padded tensor with width === height.
*/
function padToSquare(imgTensor, isCenterImage) {
if (isCenterImage === void 0) { isCenterImage = false; }
return tidy(function () {
var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1];
if (height === width) {
return imgTensor;
}
var dimDiff = Math.abs(height - width);
var paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
var paddingAxis = height > width ? 2 : 1;
var createPaddingTensor = function (paddingAmount) {
var paddingTensorShape = imgTensor.shape.slice();
paddingTensorShape[paddingAxis] = paddingAmount;
return fill(paddingTensorShape, 0);
};
var paddingTensorAppend = createPaddingTensor(paddingAmount);
var remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis];
var paddingTensorPrepend = isCenterImage && remainingPaddingAmount
? createPaddingTensor(remainingPaddingAmount)
: null;
var tensorsToStack = [
paddingTensorPrepend,
imgTensor,
paddingTensorAppend
]
.filter(function (t) { return t !== null; });
return concat(tensorsToStack, paddingAxis);
});
}
function extractWeightsFactory(weights) { function extractWeightsFactory(weights) {
var remainingWeights = weights; var remainingWeights = weights;
function extractWeights(numWeights) { function extractWeights(numWeights) {
...@@ -986,22 +1093,6 @@ ...@@ -986,22 +1093,6 @@
}; };
} }
function isTensor(tensor$$1, dim) {
return tensor$$1 instanceof Tensor && tensor$$1.shape.length === dim;
}
function isTensor1D(tensor$$1) {
return isTensor(tensor$$1, 1);
}
function isTensor2D(tensor$$1) {
return isTensor(tensor$$1, 2);
}
function isTensor3D(tensor$$1) {
return isTensor(tensor$$1, 3);
}
function isTensor4D(tensor$$1) {
return isTensor(tensor$$1, 4);
}
function getModelUris(uri, defaultModelName) { function getModelUris(uri, defaultModelName) {
var parts = (uri || '').split('/'); var parts = (uri || '').split('/');
var modelBaseUri = ((uri || '').endsWith('.json') var modelBaseUri = ((uri || '').endsWith('.json')
...@@ -1355,16 +1446,6 @@ ...@@ -1355,16 +1446,6 @@
}); });
} }
var resizedImageSize = [512, 512];
var weight = scalar(0.007843137718737125);
var bias = scalar(1);
function resizeLayer(x) {
return tidy(function () {
var resized = image.resizeBilinear(x, resizedImageSize, false);
return sub(mul(resized, weight), bias);
});
}
var FaceDetectionNet = /** @class */ (function () { var FaceDetectionNet = /** @class */ (function () {
function FaceDetectionNet() { function FaceDetectionNet() {
} }
...@@ -1393,37 +1474,28 @@ ...@@ -1393,37 +1474,28 @@
FaceDetectionNet.prototype.extractWeights = function (weights) { FaceDetectionNet.prototype.extractWeights = function (weights) {
this._params = extractParams(weights); this._params = extractParams(weights);
}; };
FaceDetectionNet.prototype.forwardTensor = function (imgTensor) { FaceDetectionNet.prototype.forwardInput = function (input) {
var _this = this; var _this = this;
if (!this._params) { if (!this._params) {
throw new Error('FaceDetectionNet - load model before inference'); throw new Error('FaceDetectionNet - load model before inference');
} }
return tidy(function () { return tidy(function () {
var resized = resizeLayer(imgTensor); var batchTensor = input.toBatchTensor(512, false);
var features = mobileNetV1(resized, _this._params.mobilenetv1_params); var x = sub(mul(batchTensor, scalar(0.007843137718737125)), scalar(1));
var features = mobileNetV1(x, _this._params.mobilenetv1_params);
var _a = predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; var _a = predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params); return outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params);
}); });
}; };
FaceDetectionNet.prototype.forward = function (input) { FaceDetectionNet.prototype.forward = function (input) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var _this = this; var _a;
var netInput, _a;
return __generator$1(this, function (_b) { return __generator$1(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
if (!(input instanceof Tensor)) return [3 /*break*/, 1]; _a = this.forwardInput;
_a = input; return [4 /*yield*/, toNetInput(input, true)];
return [3 /*break*/, 3]; case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
case 1: return [4 /*yield*/, toNetInput(input)];
case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [2 /*return*/, tidy(function () {
return _this.forwardTensor(padToSquare(getImageTensor(netInput)));
})];
} }
}); });
}); });
...@@ -1432,42 +1504,27 @@ ...@@ -1432,42 +1504,27 @@
if (minConfidence === void 0) { minConfidence = 0.8; } if (minConfidence === void 0) { minConfidence = 0.8; }
if (maxResults === void 0) { maxResults = 100; } if (maxResults === void 0) { maxResults = 100; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var _this = this; var netInput, _a, _boxes, _scores, boxes, scores, i, scoresData, _b, _c, iouThreshold, indices, paddedHeightRelative, paddedWidthRelative, results;
var netInput, _a, paddedHeightRelative, paddedWidthRelative, imageDimensions, _b, _boxes, _scores, boxes, scores, i, scoresData, _c, _d, iouThreshold, indices, results; return __generator$1(this, function (_d) {
return __generator$1(this, function (_e) { switch (_d.label) {
switch (_e.label) { case 0: return [4 /*yield*/, toNetInput(input, true)];
case 0: case 1:
if (!(input instanceof Tensor)) return [3 /*break*/, 1]; netInput = _d.sent();
_a = input; _a = this.forwardInput(netInput), _boxes = _a.boxes, _scores = _a.scores;
return [3 /*break*/, 3];
case 1: return [4 /*yield*/, toNetInput(input)];
case 2:
_a = _e.sent();
_e.label = 3;
case 3:
netInput = _a;
paddedHeightRelative = 1, paddedWidthRelative = 1;
_b = tidy(function () {
var imgTensor = getImageTensor(netInput);
var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1];
imageDimensions = { width: width, height: height };
imgTensor = padToSquare(imgTensor);
paddedHeightRelative = imgTensor.shape[1] / height;
paddedWidthRelative = imgTensor.shape[2] / width;
return _this.forwardTensor(imgTensor);
}), _boxes = _b.boxes, _scores = _b.scores;
boxes = _boxes[0]; boxes = _boxes[0];
scores = _scores[0]; scores = _scores[0];
for (i = 1; i < _boxes.length; i++) { for (i = 1; i < _boxes.length; i++) {
_boxes[i].dispose(); _boxes[i].dispose();
_scores[i].dispose(); _scores[i].dispose();
} }
_d = (_c = Array).from; _c = (_b = Array).from;
return [4 /*yield*/, scores.data()]; return [4 /*yield*/, scores.data()];
case 4: case 2:
scoresData = _d.apply(_c, [_e.sent()]); scoresData = _c.apply(_b, [_d.sent()]);
iouThreshold = 0.5; iouThreshold = 0.5;
indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence); indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence);
paddedHeightRelative = (netInput.getPaddings(0).y + netInput.getInputHeight(0)) / netInput.getInputHeight(0);
paddedWidthRelative = (netInput.getPaddings(0).x + netInput.getInputWidth(0)) / netInput.getInputWidth(0);
results = indices results = indices
.map(function (idx) { .map(function (idx) {
var _a = [ var _a = [
...@@ -1478,7 +1535,10 @@ ...@@ -1478,7 +1535,10 @@
Math.max(0, boxes.get(idx, 1)), Math.max(0, boxes.get(idx, 1)),
Math.min(1.0, boxes.get(idx, 3)) Math.min(1.0, boxes.get(idx, 3))
].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1]; ].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1];
return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), imageDimensions); return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), {
height: netInput.getInputHeight(0),
width: netInput.getInputWidth(0)
});
}); });
boxes.dispose(); boxes.dispose();
scores.dispose(); scores.dispose();
...@@ -1745,20 +1805,14 @@ ...@@ -1745,20 +1805,14 @@
FaceLandmarkNet.prototype.extractWeights = function (weights) { FaceLandmarkNet.prototype.extractWeights = function (weights) {
this._params = extractParams$1(weights); this._params = extractParams$1(weights);
}; };
FaceLandmarkNet.prototype.forwardTensor = function (imgTensor) { 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 _a = imgTensor.shape.slice(), batchSize = _a[0], height = _a[1], width = _a[2]; var batchTensor = input.toBatchTensor(128, true);
var x = padToSquare(imgTensor, true); var out = conv(batchTensor, params.conv0_params);
var _b = x.shape.slice(1), heightAfterPadding = _b[0], widthAfterPadding = _b[1];
// work with 128 x 128 sized face images
if (heightAfterPadding !== 128 || widthAfterPadding !== 128) {
x = image.resizeBilinear(x, [128, 128]);
}
var out = conv(x, params.conv0_params);
out = maxPool$1(out); out = maxPool$1(out);
out = conv(out, params.conv1_params); out = conv(out, params.conv1_params);
out = conv(out, params.conv2_params); out = conv(out, params.conv2_params);
...@@ -1776,37 +1830,34 @@ ...@@ -1776,37 +1830,34 @@
return stack([ return stack([
fill([68], fillX), fill([68], fillX),
fill([68], fillY) fill([68], fillY)
], 1).as2D(batchSize, 136); ], 1).as2D(1, 136).as1D();
}; };
/* shift coordinates back, to undo centered padding /* shift coordinates back, to undo centered padding
((x * widthAfterPadding) - shiftX) / width x = ((x * widthAfterPadding) - shiftX) / width
((y * heightAfterPadding) - shiftY) / height y = ((y * heightAfterPadding) - shiftY) / height
*/ */
var shiftX = Math.floor(Math.abs(widthAfterPadding - width) / 2); var landmarkTensors = fc1
var shiftY = Math.floor(Math.abs(heightAfterPadding - height) / 2); .mul(stack(Array.from(Array(input.batchSize), function (_, batchIdx) {
var landmarkTensor = fc1 return createInterleavedTensor(input.getPaddings(batchIdx).x + input.getInputWidth(batchIdx), input.getPaddings(batchIdx).y + input.getInputHeight(batchIdx));
.mul(createInterleavedTensor(widthAfterPadding, heightAfterPadding)) })))
.sub(createInterleavedTensor(shiftX, shiftY)) .sub(stack(Array.from(Array(input.batchSize), function (_, batchIdx) {
.div(createInterleavedTensor(width, height)); return createInterleavedTensor(Math.floor(input.getPaddings(batchIdx).x / 2), Math.floor(input.getPaddings(batchIdx).y / 2));
return landmarkTensor; })))
.div(stack(Array.from(Array(input.batchSize), function (_, batchIdx) {
return createInterleavedTensor(input.getInputWidth(batchIdx), input.getInputHeight(batchIdx));
})));
return landmarkTensors;
}); });
}; };
FaceLandmarkNet.prototype.forward = function (input) { FaceLandmarkNet.prototype.forward = function (input) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var netInput, _a; var _a;
return __generator$1(this, function (_b) { return __generator$1(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
if (!(input instanceof Tensor)) return [3 /*break*/, 1]; _a = this.forwardInput;
_a = input; return [4 /*yield*/, toNetInput(input, true)];
return [3 /*break*/, 3]; case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
case 1: return [4 /*yield*/, toNetInput(input)];
case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [2 /*return*/, this.forwardTensor(getImageTensor(netInput))];
} }
}); });
}); });
...@@ -1814,33 +1865,35 @@ ...@@ -1814,33 +1865,35 @@
FaceLandmarkNet.prototype.detectLandmarks = function (input) { FaceLandmarkNet.prototype.detectLandmarks = function (input) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var _this = this; var _this = this;
var netInput, _a, imageDimensions, outTensor, faceLandmarksArray, _b, _c, xCoords, yCoords; var netInput, landmarkTensors, landmarksForBatch;
return __generator$1(this, function (_d) { return __generator$1(this, function (_a) {
switch (_d.label) { switch (_a.label) {
case 0: return [4 /*yield*/, toNetInput(input, true)];
case 1:
netInput = _a.sent();
landmarkTensors = unstack(this.forwardInput(netInput));
return [4 /*yield*/, Promise.all(landmarkTensors.map(function (landmarkTensor, batchIdx) { return __awaiter$1(_this, void 0, void 0, function () {
var landmarksArray, _a, _b, xCoords, yCoords;
return __generator$1(this, function (_c) {
switch (_c.label) {
case 0: case 0:
if (!(input instanceof Tensor)) return [3 /*break*/, 1]; _b = (_a = Array).from;
_a = input; return [4 /*yield*/, landmarkTensor.data()];
return [3 /*break*/, 3]; case 1:
case 1: return [4 /*yield*/, toNetInput(input)]; landmarksArray = _b.apply(_a, [_c.sent()]);
case 2: xCoords = landmarksArray.filter(function (_, i) { return isEven(i); });
_a = _d.sent(); yCoords = landmarksArray.filter(function (_, i) { return !isEven(i); });
_d.label = 3; return [2 /*return*/, new FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point(xCoords[i], yCoords[i]); }), {
case 3: height: netInput.getInputHeight(batchIdx),
netInput = _a; width: netInput.getInputWidth(batchIdx),
outTensor = tidy(function () { })];
var imgTensor = getImageTensor(netInput); }
var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1];
imageDimensions = { width: width, height: height };
return _this.forwardTensor(imgTensor);
}); });
_c = (_b = Array).from; }); }))];
return [4 /*yield*/, outTensor.data()]; case 2:
case 4: landmarksForBatch = _a.sent();
faceLandmarksArray = _c.apply(_b, [_d.sent()]); landmarkTensors.forEach(function (t) { return t.dispose(); });
outTensor.dispose(); return [2 /*return*/, landmarksForBatch.length === 1 ? landmarksForBatch[0] : landmarksForBatch];
xCoords = faceLandmarksArray.filter(function (_, i) { return isEven(i); });
yCoords = faceLandmarksArray.filter(function (_, i) { return !isEven(i); });
return [2 /*return*/, new FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point(xCoords[i], yCoords[i]); }), imageDimensions)];
} }
}); });
}); });
...@@ -2122,33 +2175,17 @@ ...@@ -2122,33 +2175,17 @@
FaceRecognitionNet.prototype.extractWeights = function (weights) { FaceRecognitionNet.prototype.extractWeights = function (weights) {
this._params = extractParams$2(weights); this._params = extractParams$2(weights);
}; };
FaceRecognitionNet.prototype.forward = function (input) { FaceRecognitionNet.prototype.forwardInput = function (input) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var _this = this; var _this = this;
var netInput, _a; return __generator$1(this, function (_a) {
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0:
if (!this._params) { if (!this._params) {
throw new Error('FaceRecognitionNet - load model before inference'); throw new Error('FaceRecognitionNet - load model before inference');
} }
if (!(input instanceof Tensor)) return [3 /*break*/, 1];
_a = input;
return [3 /*break*/, 3];
case 1: return [4 /*yield*/, toNetInput(input)];
case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [2 /*return*/, tidy(function () { return [2 /*return*/, tidy(function () {
var x = padToSquare(getImageTensor(netInput), true); var batchTensor = input.toBatchTensor(150, true);
// work with 150 x 150 sized face images var normalized = normalize(batchTensor);
if (x.shape[1] !== 150 || x.shape[2] !== 150) { var out = convDown(normalized, _this._params.conv32_down);
x = image.resizeBilinear(x, [150, 150]);
}
x = normalize(x);
var out = convDown(x, _this._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, _this._params.conv32_1);
out = residual(out, _this._params.conv32_2); out = residual(out, _this._params.conv32_2);
...@@ -2168,30 +2205,35 @@ ...@@ -2168,30 +2205,35 @@
var fullyConnected = matMul(globalAvg, _this._params.fc); var fullyConnected = matMul(globalAvg, _this._params.fc);
return fullyConnected; return fullyConnected;
})]; })];
});
});
};
FaceRecognitionNet.prototype.forward = function (input) {
return __awaiter$1(this, void 0, void 0, function () {
var _a;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0:
_a = this.forwardInput;
return [4 /*yield*/, toNetInput(input, true)];
case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
} }
}); });
}); });
}; };
FaceRecognitionNet.prototype.computeFaceDescriptor = function (input) { FaceRecognitionNet.prototype.computeFaceDescriptor = function (input) {
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var netInput, _a, result, data; var result, _a, data;
return __generator$1(this, function (_b) { return __generator$1(this, function (_b) {
switch (_b.label) { switch (_b.label) {
case 0: case 0:
if (!(input instanceof Tensor)) return [3 /*break*/, 1]; _a = this.forward;
_a = input; return [4 /*yield*/, toNetInput(input, true)];
return [3 /*break*/, 3]; case 1: return [4 /*yield*/, _a.apply(this, [_b.sent()])];
case 1: return [4 /*yield*/, toNetInput(input)];
case 2: case 2:
_a = _b.sent();
_b.label = 3;
case 3:
netInput = _a;
return [4 /*yield*/, this.forward(netInput)];
case 4:
result = _b.sent(); result = _b.sent();
return [4 /*yield*/, result.data()]; return [4 /*yield*/, result.data()];
case 5: case 3:
data = _b.sent(); data = _b.sent();
result.dispose(); result.dispose();
return [2 /*return*/, data]; return [2 /*return*/, data];
...@@ -2217,21 +2259,25 @@ ...@@ -2217,21 +2259,25 @@
case 0: return [4 /*yield*/, detectionNet.locateFaces(input, minConfidence)]; case 0: return [4 /*yield*/, detectionNet.locateFaces(input, minConfidence)];
case 1: case 1:
detections = _a.sent(); detections = _a.sent();
return [4 /*yield*/, extractFaceTensors(input, detections)]; return [4 /*yield*/, extractFaceTensors(input, detections)
/**
const faceLandmarksByFace = await Promise.all(faceTensors.map(
faceTensor => landmarkNet.detectLandmarks(faceTensor)
)) as FaceLandmarks[]
*/
];
case 2: case 2:
faceTensors = _a.sent(); faceTensors = _a.sent();
return [4 /*yield*/, Promise.all(faceTensors.map(function (faceTensor) { return landmarkNet.detectLandmarks(faceTensor); }))]; return [4 /*yield*/, landmarkNet.detectLandmarks(faceTensors)];
case 3: case 3:
faceLandmarksByFace = _a.sent(); faceLandmarksByFace = _a.sent();
faceTensors.forEach(function (t) { return t.dispose(); }); faceTensors.forEach(function (t) { return t.dispose(); });
return [4 /*yield*/, Promise.all(faceLandmarksByFace.map(function (landmarks, i) { return landmarks.align(detections[i].getBox()); }))]; alignedFaceBoxes = faceLandmarksByFace.map(function (landmarks, i) { return landmarks.align(detections[i].getBox()); });
case 4:
alignedFaceBoxes = _a.sent();
return [4 /*yield*/, extractFaceTensors(input, alignedFaceBoxes)]; return [4 /*yield*/, extractFaceTensors(input, alignedFaceBoxes)];
case 5: case 4:
alignedFaceTensors = _a.sent(); alignedFaceTensors = _a.sent();
return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))]; return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))];
case 6: case 5:
descriptors = _a.sent(); descriptors = _a.sent();
alignedFaceTensors.forEach(function (t) { return t.dispose(); }); alignedFaceTensors.forEach(function (t) { return t.dispose(); });
return [2 /*return*/, detections.map(function (detection, i) { return [2 /*return*/, detections.map(function (detection, i) {
...@@ -2310,7 +2356,7 @@ ...@@ -2310,7 +2356,7 @@
exports.isFloat = isFloat; exports.isFloat = isFloat;
exports.isEven = isEven; exports.isEven = isEven;
exports.round = round$1; exports.round = round$1;
exports.getElement = getElement; exports.resolveInput = resolveInput;
exports.isLoaded = isLoaded; exports.isLoaded = isLoaded;
exports.awaitMediaLoaded = awaitMediaLoaded; exports.awaitMediaLoaded = awaitMediaLoaded;
exports.getContext2dOrThrow = getContext2dOrThrow; exports.getContext2dOrThrow = getContext2dOrThrow;
......
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.
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