face-api.js 깃허브 저장소 링크 : face-api.js
사진 관리, 보안 시스템, 사회적 미디어 분석, 게임 개발 등 다양한 분야에서 활용될 수 있다.
npm install face-api.js
models폴더
(위의 models폴더 클릭 시 압축된 models 폴더 다운)
import * as faceapi from 'face-api.js';
// fae-api를 사용할 jsx 또는 js에 추가하기
useEffect(() => {
Promise.all([
faceapi.nets.tinyFaceDetector.loadFromUri('/models'),
faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
faceapi.nets.faceExpressionNet.loadFromUri('/models'),
]).then(startVideo);
}, []);
<video style={CameraStyle} ref={videoRef} onLoadedMetadata={detectFace} autoPlay muted />
<canvas ref={canvasRef} style={{ position: 'absolute', top: 0, left: 0, width: 838, transform: "scaleX(-1)"}}/>
얼굴 감지
const detections = await faceapi.detectAllFaces(input)
얼굴 랜드마크
const detectionsWithLandmarks = await faceapi.detectAllFaces(input).withFaceLandmarks()
ex) 왼쪽 오른쪽 방향 표시 함수
const faceDirection = getFaceDirection(resizedDetections);
if (faceDirection === 'left') {
console.log('오른쪽');
} else if (faceDirection === 'right') {
console.log('왼쪽');
}
const getFaceDirection = (detections) => {
if (!detections || detections.length === 0) {
return 'unknown';
}
const landmarks = detections[0].landmarks;
const noseX = landmarks.getNose()[0].x;
const movementDistance = Math.abs(noseX - previousNoseX);
let faceDirection = 'unknown';
const movementThreshold = 5;
if (movementDistance > movementThreshold) {
if (noseX < previousNoseX) {
faceDirection = 'left';
} else if (noseX > previousNoseX) {
faceDirection = 'right';
}
previousNoseX = noseX;
}
return faceDirection;
};