ComfyUI에서 마스크를 다루는 기술은 매우 중요합니다. 외부 이미지 편집 툴을 사용하지 않고도 ComfyUI 내에서 이미지 사이즈를 조정하거나, 색감, 투명도 조정 심지어 블렌딩까지 대부분의 이미지 편집이 가능하기 때문에, 마스킹까지 잘 다룬다면 누끼작업을 대체할 수 있기 때문입니다. 포토샵을 열지 않고 이미지 생성부터 편집까지 모든 것을 해결하다보면 정말 그 편리함 때문에 더더욱 ComfyUI의 매력에 빠져드는 것 같습니다.
ComfyUI 마스크 관련 커스텀 노드
커스텀노드를 마음대로 사용할 수 있다는 점은 ComfyUI의 장점을 극대화시켜주는 포인트입니다. 이미 수많은 커스텀노드들이 마스크를 편집하고 조작하는 기능을 포함하고 있습니다. 아래에서 소개드리는 마스크 기능 관련 몇가지 커스텀 노드들은 매우 대중적이어서 아마 다른 작업을 위해 이미 설치를 하신 경우가 대부분일 것이라 생각됩니다. ComfyUI에서 커스텀노드를 설치하는 방법이 익숙치 않은 분들은 아래 글을 참고하시기 바랍니다.
기본 Mask 노드
커스텀노드를 설치하기 앞서 기본적으로 내장되어 있는 ComfyUI 마스크 노드 관련 기능은 다음과 같습니다.
기본 노드만으로도 상당부분 마스크 관련 작업을 진행할 수 있는데요, 특히 마스크 반전(InvertMask), 마스크 확장(GrowMask) 및 피더(FeatherMask), 이미지를 마스크(Convert Image to mask)로, 마스크를 이미지(Convert Mask to Image)로 바꾸는 노드들은 다른 커스텀 노드를 사용하지 않고도 충분히 훌륭하게 제 기능을 하기 때문에 자주 사용하게 됩니다.
ImpactPack
ComfyUI를 사용하시는 분들 중에 임팩트팩을 설치하지 않은 분들은 아마 거의 없을 것이라 생각됩니다. 디테일러를 비롯해 다양한 기능이 녹아있기 때문에 필수로 사용하시는 것을 권장드리는데요, 임팩트팩 내에도 다양한 마스크 관련 기능들이 있습니다.
먼저 Util에 가면 마스크 를 확장(Dilate)하고, 블러(Gaussian Blur)처리하는 기능이 있습니다. 아래는 이미지를 불러와 SegmentAnything으로 마스크를 생성한 뒤 위 두 기능으로 이를 각각 확장하고 블러처리까지 한 결과입니다.
한편 operation으로 가면 Bitwise(MASK + MASK)로 2개의 마스크를 합치거나 Bitwise(MASK – MASK)로 마스크를 빼는 작업도 할 수 있습니다. 이를 잘 활용하면 여러물체가 복합적으로 존재할 때 특정 물체만 분리하는 작업이 가능합니다.
Impact Pack에서 매우 핵심이 되는 기능인 디테일러에서도 MaskDetailer를 찾아볼 수 있습니다.
직접 마스킹한 영역을 디테일러 노드에 전달하여, 해당 부위만 디테일을 강화할 수 있는데요, 이는 곧 정교한 인페인트가 가능하다는 것을 의미합니다.
Essentials
에센셜 또한 비단 마스크뿐만 아니라 다른 여러 기능들을 제공하기 때문에 매우 활용도가 높은 커스텀 노드입니다.
마스크 블러, 플립, 미리보기, 특정 색상만 마스킹, 세그먼트로부터 마스크만들기 등 다양한 기능이 있습니다. 그 중 마스크 블러는 앞서 살펴본 ImpactPack의 dilate와 사용성이 거의 동일하다고 볼 수 있으며, 마스크 미리보기가 굉장히 유용합니다. 플립의 경우 아래와 같이 x, y 축을 기준으로 마스크 반전을 할 수 있습니다.
Masquerade
ComfyUI 마스크 관련 커스텀 노드 중 가장 마스크 지향적인 노드가 바로 Masquerade입니다. Masquerade는 그 이름에서도 보이듯 아예 전문적으로 ComfyUI 마스크를 제대로 활용하기 위해 탄생한 커스텀노드입니다. 가장 첫 노드부터 강력한 기능을 보여주는데요, 바로 Mask By Text, 즉 사용자가 입력한 프롬프트를 기준으로 이미지에서 바로 입력한 프롬프트에 해당하는 영역을 마스킹해주는 기능입니다.
예를 들어 강아지 이미지에서 강아지만 마스킹하고 싶다면 아래와 같이 노드를 구성하고 프롬프트에 dog을 입력합니다.
노드 1개만으로 간단하게 강아지 마스킹 이미지를 얻었습니다. 이 노드는 다수의 피사체가 등장하는 이미지에서 특히 유용하게 활용할 수 있는데요, 아래와 같이 건물과 사람이 같이 나온 이미지에서, 프롬프트로 한 단어 작성하는 것만으로 둘을 분리해낼 수 있습니다.
게다가 데이터타입을 이미지 그대로 처리할 수 있다는 점도 위의 마스크 노드들과의 차이인데요, 물론 기본노드를 이용해 데이터 타입은 변환이 가능하기 때문에 의미없다고 느낄 수도 있는 부분이지만, 잘 활용하면 워크플로우를 더욱 깔끔하게 구성할 수 있습니다. 이 외에도 마스크로 이미지를 커팅하거나 이미지를 분류하는 등 다양한 작업이 가능하므로 꼭 한 번 사용해보시길 권장드립니다.
SegmentAnything
위에서 살펴본 Masquerade 커스텀노드에서 간단한 프롬프트로 마스크 이미지를 생성했던 것 대비, 더욱 정교하고 근본적인 마스킹은 Segment Anything으로 구현할 수 있습니다. 이전 포스팅에서 WebUI에서 Segment Anything을 다루는 방법을 소개드린바 있는데요, WebUI에서는 세그먼트로 요소를 나누고 마스킹 하더라도, 처리된 이미지를 다시 인페인트에 적용할 때 이미지를 다운받고 다시 업로드하는 등 번거로웠습니다. 하지만 ComfyUI에서는 처리된 이미지를 곧바로 다음 노드로 보내 작업을 이어나갈 수 있기 때문에 매우 편리합니다.
Segment Anything은 기본적으로 위와 같이 구성하여 ComfyUI 마스크를 얻을 수 있습니다. 여기서도 마찬가지로 프롬프트에 마스킹 목표물을 작성하면 그 결과를 마스크 또는 이미지로 출력하여 사용할 수 있습니다. Masquerade에서 노드 1개로 구현가능했던 부분을 실제로는 모델 로더를 통해 3개의 노드를 사용하기 때문에 복잡하고 번거로워 보일 수 있습니다. 하지만 SAM 모델을 직접 선택할 수 있다는 점, 그리고 결과를 이미지 또는 마스크로 사용자가 원하는대로 바로 빼낼 수 있다는 장점이 있습니다.