@vladmandic/face-api
Version:
FaceAPI: AI-powered Face Detection & Rotation Tracking, Face Description & Recognition, Age & Gender & Emotion Prediction for Browser and NodeJS using TensorFlow/JS
47 lines (43 loc) • 2.03 kB
text/typescript
import * as tf from '../../dist/tfjs.esm';
import { FaceDetection } from '../classes/FaceDetection';
import { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';
import { WithFaceDetection } from '../factories/WithFaceDetection';
import { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';
export async function extractAllFacesAndComputeResults<TSource extends WithFaceDetection<{}>, TResult>(
parentResults: TSource[],
input: TNetInput,
// eslint-disable-next-line no-unused-vars
computeResults: (faces: Array<HTMLCanvasElement | tf.Tensor3D>) => Promise<TResult>,
extractedFaces?: Array<HTMLCanvasElement | tf.Tensor3D> | null,
// eslint-disable-next-line no-unused-vars
getRectForAlignment: (parentResult: WithFaceLandmarks<TSource, any>) => FaceDetection = ({ alignedRect }) => alignedRect,
) {
const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)
? getRectForAlignment(parentResult)
: parentResult.detection));
const faces: Array<HTMLCanvasElement | tf.Tensor3D> = extractedFaces || (
input instanceof tf.Tensor
? await extractFaceTensors(input, faceBoxes)
: await extractFaces(input, faceBoxes)
);
const results = await computeResults(faces);
faces.forEach((f) => f instanceof tf.Tensor && f.dispose());
return results;
}
export async function extractSingleFaceAndComputeResult<TSource extends WithFaceDetection<{}>, TResult>(
parentResult: TSource,
input: TNetInput,
// eslint-disable-next-line no-unused-vars
computeResult: (face: HTMLCanvasElement | tf.Tensor3D) => Promise<TResult>,
extractedFaces?: Array<HTMLCanvasElement | tf.Tensor3D> | null,
// eslint-disable-next-line no-unused-vars
getRectForAlignment?: (parentResultLocal: WithFaceLandmarks<TSource, any>) => FaceDetection,
) {
return extractAllFacesAndComputeResults<TSource, TResult>(
[parentResult],
input,
async (faces) => computeResult(faces[0]),
extractedFaces,
getRectForAlignment,
);
}