반응형
https://justadudewhohacks.github.io/face-api.js/docs/index.html
업로드된 파일에서 사람을 인식해서 학습하고,
학습된 데이터 내에서 특정 인물의 데이터를 가져오기 위해 사용하였다.
사진 및 비디오에서 사람을 인식하려는 목적을 가지고 있었으나,
기본적으로 front에서 사용되도록 구현된 오픈소스이기 때문에 backend에서 구현하는데 한계가 있었다.
그래서 사진에서만 인식하는걸로..
아래는 이미지를 학습하고 넘겨받은 name을 함께 학습 데이터에 저장하는 코드
FACE.learnPhoto = async(filePath, name) =>{
const descriptors = [];
await faceapi.nets.ssdMobilenetv1.loadFromDisk('./weights');
await faceapi.nets.faceRecognitionNet.loadFromDisk('./weights');
await faceapi.nets.faceLandmark68Net.loadFromDisk('./weights');
const img = await canvas.loadImage(filePath);
const resultRef = await faceapi.detectSingleFace(img, faceDetectionOptions)
.withFaceLandmarks().withFaceDescriptor();
if(!resultRef || !resultRef.hasOwnProperty('descriptor')) {
console.log("error: learn photo failed");
return payload.returnPayload(payload.FAIL, [{error:"learn photo failed"}]);
}
descriptors.push(resultRef.descriptor);
const learnedPhoto = new faceapi.LabeledFaceDescriptors(
name,
descriptors
);
// 파일서버에 저장된 facematcher를 가져온다
const faceMatcerJson = await file.getFaceMatcher();
const fm = FaceMatcher.fromJSON(JSON.parse(faceMatcerJson));
learnedList = fm.labeledDescriptors;
learnedList.push(learnedPhoto);
faceMatcher = JSON.stringify(new FaceMatcher(learnedList).toJSON());
// 새로 학습된 데이터를 파일서버에 업로드한다
const result = await file.uploadFaceMatcher(faceMatcher);
console.log('learn photo success : ' + name);
return payload.returnPayload(payload.SUCCESS, []);
}
아래 코드는 학습된 데이터로 인식된 얼굴의 name을 가져오는 코드
FACE.detectFace = async(path) => {
try {
const foundList = [];
await faceapi.nets.ssdMobilenetv1.loadFromDisk('./weights');
await faceapi.nets.faceRecognitionNet.loadFromDisk('./weights');
await faceapi.nets.faceLandmark68Net.loadFromDisk('./weights');
// 파일서버에 저장된 facematcher를 가져온다.
const faceMatcerJson = await file.getFaceMatcher();
const fm = FaceMatcher.fromJSON(JSON.parse(faceMatcerJson));
// 얼굴을 인식하기 위해서 canvas를 사용해야 한다
const img = await canvas.loadImage(path);
const results = await faceapi.detectAllFaces(img, faceDetectionOptions)
.withFaceLandmarks()
.withFaceDescriptors();
const resizedResults = faceapi.resizeResults(results, img);
// 저장된 facematcher에서 업로드된 이미지와 가장 비슷한 데이터를 가져와서 return
resizedResults.forEach(({ detection, descriptor }) => {
const label = fm.findBestMatch(descriptor).toString();
if (label.indexOf('unknown') === -1) {
foundList.push(Number(label.substring(0, label.lastIndexOf('('))));
}
});
return payload.returnPayload(payload.SUCCESS, foundList);
} catch(e) {
console.log(e)
return null;
}
}
반응형
'개발 > node' 카테고리의 다른 글
[fluent-ffmpeg] video codec 변경 (0) | 2022.09.28 |
---|