diff --git a/scripts/streamAndDetect.ts b/scripts/streamAndDetect.ts index a26b763..95f6cc2 100644 --- a/scripts/streamAndDetect.ts +++ b/scripts/streamAndDetect.ts @@ -1,5 +1,5 @@ import { Rtsp } from "rtsp-stream/lib"; -import { FaceMatcher, nets } from "@vladmandic/face-api"; +import { nets } from "@vladmandic/face-api"; import * as faceapi from "@vladmandic/face-api"; import canvas from "canvas"; import fs from "fs"; @@ -31,28 +31,23 @@ const main = async () => { path.join(__dirname, "../weights") ); - const files = fs.readdirSync(modelDir); - const matchers: Array = []; - for (const file of files) { - const raw = fs.readFileSync(path.join(modelDir, file), "utf-8"); - const content = JSON.parse(raw); - matchers.push(FaceMatcher.fromJSON(content)); - } + const raw = fs.readFileSync(path.join(modelDir, "data.json"), "utf-8"); + const content = JSON.parse(raw); + const matcher = faceapi.FaceMatcher.fromJSON(content); rtsp.on("data", async (data: Buffer) => { - const img = new Image(); - img.src = data.toString("base64"); - const input = await canvas.loadImage(data, "base64"); + const input = ((await canvas.loadImage(data)) as unknown) as ImageData; + const out = faceapi.createCanvasFromMedia(input); + + // fs.writeFileSync(path.join(__dirname, "image.jpg"), data, "base64"); const resultsQuery = await faceapi - .detectAllFaces(input, getFaceDetectorOptions(faceDetectionNet)) + .detectAllFaces(out, getFaceDetectorOptions(faceDetectionNet)) .withFaceLandmarks() .withFaceDescriptors(); for (const res of resultsQuery) { - for (const matcher of matchers) { - const bestMatch = matcher.findBestMatch(res.descriptor); - console.log(bestMatch.label); - } + const bestMatch = matcher.findBestMatch(res.descriptor); + console.log(bestMatch.label); } }); diff --git a/scripts/train.ts b/scripts/train.ts index cda26fd..8a38547 100644 --- a/scripts/train.ts +++ b/scripts/train.ts @@ -2,7 +2,7 @@ import * as faceapi from "@vladmandic/face-api"; import canvas from "canvas"; import fs, { lstatSync } from "fs"; import * as path from "path"; -import { TNetInput } from "@vladmandic/face-api"; +import { LabeledFaceDescriptors, TNetInput } from "@vladmandic/face-api"; import * as mime from "mime-types"; import dotenv from "dotenv-extended"; import { getFaceDetectorOptions } from "../src/common"; @@ -33,6 +33,7 @@ const main = async () => { const dirs = fs.readdirSync(inputDir); + const refs: Array = []; for (const dir of dirs) { if (!lstatSync(path.join(inputDir, dir)).isDirectory()) { continue; @@ -54,11 +55,15 @@ const main = async () => { )) as unknown; const descriptor = await faceapi - .detectAllFaces(referenceImage as TNetInput, options) + .detectSingleFace(referenceImage as TNetInput, options) .withFaceLandmarks() - .withFaceDescriptors(); + .withFaceDescriptor(); + if (!descriptor || !descriptor.descriptor) { + throw new Error("No face found"); + } - return descriptor.length > 0 ? descriptor : undefined; + const faceDescriptors = [descriptor.descriptor]; + return new faceapi.LabeledFaceDescriptors(dir, faceDescriptors); } catch (err) { console.log( "An error occurred loading image at path: " + @@ -69,26 +74,27 @@ const main = async () => { }) ); - const items = []; - for (const item of referenceResults) { - if (item) { - items.push(...item); - } + if (referenceResults) { + refs.push( + ...(referenceResults.filter((e) => e) as LabeledFaceDescriptors[]) + ); } - const faceMatcher = new faceapi.FaceMatcher(items); - fs.writeFile( - path.join(outDir, dir + ".json"), - JSON.stringify(faceMatcher.toJSON()), - "utf8", - (err) => { - if (err) { - console.log(`An error occurred while writing ${dir} model to file`); - } - - console.log(`Successfully wrote ${dir} model to file`); - } - ); } + + const faceMatcher = new faceapi.FaceMatcher(refs); + + fs.writeFile( + path.join(outDir, "data.json"), + JSON.stringify(faceMatcher.toJSON()), + "utf8", + (err) => { + if (err) { + console.log(`An error occurred while writing data model to file`); + } + + console.log(`Successfully wrote data model to file`); + } + ); }; main();