본문 바로가기

개발/node

[face-api.js] 얼굴인식

반응형

https://justadudewhohacks.github.io/face-api.js/docs/index.html

 

face-api.js

face-api.js JavaScript API for face detection and face recognition in the browser implemented on top of the tensorflow.js core API (tensorflow/tfjs-core) Table of Contents: Resources Live Demos Check out the live demos! Tutorials Check out my face-api.js t

justadudewhohacks.github.io

업로드된 파일에서 사람을 인식해서 학습하고, 

학습된 데이터 내에서 특정 인물의 데이터를 가져오기 위해 사용하였다.

 

사진 및 비디오에서 사람을 인식하려는 목적을 가지고 있었으나,

기본적으로 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