Unverified Commit a988c98a by justadudewhohacks Committed by GitHub

Merge pull request #58 from justadudewhohacks/ssd-allfaces-facealignment-fix

Ssd allfaces facealignment fix
parents 5cc2741b 8fda8661
...@@ -69,7 +69,7 @@ var FaceLandmarks = /** @class */ (function () { ...@@ -69,7 +69,7 @@ var FaceLandmarks = /** @class */ (function () {
// TODO: pad in case rectangle is out of image bounds // TODO: pad in case rectangle is out of image bounds
var x = Math.floor(Math.max(0, refPoint.x - (relX * size))); var x = Math.floor(Math.max(0, refPoint.x - (relX * size)));
var y = Math.floor(Math.max(0, refPoint.y - (relY * size))); var y = Math.floor(Math.max(0, refPoint.y - (relY * size)));
return new Rect_1.Rect(x, y, Math.min(size, this._imageWidth - x), Math.min(size, this._imageHeight - y)); return new Rect_1.Rect(x, y, Math.min(size, this._imageWidth + x), Math.min(size, this._imageHeight + y));
}; };
FaceLandmarks.prototype.getRefPointsForAlignment = function () { FaceLandmarks.prototype.getRefPointsForAlignment = function () {
throw new Error('getRefPointsForAlignment not implemented by base class'); throw new Error('getRefPointsForAlignment not implemented by base class');
......
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 { FullFaceDescription } from './FullFaceDescription'; import { FullFaceDescription } from './FullFaceDescription';
import { Mtcnn } from './mtcnn/Mtcnn'; import { Mtcnn } from './mtcnn/Mtcnn';
import { MtcnnForwardParams } from './mtcnn/types'; import { MtcnnForwardParams } from './mtcnn/types';
import { Rect } from './Rect';
import { TNetInput } from './types'; import { TNetInput } from './types';
export declare function allFacesFactory(detectionNet: FaceDetectionNet, landmarkNet: FaceLandmarkNet, computeDescriptors: (input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) => Promise<Float32Array[]>): (input: TNetInput, minConfidence: number, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>; export declare function allFacesFactory(detectionNet: FaceDetectionNet, landmarkNet: FaceLandmarkNet, recognitionNet: FaceRecognitionNet): (input: TNetInput, minConfidence?: number, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>;
export declare function allFacesMtcnnFactory(mtcnn: Mtcnn, computeDescriptors: (input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) => Promise<Float32Array[]>): (input: TNetInput, mtcnnForwardParams: MtcnnForwardParams, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>; export declare function allFacesMtcnnFactory(mtcnn: Mtcnn, recognitionNet: FaceRecognitionNet): (input: TNetInput, mtcnnForwardParams?: MtcnnForwardParams, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>;
...@@ -3,8 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); ...@@ -3,8 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib"); var tslib_1 = require("tslib");
var extractFaceTensors_1 = require("./extractFaceTensors"); var extractFaceTensors_1 = require("./extractFaceTensors");
var FullFaceDescription_1 = require("./FullFaceDescription"); var FullFaceDescription_1 = require("./FullFaceDescription");
function allFacesFactory(detectionNet, landmarkNet, computeDescriptors) { function computeDescriptorsFactory(recognitionNet) {
return function (input, alignedFaceBoxes, useBatchProcessing) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var alignedFaceTensors, descriptors, _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, extractFaceTensors_1.extractFaceTensors(input, alignedFaceBoxes)];
case 1:
alignedFaceTensors = _b.sent();
if (!useBatchProcessing) return [3 /*break*/, 3];
return [4 /*yield*/, recognitionNet.computeFaceDescriptor(alignedFaceTensors)];
case 2:
_a = _b.sent();
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))];
case 4:
_a = _b.sent();
_b.label = 5;
case 5:
descriptors = _a;
alignedFaceTensors.forEach(function (t) { return t.dispose(); });
return [2 /*return*/, descriptors];
}
});
});
};
}
function allFacesFactory(detectionNet, landmarkNet, recognitionNet) {
var computeDescriptors = computeDescriptorsFactory(recognitionNet);
return function (input, minConfidence, useBatchProcessing) { return function (input, minConfidence, useBatchProcessing) {
if (minConfidence === void 0) { minConfidence = 0.8; }
if (useBatchProcessing === void 0) { useBatchProcessing = false; } if (useBatchProcessing === void 0) { useBatchProcessing = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var detections, faceTensors, faceLandmarksByFace, _a, alignedFaceBoxes, descriptors; var detections, faceTensors, faceLandmarksByFace, _a, alignedFaceBoxes, descriptors;
...@@ -41,8 +70,10 @@ function allFacesFactory(detectionNet, landmarkNet, computeDescriptors) { ...@@ -41,8 +70,10 @@ function allFacesFactory(detectionNet, landmarkNet, computeDescriptors) {
}; };
} }
exports.allFacesFactory = allFacesFactory; exports.allFacesFactory = allFacesFactory;
function allFacesMtcnnFactory(mtcnn, computeDescriptors) { function allFacesMtcnnFactory(mtcnn, recognitionNet) {
var computeDescriptors = computeDescriptorsFactory(recognitionNet);
return function (input, mtcnnForwardParams, useBatchProcessing) { return function (input, mtcnnForwardParams, useBatchProcessing) {
if (mtcnnForwardParams === void 0) { mtcnnForwardParams = {}; }
if (useBatchProcessing === void 0) { useBatchProcessing = false; } if (useBatchProcessing === void 0) { useBatchProcessing = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var results, alignedFaceBoxes, descriptors; var results, alignedFaceBoxes, descriptors;
......
{"version":3,"file":"allFacesFactory.js","sourceRoot":"","sources":["../src/allFacesFactory.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAI1D,6DAA4D;AAM5D,yBACE,YAA8B,EAC9B,WAA4B,EAC5B,kBAAwH;IAExH,OAAO,UACL,KAAgB,EAChB,aAAqB,EACrB,kBAAmC;QAAnC,mCAAA,EAAA,0BAAmC;;;;;4BAGhB,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;6BAEnC,kBAAkB,EAAlB,wBAAkB;wBAC1C,qBAAM,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,EAAA;;wBAA9C,KAAA,SAAmE,CAAA;;4BACnE,qBAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CACjC,UAAA,UAAU,IAAI,OAAA,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,EAAvC,CAAuC,CACtD,CAAC,EAAA;;wBAFA,KAAA,SAEqB,CAAA;;;wBAJnB,mBAAmB,KAIA;wBAEzB,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;wBAEmB,qBAAM,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAA;;wBAAnF,WAAW,GAAG,SAAqE;wBAEzF,sBAAO,UAAU,CAAC,GAAG,CAAC,UAAC,SAAS,EAAE,CAAC;gCACjC,OAAA,IAAI,yCAAmB,CACrB,SAAS,EACT,mBAAmB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAkB,SAAS,CAAC,MAAM,EAAE,CAAC,EACxE,WAAW,CAAC,CAAC,CAAC,CACf;4BAJD,CAIC,CACF,EAAA;;;;KAEF,CAAA;AACH,CAAC;AAtCD,0CAsCC;AAED,8BACE,KAAY,EACZ,kBAAwH;IAExH,OAAO,UACL,KAAgB,EAChB,kBAAsC,EACtC,kBAAmC;QAAnC,mCAAA,EAAA,0BAAmC;;;;;4BAGnB,qBAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAA;;wBAAxD,OAAO,GAAG,SAA8C;wBAExD,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAClC,UAAC,EAAiB;gCAAf,gCAAa;4BAAO,OAAA,aAAa,CAAC,KAAK,EAAE;wBAArB,CAAqB,CAC7C,CAAA;wBAEmB,qBAAM,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAA;;wBAAnF,WAAW,GAAG,SAAqE;wBAEzF,sBAAO,OAAO,CAAC,GAAG,CAAC,UAAC,EAAgC,EAAE,CAAC;oCAAjC,gCAAa,EAAE,gCAAa;gCAChD,OAAA,IAAI,yCAAmB,CACrB,aAAa,EACb,aAAa,EACb,WAAW,CAAC,CAAC,CAAC,CACf;4BAJD,CAIC,CACF,EAAA;;;;KAEF,CAAA;AACH,CAAC;AA3BD,oDA2BC"} {"version":3,"file":"allFacesFactory.js","sourceRoot":"","sources":["../src/allFacesFactory.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
...@@ -27,5 +27,7 @@ export declare function locateFaces(input: TNetInput, minConfidence?: number, ma ...@@ -27,5 +27,7 @@ export declare function locateFaces(input: TNetInput, minConfidence?: number, ma
export declare function detectLandmarks(input: TNetInput): Promise<FaceLandmarks68 | FaceLandmarks68[]>; export declare function detectLandmarks(input: TNetInput): Promise<FaceLandmarks68 | FaceLandmarks68[]>;
export declare function computeFaceDescriptor(input: TNetInput): Promise<Float32Array | Float32Array[]>; export declare function computeFaceDescriptor(input: TNetInput): Promise<Float32Array | Float32Array[]>;
export declare function mtcnn(input: TNetInput, forwardParams: MtcnnForwardParams): Promise<MtcnnResult[]>; export declare function mtcnn(input: TNetInput, forwardParams: MtcnnForwardParams): Promise<MtcnnResult[]>;
export declare const allFaces: (input: tf.Tensor | NetInput | TNetInput, minConfidence: number, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>; export declare type allFacesFunction = (input: tf.Tensor | NetInput | TNetInput, minConfidence?: number, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>;
export declare const allFacesMtcnn: (input: tf.Tensor | NetInput | TNetInput, mtcnnForwardParams: MtcnnForwardParams, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>; export declare const allFaces: allFacesFunction;
export declare type allFacesMtcnnFunction = (input: tf.Tensor | NetInput | TNetInput, mtcnnForwardParams?: MtcnnForwardParams, useBatchProcessing?: boolean) => Promise<FullFaceDescription[]>;
export declare const allFacesMtcnn: allFacesMtcnnFunction;
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var allFacesFactory_1 = require("./allFacesFactory"); var allFacesFactory_1 = require("./allFacesFactory");
var extractFaceTensors_1 = require("./extractFaceTensors");
var FaceDetectionNet_1 = require("./faceDetectionNet/FaceDetectionNet"); var FaceDetectionNet_1 = require("./faceDetectionNet/FaceDetectionNet");
var FaceLandmarkNet_1 = require("./faceLandmarkNet/FaceLandmarkNet"); var FaceLandmarkNet_1 = require("./faceLandmarkNet/FaceLandmarkNet");
var FaceRecognitionNet_1 = require("./faceRecognitionNet/FaceRecognitionNet"); var FaceRecognitionNet_1 = require("./faceRecognitionNet/FaceRecognitionNet");
...@@ -59,33 +57,6 @@ function mtcnn(input, forwardParams) { ...@@ -59,33 +57,6 @@ function mtcnn(input, forwardParams) {
return exports.nets.mtcnn.forward(input, forwardParams); return exports.nets.mtcnn.forward(input, forwardParams);
} }
exports.mtcnn = mtcnn; exports.mtcnn = mtcnn;
exports.allFaces = allFacesFactory_1.allFacesFactory(exports.detectionNet, exports.landmarkNet, computeDescriptorsFactory(exports.nets.faceRecognitionNet)); exports.allFaces = allFacesFactory_1.allFacesFactory(exports.nets.ssdMobilenet, exports.nets.faceLandmark68Net, exports.nets.faceRecognitionNet);
exports.allFacesMtcnn = allFacesFactory_1.allFacesMtcnnFactory(exports.nets.mtcnn, computeDescriptorsFactory(exports.nets.faceRecognitionNet)); exports.allFacesMtcnn = allFacesFactory_1.allFacesMtcnnFactory(exports.nets.mtcnn, exports.nets.faceRecognitionNet);
function computeDescriptorsFactory(recognitionNet) {
return function (input, alignedFaceBoxes, useBatchProcessing) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var alignedFaceTensors, descriptors, _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, extractFaceTensors_1.extractFaceTensors(input, alignedFaceBoxes)];
case 1:
alignedFaceTensors = _b.sent();
if (!useBatchProcessing) return [3 /*break*/, 3];
return [4 /*yield*/, recognitionNet.computeFaceDescriptor(alignedFaceTensors)];
case 2:
_a = _b.sent();
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))];
case 4:
_a = _b.sent();
_b.label = 5;
case 5:
descriptors = _a;
alignedFaceTensors.forEach(function (t) { return t.dispose(); });
return [2 /*return*/, descriptors];
}
});
});
};
}
//# sourceMappingURL=globalApi.js.map //# sourceMappingURL=globalApi.js.map
\ No newline at end of file
{"version":3,"file":"globalApi.js","sourceRoot":"","sources":["../src/globalApi.ts"],"names":[],"mappings":"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"} {"version":3,"file":"globalApi.js","sourceRoot":"","sources":["../src/globalApi.ts"],"names":[],"mappings":";;AAEA,qDAA0E;AAE1E,wEAAuE;AACvE,qEAAoE;AAEpE,8EAA6E;AAE7E,uCAAsC;AAKzB,QAAA,YAAY,GAAG,IAAI,mCAAgB,EAAE,CAAA;AACrC,QAAA,WAAW,GAAG,IAAI,iCAAe,EAAE,CAAA;AACnC,QAAA,cAAc,GAAG,IAAI,uCAAkB,EAAE,CAAA;AAEtD,8DAA8D;AAC9D,oDAAoD;AACvC,QAAA,IAAI,GAAG;IAClB,YAAY,EAAE,oBAAY;IAC1B,iBAAiB,EAAE,mBAAW;IAC9B,kBAAkB,EAAE,sBAAc;IAClC,KAAK,EAAE,IAAI,aAAK,EAAE;CACnB,CAAA;AAED,gCAAuC,GAAW;IAChD,OAAO,YAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC;AAFD,wDAEC;AAED,+BAAsC,GAAW;IAC/C,OAAO,YAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACzC,CAAC;AAFD,sDAEC;AAED,kCAAyC,GAAW;IAClD,OAAO,YAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1C,CAAC;AAFD,4DAEC;AAED,wBAA+B,GAAW;IACxC,OAAO,YAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7B,CAAC;AAFD,wCAEC;AAED,oBAA2B,GAAW;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,sBAAsB,CAAC,GAAG,CAAC;QAC3B,qBAAqB,CAAC,GAAG,CAAC;QAC1B,wBAAwB,CAAC,GAAG,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC;KACpB,CAAC,CAAA;AACJ,CAAC;AAPD,gCAOC;AAED,qBACE,KAAgB,EAChB,aAAsB,EACtB,UAAmB;IAEnB,OAAO,YAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;AACxE,CAAC;AAND,kCAMC;AAED,yBACE,KAAgB;IAEhB,OAAO,YAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;AACtD,CAAC;AAJD,0CAIC;AAED,+BACE,KAAgB;IAEhB,OAAO,YAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;AAC7D,CAAC;AAJD,sDAIC;AAED,eACE,KAAgB,EAChB,aAAiC;IAEjC,OAAO,YAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;AACjD,CAAC;AALD,sBAKC;AAQY,QAAA,QAAQ,GAAqB,iCAAe,CACvD,YAAI,CAAC,YAAY,EACjB,YAAI,CAAC,iBAAiB,EACtB,YAAI,CAAC,kBAAkB,CACxB,CAAA;AAQY,QAAA,aAAa,GAA0B,sCAAoB,CACtE,YAAI,CAAC,KAAK,EACV,YAAI,CAAC,kBAAkB,CACxB,CAAA"}
\ No newline at end of file \ No newline at end of file
...@@ -4,12 +4,12 @@ import { TNetInput } from '../types'; ...@@ -4,12 +4,12 @@ import { TNetInput } from '../types';
import { MtcnnForwardParams, MtcnnResult, NetParams } from './types'; import { MtcnnForwardParams, MtcnnResult, NetParams } from './types';
export declare class Mtcnn extends NeuralNetwork<NetParams> { export declare class Mtcnn extends NeuralNetwork<NetParams> {
constructor(); constructor();
forwardInput(input: NetInput, forwardParams: MtcnnForwardParams): Promise<{ forwardInput(input: NetInput, forwardParams?: MtcnnForwardParams): Promise<{
results: MtcnnResult[]; results: MtcnnResult[];
stats: any; stats: any;
}>; }>;
forward(input: TNetInput, forwardParams: MtcnnForwardParams): Promise<MtcnnResult[]>; forward(input: TNetInput, forwardParams?: MtcnnForwardParams): Promise<MtcnnResult[]>;
forwardWithStats(input: TNetInput, forwardParams: MtcnnForwardParams): Promise<{ forwardWithStats(input: TNetInput, forwardParams?: MtcnnForwardParams): Promise<{
results: MtcnnResult[]; results: MtcnnResult[];
stats: any; stats: any;
}>; }>;
......
...@@ -24,6 +24,7 @@ var Mtcnn = /** @class */ (function (_super) { ...@@ -24,6 +24,7 @@ var Mtcnn = /** @class */ (function (_super) {
return _super.call(this, 'Mtcnn') || this; return _super.call(this, 'Mtcnn') || this;
} }
Mtcnn.prototype.forwardInput = function (input, forwardParams) { Mtcnn.prototype.forwardInput = function (input, forwardParams) {
if (forwardParams === void 0) { forwardParams = {}; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var params, inputTensor, inputCanvas, stats, tsTotal, imgTensor, onReturn, _a, height, width, _b, minFaceSize, scaleFactor, maxNumScales, scoreThresholds, scaleSteps, scales, ts, out1, out2, out3, results; var params, inputTensor, inputCanvas, stats, tsTotal, imgTensor, onReturn, _a, height, width, _b, minFaceSize, scaleFactor, maxNumScales, scoreThresholds, scaleSteps, scales, ts, out1, out2, out3, results;
return tslib_1.__generator(this, function (_c) { return tslib_1.__generator(this, function (_c) {
...@@ -98,6 +99,7 @@ var Mtcnn = /** @class */ (function (_super) { ...@@ -98,6 +99,7 @@ var Mtcnn = /** @class */ (function (_super) {
}); });
}; };
Mtcnn.prototype.forward = function (input, forwardParams) { Mtcnn.prototype.forward = function (input, forwardParams) {
if (forwardParams === void 0) { forwardParams = {}; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a; var _a;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_b) {
...@@ -113,6 +115,7 @@ var Mtcnn = /** @class */ (function (_super) { ...@@ -113,6 +115,7 @@ var Mtcnn = /** @class */ (function (_super) {
}); });
}; };
Mtcnn.prototype.forwardWithStats = function (input, forwardParams) { Mtcnn.prototype.forwardWithStats = function (input, forwardParams) {
if (forwardParams === void 0) { forwardParams = {}; }
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a; var _a;
return tslib_1.__generator(this, function (_b) { return tslib_1.__generator(this, function (_b) {
......
{"version":3,"file":"Mtcnn.js","sourceRoot":"","sources":["../../src/mtcnn/Mtcnn.ts"],"names":[],"mappings":"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"} {"version":3,"file":"Mtcnn.js","sourceRoot":"","sources":["../../src/mtcnn/Mtcnn.ts"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
...@@ -1095,7 +1095,7 @@ ...@@ -1095,7 +1095,7 @@
// TODO: pad in case rectangle is out of image bounds // TODO: pad in case rectangle is out of image bounds
var x = Math.floor(Math.max(0, refPoint.x - (relX * size))); var x = Math.floor(Math.max(0, refPoint.x - (relX * size)));
var y = Math.floor(Math.max(0, refPoint.y - (relY * size))); var y = Math.floor(Math.max(0, refPoint.y - (relY * size)));
return new Rect(x, y, Math.min(size, this._imageWidth - x), Math.min(size, this._imageHeight - y)); return new Rect(x, y, Math.min(size, this._imageWidth + x), Math.min(size, this._imageHeight + y));
}; };
FaceLandmarks.prototype.getRefPointsForAlignment = function () { FaceLandmarks.prototype.getRefPointsForAlignment = function () {
throw new Error('getRefPointsForAlignment not implemented by base class'); throw new Error('getRefPointsForAlignment not implemented by base class');
...@@ -2443,8 +2443,37 @@ ...@@ -2443,8 +2443,37 @@
return createFaceRecognitionNet(weights); return createFaceRecognitionNet(weights);
} }
function allFacesFactory(detectionNet, landmarkNet, computeDescriptors) { function computeDescriptorsFactory(recognitionNet) {
return function (input, alignedFaceBoxes, useBatchProcessing) {
return __awaiter$1(this, void 0, void 0, function () {
var alignedFaceTensors, descriptors, _a;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, extractFaceTensors(input, alignedFaceBoxes)];
case 1:
alignedFaceTensors = _b.sent();
if (!useBatchProcessing) return [3 /*break*/, 3];
return [4 /*yield*/, recognitionNet.computeFaceDescriptor(alignedFaceTensors)];
case 2:
_a = _b.sent();
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))];
case 4:
_a = _b.sent();
_b.label = 5;
case 5:
descriptors = _a;
alignedFaceTensors.forEach(function (t) { return t.dispose(); });
return [2 /*return*/, descriptors];
}
});
});
};
}
function allFacesFactory(detectionNet, landmarkNet, recognitionNet) {
var computeDescriptors = computeDescriptorsFactory(recognitionNet);
return function (input, minConfidence, useBatchProcessing) { return function (input, minConfidence, useBatchProcessing) {
if (minConfidence === void 0) { minConfidence = 0.8; }
if (useBatchProcessing === void 0) { useBatchProcessing = false; } if (useBatchProcessing === void 0) { useBatchProcessing = false; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var detections, faceTensors, faceLandmarksByFace, _a, alignedFaceBoxes, descriptors; var detections, faceTensors, faceLandmarksByFace, _a, alignedFaceBoxes, descriptors;
...@@ -2480,8 +2509,10 @@ ...@@ -2480,8 +2509,10 @@
}); });
}; };
} }
function allFacesMtcnnFactory(mtcnn, computeDescriptors) { function allFacesMtcnnFactory(mtcnn, recognitionNet) {
var computeDescriptors = computeDescriptorsFactory(recognitionNet);
return function (input, mtcnnForwardParams, useBatchProcessing) { return function (input, mtcnnForwardParams, useBatchProcessing) {
if (mtcnnForwardParams === void 0) { mtcnnForwardParams = {}; }
if (useBatchProcessing === void 0) { useBatchProcessing = false; } if (useBatchProcessing === void 0) { useBatchProcessing = false; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var results, alignedFaceBoxes, descriptors; var results, alignedFaceBoxes, descriptors;
...@@ -3167,6 +3198,7 @@ ...@@ -3167,6 +3198,7 @@
return _super.call(this, 'Mtcnn') || this; return _super.call(this, 'Mtcnn') || this;
} }
Mtcnn.prototype.forwardInput = function (input, forwardParams) { Mtcnn.prototype.forwardInput = function (input, forwardParams) {
if (forwardParams === void 0) { forwardParams = {}; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var params, inputTensor, inputCanvas, stats, tsTotal, imgTensor, onReturn, _a, height, width, _b, minFaceSize, scaleFactor, maxNumScales, scoreThresholds, scaleSteps, scales, ts, out1, out2, out3, results; var params, inputTensor, inputCanvas, stats, tsTotal, imgTensor, onReturn, _a, height, width, _b, minFaceSize, scaleFactor, maxNumScales, scoreThresholds, scaleSteps, scales, ts, out1, out2, out3, results;
return __generator$1(this, function (_c) { return __generator$1(this, function (_c) {
...@@ -3241,6 +3273,7 @@ ...@@ -3241,6 +3273,7 @@
}); });
}; };
Mtcnn.prototype.forward = function (input, forwardParams) { Mtcnn.prototype.forward = function (input, forwardParams) {
if (forwardParams === void 0) { forwardParams = {}; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var _a; var _a;
return __generator$1(this, function (_b) { return __generator$1(this, function (_b) {
...@@ -3256,6 +3289,7 @@ ...@@ -3256,6 +3289,7 @@
}); });
}; };
Mtcnn.prototype.forwardWithStats = function (input, forwardParams) { Mtcnn.prototype.forwardWithStats = function (input, forwardParams) {
if (forwardParams === void 0) { forwardParams = {}; }
return __awaiter$1(this, void 0, void 0, function () { return __awaiter$1(this, void 0, void 0, function () {
var _a; var _a;
return __generator$1(this, function (_b) { return __generator$1(this, function (_b) {
...@@ -3322,35 +3356,8 @@ ...@@ -3322,35 +3356,8 @@
function mtcnn(input, forwardParams) { function mtcnn(input, forwardParams) {
return nets.mtcnn.forward(input, forwardParams); return nets.mtcnn.forward(input, forwardParams);
} }
var allFaces = allFacesFactory(detectionNet, landmarkNet, computeDescriptorsFactory(nets.faceRecognitionNet)); var allFaces = allFacesFactory(nets.ssdMobilenet, nets.faceLandmark68Net, nets.faceRecognitionNet);
var allFacesMtcnn = allFacesMtcnnFactory(nets.mtcnn, computeDescriptorsFactory(nets.faceRecognitionNet)); var allFacesMtcnn = allFacesMtcnnFactory(nets.mtcnn, nets.faceRecognitionNet);
function computeDescriptorsFactory(recognitionNet) {
return function (input, alignedFaceBoxes, useBatchProcessing) {
return __awaiter$1(this, void 0, void 0, function () {
var alignedFaceTensors, descriptors, _a;
return __generator$1(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, extractFaceTensors(input, alignedFaceBoxes)];
case 1:
alignedFaceTensors = _b.sent();
if (!useBatchProcessing) return [3 /*break*/, 3];
return [4 /*yield*/, recognitionNet.computeFaceDescriptor(alignedFaceTensors)];
case 2:
_a = _b.sent();
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, Promise.all(alignedFaceTensors.map(function (faceTensor) { return recognitionNet.computeFaceDescriptor(faceTensor); }))];
case 4:
_a = _b.sent();
_b.label = 5;
case 5:
descriptors = _a;
alignedFaceTensors.forEach(function (t) { return t.dispose(); });
return [2 /*return*/, descriptors];
}
});
});
};
}
function createMtcnn(weights) { function createMtcnn(weights) {
var net = new Mtcnn(); var net = new Mtcnn();
......
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.
...@@ -105,7 +105,7 @@ export class FaceLandmarks { ...@@ -105,7 +105,7 @@ export class FaceLandmarks {
const x = Math.floor(Math.max(0, refPoint.x - (relX * size))) const x = Math.floor(Math.max(0, refPoint.x - (relX * size)))
const y = Math.floor(Math.max(0, refPoint.y - (relY * size))) const y = Math.floor(Math.max(0, refPoint.y - (relY * size)))
return new Rect(x, y, Math.min(size, this._imageWidth - x), Math.min(size, this._imageHeight - y)) return new Rect(x, y, Math.min(size, this._imageWidth + x), Math.min(size, this._imageHeight + y))
} }
protected getRefPointsForAlignment(): Point[] { protected getRefPointsForAlignment(): Point[] {
......
...@@ -2,25 +2,45 @@ import { extractFaceTensors } from './extractFaceTensors'; ...@@ -2,25 +2,45 @@ import { extractFaceTensors } from './extractFaceTensors';
import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet'; import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet';
import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet'; import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet';
import { FaceLandmarks68 } from './faceLandmarkNet/FaceLandmarks68'; import { FaceLandmarks68 } from './faceLandmarkNet/FaceLandmarks68';
import { FaceRecognitionNet } from './faceRecognitionNet/FaceRecognitionNet';
import { FullFaceDescription } from './FullFaceDescription'; import { FullFaceDescription } from './FullFaceDescription';
import { Mtcnn } from './mtcnn/Mtcnn'; import { Mtcnn } from './mtcnn/Mtcnn';
import { MtcnnForwardParams } from './mtcnn/types'; import { MtcnnForwardParams } from './mtcnn/types';
import { Rect } from './Rect'; import { Rect } from './Rect';
import { TNetInput } from './types'; import { TNetInput } from './types';
function computeDescriptorsFactory(
recognitionNet: FaceRecognitionNet
) {
return async function(input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) {
const alignedFaceTensors = await extractFaceTensors(input, alignedFaceBoxes)
const descriptors = useBatchProcessing
? await recognitionNet.computeFaceDescriptor(alignedFaceTensors) as Float32Array[]
: await Promise.all(alignedFaceTensors.map(
faceTensor => recognitionNet.computeFaceDescriptor(faceTensor)
)) as Float32Array[]
alignedFaceTensors.forEach(t => t.dispose())
return descriptors
}
}
export function allFacesFactory( export function allFacesFactory(
detectionNet: FaceDetectionNet, detectionNet: FaceDetectionNet,
landmarkNet: FaceLandmarkNet, landmarkNet: FaceLandmarkNet,
computeDescriptors: (input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) => Promise<Float32Array[]> recognitionNet: FaceRecognitionNet
) { ) {
const computeDescriptors = computeDescriptorsFactory(recognitionNet)
return async function( return async function(
input: TNetInput, input: TNetInput,
minConfidence: number, minConfidence: number = 0.8,
useBatchProcessing: boolean = false useBatchProcessing: boolean = false
): Promise<FullFaceDescription[]> { ): Promise<FullFaceDescription[]> {
const detections = await detectionNet.locateFaces(input, minConfidence) const detections = await detectionNet.locateFaces(input, minConfidence)
const faceTensors = await extractFaceTensors(input, detections) const faceTensors = await extractFaceTensors(input, detections)
const faceLandmarksByFace = useBatchProcessing const faceLandmarksByFace = useBatchProcessing
...@@ -50,11 +70,13 @@ export function allFacesFactory( ...@@ -50,11 +70,13 @@ export function allFacesFactory(
export function allFacesMtcnnFactory( export function allFacesMtcnnFactory(
mtcnn: Mtcnn, mtcnn: Mtcnn,
computeDescriptors: (input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) => Promise<Float32Array[]> recognitionNet: FaceRecognitionNet
) { ) {
const computeDescriptors = computeDescriptorsFactory(recognitionNet)
return async function( return async function(
input: TNetInput, input: TNetInput,
mtcnnForwardParams: MtcnnForwardParams, mtcnnForwardParams: MtcnnForwardParams = {},
useBatchProcessing: boolean = false useBatchProcessing: boolean = false
): Promise<FullFaceDescription[]> { ): Promise<FullFaceDescription[]> {
......
...@@ -50,7 +50,7 @@ export class FaceDetectionNet extends NeuralNetwork<NetParams> { ...@@ -50,7 +50,7 @@ export class FaceDetectionNet extends NeuralNetwork<NetParams> {
public async locateFaces( public async locateFaces(
input: TNetInput, input: TNetInput,
minConfidence: number = 0.8, minConfidence: number = 0.8,
maxResults: number = 100, maxResults: number = 100
): Promise<FaceDetection[]> { ): Promise<FaceDetection[]> {
const netInput = await toNetInput(input, true) const netInput = await toNetInput(input, true)
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { allFacesFactory, allFacesMtcnnFactory } from './allFacesFactory'; import { allFacesFactory, allFacesMtcnnFactory } from './allFacesFactory';
import { extractFaceTensors } from './extractFaceTensors';
import { FaceDetection } from './FaceDetection'; import { FaceDetection } from './FaceDetection';
import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet'; import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet';
import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet'; import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet';
...@@ -11,7 +10,6 @@ import { FullFaceDescription } from './FullFaceDescription'; ...@@ -11,7 +10,6 @@ import { FullFaceDescription } from './FullFaceDescription';
import { Mtcnn } from './mtcnn/Mtcnn'; import { Mtcnn } from './mtcnn/Mtcnn';
import { MtcnnForwardParams, MtcnnResult } from './mtcnn/types'; import { MtcnnForwardParams, MtcnnResult } from './mtcnn/types';
import { NetInput } from './NetInput'; import { NetInput } from './NetInput';
import { Rect } from './Rect';
import { TNetInput } from './types'; import { TNetInput } from './types';
export const detectionNet = new FaceDetectionNet() export const detectionNet = new FaceDetectionNet()
...@@ -79,39 +77,25 @@ export function mtcnn( ...@@ -79,39 +77,25 @@ export function mtcnn(
return nets.mtcnn.forward(input, forwardParams) return nets.mtcnn.forward(input, forwardParams)
} }
export const allFaces: ( export type allFacesFunction = (
input: tf.Tensor | NetInput | TNetInput, input: tf.Tensor | NetInput | TNetInput,
minConfidence: number, minConfidence?: number,
useBatchProcessing?: boolean useBatchProcessing?: boolean
) => Promise<FullFaceDescription[]> = allFacesFactory( ) => Promise<FullFaceDescription[]>
detectionNet,
landmarkNet, export const allFaces: allFacesFunction = allFacesFactory(
computeDescriptorsFactory(nets.faceRecognitionNet) nets.ssdMobilenet,
nets.faceLandmark68Net,
nets.faceRecognitionNet
) )
export const allFacesMtcnn: ( export type allFacesMtcnnFunction = (
input: tf.Tensor | NetInput | TNetInput, input: tf.Tensor | NetInput | TNetInput,
mtcnnForwardParams: MtcnnForwardParams, mtcnnForwardParams?: MtcnnForwardParams,
useBatchProcessing?: boolean useBatchProcessing?: boolean
) => Promise<FullFaceDescription[]> = allFacesMtcnnFactory( ) => Promise<FullFaceDescription[]>
nets.mtcnn,
computeDescriptorsFactory(nets.faceRecognitionNet)
)
function computeDescriptorsFactory( export const allFacesMtcnn: allFacesMtcnnFunction = allFacesMtcnnFactory(
recognitionNet: FaceRecognitionNet nets.mtcnn,
) { nets.faceRecognitionNet
return async function(input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) { )
const alignedFaceTensors = await extractFaceTensors(input, alignedFaceBoxes) \ No newline at end of file
const descriptors = useBatchProcessing
? await recognitionNet.computeFaceDescriptor(alignedFaceTensors) as Float32Array[]
: await Promise.all(alignedFaceTensors.map(
faceTensor => recognitionNet.computeFaceDescriptor(faceTensor)
)) as Float32Array[]
alignedFaceTensors.forEach(t => t.dispose())
return descriptors
}
}
\ No newline at end of file
...@@ -28,7 +28,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> { ...@@ -28,7 +28,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
public async forwardInput( public async forwardInput(
input: NetInput, input: NetInput,
forwardParams: MtcnnForwardParams forwardParams: MtcnnForwardParams = {}
): Promise<{ results: MtcnnResult[], stats: any }> { ): Promise<{ results: MtcnnResult[], stats: any }> {
const { params } = this const { params } = this
...@@ -132,7 +132,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> { ...@@ -132,7 +132,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
public async forward( public async forward(
input: TNetInput, input: TNetInput,
forwardParams: MtcnnForwardParams forwardParams: MtcnnForwardParams = {}
): Promise<MtcnnResult[]> { ): Promise<MtcnnResult[]> {
return ( return (
await this.forwardInput( await this.forwardInput(
...@@ -144,7 +144,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> { ...@@ -144,7 +144,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
public async forwardWithStats( public async forwardWithStats(
input: TNetInput, input: TNetInput,
forwardParams: MtcnnForwardParams forwardParams: MtcnnForwardParams = {}
): Promise<{ results: MtcnnResult[], stats: any }> { ): Promise<{ results: MtcnnResult[], stats: any }> {
return this.forwardInput( return this.forwardInput(
await toNetInput(input, true, true), await toNetInput(input, true, true),
......
import * as faceapi from '../../../src';
import { describeWithNets, expectAllTensorsReleased, expectRectClose, expectPointClose } from '../../utils';
import { expectedSsdBoxes } from './expectedResults';
import { NetInput } from '../../../src/NetInput';
import { toNetInput } from '../../../src';
import * as tf from '@tensorflow/tfjs-core';
import { Point } from '../../../src/Point';
describe('allFaces', () => {
let imgEl: HTMLImageElement
let facesFaceLandmarkPositions: Point[][]
let facesFaceDescriptors: number[][]
beforeAll(async () => {
const img = await (await fetch('base/test/images/faces.jpg')).blob()
imgEl = await faceapi.bufferToImage(img)
facesFaceLandmarkPositions = await (await fetch('base/test/data/facesFaceLandmarkPositions.json')).json()
facesFaceDescriptors = await (await fetch('base/test/data/facesFaceDescriptorsSsd.json')).json()
})
describeWithNets('computes full face descriptions', { withAllFaces: true }, ({ allFaces }) => {
const expectedScores = [0.97, 0.88, 0.83, 0.82, 0.59, 0.52]
const maxBoxDelta = 5
const maxLandmarkPointsDelta = 1
it('scores > 0.8', async () => {
const results = await allFaces(imgEl, 0.8)
expect(results.length).toEqual(4)
results.forEach(({ detection, landmarks, descriptor }, i) => {
expect(detection.getImageWidth()).toEqual(imgEl.width)
expect(detection.getImageHeight()).toEqual(imgEl.height)
expect(detection.getScore()).toBeCloseTo(expectedScores[i], 2)
expectRectClose(detection.getBox(), expectedSsdBoxes[i], maxBoxDelta)
landmarks.getPositions().forEach((pt, j) => expectPointClose(pt, facesFaceLandmarkPositions[i][j], maxLandmarkPointsDelta))
expect(descriptor).toEqual(new Float32Array(facesFaceDescriptors[i]))
})
})
it('scores > 0.5', async () => {
const results = await allFaces(imgEl, 0.5)
expect(results.length).toEqual(6)
results.forEach(({ detection, landmarks, descriptor }, i) => {
expect(detection.getImageWidth()).toEqual(imgEl.width)
expect(detection.getImageHeight()).toEqual(imgEl.height)
expect(detection.getScore()).toBeCloseTo(expectedScores[i], 2)
expectRectClose(detection.getBox(), expectedSsdBoxes[i], maxBoxDelta)
landmarks.getPositions().forEach((pt, j) => expectPointClose(pt, facesFaceLandmarkPositions[i][j], maxLandmarkPointsDelta))
expect(descriptor).toEqual(new Float32Array(facesFaceDescriptors[i]))
})
})
})
describeWithNets('no memory leaks', { withAllFaces: true }, ({ allFaces }) => {
it('single image element', async () => {
await expectAllTensorsReleased(async () => {
await allFaces(imgEl)
})
})
it('single tf.Tensor3D', async () => {
const tensor = tf.fromPixels(imgEl)
await expectAllTensorsReleased(async () => {
const netInput = (new NetInput([tensor])).managed()
await allFaces(netInput)
})
tensor.dispose()
})
it('single batch size 1 tf.Tensor4Ds', async () => {
const tensor = tf.tidy(() => tf.fromPixels(imgEl).expandDims()) as tf.Tensor4D
await expectAllTensorsReleased(async () => {
await allFaces(await toNetInput(tensor, true))
})
tensor.dispose()
})
})
})
\ No newline at end of file
import * as faceapi from '../../../src';
import { FaceLandmarks5 } from '../../../src/mtcnn/FaceLandmarks5';
import { NetInput } from '../../../src/NetInput';
import { describeWithNets, expectAllTensorsReleased } from '../../utils';
import { expectMtcnnResults } from './expectedResults';
describe('allFacesMtcnn', () => {
let imgEl: HTMLImageElement
let facesFaceDescriptors: number[][]
beforeAll(async () => {
const img = await (await fetch('base/test/images/faces.jpg')).blob()
imgEl = await faceapi.bufferToImage(img)
facesFaceDescriptors = await (await fetch('base/test/data/facesFaceDescriptorsMtcnn.json')).json()
})
describeWithNets('computes full face descriptions', { withAllFacesMtcnn: true }, ({ allFacesMtcnn }) => {
it('minFaceSize = 20', async () => {
const forwardParams = {
minFaceSize: 20
}
const results = await allFacesMtcnn(imgEl, forwardParams)
expect(results.length).toEqual(6)
const mtcnnResult = results.map(res => ({
faceDetection: res.detection,
faceLandmarks: res.landmarks as FaceLandmarks5
}))
expectMtcnnResults(mtcnnResult, [0, 1, 2, 3, 4, 5], 1, 1)
results.forEach(({ descriptor }, i) => {
expect(descriptor).toEqual(new Float32Array(facesFaceDescriptors[i]))
})
})
})
describeWithNets('no memory leaks', { withAllFacesMtcnn: true }, ({ allFacesMtcnn }) => {
it('single image element', async () => {
await expectAllTensorsReleased(async () => {
await allFacesMtcnn(imgEl)
})
})
})
})
\ No newline at end of file
import * as faceapi from '../../../src';
import { FaceLandmarks5 } from '../../../src/mtcnn/FaceLandmarks5';
import { Point } from '../../../src/Point';
import { expectMaxDelta, expectPointClose, expectRectClose } from '../../utils';
export const expectedSsdBoxes = [
{ x: 48, y: 253, width: 104, height: 129 },
{ x: 260, y: 227, width: 76, height: 117 },
{ x: 466, y: 165, width: 88, height: 130 },
{ x: 234, y: 36, width: 84, height: 119 },
{ x: 577, y: 65, width: 84, height: 105 },
{ x: 84, y: 14, width: 79, height: 132 }
]
export const expectedMtcnnBoxes = [
{ x: 70, y: 21, width: 112, height: 112 },
{ x: 36, y: 250, width: 133, height: 132 },
{ x: 221, y: 43, width: 112, height: 111 },
{ x: 247, y: 231, width: 106, height: 107 },
{ x: 566, y: 67, width: 104, height: 104 },
{ x: 451, y: 176, width: 122, height: 122 }
]
export const expectedMtcnnFaceLandmarks = [
[new Point(117, 58), new Point(156, 63), new Point(141, 86), new Point(109, 98), new Point(147, 104)],
[new Point(82, 292), new Point(134, 304), new Point(104, 330), new Point(72, 342), new Point(120, 353)],
[new Point(261, 82), new Point(306, 83), new Point(282, 113), new Point(257, 124), new Point(306, 126)],
[new Point(277, 273), new Point(318, 273), new Point(295, 300), new Point(279, 311), new Point(316, 313)],
[new Point(607, 110), new Point(645, 115), new Point(626, 138), new Point(601, 144), new Point(639, 150)],
[new Point(489, 224), new Point(534, 223), new Point(507, 250), new Point(493, 271), new Point(530, 270)]
]
export function expectMtcnnResults(
results: { faceDetection: faceapi.FaceDetection, faceLandmarks: faceapi.FaceLandmarks5 }[],
boxOrder: number[],
maxBoxDelta: number,
maxLandmarkPointsDelta: number
) {
results.forEach((result, i) => {
const { faceDetection, faceLandmarks } = result
expect(faceDetection instanceof faceapi.FaceDetection).toBe(true)
expect(faceLandmarks instanceof faceapi.FaceLandmarks5).toBe(true)
expectRectClose(faceDetection.getBox(), expectedMtcnnBoxes[boxOrder[i]], maxBoxDelta)
faceLandmarks.getPositions().forEach((pt, j) => expectPointClose(pt, expectedMtcnnFaceLandmarks[boxOrder[i]][j], maxLandmarkPointsDelta))
expectMaxDelta(faceDetection.getScore(), 0.99, 0.01)
})
}
\ No newline at end of file
import * as faceapi from '../../../src'; import * as faceapi from '../../../src';
import { describeWithNets, expectAllTensorsReleased, expectRectClose } from '../../utils'; import { describeWithNets, expectAllTensorsReleased, expectRectClose } from '../../utils';
import { expectedSsdBoxes } from './expectedResults';
const expectedBoxes = [
{ x: 48, y: 253, width: 104, height: 129 },
{ x: 260, y: 227, width: 76, height: 117 },
{ x: 466, y: 165, width: 88, height: 130 },
{ x: 234, y: 36, width: 84, height: 119 },
{ x: 577, y: 65, width: 84, height: 105 },
{ x: 84, y: 14, width: 79, height: 132 }
]
describe('faceDetectionNet', () => { describe('faceDetectionNet', () => {
...@@ -32,7 +24,7 @@ describe('faceDetectionNet', () => { ...@@ -32,7 +24,7 @@ describe('faceDetectionNet', () => {
expect(det.getImageWidth()).toEqual(imgEl.width) expect(det.getImageWidth()).toEqual(imgEl.width)
expect(det.getImageHeight()).toEqual(imgEl.height) expect(det.getImageHeight()).toEqual(imgEl.height)
expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) expect(det.getScore()).toBeCloseTo(expectedScores[i], 2)
expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) expectRectClose(det.getBox(), expectedSsdBoxes[i], maxBoxDelta)
}) })
}) })
...@@ -44,7 +36,7 @@ describe('faceDetectionNet', () => { ...@@ -44,7 +36,7 @@ describe('faceDetectionNet', () => {
expect(det.getImageWidth()).toEqual(imgEl.width) expect(det.getImageWidth()).toEqual(imgEl.width)
expect(det.getImageHeight()).toEqual(imgEl.height) expect(det.getImageHeight()).toEqual(imgEl.height)
expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) expect(det.getScore()).toBeCloseTo(expectedScores[i], 2)
expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) expectRectClose(det.getBox(), expectedSsdBoxes[i], maxBoxDelta)
}) })
}) })
...@@ -63,7 +55,7 @@ describe('faceDetectionNet', () => { ...@@ -63,7 +55,7 @@ describe('faceDetectionNet', () => {
expect(det.getImageWidth()).toEqual(imgEl.width) expect(det.getImageWidth()).toEqual(imgEl.width)
expect(det.getImageHeight()).toEqual(imgEl.height) expect(det.getImageHeight()).toEqual(imgEl.height)
expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) expect(det.getScore()).toBeCloseTo(expectedScores[i], 2)
expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) expectRectClose(det.getBox(), expectedSsdBoxes[i], maxBoxDelta)
}) })
}) })
...@@ -75,7 +67,7 @@ describe('faceDetectionNet', () => { ...@@ -75,7 +67,7 @@ describe('faceDetectionNet', () => {
expect(det.getImageWidth()).toEqual(imgEl.width) expect(det.getImageWidth()).toEqual(imgEl.width)
expect(det.getImageHeight()).toEqual(imgEl.height) expect(det.getImageHeight()).toEqual(imgEl.height)
expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) expect(det.getScore()).toBeCloseTo(expectedScores[i], 2)
expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) expectRectClose(det.getBox(), expectedSsdBoxes[i], maxBoxDelta)
}) })
}) })
......
...@@ -4,7 +4,7 @@ import * as faceapi from '../../../src'; ...@@ -4,7 +4,7 @@ import * as faceapi from '../../../src';
import { isTensor3D } from '../../../src/commons/isTensor'; import { isTensor3D } from '../../../src/commons/isTensor';
import { Point } from '../../../src/Point'; import { Point } from '../../../src/Point';
import { Dimensions, TMediaElement } from '../../../src/types'; import { Dimensions, TMediaElement } from '../../../src/types';
import { expectMaxDelta, expectAllTensorsReleased, tensor3D, describeWithNets } from '../../utils'; import { expectMaxDelta, expectAllTensorsReleased, describeWithNets } from '../../utils';
import { NetInput } from '../../../src/NetInput'; import { NetInput } from '../../../src/NetInput';
import { toNetInput } from '../../../src'; import { toNetInput } from '../../../src';
......
import * as faceapi from '../../../src'; import * as faceapi from '../../../src';
import { MtcnnResult } from '../../../src/mtcnn/types'; import { describeWithNets, expectAllTensorsReleased } from '../../utils';
import { Point } from '../../../src/Point'; import { expectMtcnnResults } from './expectedResults';
import { describeWithNets, expectAllTensorsReleased, expectPointClose, expectRectClose, expectMaxDelta } from '../../utils';
const expectedBoxes = [
{ x: 70, y: 21, width: 112, height: 112 },
{ x: 36, y: 250, width: 133, height: 132 },
{ x: 221, y: 43, width: 112, height: 111 },
{ x: 247, y: 231, width: 106, height: 107 },
{ x: 566, y: 67, width: 104, height: 104 },
{ x: 451, y: 176, width: 122, height: 122 }
]
const expectedFaceLandmarks = [
[new Point(117, 58), new Point(156, 63), new Point(141, 86), new Point(109, 98), new Point(147, 104)],
[new Point(82, 292), new Point(134, 304), new Point(104, 330), new Point(72, 342), new Point(120, 353)],
[new Point(261, 82), new Point(306, 83), new Point(282, 113), new Point(257, 124), new Point(306, 126)],
[new Point(277, 273), new Point(318, 273), new Point(295, 300), new Point(279, 311), new Point(316, 313)],
[new Point(607, 110), new Point(645, 115), new Point(626, 138), new Point(601, 144), new Point(639, 150)],
[new Point(489, 224), new Point(534, 223), new Point(507, 250), new Point(493, 271), new Point(530, 270)]
]
describe('mtcnn', () => { describe('mtcnn', () => {
...@@ -32,21 +14,6 @@ describe('mtcnn', () => { ...@@ -32,21 +14,6 @@ describe('mtcnn', () => {
describeWithNets('uncompressed weights', { withMtcnn: { quantized: false } }, ({ mtcnn }) => { describeWithNets('uncompressed weights', { withMtcnn: { quantized: false } }, ({ mtcnn }) => {
function expectResults(
results: MtcnnResult[],
boxOrder: number[],
maxBoxDelta: number,
maxLandmarkPointsDelta: number
) {
results.forEach((result, i) => {
const { faceDetection, faceLandmarks } = result
expect(faceDetection instanceof faceapi.FaceDetection).toBe(true)
expect(faceLandmarks instanceof faceapi.FaceLandmarks5).toBe(true)
expectRectClose(faceDetection.getBox(), expectedBoxes[boxOrder[i]], maxBoxDelta)
faceLandmarks.getPositions().forEach((pt, j) => expectPointClose(pt, expectedFaceLandmarks[boxOrder[i]][j], maxLandmarkPointsDelta))
expectMaxDelta(faceDetection.getScore(), 0.99, 0.01)
})
}
it('minFaceSize = 20, finds all faces', async () => { it('minFaceSize = 20, finds all faces', async () => {
const forwardParams = { const forwardParams = {
...@@ -55,7 +22,7 @@ describe('mtcnn', () => { ...@@ -55,7 +22,7 @@ describe('mtcnn', () => {
const results = await mtcnn.forward(imgEl, forwardParams) const results = await mtcnn.forward(imgEl, forwardParams)
expect(results.length).toEqual(6) expect(results.length).toEqual(6)
expectResults(results, [0, 1, 2, 3, 4, 5], 1, 1) expectMtcnnResults(results, [0, 1, 2, 3, 4, 5], 1, 1)
}) })
it('minFaceSize = 80, finds all faces', async () => { it('minFaceSize = 80, finds all faces', async () => {
...@@ -66,7 +33,7 @@ describe('mtcnn', () => { ...@@ -66,7 +33,7 @@ describe('mtcnn', () => {
const results = await mtcnn.forward(imgEl, forwardParams) const results = await mtcnn.forward(imgEl, forwardParams)
expect(results.length).toEqual(6) expect(results.length).toEqual(6)
expectResults(results, [0, 5, 3, 1, 2, 4], 12, 12) expectMtcnnResults(results, [0, 5, 3, 1, 2, 4], 12, 12)
}) })
it('all optional params passed, finds all faces', async () => { it('all optional params passed, finds all faces', async () => {
...@@ -79,7 +46,7 @@ describe('mtcnn', () => { ...@@ -79,7 +46,7 @@ describe('mtcnn', () => {
const results = await mtcnn.forward(imgEl, forwardParams) const results = await mtcnn.forward(imgEl, forwardParams)
expect(results.length).toEqual(6) expect(results.length).toEqual(6)
expectResults(results, [5, 1, 4, 3, 2, 0], 6, 10) expectMtcnnResults(results, [5, 1, 4, 3, 2, 0], 6, 10)
}) })
it('scale steps passed, finds all faces', async () => { it('scale steps passed, finds all faces', async () => {
...@@ -89,7 +56,7 @@ describe('mtcnn', () => { ...@@ -89,7 +56,7 @@ describe('mtcnn', () => {
const results = await mtcnn.forward(imgEl, forwardParams) const results = await mtcnn.forward(imgEl, forwardParams)
expect(results.length).toEqual(6) expect(results.length).toEqual(6)
expectResults(results, [5, 1, 3, 0, 2, 4], 7, 15) expectMtcnnResults(results, [5, 1, 3, 0, 2, 4], 7, 15)
}) })
}) })
......
...@@ -4,6 +4,8 @@ import { IRect } from '../build/Rect'; ...@@ -4,6 +4,8 @@ import { IRect } from '../build/Rect';
import * as faceapi from '../src/'; import * as faceapi from '../src/';
import { NeuralNetwork } from '../src/commons/NeuralNetwork'; import { NeuralNetwork } from '../src/commons/NeuralNetwork';
import { IPoint } from '../src/'; import { IPoint } from '../src/';
import { allFacesFactory, allFacesMtcnnFactory } from '../src/allFacesFactory';
import { allFacesMtcnnFunction, allFacesFunction } from '../src/globalApi';
export function zeros(length: number): Float32Array { export function zeros(length: number): Float32Array {
return new Float32Array(length) return new Float32Array(length)
...@@ -57,9 +59,14 @@ export type InjectNetArgs = { ...@@ -57,9 +59,14 @@ export type InjectNetArgs = {
faceLandmarkNet: faceapi.FaceLandmarkNet faceLandmarkNet: faceapi.FaceLandmarkNet
faceRecognitionNet: faceapi.FaceRecognitionNet faceRecognitionNet: faceapi.FaceRecognitionNet
mtcnn: faceapi.Mtcnn mtcnn: faceapi.Mtcnn
allFaces: allFacesFunction
allFacesMtcnn: allFacesMtcnnFunction
} }
export type DescribeWithNetsOptions = { export type DescribeWithNetsOptions = {
withAllFaces?: boolean
withAllFacesMtcnn?: boolean
withFaceDetectionNet?: WithNetOptions withFaceDetectionNet?: WithNetOptions
withFaceLandmarkNet?: WithNetOptions withFaceLandmarkNet?: WithNetOptions
withFaceRecognitionNet?: WithNetOptions withFaceRecognitionNet?: WithNetOptions
...@@ -92,37 +99,43 @@ export function describeWithNets( ...@@ -92,37 +99,43 @@ export function describeWithNets(
let faceLandmarkNet: faceapi.FaceLandmarkNet = new faceapi.FaceLandmarkNet() let faceLandmarkNet: faceapi.FaceLandmarkNet = new faceapi.FaceLandmarkNet()
let faceRecognitionNet: faceapi.FaceRecognitionNet = new faceapi.FaceRecognitionNet() let faceRecognitionNet: faceapi.FaceRecognitionNet = new faceapi.FaceRecognitionNet()
let mtcnn: faceapi.Mtcnn = new faceapi.Mtcnn() let mtcnn: faceapi.Mtcnn = new faceapi.Mtcnn()
let allFaces = allFacesFactory(faceDetectionNet, faceLandmarkNet, faceRecognitionNet)
let allFacesMtcnn = allFacesMtcnnFactory(mtcnn, faceRecognitionNet)
beforeAll(async () => { beforeAll(async () => {
const { const {
withFaceDetectionNet, withFaceDetectionNet,
withFaceLandmarkNet, withFaceLandmarkNet,
withFaceRecognitionNet, withFaceRecognitionNet,
withMtcnn withMtcnn,
withAllFaces,
withAllFacesMtcnn
} = options } = options
if (withFaceDetectionNet) { if (withFaceDetectionNet || withAllFaces) {
await initNet<faceapi.FaceDetectionNet>( await initNet<faceapi.FaceDetectionNet>(
faceDetectionNet, faceDetectionNet,
!withFaceDetectionNet.quantized && 'face_detection_model.weights' !!withFaceDetectionNet && !withFaceDetectionNet.quantized && 'face_detection_model.weights'
) )
} }
if (withFaceLandmarkNet) { if (withFaceLandmarkNet || withAllFaces) {
await initNet<faceapi.FaceLandmarkNet>( await initNet<faceapi.FaceLandmarkNet>(
faceLandmarkNet, faceLandmarkNet,
!withFaceLandmarkNet.quantized && 'face_landmark_68_model.weights' !!withFaceLandmarkNet && !withFaceLandmarkNet.quantized && 'face_landmark_68_model.weights'
) )
} }
if (withFaceRecognitionNet) {
if (withFaceRecognitionNet || withAllFaces || withAllFacesMtcnn) {
await initNet<faceapi.FaceRecognitionNet>( await initNet<faceapi.FaceRecognitionNet>(
faceRecognitionNet, faceRecognitionNet,
!withFaceRecognitionNet.quantized && 'face_recognition_model.weights' // TODO: figure out why quantized weights results in NaNs in testcases
'face_recognition_model.weights'
) )
} }
if (withMtcnn) { if (withMtcnn || withAllFacesMtcnn) {
await initNet<faceapi.Mtcnn>( await initNet<faceapi.Mtcnn>(
mtcnn, mtcnn,
!withMtcnn.quantized && 'mtcnn_model.weights' !!withMtcnn && !withMtcnn.quantized && 'mtcnn_model.weights'
) )
} }
}) })
...@@ -134,7 +147,7 @@ export function describeWithNets( ...@@ -134,7 +147,7 @@ export function describeWithNets(
mtcnn && mtcnn.dispose() mtcnn && mtcnn.dispose()
}) })
specDefinitions({ faceDetectionNet, faceLandmarkNet, faceRecognitionNet, mtcnn }) specDefinitions({ faceDetectionNet, faceLandmarkNet, faceRecognitionNet, mtcnn, allFaces, allFacesMtcnn })
}) })
} }
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