face-api.js
Version:
JavaScript API for face detection and face recognition in the browser with tensorflow.js
110 lines • 5.96 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var tf = require("@tensorflow/tfjs-core");
var classes_1 = require("../classes");
var FaceDetection_1 = require("../classes/FaceDetection");
var dom_1 = require("../dom");
var NeuralNetwork_1 = require("../NeuralNetwork");
var extractParams_1 = require("./extractParams");
var extractParamsFromWeigthMap_1 = require("./extractParamsFromWeigthMap");
var mobileNetV1_1 = require("./mobileNetV1");
var nonMaxSuppression_1 = require("./nonMaxSuppression");
var outputLayer_1 = require("./outputLayer");
var predictionLayer_1 = require("./predictionLayer");
var SsdMobilenetv1Options_1 = require("./SsdMobilenetv1Options");
var SsdMobilenetv1 = /** @class */ (function (_super) {
tslib_1.__extends(SsdMobilenetv1, _super);
function SsdMobilenetv1() {
return _super.call(this, 'SsdMobilenetv1') || this;
}
SsdMobilenetv1.prototype.forwardInput = function (input) {
var params = this.params;
if (!params) {
throw new Error('SsdMobilenetv1 - load model before inference');
}
return tf.tidy(function () {
var batchTensor = input.toBatchTensor(512, false).toFloat();
var x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1));
var features = mobileNetV1_1.mobileNetV1(x, params.mobilenetv1);
var _a = predictionLayer_1.predictionLayer(features.out, features.conv11, params.prediction_layer), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions;
return outputLayer_1.outputLayer(boxPredictions, classPredictions, params.output_layer);
});
};
SsdMobilenetv1.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*/, dom_1.toNetInput(input)];
case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];
}
});
});
};
SsdMobilenetv1.prototype.locateFaces = function (input, options) {
if (options === void 0) { options = {}; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a, maxResults, minConfidence, netInput, _b, _boxes, _scores, boxes, scores, i, scoresData, _c, _d, iouThreshold, indices, reshapedDims, inputSize, padX, padY, boxesData, results;
return tslib_1.__generator(this, function (_e) {
switch (_e.label) {
case 0:
_a = new SsdMobilenetv1Options_1.SsdMobilenetv1Options(options), maxResults = _a.maxResults, minConfidence = _a.minConfidence;
return [4 /*yield*/, dom_1.toNetInput(input)];
case 1:
netInput = _e.sent();
_b = this.forwardInput(netInput), _boxes = _b.boxes, _scores = _b.scores;
boxes = _boxes[0];
scores = _scores[0];
for (i = 1; i < _boxes.length; i++) {
_boxes[i].dispose();
_scores[i].dispose();
}
_d = (_c = Array).from;
return [4 /*yield*/, scores.data()];
case 2:
scoresData = _d.apply(_c, [_e.sent()]);
iouThreshold = 0.5;
indices = nonMaxSuppression_1.nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence);
reshapedDims = netInput.getReshapedInputDimensions(0);
inputSize = netInput.inputSize;
padX = inputSize / reshapedDims.width;
padY = inputSize / reshapedDims.height;
boxesData = boxes.arraySync();
results = indices
.map(function (idx) {
var _a = [
Math.max(0, boxesData[idx][0]),
Math.min(1.0, boxesData[idx][2])
].map(function (val) { return val * padY; }), top = _a[0], bottom = _a[1];
var _b = [
Math.max(0, boxesData[idx][1]),
Math.min(1.0, boxesData[idx][3])
].map(function (val) { return val * padX; }), left = _b[0], right = _b[1];
return new FaceDetection_1.FaceDetection(scoresData[idx], new classes_1.Rect(left, top, right - left, bottom - top), {
height: netInput.getInputHeight(0),
width: netInput.getInputWidth(0)
});
});
boxes.dispose();
scores.dispose();
return [2 /*return*/, results];
}
});
});
};
SsdMobilenetv1.prototype.getDefaultModelName = function () {
return 'ssd_mobilenetv1_model';
};
SsdMobilenetv1.prototype.extractParamsFromWeigthMap = function (weightMap) {
return extractParamsFromWeigthMap_1.extractParamsFromWeigthMap(weightMap);
};
SsdMobilenetv1.prototype.extractParams = function (weights) {
return extractParams_1.extractParams(weights);
};
return SsdMobilenetv1;
}(NeuralNetwork_1.NeuralNetwork));
exports.SsdMobilenetv1 = SsdMobilenetv1;
//# sourceMappingURL=SsdMobilenetv1.js.map
;