Deep-Live-Cam은 단 한 장의 사진만으로 실시간 얼굴 교체(Face Swap)와 원클릭 비디오 딥페이크를 수행하는 오픈소스 AI 도구입니다. 웹캠 라이브 스트리밍, 이미지/동영상 파일 모두 지원하며, ONNX Runtime 기반으로 NVIDIA·AMD·Apple Silicon·Intel 등 다양한 하드웨어에서 동작합니다.
연극 분장사는 배우의 얼굴 형태를 파악하고, 다른 배우처럼 보이도록 화장을 합니다. Deep-Live-Cam은 매 프레임마다 106개 얼굴 랜드마크를 추적하고, 소스 얼굴의 특징을 타깃 얼굴에 자연스럽게 녹여 넣습니다.
핵심은 2개의 스레드가 동시에 캡처와 검출+교체를 병렬로 처리한다는 점입니다. 덕분에 처리 지연 없이 10~30fps 실시간이 가능합니다.
Deep-Live-Cam은 Ars Technica, Yahoo Tech, CNN Brasil, PetaPixel 등 주요 언론에 보도되며 대중적 관심이 폭발했습니다. 소스 이미지 1장 + 타깃 영상/웹캠만 있으면 바로 실행되는 극도의 낮은 진입 장벽, 그리고 OBS 연동 라이브 스트리밍 지원이 바이럴의 두 축입니다.
roop와 같은 초기 오픈소스 도구는 파일로 저장된 영상에만 적용 가능하고, 실시간 웹캠은 지원하지 않았습니다. 여러 사람이 나오는 영상에서 각각 다른 얼굴로 교체하는 기능도 없었습니다.
2개 스레드(캡처 / 검출+교체+향상 통합)가 병렬로 처리하여 실시간 웹캠에서 10~30fps를 달성합니다. 클러스터 기반 얼굴 임베딩 매핑으로 여러 사람을 각각 다른 얼굴로 동시에 교체할 수 있습니다.
| 비교 항목 | Deep-Live-Cam | roop (원조) | FaceFusion |
|---|---|---|---|
| 실시간 웹캠 | 2-thread 파이프라인 | 파일 전용 | 지원 |
| 입 마스크 보존 | 106-point 랜드마크 | 없음 | 일부 |
| 멀티 페이스 매핑 | 클러스터 기반 | 없음 | 지원 |
| GPU 다중 지원 | CUDA/DirectML/CoreML/OpenVINO | CUDA만 | CUDA/CoreML |
| GUI | PySide6 | Tkinter | Gradio |
| 한글 포함 다국어 | 10개 언어 | 없음 | 없음 |
| 기술 | 역할 |
|---|---|
| InsightFace buffalo_l | 얼굴 검출 + 인식 (검출·인식·랜드마크 통합) |
| InSwapper (ONNX) | 얼굴 교체 모델 — 소스 임베딩을 타깃에 적용 |
| GFPGAN v1.4 | 얼굴 화질 향상 (GAN Prior 기반 복원) |
| GPEN 256/512 | 추가 얼굴 복원 모델 (256/512 해상도) |
| OpenNSFW2 | 콘텐츠 안전 필터 — 부적절한 콘텐츠 자동 차단 |
| ONNX Runtime | 모델 추론 엔진 — 멀티 프로바이더 지원 |
| 기술 | 역할 |
|---|---|
| OpenCV (cv2) 4.10 | 프레임 캡처/처리 |
| FFmpeg | 비디오 인코딩/디코딩 |
| NumPy | 배열 연산 |
| Pillow 12.1 | 이미지 I/O |
| 프로바이더 | 하드웨어 | 추가 요구사항 |
|---|---|---|
| CUDA | NVIDIA GPU | CUDA Toolkit 12.8 + cuDNN 8.9.7 |
| DirectML | AMD/Intel/NVIDIA (Windows) | onnxruntime-directml |
| CoreML | Apple Silicon (M1/M2/M3) | onnxruntime-silicon, Python 3.11 |
| OpenVINO | Intel CPU/GPU | onnxruntime-openvino |
| CPU | 모든 플랫폼 | 기본값 (느림) |
# 프레임 프로세서는 동적으로 로딩되고 체이닝됨 (core.py)
for frame_processor in get_frame_processors():
frame_processor.process_image(source, target, output)
# 또는
frame_processor.process_video(source, temp_dir, paths)
각 프로세서(face_swapper, face_enhancer, face_masking 등)는 동일한 인터페이스를 구현하여 전략 패턴(Strategy Pattern)으로 교체 가능합니다. 새 프로세서를 추가하려면 modules/processors/frame/ 아래에 파일 하나만 추가하면 됩니다.
Capture Thread(_CaptureWorker)는 웹캠에서 프레임을 읽고 큐가 가득 차면 오래된 프레임을 버립니다(레이턴시 최소화). Processing Thread(_ProcessingWorker)는 얼굴 검출·교체·화질 향상을 하나의 스레드에서 순차적으로 처리합니다. 독립적인 Detection Thread 없이 2개 스레드로 실시간 파이프라인을 구성합니다.
# GPU 사용 불가 → 자동 CPU 폴백
try:
result = cuda_operation(frame)
except:
result = cpu_fallback(frame) # 느리지만 동작
# 실행 프로바이더별 적응적 스레딩
# CUDA: 2 스레드
# DirectML/ROCm: 단일 스레드 (컨텍스트 스위칭 방지)
# CPU: (코어수 - 2), 최대 16
ONNX Runtime으로 멀티 프로바이더(CUDA/DirectML/CoreML) 모델 추론, InsightFace 라이브러리를 활용한 얼굴 검출·인식·랜드마크 추출, 얼굴 임베딩(embedding)의 개념과 코사인 유사도 기반 매칭, Poisson Blending으로 자연스러운 얼굴 합성, 106-point 랜드마크를 이용한 정밀 마스킹을 배웁니다.
# InsightFace로 내 사진에서 얼굴 임베딩 추출해보기
import insightface, cv2
app = insightface.app.FaceAnalysis(name='buffalo_l')
app.prepare(ctx_id=0)
faces = app.get(cv2.imread('my_photo.jpg'))
print(f"검출된 얼굴: {len(faces)}")
print(f"임베딩 차원: {faces[0].normed_embedding.shape}")
OpenCV VideoCapture의 플랫폼별 차이(DirectShow vs V4L2 vs AVFoundation), 프레임 드롭 전략으로 레이턴시 관리, 멀티스레드 파이프라인에서 Queue 기반 프레임 전달, FFmpeg CLI를 Python에서 subprocess로 제어하는 방법을 배웁니다.
# 3-Thread 파이프라인 미니 버전
import threading, queue, cv2
frame_queue = queue.Queue(maxsize=2)
def capture_thread(cap):
while True:
ret, frame = cap.read()
if frame_queue.full():
frame_queue.get() # 오래된 프레임 버리기
frame_queue.put(frame)
def process_thread():
while True:
frame = frame_queue.get()
# 여기서 얼굴 처리
cv2.imshow('result', frame)
PySide6(Qt)로 모던한 데스크톱 앱 만들기, Qt 레이아웃 시스템(QVBoxLayout·QHBoxLayout)을 이용한 반응형 레이아웃, QThread와 시그널·슬롯(signal/slot) 기반 비동기 UI 업데이트, 파일 다이얼로그·슬라이더·토글 스위치 구현을 배웁니다.
전략 패턴(Strategy Pattern)으로 플러그인 시스템 구현, 전역 상태(globals.py) 관리의 장단점, 시그널 핸들러를 이용한 Graceful Shutdown, 적응적 스레딩(하드웨어에 따라 자동 조절), 다국어(i18n) 시스템 구현을 배웁니다.
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 4코어 이상 | 8코어 이상 |
| RAM | 8GB | 16GB 이상 |
| GPU | 없어도 동작 (CPU 모드) | NVIDIA RTX 3060 이상 |
| VRAM | — | 6GB 이상 |
| 저장공간 | 2GB (모델 포함) | 5GB+ |
| OS | Windows 10 / macOS 12+ / Ubuntu 20+ | — |
| GPU | 예상 FPS (실시간) | 비고 |
|---|---|---|
| CPU Only | 1~3 FPS | 사실상 사용 불가 |
| Intel iGPU (OpenVINO) | 5~10 FPS | 간단한 테스트용 |
| AMD RX 6700 (DirectML) | 10~15 FPS | 단일 스레드 제한 |
| Apple M1/M2 (CoreML) | 15~25 FPS | Python 3.11 필요 |
| NVIDIA RTX 3060 (CUDA) | 20~30 FPS | 가장 안정적 |
| NVIDIA RTX 4090 (CUDA) | 30+ FPS | 최상의 경험 |
InsightFace를 설치하고 웹캠에서 실시간으로 얼굴을 검출하여 바운딩 박스를 그리는 프로그램을 만듭니다.
체크리스트: InsightFace buffalo_l 모델 로딩 / 웹캠 프레임에서 얼굴 좌표 추출 / 바운딩 박스 + 신뢰도 점수 표시 / 106-point 랜드마크 시각화 (보너스)
두 사진의 얼굴 임베딩을 추출하고 코사인 유사도를 계산하여 "같은 사람인지" 판별하는 도구를 만듭니다.
체크리스트: 두 이미지에서 얼굴 임베딩 추출 / 코사인 유사도 계산 함수 직접 구현 / 여러 사진으로 임계값(threshold) 실험 / 클러스터링으로 사진 앨범 자동 분류 (보너스)
Deep-Live-Cam의 핵심 로직을 최소한으로 재구현합니다. InSwapper ONNX 모델을 직접 로딩하고 정적 이미지에서 얼굴 교체를 수행합니다.
체크리스트: InSwapper ONNX 모델 직접 로딩 (onnxruntime) / 소스·타깃 얼굴 검출 및 정렬 / 모델 추론으로 얼굴 교체 / Poisson Blending으로 경계 처리 / 전·후 비교 이미지 생성
3-Thread 파이프라인을 직접 구현하고 웹캠에서 실시간으로 만화 효과, 노화 효과, 스타일 전이 등의 필터를 적용합니다.
체크리스트: Capture/Detection/Processing 3개 스레드 구현 / Queue 기반 프레임 전달 + 드롭 로직 / 최소 2개 이상의 교체 가능한 필터 / FPS 카운터 + 처리 시간 모니터링 / GPU/CPU 모드 전환 지원
| 일 | 주제 | 학습 자료 |
|---|---|---|
| 1~2일 | OpenCV 기초 — 이미지 읽기/쓰기, 색공간 변환, 필터링 | OpenCV 공식 튜토리얼 |
| 3~4일 | 얼굴 검출 — Haar Cascade → MTCNN → InsightFace 발전사 | InsightFace GitHub |
| 5~7일 | 얼굴 랜드마크 — dlib 68-point vs InsightFace 106-point | "InsightFace: 2D and 3D Face Analysis" 논문 |
| 일 | 주제 | 학습 자료 |
|---|---|---|
| 1~2일 | ONNX 포맷 이해 — PyTorch/TF → ONNX 변환, 그래프 시각화 | onnx.ai 공식 문서 |
| 3~4일 | ONNX Runtime — ExecutionProvider 개념, 세션 설정, 최적화 | Microsoft ONNX Runtime 문서 |
| 5~7일 | GPU 가속 — CUDA 기초, cuDNN, TensorRT 비교 | NVIDIA Developer Blog |
| 일 | 주제 | 학습 자료 |
|---|---|---|
| 1~2일 | 멀티스레딩 — GIL, threading vs multiprocessing, Queue | Python 공식 문서 |
| 3~4일 | 프레임 파이프라인 — 생산자-소비자 패턴, 백프레셔 | 실습: 미니 파이프라인 구현 |
| 5~7일 | FFmpeg — CLI 사용법, Python 연동, 코덱 이해 | FFmpeg Wiki |
| 일 | 주제 | 학습 자료 |
|---|---|---|
| 1~2일 | GAN 기초 — Generator/Discriminator, 학습 과정 | Goodfellow et al. 2014 논문 |
| 3~4일 | 얼굴 복원 — GFPGAN, GPEN, CodeFormer 비교 | GFPGAN GitHub |
| 5~7일 | 이미지 블렌딩 — Poisson Blending, Alpha Blending | OpenCV seamlessClone 문서 |
| 일 | 주제 | 학습 자료 |
|---|---|---|
| 1~3일 | PySide6로 데스크톱 앱 만들기 — QThread·시그널·슬롯 | PySide6 공식 문서 (doc.qt.io) |
| 4~5일 | OBS WebSocket 연동으로 스트리밍 통합 | OBS WebSocket 문서 |
| 6~7일 | 자신만의 프레임 프로세서 플러그인 작성 | Deep-Live-Cam 소스 코드 참고 |
| 키워드 | 설명 |
|---|---|
| Face Swap | 한 사람의 얼굴을 다른 사람의 얼굴로 교체하는 기술. 검출→정렬→교체→블렌딩 파이프라인으로 구성 |
| ONNX | Open Neural Network Exchange. 다양한 딥러닝 프레임워크 간 모델 호환을 위한 개방형 포맷 |
| ONNX Runtime | Microsoft가 개발한 고성능 추론 엔진. ExecutionProvider로 CUDA/DirectML/CoreML 등 지원 |
| ExecutionProvider | ONNX Runtime에서 모델 추론을 실행할 하드웨어 백엔드 |
| InsightFace | DAMO Academy에서 개발한 얼굴 분석 라이브러리. 검출·인식·정렬·랜드마크 통합 제공 |
| buffalo_l | InsightFace의 사전학습 모델 팩. det_10g(검출) + w600k_r50(인식) + 2d106det(랜드마크) 포함 |
| InSwapper | InsightFace 기반 얼굴 교체 모델. 소스 얼굴 임베딩을 타깃 얼굴에 적용해 픽셀 레벨 교체 |
| Face Embedding | 얼굴 특징을 512차원 벡터로 압축한 표현. 같은 사람은 유사, 다른 사람은 먼 벡터를 가짐 |
| Cosine Similarity | 두 벡터 간의 각도를 측정하는 유사도 지표. -1(반대)~1(동일). 얼굴 매칭에 널리 사용 |
| 106-point Landmark | 얼굴의 윤곽, 눈, 코, 입, 눈썹 등 106개 핵심 포인트의 좌표. 정밀한 마스킹과 정렬에 사용 |
| Poisson Blending | 그래디언트 도메인에서 이미지를 합성하는 기법. 경계선이 자연스럽게 녹아들어 흔적 최소화 |
| GFPGAN | Generative Facial Prior GAN. 저품질/손상된 얼굴 이미지를 고품질로 복원하는 네트워크 |
| GPEN | GAN Prior Embedded Network. GFPGAN과 유사하지만 다른 아키텍처. 256/512 해상도 버전 존재 |
| PySide6 | Qt 프레임워크의 공식 Python 바인딩(Qt 6). QThread·시그널·슬롯 기반 비동기 UI, 크로스플랫폼 데스크톱 앱 개발에 사용 |
| DirectML | Microsoft의 하드웨어 독립적 머신러닝 가속 API. NVIDIA/AMD/Intel GPU에서 동작 |
| CoreML | Apple의 머신러닝 프레임워크. Neural Engine + GPU + CPU를 통합 활용 |
| OpenVINO | Intel의 추론 최적화 툴킷. Intel CPU/GPU/VPU에서 최적 성능 |
| NSFW Detection | Not Safe For Work 콘텐츠 감지. OpenNSFW2 모델로 부적절한 콘텐츠 자동 차단 |
| Frame Drop | 실시간 처리에서 처리 속도가 입력 속도를 따라가지 못할 때 오래된 프레임을 의도적으로 폐기하는 기법 |
| Graceful Degradation | 시스템의 일부 기능이 사용 불가해도 나머지가 정상 동작하도록 하는 설계 원칙 |