Photo Validator
증명사진 검증을 위한 JavaScript 라이브러리입니다. face-api.js를 기반으로 구현되었습니다.
설치
npm install photo-validator
사용법
1. HTML 준비
<input type="file" id="photo-upload" accept="image/*">
<div id="result"></div>
2. JavaScript
window.addEventListener("DOMContentLoaded", async () => {
const validator = new PhotoValidator({
debug: true,
});
await validator.init('photoInput');
async function handleImageUpload(event) {
const file = event.target.files[0];
if (!file) return;
const img = validator.getPreviewElement();
const errorMessages = [];
const reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
img.onload = async () => {
try {
if(!validator.isValidFileType(file) ) {
errorMessages.push("<p class='text-error'>❌ 허용되지 않는 파일 형식입니다.</p>");
console.error(`파일 형식 오류.. 현재 : ${file.type}`);
}
if(!validator.isImageSizeValid(300, 360)) {
errorMessages.push("<p class='text-error'>❌ 이미지 크기가 너무 작습니다.</p>");
console.error(`이미지 사이즈 오류.. 가로 x 세로 : ${img.width} x ${img.height}`);
}
if(!validator.isValidAspectRatio()) {
errorMessages.push("<p class='text-error'>❌ 증명 사진 비율에 맞는 이미지를 등록해주세요.</p>");
console.error(`이미지 사이즈 오류.. 가로 x 세로 : ${img.width} x ${img.height}`);
}
if(!(await validator.isSingleFace())) {
errorMessages.push("<p class='text-error'>❌ 사진에는 반드시 한 사람이 있어야 합니다.</p>");
console.error("사진에는 한사람만 등장해야 합니다.");
}
if(!(await validator.isHeadFullyVisible())) {
errorMessages.push("<p class='text-error'>❌ 머리가 사진 상단과 너무 가깝거나 잘려있습니다.</p>");
console.error("머리가 붙어있거나 잘려있는 사진입니다.")
}
if(!(await validator.isFacingForward(3.5))) {
errorMessages.push("<p class='text-error'>❌ 얼굴이 정면을 향하고 있지 않습니다.</p>");
console.error("얼굴이 정면을 향하고 있어야합니다.");
}
if(!(await validator.isUniformBackground())) {
errorMessages.push("<p class='text-error'>❌ 배경이 균일하지 않습니다. 단일 색상 배경을 사용하세요.</p>");
console.error("배경 색상이 균일하지않습니다.");
}
if(!(await validator.isFaceCenteredAndComplete(false))) {
errorMessages.push("<p class='text-error'>❌ 얼굴이 중앙에 위치하지 않습니다.</p>");
console.error("얼굴이 중앙에 위치하지 않습니다.")
}
} catch (error) {
console.error("검증 오류:", error);
errorMessages.push(`<p class='text-error'>❌ ${error}`);
}
if(errorMessages.length > 0) {
document.getElementById("result").innerHTML = errorMessages.join("\n");
} else{
document.getElementById("result").innerHTML = "<p class='text-success'>✅ 증명 사진으로 적합합니다.</p>";
}
};
};
reader.readAsDataURL(file);
}
document.getElementById("photoInput").addEventListener("change", handleImageUpload);
});
PhotoValidator
PhotoValidator
클래스는 생성자에서 다음과 같은 옵션들을 받습니다:
modelsPath | /models | 얼굴 인식 모델이 저장된 경로를 지정합니다. face-api.js 모델 파일들이 위치한 디렉토리 경로입니다. |
eyeHeightDiffThreshold | 3.5 | 눈 높이 차이의 임계값입니다. 두 눈의 높이 차이가 이 값보다 크면 얼굴이 기울어진 것으로 판단합니다. |
colorThreshold | 15 | 색상 임계값으로, 배경색 판단 등 색상 관련 검증에 사용됩니다. |
centerOffsetXRatio | 0.2 | 얼굴의 X축(가로) 중심 오프셋 비율입니다. 얼굴이 이미지의 중앙에서 얼마나 벗어날 수 있는지를 정의합니다. |
centerOffsetYRatio | 0.28 | 얼굴의 Y축(세로) 중심 오프셋 비율입니다. 얼굴이 이미지의 중앙에서 얼마나 벗어날 수 있는지를 정의합니다. |
debug | false | 디버그 모드 활성화 여부입니다. true 로 설정하면 콘솔에 디버그 정보가 출력되고, 캔버스에 인식 결과를 시각적으로 표시합니다. |
API
isSingleFace() | 단일 얼굴 검사 | 여러 명이 있는 경우 |
isFacingForward() | 정면 얼굴 검사 | 측면 혹은 얼굴이 비스듬한 경우 |
isUniformBackground() | 배경 단일 색상 검사 | 배경 그라데이션이 있거나 길거리에서 촬영한 경우 |
isHeadFullyVisible() | 머리 완전성 검사 | 머리가 사진 상단에 너무 가까이 있거나 잘린 경우 |
isFaceCenteredAndComplete() | 얼굴 중앙 위치 검사 | 얼굴이 중앙에 위치하지 않는 경우 |
isValidAspectRatio() | 이미지 비율 검사 | 이미지 비율이 증명사진, 여권사진 비율이 아닌 경우 |
라이센스
MIT
Thanks to ❤️
위 모듈을 기획 및 개발 지원을 해주신 분들께 감사의 마음을 표합니다. 🫶
안태규 팀장
최우리 TL
조태응 팀장
정신환 팀장
이홍순 수석
김규진 책임
Repository
https://github.com/jinwanseo/photo-validator
Bug & Issue
https://github.com/jinwanseo/photo-validator/issues