ComfyUI에서 영상을 다룰 때 필수적으로 사용하는 커스텀노드인 Video Helper Suite와, 인물의 얼굴을 빠르게 바꿔주는 reactor를 이용해 영상 속 얼굴을 바꾸는 간단한 워크플로우를 구성해보겠습니다.
영상은 사실 연속된 이미지 모음(프레임)을 시간의 흐름에 맞게 보여주는 것이기 때문에, 스테이블 디퓨전으로 이미지를 생성하고 편집하는 과정을 각 프레임마다 작업해주기만 하면, 이론적으로 영상도 편집이 가능합니다. 본문에서는 ComfyUI에서 원본 영상을 각 프레임로 나누고, 프레임 이미지 속 인물의 얼굴만 빠르게 가상의 인물로 바꿔 다시 영상으로 합하는 작업을 진행해보겠습니다.
Video Helper Suite
기본적으로 ComfyUI에서 영상을 다룰 때는 SVD, AnimateDiff 등 어떤 종류의 커스텀 노드를 활용하더라도, Video Helper Suite는 필수로 사용하게 됩니다.
다양한 기능이 있지만 핵심 기능은 바로, 영상을 불러와(V)서 프레임 이미지 묶음(배치)로 변환해주고, 편집이 끝난 프레임 이미지를 다시 영상으로 묶어(Video Combine)해주는 기능입니다.
VHS 커스텀 노드 설치
일단, ComfyUI Manager에서 검색하거나, 또는 아래 깃 레포지터리 주소를 복사해 커스텀 노드를 설치해줍니다.
GitHub : https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite
ComfyUI Manager 사용이 익숙치 않거나 커스텀 노드 설치 방법이 낯선 분들은 아래 글을 참고해주시기 바랍니다.
VHS Load Video
설치를 마친 다음에는 위에서 소개드린 2개의 노드를 바로 불러와 사용할 수 있습니다. 영상을 불러오고, 영상을 묶어 저장하는 노드입니다. ComfyUI의 기본 노드인 Load Image가 단일 이미지를 불러온다면, Load Video는 영상을 구성하는 모든 프레임 이미지를 불러오는 것과 마찬가지입니다.
ComfyUI의 강력한 장점 중 하나가 바로 배치 이미지를 처리하는 능력입니다. 성공적으로 Load Video 노드로 영상을 불러왔다면, 위와같이 출력단의 image 노드에 preview image를 연결하고, Queue Prompt 버튼을 눌러봅니다. 영상을 구성하는 모든 이미지가 Preview Image 노드 하나로 불러와집니다. 별 것 아닌 것처럼 느끼실 수도, 프레임을 다루기 위해 별도의 노드를 설치하지 않아도 기본 노드에서 배치로 전달되는 각각의 이미지를 모두 받아올 수 있다는 것은 편집하는 입장에서는 매우 반가운 일입니다.
불러온 다수의 프레임 중 한 장을 선택하면 해당 이미지가 확대되며, 위와 같이 총 프레임중 몇번째 이미지인지 확인할 수 있습니다.
Load Video 노드를 통해 영상을 이미지로 불러올 때는 아래의 3가지를 제어해 불러오는 프레임을 사용자가 정할 수 있습니다.
- frame_load_cap : 원본 영상으로부터 불러오는 전체 프레임 수를 제한합니다.
- skip_first_frames : 원본 영상의 시작부터 설정한 프레임까지는 불러오지 않습니다.
- select_every_nth : 설정한 값만큼 매 프레임을 건너뛰고 가져옵니다.
frmae_load_cap
만약 전체 108프레임으로 구성된 위 예시 영상의 경우, frame_load_cap 값을 16으로 주면, 처음 16개 프레임만 이미지로 불러오겠다는 의미입니다.
skip_first_frames
예시에서 사용한 원본 영상은 30fps입니다. 이는 즉 초당 30장의 프레임(이미지)로 재생된다는 것으로, 만약 위 영상에서 처음 60프레임을 스킵하고 그 이후부터 가져온다고 하면, 영상의 초반 2초를 잘라내고 그 뒤 16프레임만 가져오게 됩니다.
select_every_nth
만약 매 6번째 프레임을 가져오겠다고 설정했다면, 전체 108개 프레임 중 18개 프레임(108/6=18)만 가져오게 됩니다.
Video Combine
비디오 컴바인 노드는 말 그대로 편집이 끝난 배치이미지를 받아와 다시 영상으로 합해주는 역할을 합니다. 이 때 영상을 gif, webp 등의 이미지 파일로 저장할 수도 있고, 각종 코덱에 맞춰 다양한 형식(format)으로 내보낼 수 있습니다. 또한 내보내는 영상의 frame_rate, 파일명 등을 재설정하는 것도 가능합니다.
Reactor
리엑터는 인물의 얼굴을 빠르게 바꿔주는 기능을 합니다. 마찬가지로 사용을 위해 ComfyUI Manager 또는 깃 레포지터리 주소로 설치를 진행합니다.
GitHub : https://github.com/Gourieff/comfyui-reactor-node
Reactor는 insightface가 설치되어 있어야 정상적으로 사용이 가능합니다. 만약 커스텀 노드 설치 후 실행시, insightface가 설치되지 않았다는 이유로 오류가 발생한다면, 가상환경 진입 상태에서 아래 명령어를 입력해 InsightFace를 설치해줍니다.
GitHub : pip install insightface-0.7.3-cp310-cp310-win_amd64.whl
위 명령어에서 cp310은 파이썬 버전을 나타냅니다. 가상환경이 구성된 파이썬 버전이 3.10인 경우 cp310을, 3.11버전인 경우 cp311을 작성해 설치를 진행해줍니다. 3.12버전인 경우 마찬가지로 cp312를 입력해 설치할 수 있습니다.
Reactor x Video Helper Suite Workflow
이제 모든 설치를 마쳤으므로 두 커스텀 노드를 이용해 예시 영상의 얼굴을 바꿔(FaceSwap)보도록 하겠습니다. 먼저 얼굴을 바꾸기 위해 아래와 같이 간단한 워크플로우를 구성합니다.
Load Video 노드에서 다른 설정은 건들지 않고 select_every_nth 설정만 3으로 바꿨습니다. 원본영상이 30fps이므로, 새로 생성되는 영상은 이를 3으로 나눈 10fps가 됩니다. 즉 초당 10장의 이미지로 구성된 영상을 생성합니다. 한편 이렇게 불러온 영상 이미지들, 즉, 프레임 이미지를 모두 ReActor 노드의 input_image로 넘겨줍니다. ReActor 노드의 source_image에는 바꿀 얼굴을 넣어줍니다. 이후 출력단에는 다시 Video Combine 노드를 연결해주고 저장할 형식을 지정해줍니다. 아래는 이렇게 구성해 만든 영상입니다.
(업로드 용량 때문에 ReActor – Video Combine 노드 사이에 Image Resize 노드를 추가해 해상도만 변경한 영상입니다.)
원본 영상의 배수지님의 얼굴이, AIPOQUE 마스코트 얼굴로 바뀐모습입니다. ReActor 설정에서 face_restore_model을 지정해주면, 바뀐 얼굴을 한 번 더 보정해줌으로써 얼굴을 더욱 깔끔하게 바꿔줄 수 있습니다.
Face Model
한편 이렇게 한 번 FaceSwap을 진행한 얼굴의 경우, 매번 로드 이미지로 얼굴 이미지로 제공할 필요 없이 Face Model을 저장해두면, 해당 모델을 불러와 사용하는 것도 가능합니다.
위와 같이 저장할 얼굴 이미지를 불러온 후 Save Face Model 노드에 연결한 뒤, 파일명을 작성하고 Queue Prompt를 누르면 해당 인물의 얼굴모델이 ComfyUI/models/reactor/faces 폴더에 저장됩니다. 예시에서는 따로 이름을 정하지 않아서 default.safetensors 파일로 저장되었습니다.
이렇게 저장된 Face Model은 위와 같이 Load Face Model 노드로 불러와 ReActor 노드에서 바로 사용 가능합니다. 매번 인물의 얼굴 이미지를 다시 불러올 필요없이 저장한 Face Model을 불러와 간편하게 사용할 수 있습니다.