UNPKG

face-api.js

Version:

JavaScript API for face detection and face recognition in the browser with tensorflow.js

81 lines 4.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var tf = require("@tensorflow/tfjs-core"); var classes_1 = require("../classes"); var ops_1 = require("../ops"); var extractImagePatches_1 = require("./extractImagePatches"); var MtcnnBox_1 = require("./MtcnnBox"); var ONet_1 = require("./ONet"); function stage3(img, inputBoxes, scoreThreshold, params, stats) { return tslib_1.__awaiter(this, void 0, void 0, function () { var ts, onetInputs, onetOuts, scoresTensor, scores, _a, _b, indices, filteredRegions, filteredBoxes, filteredScores, finalBoxes, finalScores, points, indicesNms; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: ts = Date.now(); return [4 /*yield*/, extractImagePatches_1.extractImagePatches(img, inputBoxes, { width: 48, height: 48 })]; case 1: onetInputs = _c.sent(); stats.stage3_extractImagePatches = Date.now() - ts; ts = Date.now(); onetOuts = onetInputs.map(function (onetInput) { var out = ONet_1.ONet(onetInput, params); onetInput.dispose(); return out; }); stats.stage3_onet = Date.now() - ts; scoresTensor = onetOuts.length > 1 ? tf.concat(onetOuts.map(function (out) { return out.scores; })) : onetOuts[0].scores; _b = (_a = Array).from; return [4 /*yield*/, scoresTensor.data()]; case 2: scores = _b.apply(_a, [_c.sent()]); scoresTensor.dispose(); indices = scores .map(function (score, idx) { return ({ score: score, idx: idx }); }) .filter(function (c) { return c.score > scoreThreshold; }) .map(function (_a) { var idx = _a.idx; return idx; }); filteredRegions = indices.map(function (idx) { var regionsData = onetOuts[idx].regions.arraySync(); return new MtcnnBox_1.MtcnnBox(regionsData[0][0], regionsData[0][1], regionsData[0][2], regionsData[0][3]); }); filteredBoxes = indices .map(function (idx, i) { return inputBoxes[idx].calibrate(filteredRegions[i]); }); filteredScores = indices.map(function (idx) { return scores[idx]; }); finalBoxes = []; finalScores = []; points = []; if (filteredBoxes.length > 0) { ts = Date.now(); indicesNms = ops_1.nonMaxSuppression(filteredBoxes, filteredScores, 0.7, false); stats.stage3_nms = Date.now() - ts; finalBoxes = indicesNms.map(function (idx) { return filteredBoxes[idx]; }); finalScores = indicesNms.map(function (idx) { return filteredScores[idx]; }); points = indicesNms.map(function (idx, i) { return Array(5).fill(0).map(function (_, ptIdx) { var pointsData = onetOuts[idx].points.arraySync(); return new classes_1.Point(((pointsData[0][ptIdx] * (finalBoxes[i].width + 1)) + finalBoxes[i].left), ((pointsData[0][ptIdx + 5] * (finalBoxes[i].height + 1)) + finalBoxes[i].top)); }); }); } onetOuts.forEach(function (t) { t.regions.dispose(); t.scores.dispose(); t.points.dispose(); }); return [2 /*return*/, { boxes: finalBoxes, scores: finalScores, points: points }]; } }); }); } exports.stage3 = stage3; //# sourceMappingURL=stage3.js.map