Wip
This commit is contained in:
74
scripts/detectFromImage.ts
Normal file
74
scripts/detectFromImage.ts
Normal file
@ -0,0 +1,74 @@
|
||||
import { nets } from "@vladmandic/face-api";
|
||||
import * as faceapi from "@vladmandic/face-api";
|
||||
import canvas from "canvas";
|
||||
import fs from "fs";
|
||||
import * as path from "path";
|
||||
import dotenv from "dotenv-extended";
|
||||
import { getFaceDetectorOptions } from "../src/common";
|
||||
import * as mime from "mime-types";
|
||||
require("@tensorflow/tfjs-node");
|
||||
|
||||
const { Canvas, Image, ImageData } = canvas;
|
||||
//@ts-ignore
|
||||
faceapi.env.monkeyPatch({ Canvas, Image, ImageData });
|
||||
|
||||
const main = async () => {
|
||||
dotenv.load({
|
||||
silent: false,
|
||||
errorOnMissing: true,
|
||||
});
|
||||
|
||||
const modelDir = process.env.TRAINED_MODEL_DIR as string;
|
||||
const faceDetectionNet = nets.ssdMobilenetv1;
|
||||
|
||||
await faceDetectionNet.loadFromDisk(path.join(__dirname, "../weights"));
|
||||
await nets.faceLandmark68Net.loadFromDisk(path.join(__dirname, "../weights"));
|
||||
await nets.faceRecognitionNet.loadFromDisk(
|
||||
path.join(__dirname, "../weights")
|
||||
);
|
||||
|
||||
const raw = fs.readFileSync(path.join(modelDir, "data.json"), "utf-8");
|
||||
const content = JSON.parse(raw);
|
||||
const matcher = faceapi.FaceMatcher.fromJSON(content);
|
||||
|
||||
let dir = path.join(process.env.OUT_DIR as string);
|
||||
const files = fs.readdirSync(dir);
|
||||
await Promise.all(
|
||||
files.map(async (file: string) => {
|
||||
const mimeType = mime.contentType(path.extname(path.join(dir, file)));
|
||||
if (!mimeType || !mimeType.startsWith("image")) {
|
||||
return;
|
||||
}
|
||||
const imgData = fs.readFileSync(path.join(dir, file));
|
||||
const input = ((await canvas.loadImage(imgData)) as unknown) as ImageData;
|
||||
const out = faceapi.createCanvasFromMedia(input);
|
||||
const resultsQuery = await faceapi
|
||||
.detectAllFaces(out, getFaceDetectorOptions(faceDetectionNet))
|
||||
.withFaceLandmarks()
|
||||
.withFaceDescriptors();
|
||||
|
||||
if (resultsQuery.length > 0) {
|
||||
for (const res of resultsQuery) {
|
||||
const bestMatch = matcher.findBestMatch(res.descriptor);
|
||||
console.log(
|
||||
`Face Detected with ${
|
||||
res.detection.score * 100
|
||||
}% accuracy and a distance of ${bestMatch.distance}: ${
|
||||
bestMatch.label
|
||||
} in file ${path.join(dir, file)}`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
console.log(
|
||||
`No faces detected in file ${path.join(
|
||||
process.env.REF_IMAGE_DIR as string,
|
||||
"aline",
|
||||
file
|
||||
)}`
|
||||
);
|
||||
}
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
main();
|
Reference in New Issue
Block a user