이음(以音) — 가족 소통 기반 치매 조기 징후 탐지 앱의 영상(표정) 분석 모듈.
노인이 매일 가족에게 보내는 짧은 영상 일기 속 표정 변화를 비지도 학습으로 분석해, 인지 기능 저하와 관련된 안면 동결(hypomimia) 신호를 조용히 추적한다.
이음은 팀원별로 역할을 나눈 풀스택 프로젝트이며, 이 레포는 그중 영상 분석 파트를 담당한다.
| 레포 | 역할 | 담당 |
|---|---|---|
| ieum-android | Android 앱 (Kotlin) | 팀원 |
| ieum-server | 음성 분석 + LSTM 추론 서버 (Flask/FastAPI) | 팀원 |
| Pioda_vision (이 레포) | 영상(표정) 분석 모듈 | 본인 |
| Pioda-Project | 음성+영상 통합/앙상블 버전 | 팀원 + 본인 |
프로젝트 초기에는 음성 + 키스트로크(타이핑 패턴) 두 채널을 분석하는 설계였으나, 노인 사용자에게 타이핑 자체가 진입장벽이 된다는 판단 아래 음성 + 영상(표정) 조합으로 피벗했다. 이 레포는 그중 영상 채널을 담당한다.
- Py-Feat(MIT 라이선스)의
Detectorv2로 영상에서 프레임별 Action Unit(AU) 20종을 추출 - AU는 FACS(Facial Action Coding System) 기반 표정 근육 활성도 지표로, 파킨슨병·치매의 안면 동결(hypomimia) 연구에서 임상적으로 가장 널리 쓰이는 지표
- 온디바이스 경량화 제약을 두지 않기로 방향을 잡아(멘토링 피드백 반영), 무겁지만 정확한 Py-Feat을 서버 사이드에서 사용
- 정상 노인의 표정 움직임 패턴을 LSTM 오토인코더로 학습 (음성 모듈과 동일한 방식으로 설계해 인터페이스 일관성 확보)
- 정상 패턴을 잘 복원하지 못하는(재구성 오차가 큰) 입력을 이상(인지 저하 의심 신호)으로 판단
- Z-score 정규화 통계(
norm_stats.pt)를 학습 시점에 저장해 추론 시에도 동일하게 적용 - 이상 탐지 임계값은 재구성 오차의
mean + 2σ로 설정 (threshold.pt)
- 영상 1개를 받아 윈도우 단위로 재구성 오차를 계산하고, 평균을 영상 전체의 이상 점수로 사용
VisionAnomalyDetector클래스로 캡슐화해 음성 모듈과 동일한 인터페이스 유지 → 통합 레포(Pioda-Project)에서 음성 점수와 앙상블
- 웹캠으로 테스트 영상을 직접 녹화해 파이프라인 전체(추출 → 학습 → 추론)를 검증할 수 있는 스크립트
- 실제 녹화 영상으로 피처 추출부터 이상 탐지까지 전체 흐름 검증 완료
Pioda_vision/
├── feature_extractor.py # 영상 → Py-Feat → AU 시계열 추출
├── model_train.py # LSTM 오토인코더 학습
├── inference.py # 이상 탐지 추론
├── record_test.py # 웹캠 테스트 영상 녹화 도구
├── vision_autoencoder.pt # 학습된 모델 가중치
├── norm_stats.pt # 정규화 통계 (mean, std)
├── threshold.pt # 이상 탐지 임계값
└── requirements.txt
- 지도학습 대신 비지도 이상 탐지를 택한 이유: 치매 여부가 라벨링된 대규모 얼굴 데이터를 구하기 어렵고, 개인마다 표정 baseline이 다르기 때문에 "정상 패턴에서 벗어난 정도"를 측정하는 방식이 더 현실적
- AU(Action Unit) 기반 피처를 택한 이유: 픽셀 자체보다 임상적으로 검증된 표정 근육 활성도 지표를 사용해 해석 가능성을 확보
- 음성 모듈과 동일한 LSTM 오토인코더 구조를 사용한 이유: 인터페이스 일관성을 맞춰 팀원의 음성 모듈과 손쉽게 앙상블할 수 있도록 설계
inference.py독스트링에 남아있는 구버전 피처 차원 표기((N, seq_len, 6)) 정정 필요 (실제는 20)- 실제 노인 사용자 대상 검증 데이터 확보 시 임계값 재조정 필요