UNPKG

face-api.js

Version:

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

129 lines 6.71 kB
import { __awaiter, __extends, __generator } from "tslib"; import * as tf from '@tensorflow/tfjs-core'; import { extractFaces, extractFaceTensors } from '../dom'; import { extendWithFaceLandmarks } from '../factories/WithFaceLandmarks'; import { ComposableTask } from './ComposableTask'; import { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks'; import { nets } from './nets'; import { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask, } from './PredictAgeAndGenderTask'; import { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask, } from './PredictFaceExpressionsTask'; var DetectFaceLandmarksTaskBase = /** @class */ (function (_super) { __extends(DetectFaceLandmarksTaskBase, _super); function DetectFaceLandmarksTaskBase(parentTask, input, useTinyLandmarkNet) { var _this = _super.call(this) || this; _this.parentTask = parentTask; _this.input = input; _this.useTinyLandmarkNet = useTinyLandmarkNet; return _this; } Object.defineProperty(DetectFaceLandmarksTaskBase.prototype, "landmarkNet", { get: function () { return this.useTinyLandmarkNet ? nets.faceLandmark68TinyNet : nets.faceLandmark68Net; }, enumerable: true, configurable: true }); return DetectFaceLandmarksTaskBase; }(ComposableTask)); export { DetectFaceLandmarksTaskBase }; var DetectAllFaceLandmarksTask = /** @class */ (function (_super) { __extends(DetectAllFaceLandmarksTask, _super); function DetectAllFaceLandmarksTask() { return _super !== null && _super.apply(this, arguments) || this; } DetectAllFaceLandmarksTask.prototype.run = function () { return __awaiter(this, void 0, void 0, function () { var parentResults, detections, faces, _a, faceLandmarksByFace; var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.parentTask]; case 1: parentResults = _b.sent(); detections = parentResults.map(function (res) { return res.detection; }); if (!(this.input instanceof tf.Tensor)) return [3 /*break*/, 3]; return [4 /*yield*/, extractFaceTensors(this.input, detections)]; case 2: _a = _b.sent(); return [3 /*break*/, 5]; case 3: return [4 /*yield*/, extractFaces(this.input, detections)]; case 4: _a = _b.sent(); _b.label = 5; case 5: faces = _a; return [4 /*yield*/, Promise.all(faces.map(function (face) { return _this.landmarkNet.detectLandmarks(face); }))]; case 6: faceLandmarksByFace = _b.sent(); faces.forEach(function (f) { return f instanceof tf.Tensor && f.dispose(); }); return [2 /*return*/, parentResults.map(function (parentResult, i) { return extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i]); })]; } }); }); }; DetectAllFaceLandmarksTask.prototype.withFaceExpressions = function () { return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); }; DetectAllFaceLandmarksTask.prototype.withAgeAndGender = function () { return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); }; DetectAllFaceLandmarksTask.prototype.withFaceDescriptors = function () { return new ComputeAllFaceDescriptorsTask(this, this.input); }; return DetectAllFaceLandmarksTask; }(DetectFaceLandmarksTaskBase)); export { DetectAllFaceLandmarksTask }; var DetectSingleFaceLandmarksTask = /** @class */ (function (_super) { __extends(DetectSingleFaceLandmarksTask, _super); function DetectSingleFaceLandmarksTask() { return _super !== null && _super.apply(this, arguments) || this; } DetectSingleFaceLandmarksTask.prototype.run = function () { return __awaiter(this, void 0, void 0, function () { var parentResult, detection, faces, _a, landmarks; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.parentTask]; case 1: parentResult = _b.sent(); if (!parentResult) { return [2 /*return*/]; } detection = parentResult.detection; if (!(this.input instanceof tf.Tensor)) return [3 /*break*/, 3]; return [4 /*yield*/, extractFaceTensors(this.input, [detection])]; case 2: _a = _b.sent(); return [3 /*break*/, 5]; case 3: return [4 /*yield*/, extractFaces(this.input, [detection])]; case 4: _a = _b.sent(); _b.label = 5; case 5: faces = _a; return [4 /*yield*/, this.landmarkNet.detectLandmarks(faces[0])]; case 6: landmarks = _b.sent(); faces.forEach(function (f) { return f instanceof tf.Tensor && f.dispose(); }); return [2 /*return*/, extendWithFaceLandmarks(parentResult, landmarks)]; } }); }); }; DetectSingleFaceLandmarksTask.prototype.withFaceExpressions = function () { return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); }; DetectSingleFaceLandmarksTask.prototype.withAgeAndGender = function () { return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); }; DetectSingleFaceLandmarksTask.prototype.withFaceDescriptor = function () { return new ComputeSingleFaceDescriptorTask(this, this.input); }; return DetectSingleFaceLandmarksTask; }(DetectFaceLandmarksTaskBase)); export { DetectSingleFaceLandmarksTask }; //# sourceMappingURL=DetectFaceLandmarksTasks.js.map