프로젝트 목록
2026.06 - 현재On-Device AI

자체 안티스푸핑(Liveness) AI 모델 & 실기기 검증 앱

상용 SDK 없이 출입통제 단말용 위조 얼굴 판별 딥러닝 모델을 자체 개발하고, NXP i.MX 8M Plus NPU 실기기 검증 앱까지 구축한 On-Device AI 프로젝트

정량적 검증 성과 지표

0.05%
단일 IR ACER
최신 IR 모델 검증 오차율 (보안 목표 2.0% 대비)
0.60%
독립 Test ACER
INT8 양자화 모델 고정 Test Split 평가 결과
P50 10ms
실기기 NPU 추론 지연
NXP i.MX 8M Plus NPU(NNAPI) 실시간 추론
14,400장
학습 데이터셋 규모
Train 12,000 / Val 1,200 / Test 1,198 (6개 클래스)

엔드투엔드 파이프라인 아키텍처

01

Dataset & Leakage Prevention

RGB/IR 6클래스 14,400장 데이터셋 구축, Subject 단위 Group K-Fold로 인물 간 데이터 누수 원천 차단

02

Model Architecture & Tuning

MobileNetV2 기반 경량 모델 설계, IR 1채널 Conv1 가중치 전이(sum 모드) 적용으로 활성화 왜곡 방지

03

INT8 PTQ & NPU Export

TFLite INT8 양자화 적용, Hardswish→ReLU 개조 및 SE 비활성화로 NPU 최적화 손실 최소화 (Near-Zero Loss)

04

Real-time Dual Stream Pipeline

Android 타깃 단말에서 RGB/IR 150ms 프레임 페어링 및 3-Executor 스레드 분리(카메라/검출/추론)

05

AI-Driven Unit & Boundary Tests

AI를 활용한 17개 JVM 단위 테스트로 확률 경계값(79.9% vs 80.0%) 및 24-bit BMP 바이트 정합성 잠금

저장소 구조 및 공개 범위

access-liveness-model

딥러닝 모델 학습, 데이터셋 설계, INT8 양자화 및 NPU 배포 파이프라인 (Python)

공개 범위전체 공개 (코드 전체 및 수치 지표 공개)

android-anti-spoofing-lab

Android 실시간 듀얼 카메라 추론, NPU 하드웨어 평가 앱 및 17개 단위 테스트 (Java)

공개 범위마스킹 후 부분 공개 (단말 상용 SDK/기존 코드 마스킹, 본인 구현부 발췌)

프로젝트 배경

얼굴인식 출입통제기에서 인쇄물, 스마트폰 화면 재생, 3D 실리콘 마스크 등 다양한 위조 얼굴 공격을 방어해야 했습니다. 외부 상용 SDK에 의존하지 않고 자체 딥러닝 모델을 구축해야 했으며, 최종 배포처가 연산 자원이 극도로 제한된 임베디드 NPU(NXP i.MX 8M Plus) 환경이라는 하드웨어 제약이 존재했습니다.

핵심 문제 및 기술적 제약조건

정확도 손실 없이 모델을 INT8 정수형으로 양자화하여 임베디드 NPU에 배포해야 했으며, 카메라 스트림 전처리와 NPU 추론 지연시간을 실시간(Real-time) 수준으로 유지하고, 미세한 확률 변동 속에서도 측정 신뢰성을 엄격히 확보해야 했습니다.

주요 개발 기능 및 기술 솔루션

01

Subject 단위 Group K-Fold 및 IR 1채널 가중치 전이 최적화

데이터셋 구축 시 인물 데이터 누수를 방지하고 단일 IR 센서 입력에 최적화된 합성곱 가중치 변환 설계

문제 상황
동일 인물의 프레임이 Train과 Val/Test에 섞여 들어갈 경우 지표가 과도하게 낙관적으로 왜곡(Data Leakage)되고, 1채널 IR 이미지 주입 시 기존 3채널 사전학습 모델의 Conv1 활성화 스케일이 왜곡되는 문제가 발생했습니다.
해결 방법 & 로직
물리적 피실험자 매핑 기반 Subject Group K-Fold를 강제 적용해 진짜 성능을 검증하고, Conv1 가중치 전이 모드를 'mean'에서 'sum'으로 변경하여 초기 활성화 스케일 왜곡을 방지했습니다.
결과 및 성과
인물 누수를 완벽 차단한 상태에서 최신 단일 IR 모델 ACER 0.05%를 달성하여 보안 기준치(2.0%)를 크게 상회하는 정확도를 확보했습니다.
02

Keras MobileNetV2 기반 INT8 PTQ 양자화 및 Near-Zero Loss 달성

임베디드 NPU 하드웨어 구동을 위해 32비트 부동소수점 모델을 8비트 정수형으로 양자화(Post-Training Quantization)

문제 상황
초기 PyTorch MobileNetV3 경로에서는 Hardswish 활성화 함수와 SE 블록으로 인해 양자화 시 활성화 분포가 무너져 ACER가 50%까지 폭락하는 구조적 한계가 확인되었습니다.
해결 방법 & 로직
Hardswish를 ReLU로 교체하고 SE 블록을 비활성화하는 구조 개조를 거친 후, Keras/MobileNetV2 기반 TFLite INT8 및 NPU-friendly export 경로로 피벗(Pivot)을 단행했습니다.
결과 및 성과
Float32 대비 정확도 손실이 거의 없는(Near-Zero Loss) INT8 양자화 모델을 성공적으로 도출했습니다.
03

Android 실시간 RGB/IR 듀얼 카메라 추론 파이프라인 및 스레드 격리

하드웨어 단말에서 실시간으로 유입되는 RGB 및 IR 카메라 스트림을 동기화하고 온디바이스 NPU 추론을 수행하는 Android 시스템 앱 구현

문제 상황
초당 30프레임의 듀얼 카메라 콜백에서 YUV→Bitmap 변환과 NNAPI 추론이 메인/카메라 스레드를 점유하여 프레임 드랍 및 UI 프리징이 발생했습니다.
해결 방법 & 로직
카메라 수신, 전처리/디텍션, NPU 추론의 책임을 3개의 독립적인 Single-thread Executor로 완전 분리하고, 150ms 타임스탬프 허용 오차(MAX_PAIR_DELTA_NS) 기반 프레임 페어링 큐를 설계했습니다.
결과 및 성과
카메라 프레임 누락 없이 실시간 듀얼 스트림을 안정적으로 동기화하며 NPU 실기기 추론(P50 10ms)을 달성했습니다.
04

AI 활용 17개 JVM 단위 테스트 및 경계값(Edge-case) 회귀 방지

실제 하드웨어의 미세 확률 변동과 바이너리 파일 입출력의 정합성을 보장하는 단위 테스트 스위트 구축

문제 상황
화면상 표시되는 라이브니스 확률이 실시간으로 변동하여 육안 검증이 불가능한 경계값(Threshold)과 커스텀 24-bit BMP 바이트 패딩 에러를 수동 테스트로 검출하기 어려웠습니다.
해결 방법 & 로직
AI를 활용하여 100회 캡처 스케줄, LIVE 79.9% Rejected vs 80.0% Allowed 판정 경계, 24-bit BMP 헤더·4바이트 row padding·바이트 오더를 검증하는 17개 JVM 단위 테스트를 구축했습니다.
결과 및 성과
코드 리팩토링 및 NPU 드라이버 업데이트 시에도 핵심 비즈니스 로직과 파일 입출력의 무결성을 100% 보장하는 회귀 테스트 환경을 확보했습니다.
05

NPU 평가 스크립트 정규화 버그 규명 및 NNAPI 캐싱 실패 원인 분석

하드웨어 가속기(NPU) 배포 과정에서 발생하는 비정상 지표와 런타임 드라이버 장애의 근본 원인(Root Cause) 추적 및 해결

문제 상황
NPU-friendly 모델 평가 시 위조를 진짜로 오인하는 BPCER이 30~60%로 폭등하고, 타깃 보드 NPU 드라이버에서 NNAPI 컴파일 캐싱 활성화 시 런타임 실패(ANEURALNETWORKS_OP_FAILED)가 발생했습니다.
해결 방법 & 로직
지표 폭등의 원인이 모델 결함이 아니라 평가 스크립트의 입력 정규화 범위 미스매치임을 역추적하여 수식을 보정하고, VSI NPU 드라이버의 캐싱 버그를 확인하여 캐시 설정을 비활성화함과 동시에 CPU 조용한 폴백(Silent fallback)을 차단했습니다.
결과 및 성과
성능 착시를 원천 차단하고 Float32와 동등한 정상 성능을 복원하여 실기기 하드웨어 신뢰성을 확보했습니다.

프로젝트 결과 및 성과

보안 목표치(2.0%)를 압도하는 ACER 0.05%(단일 IR) 및 0.60%(Test split)를 달성하고, Float32 대비 정확도 손실 없는 INT8 양자화 모델을 실물 NPU 하드웨어에서 P50 10ms 속도로 실시간 구동하는 데 성공했습니다.

성장 및 배운 점

지표를 좋게 만드는 것과 모델을 견고하게 만드는 것은 다릅니다. 데이터 누수를 철저히 차단하고 NPU 실패 시의 조용한 폴백을 막았을 때 비로소 드러나는 결함들을 정면으로 마주하며 해결할 수 있었습니다. 엔지니어링의 본질은 눈앞의 수치를 꾸미는 것이 아니라 어떤 극한 환경에서도 신뢰할 수 있는 재현성을 확보하는 것임을 배웠습니다.

기술 스택

PythonPyTorchKeras/TensorFlowTFLiteINT8 PTQAndroid SDKJavaNNAPINXP i.MX 8M Plus NPUCameraXJUnit4

검증 증거 및 공개 범위

공개 및 보안 가이드라인

Python 학습 파이프라인(access-liveness-model)은 완전 공개되며, Android 검증 앱(android-anti-spoofing-lab)은 상용 SDK 및 단말 의존 코드를 마스킹한 후 본인 구현부(파이프라인·스레드·17개 단위테스트)를 중심으로 발췌 공개합니다.

검증 증거GitHub access-liveness-model (Python 학습 및 양자화 파이프라인 코드)
검증 증거GitHub android-anti-spoofing-lab (Android 실시간 추론 앱 및 17개 단위 테스트)
검증 증거실기기 NXP i.MX 8M Plus NPU 회귀 테스트 로그 (2026-07-28)