포스트

Deep-Live-Cam 실시간 Face Swap는 어디서 깨질까: 128px, 측면 얼굴, 지연

Deep-Live-Cam은 동의를 받은 얼굴로 제한된 테스트에는 빠르게 쓸 수 있지만, 사진 한 장만으로 모든 자세에서 자연스러운 실시간 합성을 보장하지는 않습니다.

한 프레임이 바뀐 얼굴로 돌아오는 다섯 단계

웹캠 프레임은 cv2.VideoCapture로 들어오고, 캡처와 추론은 큐를 둔 생산자-소비자 방식으로 분리됩니다. 프레임을 읽는 작업이 모델 추론을 기다리면 입력이 밀리고 화면 지연이 커지기 때문입니다. 큐를 무한히 쌓는 대신 오래된 프레임을 버릴지, 모든 프레임을 처리할지 정책을 정해야 실시간성이 유지됩니다.

RetinaFace 또는 YOLOv8-face는 얼굴 영역과 눈, 코, 입꼬리의 다섯 랜드마크를 찾습니다. 이 점들을 기준으로 얼굴을 정렬해 128×128 입력으로 만듭니다. 이후 ArcFace가 원본 사진에서 추출한 512차원 identity 임베딩과 현재 얼굴을 inswapper_128.onnx에 넣습니다. 결과 얼굴은 역 어파인 변환으로 원래 위치에 돌아가며 마스크와 알파 블렌딩으로 경계를 섞습니다.

새 모델 하나가 모든 일을 하는 구조가 아닙니다. 탐지, 정렬, identity 주입과 합성을 각각 맡은 모델과 영상 처리 단계를 낮은 지연 안에 이어 붙인 파이프라인입니다. 어느 한 단계가 얼굴을 놓치면 뒤 단계가 정확해도 결과가 깨집니다.

128px를 살리면 FPS가 줄어든다

inswapper_128.onnx의 출력은 128×128이므로 큰 웹캠 화면에 붙이면 디테일 부족이 눈에 띕니다. GFPGAN이나 CodeFormer 같은 복원 모델을 추가하면 선명도를 높일 수 있지만 프레임마다 추론이 하나 더 생깁니다.

원문은 복원을 켰을 때 10~15 FPS와 약 0.5초 지연이 나타날 수 있다고 설명합니다. 이는 모든 하드웨어의 고정 성능이 아니라 해당 환경에서 관찰될 수 있는 한계를 보여 주는 수치로 읽어야 합니다. 해상도, 동시에 잡힌 얼굴 수, execution provider와 복원 설정을 바꾸며 p95 프레임 시간을 직접 재야 합니다.

여기서 목표를 먼저 정해야 합니다. 대화의 자연스러움이 중요하면 최신 프레임을 우선하고 복원을 줄이는 편이 낫습니다. 녹화 결과의 품질이 중요하면 낮은 FPS를 받아들이고 복원이나 후처리를 켤 수 있습니다. “고화질”과 “실시간”을 한 설정에서 동시에 최대화하기는 어렵습니다.

측면 얼굴과 깜박임은 정렬 단계에서 시작된다

정면 사진 하나에서 얻은 identity는 고개가 크게 돌아갔을 때 보이지 않는 면의 정보를 제공하지 않습니다. 원문은 좌우로 45도 이상 회전하거나 고개를 크게 움직일 때 탐지와 랜드마크가 흔들리고 마스크가 깜박일 수 있다고 지적합니다. 모션 블러, 얼굴 가림과 강한 조명 변화도 같은 경로를 어렵게 만듭니다.

평균 FPS만 보는 데모는 이 문제를 숨깁니다. 테스트 영상에 정면, 좌우 회전, 손으로 얼굴 가리기, 화면 밖 출입과 조명 변화를 넣고 다음을 기록하십시오.

  • 탐지가 끊긴 프레임 비율
  • 랜드마크와 합성 경계의 흔들림
  • 캡처부터 출력까지의 지연
  • 복원 사용 전후의 FPS와 디테일
  • 여러 얼굴이 있을 때 대상 선택의 일관성

실패했을 때 원본 프레임으로 돌아갈지, 마지막 합성 결과를 유지할지도 제품 정책입니다. 잘못된 얼굴에 identity를 붙이는 것보다 안전한 폴백이 우선입니다.

ONNX Runtime은 하드웨어 차이를 없애지 않는다

ONNX Runtime은 NVIDIA의 CUDA, Apple의 CoreML, Windows의 DirectML 같은 execution provider를 선택할 수 있게 합니다. 동일한 모델 형식을 여러 장치에서 실행할 수 있다는 장점은 크지만, provider마다 지원 연산, 초기 로딩과 성능 특성이 같다는 뜻은 아닙니다.

Python 패키지, InsightFace의 C++ 빌드 도구, ONNX Runtime과 CUDA 조합이 맞지 않으면 설치부터 막힐 수 있습니다. 원문의 python run.py는 실행 진입점을 가리킬 뿐 완전한 설치 절차가 아닙니다. 운영 후보라면 OS, GPU, 드라이버, 패키지 버전을 고정하고, CPU 폴백이 조용히 활성화되지 않았는지 확인해야 합니다.

사용할 수 있는가보다 사용해도 되는가가 먼저다

사람의 얼굴은 비밀번호처럼 바꿀 수 없는 식별 정보입니다. 원본 인물과 촬영 대상 모두의 명시적 동의를 받고, 허용된 목적과 보존 기간을 정해야 합니다. 타인의 신원 사칭, 허위 영상이나 동의 없는 배포에는 사용해서는 안 됩니다.

제품에 넣는다면 합성임을 알리는 워터마크와 C2PA 같은 출처 메타데이터를 검토하고, 원본 사진과 identity 임베딩에 대한 접근, 삭제 정책을 마련해야 합니다. Deep-Live-Cam의 기술적 장점은 빠른 프로토타이핑입니다. 사람을 속이는 완성도나 무제한 실시간 서비스를 증명하는 도구로 해석해서는 안 됩니다.

지연 예산은 파이프라인 어디에서 쓰일까

종단 지연은 캡처, 얼굴 탐지, 정렬, swap 추론, 복원, 역변환, 블렌딩과 화면 출력의 합입니다. 단계별 시간을 기록하지 않고 FPS만 보면 큐에 오래된 프레임이 쌓여 화면은 부드러워도 실제 표정이 늦게 따라오는 문제를 놓칠 수 있습니다. 각 출력 프레임에 캡처 시각을 붙여 화면에 표시될 때까지의 P50/P95를 재야 합니다.

대화형 영상은 모든 프레임 처리보다 최신성 우선 정책이 적합할 수 있습니다. 추론이 캡처보다 느리면 큐 길이를 제한하고 오래된 프레임을 버리되, 오디오와 입 모양의 시간차가 허용 범위를 넘지 않는지 확인합니다. 녹화 경로는 프레임을 버리지 않고 더 느리게 처리할 수 있으므로 실시간 미리보기와 최종 렌더링 설정을 분리할 수 있습니다.

여러 얼굴을 처리하면 탐지 수만큼 추론이 늘 수 있습니다. 대상 한 명만 swap할지 모든 얼굴을 처리할지 정하고, 얼굴 수에 따른 지연과 메모리를 측정합니다. 부하가 높을 때 복원을 먼저 끌지, 해상도를 낮출지, 원본 프레임으로 돌아갈지 우선순위를 미리 정해야 갑작스러운 CPU 폴백으로 지연이 폭증하는 일을 막을 수 있습니다.

여러 얼굴 중 같은 사람을 어떻게 계속 고를까

프레임마다 가장 큰 얼굴을 선택하면 사람이 가까이 지나갈 때 대상이 바뀔 수 있습니다. 첫 프레임에서 사용자가 대상을 지정하고 이후에는 위치, 얼굴 특징과 이동 궤적을 함께 추적해야 합니다. 대상이 가려졌다가 돌아왔을 때 다른 사람에게 identity가 붙지 않도록 재확인 임계치와 실패 폴백이 필요합니다.

탐지 ID가 바뀌는 장면을 일부러 만듭니다. 두 사람이 교차하고, 한 명이 화면 밖으로 나갔다 들어오며, 비슷한 크기의 얼굴이 가까이 있는 영상을 사용합니다. 대상 일관성, 잘못된 사람에게 swap한 프레임과 복구 시간을 기록합니다. 잘못된 대상 합성은 경계 깜박임보다 더 큰 개인정보, 신원 위험입니다.

얼굴을 찾지 못한 프레임에서 마지막 마스크를 계속 쓰면 현재 위치가 아닌 곳에 합성 흔적이 남을 수 있습니다. 탐지 실패 시 원본으로 즉시 돌아가고, 다시 충분한 연속 프레임에서 대상이 확인된 뒤 swap을 재개하는 보수적 정책이 안전합니다.

품질은 선명도 외에 무엇을 봐야 할까

복원 모델은 피부와 눈을 선명하게 만들 수 있지만 원본 identity와 다른 세부를 만들어 낼 수도 있습니다. 해상도만 올라간 결과와 실제 인물 특징이 유지된 결과를 구분해야 합니다. 정면, 측면, 표정, 조명별로 identity 일관성, 경계, 색상 차이와 시간적 깜박임을 평가합니다.

프레임 단위 점수가 높아도 영상에서는 마스크가 흔들리거나 눈, 입 모양이 갑자기 바뀔 수 있습니다. 같은 얼굴 영역의 연속 프레임 차이와 랜드마크 이동을 보고 사람이 전체 클립을 확인합니다. 빠른 고개 회전, 모션 블러와 가림 구간은 별도 실패율로 보고 평균 정면 장면에 묻히지 않게 합니다.

원본 영상의 표정과 입 모양을 얼마나 보존하는지도 목적에 따라 중요합니다. identity 유사도만 최대화하면 촬영 대상의 표정이 사라질 수 있습니다. 화상 통화, 창작 영상과 익명화는 서로 다른 성공 기준을 가지므로 한 설정을 모든 용도에 쓰지 않습니다.

원본 사진과 임베딩은 어떻게 보호할까

Identity 임베딩은 원본 사진이 아니어도 특정 사람을 나타내는 민감 정보로 취급해야 합니다. 프로젝트, 사용자별로 암호화하고 접근 로그와 보존 기간을 두며, 삭제 요청 때 원본, 임베딩, 캐시, 백업의 처리 범위를 설명해야 합니다. 테스트 영상과 디버그 프레임에 얼굴이 남는지도 확인합니다.

동의에는 대상 인물의 얼굴 사용뿐 아니라 촬영 참가자와 배포 채널, 기간이 포함됩니다. 한 번 받은 사진을 다른 프로젝트나 모델 개선에 재사용하지 않고, 라이브 화면에서 합성 중임을 참가자가 알 수 있게 표시합니다. 공개 배포본에는 눈에 보이는 표시와 가능한 출처 메타데이터를 함께 두는 편이 좋습니다.

접근 통제만으로 악용을 막을 수 없는 공개 도구의 특성도 인정해야 합니다. 제품화할 때는 업로드 가능한 원본의 소유 확인, 고위험 인물과 용도 제한, 신고, 삭제 경로와 감사 절차를 별도로 설계합니다. 기술 데모가 작동한다는 사실이 특정 사용의 정당성을 보장하지 않습니다.

어떤 파일럿이면 실시간 사용 가능성을 알 수 있을까

목표 하드웨어와 해상도를 고정하고 얼굴 한 명, 여러 명, 복원 켬, 끔과 execution provider별로 단계 시간, 종단 지연, FPS, 메모리를 기록합니다. CPU 폴백이 일어난 실행은 별도로 표시합니다. 평균보다 P95 지연과 프레임 나이, 탐지 실패 뒤 원본 복귀 시간을 중요하게 봅니다.

품질 세트에는 정면만 넣지 않고 큰 회전, 빠른 표정, 손 가림, 조명 변화와 재등장을 포함합니다. 잘못된 대상 선택이 한 번이라도 발생하면 다중 얼굴 자동 처리를 보류하고 사용자 고정이나 단일 얼굴 조건으로 제한합니다. 복원으로 지연은 늘었는데 identity와 시간 일관성이 개선되지 않으면 해당 단계는 끄는 편이 낫습니다.

마지막으로 동의 기록, 합성 표시, 삭제와 로그 접근을 실제 운영 절차로 시험합니다. 기술 성능을 통과해도 이 절차가 없으면 사람 얼굴을 다루는 제품으로 준비된 것이 아닙니다. 제한된 내부 창작, 연구 환경에서 성능과 보호 조치를 함께 검증한 뒤 용도를 넓혀야 합니다.

참고 자료:

원문과 버전 확인

함께 읽으면 이해가 이어지는 글

THE END / OPSOAI

여기까지 읽었습니다

핵심 장면을 한 번 더 떠올려 보세요. 이해가 남았다면 이 책은 제 역할을 다했습니다.

다른 책 고르기
표지 1

키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.

CONTENTS

이 책의 목차

    12개 장 20 분읽는 시간