Skip to content

Instantly share code, notes, and snippets.

@hoangsetup
Created June 6, 2021 12:10
Show Gist options
  • Save hoangsetup/c0c54342cfee6d7924ae35eb65d99c13 to your computer and use it in GitHub Desktop.
Save hoangsetup/c0c54342cfee6d7924ae35eb65d99c13 to your computer and use it in GitHub Desktop.
import '@tensorflow/tfjs-node';
import * as canvas from 'canvas';
import * as faceapi from 'face-api.js';
import path from 'path';
const { Canvas, Image, ImageData } = canvas;
faceapi.env.monkeyPatch({ Canvas: Canvas as any, Image: Image as any, ImageData });
class GlassifyLib {
async glassify(imageBuffer: Buffer): Promise<Buffer> {
await this.loadModels();
const image = await canvas.loadImage(imageBuffer) as unknown as HTMLImageElement;
const faces = await faceapi.detectAllFaces(
image,
new faceapi.SsdMobilenetv1Options({ minConfidence: 0.5 }),
).withFaceLandmarks();
const output = faceapi.createCanvasFromMedia(image);
faceapi.draw.drawDetections(output, faces.map(res => res.detection));
faceapi.draw.drawFaceLandmarks(output, faces.map(res => res.landmarks));
return (output as any).toBuffer('image/jpeg');
}
private async loadModels() {
if (faceapi.nets.ssdMobilenetv1.isLoaded && faceapi.nets.faceLandmark68Net.isLoaded) {
return;
}
const modelsPath = path.join(__dirname, '../', 'public/weights');
await faceapi.nets.ssdMobilenetv1.loadFromDisk(modelsPath);
await faceapi.nets.faceLandmark68Net.loadFromDisk(modelsPath);
}
}
export default new GlassifyLib();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment