학습 노트

[학습 노트] 최종 발표 FAQ

sybear02 2026. 7. 28. 14:37

[학습 노트] 최종 발표 FAQ

ForenShield는 영상·이미지 위변조 분석과 증거 관리를 위한 딥페이크·디지털 포렌식 플랫폼이다. SK쉴더스 Rookies 개발 5기 최종 프로젝트로, Late Fusion·분석 결과 연동·soft-gate·오버레이 시각화 쪽을 중심으로 작업했다. 발표 전에 나올 법한 질문을 모아 두고, 짧게 답만 적어 둔 노트다.


1. 화면의 히트맵(붉은 영역)은 뭔가?

초안에는 히트맵이랑 오버레이를 같이 쓰려고 했다. 그런데 히트맵은 대표 프레임 이미지만 나와서 영상 따라보기엔 불편했다. 그래서 히트맵은 빼고, 오버레이에 의심 구간이랑 영역을 붉게 표시하는 쪽으로 정리했다. 지금 화면의 붉은 부분은 그 오버레이다. Grad-CAM처럼 모델 내부 기여도 맵이라고 보진 않고, 탐지·로컬라이즈 결과를 시각화한 쪽에 가깝다.


2. Late Fusion 점수가 있는데, 오버레이는 어떤 모델 것인가?

오버레이는 fusion으로 하나로 합친 게 아니라 모델별로 토글한다. Late Fusion은 riskScore랑 Veto/Rescue 같은 판정 규칙 쪽이고, 오버레이는 모듈별 단서를 보여 주는 쪽이다. 종합 점수랑 화면에 찍히는 근거는 역할이 다르다.


3. 오버레이 렌더 때문에 OOM·지연은 없었나?

오버레이 MP4 만들기가 부하가 커서 본분석이랑 분리했다. 필요할 때 on-demand overlay job으로 돌리고, 대표 구간·모듈별로만 만들어서 범위를 줄였다. 오버레이가 실패해도 점수나 메타 분석 결과는 남는다. soft-gate랑은 다른 이야기다. (아래 4번)


4. soft-gate는 뭔가?

얼굴이 없거나 너무 작아서 일부 딥페이크 모듈을 제대로 돌리기 어려울 때 쓴다. 그냥 하드 실패로 끊지 않고 COMPLETED에 errorCode랑 안내를 붙인다. 위변조처럼 가능한 경로는 이어서 돌리기도 한다. 점수가 나왔는지, 그 점수를 어떤 조건에서 읽어야 하는지를 같이 남기는 느낌이다.


5. 왜 프론트에서 AI를 바로 안 부르나? (RabbitMQ)

흐름은 FE → BE → S3 → RabbitMQ → GPU Worker → 결과 저장 → FE 조회다. 업로드랑 접수는 빨리 끝내고, 긴 추론은 Worker가 큐에서 가져가서 처리한다. 분석 중에는 progress도 발행한다. 웹이 추론에 오래 묶이지 않게 하려는 구성이다.


6. EKS랑 로컬 GPU를 같이 쓴 이유는?

웹이랑 메타데이터는 클라우드에서 받고, 무거운 추론은 On-prem GPU에서 돌린다. 둘은 RabbitMQ로 이어져 있다. 본인 쪽은 job, 진행률, 결과, 오버레이 job 연동을 담당했다.


7. 블록체인(Fabric)은 왜? 원본도 올리나?

수사·감사 성격이라 허가된 접근이 맞다고 봤다. 원본은 S3에 두고(오프체인), 체인이나 앵커에는 해시·서명·시점 같은 검증 메타만 올린다. 로컬은 simulated고, 연동할 때는 HTTP 앵커 게이트웨이를 쓴다. 원본을 체인에 올리면 용량이랑 속도 부담이 크다.


8. Late Fusion에서 일정과 정확도가 싸웠을 때는?

실제 영상에는 화질 깨짐, 블러, 변환이 섞여 있다. 그래서 조건별로 모델을 많이 학습해서 fusion하자는 의견이 있었는데, 짧은 기간에 모델 수가 너무 커질 수 있었다. 기존 모듈 fusion은 유지하고, 분석 전에 화질/블러/깨짐 경고를 넣는 쪽으로 정했다.


9. 딥페이크 레인이랑 위변조 레인을 왜 나누나?

딥페이크는 사람·신체 AI 합성이나 교체 여부고, 위변조는 국소·시간 편집 흔적이다. 신호랑 오탐 특성이 달라서 레인이랑 화면도 나눴다. Fusion은 그 레인 안에서 모듈 점수를 안정화하는 쪽에 가깝다.


10. Explainable AI라고 적은 건 Grad-CAM을 했다는 뜻인가?

학술 XAI를 전 모듈에 똑같이 적용했다는 뜻은 아니다. 점수만 주지 않고 모듈별 점수, 구간, 오버레이, fusion 규칙 같은 근거를 남긴다는 의미다. Grad-CAM은 기울기로 내부 기여도를 추정해서 히트맵으로 보여주는 기법이고, 본 제품은 탐지 결과를 오버레이로 시각화한 거라 Grad-CAM이랑은 별개다.


11. 본인 역할이랑 분석 엔진 담당은 어떻게 나뉘나?

분석 엔진이랑 근거 시각화 생성은 그쪽이 중심이다. 본인은 Late Fusion 안정화랑, 결과가 큐·API·화면·soft-gate로 이어지게 연동하는 쪽을 담당했다. JSON 스키마, overlay URL, progress, soft COMPLETED 같은 맞닿는 구간은 계약하고 분업했다.


12. 보안은?

JWT, RBAC, Step-up, 해시·서명·CoC·앵커 같은 층이 여러 개 있다. 본인은 결과랑 상태가 권한·화면 규칙에 맞게 나가도록 연동이랑 가드를 맞췄다.


13. 모델은 어떻게 학습했나?

딥페이크 레인은 Xception, TimeSformer, GMFlow 세 모듈을 쓰고, 학습 방식이 모듈마다 다르다. Xception이랑 TimeSformer는 사전학습 가중치를 가져와 ff1k → celeb1k 순으로 파인튜닝했다. Golden-200은 벤치용으로 빼 두고 학습에 넣지 않았다. 위변조 쪽 TruFor도 사전학습 위에 비디오 forgery 데이터로 파인튜닝하는 흐름이다.

GMFlow만 따로 보면, “딥페이크 분류기를 처음부터 학습했다”가 아니다. 본체는 광학 흐름을 추정하는 사전학습 모델(gmflow_things)이고, 우리가 바꾼 건 그 flow로 fake/real 점수를 붙이는 뒤단(head) 이다. 인접 프레임 쌍마다 GMFlow가 픽셀이 어디로 움직였는지(flow)를 계산하고, JSON에 평균·최대·표준편차, 시간 흔들림(temporal jitter), 공간 불일치 같은 통계 숫자가 쌓인다. CNN처럼 한 번에 fake 확률을 내는 구조가 아니다.

 

휴리스틱은 이 숫자들을 사람이 정한 규칙으로 합쳐 motion_anomaly_score를 만드는 방식이다. “real 영상 코호트에서 보통 이 정도다” 같은 기준선과 비교해서, jitter·flow 크기·방향 분산 등 몇 가지 신호를 가중합·z-score로 묶는다. 학습 데이터로 가중치를 최적화한 분류기가 아니라, 손으로 잡은 공식에 가깝다. 빠르게 baseline을 만들 수 있지만 Golden-200 기준으로 단독 성능이 약해서(대략 combined AUC 0.45, fake recall도 낮음) “이걸로만 판정하자”는 단계는 넘어갔다.

 

Random Forest learned head는 같은 flow 통계를 feature 벡터로 뽑은 뒤, fake/real 라벨이 붙은 영상(ff1k+celeb1k manifest train/val)으로 Random Forest를 학습해 fake_score를 내는 방식이다. “learned head”는 GMFlow 신경망을 다시 학습한다는 뜻이 아니라, flow 위에 얹은 얕은 분류기(head) 가 데이터에서 패턴을 배웠다는 뜻이다. 여러 프로필용 모델을 합친 rf_pooled를 운영에 썼고, threshold는 val에서 맞춘 뒤 Golden-200으로 확인했다. 휴리스틱보다 나아졌지만 여전히 Xception·TimeSformer만큼 단독으로 쓰기엔 약해서, Fusion에서는 가중치를 낮게 두고 보조 신호·veto/rescue 쪽으로 쓴다. RAFT·PWC-Net도 같이 벤치해 봤지만 Optical 대표는 GMFlow로 남겼다.

 

본인 쪽은 이 학습 파이프 전체를 혼자 돌렸다기보다, 나온 점수를 Late Fusion에 넣을 수 있게 안정화하고 서비스로 넘기는 쪽을 맡았다.


관련:
https://github.com/owhat02/ai-forensic · https://github.com/owhat02/backend-forensic · https://github.com/owhat02/frontend-deepfake