refactoring
parent
09698a891b
commit
9ccaf781ab
|
@ -11,6 +11,7 @@ Repository: **<git+https://github.com/vladmandic/face-api.git>**
|
||||||
|
|
||||||
### **HEAD -> master** 2021/03/19 mandic00@live.com
|
### **HEAD -> master** 2021/03/19 mandic00@live.com
|
||||||
|
|
||||||
|
- refactoring
|
||||||
|
|
||||||
### **1.1.4** 2021/03/18 mandic00@live.com
|
### **1.1.4** 2021/03/18 mandic00@live.com
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -64,8 +64,8 @@ export class AgeGenderNet extends NeuralNetwork<NetParams> {
|
||||||
|
|
||||||
const predictionsByBatch = await Promise.all(
|
const predictionsByBatch = await Promise.all(
|
||||||
ageAndGenderTensors.map(async ({ ageTensor, genderTensor }) => {
|
ageAndGenderTensors.map(async ({ ageTensor, genderTensor }) => {
|
||||||
const age = (await ageTensor.data())[0];
|
const age = (ageTensor.dataSync())[0];
|
||||||
const probMale = (await genderTensor.data())[0];
|
const probMale = (genderTensor.dataSync())[0];
|
||||||
const isMale = probMale > 0.5;
|
const isMale = probMale > 0.5;
|
||||||
const gender = isMale ? Gender.MALE : Gender.FEMALE;
|
const gender = isMale ? Gender.MALE : Gender.FEMALE;
|
||||||
const genderProbability = isMale ? probMale : (1 - probMale);
|
const genderProbability = isMale ? probMale : (1 - probMale);
|
||||||
|
|
|
@ -14,10 +14,7 @@ import { isTensor3D, isTensor4D } from '../utils/index';
|
||||||
* @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 async function extractFaceTensors(
|
export async function extractFaceTensors(imageTensor: tf.Tensor3D | tf.Tensor4D, detections: Array<FaceDetection | Rect>): Promise<tf.Tensor3D[]> {
|
||||||
imageTensor: tf.Tensor3D | tf.Tensor4D,
|
|
||||||
detections: Array<FaceDetection | Rect>,
|
|
||||||
): Promise<tf.Tensor3D[]> {
|
|
||||||
if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) {
|
if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) {
|
||||||
throw new Error('extractFaceTensors - expected image tensor to be 3D or 4D');
|
throw new Error('extractFaceTensors - expected image tensor to be 3D or 4D');
|
||||||
}
|
}
|
||||||
|
@ -29,11 +26,10 @@ export async function extractFaceTensors(
|
||||||
return tf.tidy(() => {
|
return tf.tidy(() => {
|
||||||
const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0);
|
const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0);
|
||||||
|
|
||||||
const boxes = detections.map(
|
const boxes = detections
|
||||||
(det) => (det instanceof FaceDetection
|
.map((det) => (det instanceof FaceDetection
|
||||||
? det.forSize(imgWidth, imgHeight).box
|
? det.forSize(imgWidth, imgHeight).box
|
||||||
: det),
|
: det))
|
||||||
)
|
|
||||||
.map((box) => box.clipAtImageBorders(imgWidth, imgHeight));
|
.map((box) => box.clipAtImageBorders(imgWidth, imgHeight));
|
||||||
|
|
||||||
const faceTensors = boxes.map(({
|
const faceTensors = boxes.map(({
|
||||||
|
|
|
@ -23,7 +23,7 @@ export class FaceExpressionNet extends FaceProcessor<FaceFeatureExtractorParams>
|
||||||
const netInput = await toNetInput(input);
|
const netInput = await toNetInput(input);
|
||||||
const out = await this.forwardInput(netInput);
|
const out = await this.forwardInput(netInput);
|
||||||
const probabilitesByBatch = await Promise.all(tf.unstack(out).map(async (t) => {
|
const probabilitesByBatch = await Promise.all(tf.unstack(out).map(async (t) => {
|
||||||
const data = await t.data();
|
const data = t.dataSync();
|
||||||
t.dispose();
|
t.dispose();
|
||||||
return data;
|
return data;
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -23,7 +23,7 @@ export class FaceFeatureExtractor extends NeuralNetwork<FaceFeatureExtractorPara
|
||||||
return tf.tidy(() => {
|
return tf.tidy(() => {
|
||||||
const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');
|
const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');
|
||||||
const meanRgb = [122.782, 117.001, 104.298];
|
const meanRgb = [122.782, 117.001, 104.298];
|
||||||
const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(255)) as tf.Tensor4D;
|
const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;
|
||||||
|
|
||||||
let out = denseBlock4(normalized, params.dense0, true);
|
let out = denseBlock4(normalized, params.dense0, true);
|
||||||
out = denseBlock4(out, params.dense1);
|
out = denseBlock4(out, params.dense1);
|
||||||
|
|
|
@ -23,7 +23,7 @@ export class TinyFaceFeatureExtractor extends NeuralNetwork<TinyFaceFeatureExtra
|
||||||
return tf.tidy(() => {
|
return tf.tidy(() => {
|
||||||
const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');
|
const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');
|
||||||
const meanRgb = [122.782, 117.001, 104.298];
|
const meanRgb = [122.782, 117.001, 104.298];
|
||||||
const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(255)) as tf.Tensor4D;
|
const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;
|
||||||
|
|
||||||
let out = denseBlock3(normalized, params.dense0, true);
|
let out = denseBlock3(normalized, params.dense0, true);
|
||||||
out = denseBlock3(out, params.dense1);
|
out = denseBlock3(out, params.dense1);
|
||||||
|
|
|
@ -72,7 +72,7 @@ export abstract class FaceLandmark68NetBase<
|
||||||
|
|
||||||
const landmarksForBatch = await Promise.all(landmarkTensors.map(
|
const landmarksForBatch = await Promise.all(landmarkTensors.map(
|
||||||
async (landmarkTensor, batchIdx) => {
|
async (landmarkTensor, batchIdx) => {
|
||||||
const landmarksArray = Array.from(await landmarkTensor.data());
|
const landmarksArray = Array.from(landmarkTensor.dataSync());
|
||||||
const xCoords = landmarksArray.filter((_, i) => isEven(i));
|
const xCoords = landmarksArray.filter((_, i) => isEven(i));
|
||||||
const yCoords = landmarksArray.filter((_, i) => !isEven(i));
|
const yCoords = landmarksArray.filter((_, i) => !isEven(i));
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ export class FaceRecognitionNet extends NeuralNetwork<NetParams> {
|
||||||
const batchTensor = tf.cast(input.toBatchTensor(150, true), 'float32');
|
const batchTensor = tf.cast(input.toBatchTensor(150, true), 'float32');
|
||||||
|
|
||||||
const meanRgb = [122.782, 117.001, 104.298];
|
const meanRgb = [122.782, 117.001, 104.298];
|
||||||
const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(256)) as tf.Tensor4D;
|
const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;
|
||||||
|
|
||||||
let out = convDown(normalized, params.conv32_down);
|
let out = convDown(normalized, params.conv32_down);
|
||||||
out = tf.maxPool(out, 3, 2, 'valid');
|
out = tf.maxPool(out, 3, 2, 'valid');
|
||||||
|
@ -62,9 +62,7 @@ export class FaceRecognitionNet extends NeuralNetwork<NetParams> {
|
||||||
public async computeFaceDescriptor(input: TNetInput): Promise<Float32Array|Float32Array[]> {
|
public async computeFaceDescriptor(input: TNetInput): Promise<Float32Array|Float32Array[]> {
|
||||||
if (input?.shape?.some((dim) => dim <= 0)) return new Float32Array(128);
|
if (input?.shape?.some((dim) => dim <= 0)) return new Float32Array(128);
|
||||||
const netInput = await toNetInput(input);
|
const netInput = await toNetInput(input);
|
||||||
const faceDescriptorTensors = tf.tidy(
|
const faceDescriptorTensors = tf.tidy(() => tf.unstack(this.forwardInput(netInput)));
|
||||||
() => tf.unstack(this.forwardInput(netInput)),
|
|
||||||
);
|
|
||||||
const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())) as Float32Array[];
|
const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())) as Float32Array[];
|
||||||
faceDescriptorTensors.forEach((t) => t.dispose());
|
faceDescriptorTensors.forEach((t) => t.dispose());
|
||||||
return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0];
|
return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0];
|
||||||
|
|
|
@ -8,12 +8,7 @@ export function isWithFaceDetection(obj: any): obj is WithFaceDetection<{}> {
|
||||||
return obj.detection instanceof FaceDetection;
|
return obj.detection instanceof FaceDetection;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function extendWithFaceDetection<
|
export function extendWithFaceDetection<TSource>(sourceObj: TSource, detection: FaceDetection): WithFaceDetection<TSource> {
|
||||||
TSource
|
|
||||||
>(
|
|
||||||
sourceObj: TSource,
|
|
||||||
detection: FaceDetection,
|
|
||||||
): WithFaceDetection<TSource> {
|
|
||||||
const extension = { detection };
|
const extension = { detection };
|
||||||
return { ...sourceObj, ...extension };
|
return { ...sourceObj, ...extension };
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,9 +65,7 @@ export class DetectAllFaceLandmarksTask<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DetectSingleFaceLandmarksTask<
|
export class DetectSingleFaceLandmarksTask<TSource extends WithFaceDetection<{}>> extends DetectFaceLandmarksTaskBase<WithFaceLandmarks<TSource> | undefined, TSource | undefined> {
|
||||||
TSource extends WithFaceDetection<{}>
|
|
||||||
> extends DetectFaceLandmarksTaskBase<WithFaceLandmarks<TSource> | undefined, TSource | undefined> {
|
|
||||||
public async run(): Promise<WithFaceLandmarks<TSource> | undefined> {
|
public async run(): Promise<WithFaceLandmarks<TSource> | undefined> {
|
||||||
const parentResult = await this.parentTask;
|
const parentResult = await this.parentTask;
|
||||||
if (!parentResult) {
|
if (!parentResult) {
|
||||||
|
|
|
@ -26,7 +26,6 @@ export class DetectFacesTaskBase<TReturn> extends ComposableTask<TReturn> {
|
||||||
export class DetectAllFacesTask extends DetectFacesTaskBase<FaceDetection[]> {
|
export class DetectAllFacesTask extends DetectFacesTaskBase<FaceDetection[]> {
|
||||||
public async run(): Promise<FaceDetection[]> {
|
public async run(): Promise<FaceDetection[]> {
|
||||||
const { input, options } = this;
|
const { input, options } = this;
|
||||||
|
|
||||||
let result;
|
let result;
|
||||||
if (options instanceof TinyFaceDetectorOptions) result = nets.tinyFaceDetector.locateFaces(input, options);
|
if (options instanceof TinyFaceDetectorOptions) result = nets.tinyFaceDetector.locateFaces(input, options);
|
||||||
else if (options instanceof SsdMobilenetv1Options) result = nets.ssdMobilenetv1.locateFaces(input, options);
|
else if (options instanceof SsdMobilenetv1Options) result = nets.ssdMobilenetv1.locateFaces(input, options);
|
||||||
|
|
|
@ -17,6 +17,7 @@ export async function extractAllFacesAndComputeResults<TSource extends WithFaceD
|
||||||
const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)
|
const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)
|
||||||
? getRectForAlignment(parentResult)
|
? getRectForAlignment(parentResult)
|
||||||
: parentResult.detection));
|
: parentResult.detection));
|
||||||
|
|
||||||
const faces: Array<HTMLCanvasElement | tf.Tensor3D> = extractedFaces || (
|
const faces: Array<HTMLCanvasElement | tf.Tensor3D> = extractedFaces || (
|
||||||
input instanceof tf.Tensor
|
input instanceof tf.Tensor
|
||||||
? await extractFaceTensors(input, faceBoxes)
|
? await extractFaceTensors(input, faceBoxes)
|
||||||
|
|
|
@ -29,7 +29,6 @@ export class SsdMobilenetv1 extends NeuralNetwork<NetParams> {
|
||||||
const batchTensor = tf.cast(input.toBatchTensor(512, false), 'float32');
|
const batchTensor = tf.cast(input.toBatchTensor(512, false), 'float32');
|
||||||
const x = tf.sub(tf.div(batchTensor, 127.5), 1) as tf.Tensor4D; // input is normalized -1..1
|
const x = tf.sub(tf.div(batchTensor, 127.5), 1) as tf.Tensor4D; // input is normalized -1..1
|
||||||
const features = mobileNetV1(x, params.mobilenetv1);
|
const features = mobileNetV1(x, params.mobilenetv1);
|
||||||
|
|
||||||
const { boxPredictions, classPredictions } = predictionLayer(features.out, features.conv11, params.prediction_layer);
|
const { boxPredictions, classPredictions } = predictionLayer(features.out, features.conv11, params.prediction_layer);
|
||||||
|
|
||||||
return outputLayer(boxPredictions, classPredictions, params.output_layer);
|
return outputLayer(boxPredictions, classPredictions, params.output_layer);
|
||||||
|
@ -42,7 +41,6 @@ export class SsdMobilenetv1 extends NeuralNetwork<NetParams> {
|
||||||
|
|
||||||
public async locateFaces(input: TNetInput, options: ISsdMobilenetv1Options = {}): Promise<FaceDetection[]> {
|
public async locateFaces(input: TNetInput, options: ISsdMobilenetv1Options = {}): Promise<FaceDetection[]> {
|
||||||
const { maxResults, minConfidence } = new SsdMobilenetv1Options(options);
|
const { maxResults, minConfidence } = new SsdMobilenetv1Options(options);
|
||||||
|
|
||||||
const netInput = await toNetInput(input);
|
const netInput = await toNetInput(input);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
@ -57,7 +55,7 @@ export class SsdMobilenetv1 extends NeuralNetwork<NetParams> {
|
||||||
_scores[i].dispose();
|
_scores[i].dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
const scoresData = Array.from(await scores.data());
|
const scoresData = Array.from(scores.dataSync());
|
||||||
const iouThreshold = 0.5;
|
const iouThreshold = 0.5;
|
||||||
const indices = nonMaxSuppression(
|
const indices = nonMaxSuppression(
|
||||||
boxes,
|
boxes,
|
||||||
|
|
|
@ -50,9 +50,7 @@ export function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {
|
||||||
const depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
|
const depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
|
||||||
out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
|
out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
|
||||||
out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
|
out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
|
||||||
if (layerIdx === 11) {
|
if (layerIdx === 11) conv11 = out;
|
||||||
conv11 = out;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (conv11 === null) {
|
if (conv11 === null) {
|
||||||
|
|
|
@ -10,8 +10,8 @@ function getCenterCoordinatesAndSizesLayer(x: tf.Tensor2D) {
|
||||||
tf.sub(vec[3], vec[1]),
|
tf.sub(vec[3], vec[1]),
|
||||||
];
|
];
|
||||||
const centers = [
|
const centers = [
|
||||||
tf.add(vec[0], tf.div(sizes[0], tf.scalar(2))),
|
tf.add(vec[0], tf.div(sizes[0], 2)),
|
||||||
tf.add(vec[1], tf.div(sizes[1], tf.scalar(2))),
|
tf.add(vec[1], tf.div(sizes[1], 2)),
|
||||||
];
|
];
|
||||||
return { sizes, centers };
|
return { sizes, centers };
|
||||||
}
|
}
|
||||||
|
@ -20,10 +20,10 @@ function decodeBoxesLayer(x0: tf.Tensor2D, x1: tf.Tensor2D) {
|
||||||
const { sizes, centers } = getCenterCoordinatesAndSizesLayer(x0);
|
const { sizes, centers } = getCenterCoordinatesAndSizesLayer(x0);
|
||||||
|
|
||||||
const vec = tf.unstack(tf.transpose(x1, [1, 0]));
|
const vec = tf.unstack(tf.transpose(x1, [1, 0]));
|
||||||
const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], tf.scalar(5))), sizes[0]), tf.scalar(2));
|
const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], 5)), sizes[0]), 2);
|
||||||
const add0_out = tf.add(tf.mul(tf.div(vec[0], tf.scalar(10)), sizes[0]), centers[0]);
|
const add0_out = tf.add(tf.mul(tf.div(vec[0], 10), sizes[0]), centers[0]);
|
||||||
const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], tf.scalar(5))), sizes[1]), tf.scalar(2));
|
const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], 5)), sizes[1]), 2);
|
||||||
const add1_out = tf.add(tf.mul(tf.div(vec[1], tf.scalar(10)), sizes[1]), centers[1]);
|
const add1_out = tf.add(tf.mul(tf.div(vec[1], 10), sizes[1]), centers[1]);
|
||||||
|
|
||||||
return tf.transpose(
|
return tf.transpose(
|
||||||
tf.stack([
|
tf.stack([
|
||||||
|
|
|
@ -2,13 +2,18 @@ import * as tf from '../../dist/tfjs.esm';
|
||||||
|
|
||||||
import { PointwiseConvParams } from './types';
|
import { PointwiseConvParams } from './types';
|
||||||
|
|
||||||
export function pointwiseConvLayer(
|
export function pointwiseConvLayer(x: tf.Tensor4D, params: PointwiseConvParams, strides: [number, number]) {
|
||||||
x: tf.Tensor4D,
|
|
||||||
params: PointwiseConvParams,
|
|
||||||
strides: [number, number],
|
|
||||||
) {
|
|
||||||
return tf.tidy(() => {
|
return tf.tidy(() => {
|
||||||
let out = tf.conv2d(x, params.filters, strides, 'same');
|
let out = tf.conv2d(x, params.filters, strides, 'same');
|
||||||
|
/*
|
||||||
|
if (x.shape[1] === 512 && x.shape[3] === 3) {
|
||||||
|
console.log('Input:', x.shape, x.size); // input does not change (checked values)
|
||||||
|
console.log('Filter:', params.filters.shape, params.filters.size); // params do not change (checked values)
|
||||||
|
console.log('Strides', strides);
|
||||||
|
console.log('Conv2d Output:', out.shape, out.size, out.dataSync()[0]); // output has different values!
|
||||||
|
console.log('Sum of all Conv2D values:', tf.reshape(out, [2097152]).sum().dataSync()[0]); // silly sum just to see how much results diverged
|
||||||
|
}
|
||||||
|
*/
|
||||||
out = tf.add(out, params.batch_norm_offset);
|
out = tf.add(out, params.batch_norm_offset);
|
||||||
return tf.clipByValue(out, 0, 6);
|
return tf.clipByValue(out, 0, 6);
|
||||||
});
|
});
|
||||||
|
|
|
@ -94,7 +94,7 @@ export class TinyYolov2Base extends NeuralNetwork<TinyYolov2NetParams> {
|
||||||
batchTensor = this.config.meanRgb
|
batchTensor = this.config.meanRgb
|
||||||
? normalize(batchTensor, this.config.meanRgb)
|
? normalize(batchTensor, this.config.meanRgb)
|
||||||
: batchTensor;
|
: batchTensor;
|
||||||
batchTensor = batchTensor.div(tf.scalar(256)) as tf.Tensor4D;
|
batchTensor = batchTensor.div(255) as tf.Tensor4D;
|
||||||
return this.config.withSeparableConvs
|
return this.config.withSeparableConvs
|
||||||
? this.runMobilenet(batchTensor, params as MobilenetParams)
|
? this.runMobilenet(batchTensor, params as MobilenetParams)
|
||||||
: this.runTinyYolov2(batchTensor, params as DefaultTinyYolov2NetParams);
|
: this.runTinyYolov2(batchTensor, params as DefaultTinyYolov2NetParams);
|
||||||
|
|
|
@ -46,7 +46,7 @@ export class TinyXception extends NeuralNetwork<TinyXceptionParams> {
|
||||||
return tf.tidy(() => {
|
return tf.tidy(() => {
|
||||||
const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');
|
const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');
|
||||||
const meanRgb = [122.782, 117.001, 104.298];
|
const meanRgb = [122.782, 117.001, 104.298];
|
||||||
const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(256)) as tf.Tensor4D;
|
const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;
|
||||||
let out = tf.relu(conv(normalized, params.entry_flow.conv_in, [2, 2]));
|
let out = tf.relu(conv(normalized, params.entry_flow.conv_in, [2, 2]));
|
||||||
out = reductionBlock(out, params.entry_flow.reduction_block_0, false);
|
out = reductionBlock(out, params.entry_flow.reduction_block_0, false);
|
||||||
out = reductionBlock(out, params.entry_flow.reduction_block_1);
|
out = reductionBlock(out, params.entry_flow.reduction_block_1);
|
||||||
|
|
|
@ -201,7 +201,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L62">globalApi/DetectFacesTasks.ts:62</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L61">globalApi/DetectFacesTasks.ts:61</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictAllAgeAndGenderTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictAllAgeAndGenderTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -218,7 +218,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L55">globalApi/DetectFacesTasks.ts:55</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L54">globalApi/DetectFacesTasks.ts:54</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictAllFaceExpressionsTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictAllFaceExpressionsTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -235,7 +235,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L47">globalApi/DetectFacesTasks.ts:47</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L46">globalApi/DetectFacesTasks.ts:46</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
|
|
@ -159,7 +159,7 @@
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<p>Overrides <a href="detectfacelandmarkstaskbase.html">DetectFaceLandmarksTaskBase</a>.<a href="detectfacelandmarkstaskbase.html#run">run</a></p>
|
<p>Overrides <a href="detectfacelandmarkstaskbase.html">DetectFaceLandmarksTaskBase</a>.<a href="detectfacelandmarkstaskbase.html#run">run</a></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L71">globalApi/DetectFaceLandmarksTasks.ts:71</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L69">globalApi/DetectFaceLandmarksTasks.ts:69</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -218,7 +218,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L93">globalApi/DetectFaceLandmarksTasks.ts:93</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L91">globalApi/DetectFaceLandmarksTasks.ts:91</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleAgeAndGenderWithFaceAlignmentTask</span><span class="tsd-signature-symbol"><</span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleAgeAndGenderWithFaceAlignmentTask</span><span class="tsd-signature-symbol"><</span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -235,7 +235,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L97">globalApi/DetectFaceLandmarksTasks.ts:97</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L95">globalApi/DetectFaceLandmarksTasks.ts:95</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <a href="computesinglefacedescriptortask.html" class="tsd-signature-type" data-tsd-kind="Class">ComputeSingleFaceDescriptorTask</a><span class="tsd-signature-symbol"><</span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <a href="computesinglefacedescriptortask.html" class="tsd-signature-type" data-tsd-kind="Class">ComputeSingleFaceDescriptorTask</a><span class="tsd-signature-symbol"><</span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -252,7 +252,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L89">globalApi/DetectFaceLandmarksTasks.ts:89</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFaceLandmarksTasks.ts#L87">globalApi/DetectFaceLandmarksTasks.ts:87</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleFaceExpressionsWithFaceAlignmentTask</span><span class="tsd-signature-symbol"><</span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleFaceExpressionsWithFaceAlignmentTask</span><span class="tsd-signature-symbol"><</span><a href="../index.html#withfacelandmarks" class="tsd-signature-type" data-tsd-kind="Type alias">WithFaceLandmarks</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">TSource</span><span class="tsd-signature-symbol">, </span><a href="facelandmarks68.html" class="tsd-signature-type" data-tsd-kind="Class">FaceLandmarks68</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
|
|
@ -142,7 +142,7 @@
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<p>Overrides <a href="detectfacestaskbase.html">DetectFacesTaskBase</a>.<a href="detectfacestaskbase.html#run">run</a></p>
|
<p>Overrides <a href="detectfacestaskbase.html">DetectFacesTaskBase</a>.<a href="detectfacestaskbase.html#run">run</a></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L71">globalApi/DetectFacesTasks.ts:71</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L70">globalApi/DetectFacesTasks.ts:70</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -201,7 +201,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L103">globalApi/DetectFacesTasks.ts:103</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L102">globalApi/DetectFacesTasks.ts:102</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleAgeAndGenderTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleAgeAndGenderTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -218,7 +218,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L96">globalApi/DetectFacesTasks.ts:96</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L95">globalApi/DetectFacesTasks.ts:95</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleFaceExpressionsTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">PredictSingleFaceExpressionsTask</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">{ </span>detection<span class="tsd-signature-symbol">: </span><a href="facedetection.html" class="tsd-signature-type" data-tsd-kind="Class">FaceDetection</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">></span></h4>
|
||||||
|
@ -235,7 +235,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L88">globalApi/DetectFacesTasks.ts:88</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/globalApi/DetectFacesTasks.ts#L87">globalApi/DetectFacesTasks.ts:87</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
|
|
@ -275,7 +275,7 @@
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<p>Inherited from <a href="ssdmobilenetv1.html">SsdMobilenetv1</a>.<a href="ssdmobilenetv1.html#forward">forward</a></p>
|
<p>Inherited from <a href="ssdmobilenetv1.html">SsdMobilenetv1</a>.<a href="ssdmobilenetv1.html#forward">forward</a></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L39">ssdMobilenetv1/SsdMobilenetv1.ts:39</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L38">ssdMobilenetv1/SsdMobilenetv1.ts:38</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
@ -515,7 +515,7 @@
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<p>Inherited from <a href="ssdmobilenetv1.html">SsdMobilenetv1</a>.<a href="ssdmobilenetv1.html#locatefaces">locateFaces</a></p>
|
<p>Inherited from <a href="ssdmobilenetv1.html">SsdMobilenetv1</a>.<a href="ssdmobilenetv1.html#locatefaces">locateFaces</a></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L43">ssdMobilenetv1/SsdMobilenetv1.ts:43</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L42">ssdMobilenetv1/SsdMobilenetv1.ts:42</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
|
|
@ -279,7 +279,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L39">ssdMobilenetv1/SsdMobilenetv1.ts:39</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L38">ssdMobilenetv1/SsdMobilenetv1.ts:38</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
@ -517,7 +517,7 @@
|
||||||
<li class="tsd-description">
|
<li class="tsd-description">
|
||||||
<aside class="tsd-sources">
|
<aside class="tsd-sources">
|
||||||
<ul>
|
<ul>
|
||||||
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L43">ssdMobilenetv1/SsdMobilenetv1.ts:43</a></li>
|
<li>Defined in <a href="https://github.com/vladmandic/face-api/blob/main/src/ssdMobilenetv1/SsdMobilenetv1.ts#L42">ssdMobilenetv1/SsdMobilenetv1.ts:42</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<h4 class="tsd-parameters-title">Parameters</h4>
|
<h4 class="tsd-parameters-title">Parameters</h4>
|
||||||
|
|
Loading…
Reference in New Issue