ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ComfyUI) 이미지를 수정하자 - Inpaint
    Stable Diffusion 2024. 9. 30. 22:27
    반응형

    Stable Diffusion으로 이미지를 생성했을 때, 전체적으로는 만족스러우나 일부 아쉬운 부분이 있을 수 있습니다. 이때 수정할 수 있는 방법 중 하나가 Inpaint입니다. 

    Inpaint는 원본 이미지에서 수정하고 싶은 부분을 선택(Masking) 한 후, 그 부분만 다시 생성하는 방식입니다. 이는 Img2img 방식 중 하나로, 원하는 부분만 간편하게 수정할 수 있다는 장점이 있습니다. 이제 Inpaint 방법에 대해 자세히 알아보겠습니다. 

    이미지 준비

    수정할 이미지를 먼저 준비합니다. Inpaint는 어떤 이미지든 활용할 수 있지만, 최상의 결과를 얻기 위해서는 가능한 한 동일한 환경에서 이미지를 생성하는 것이 좋습니다. 따라서 Inpaint용 이미지를 새로 생성해 사용하겠습니다.

    원본 이미지

    위 이미지는 하늘에서 본 도시의 모습입니다. 여기에 우주선을 추가하여 이미지를 수정해 보겠습니다. 

    전체 워크플로우

    inpaint + XY plot.json
    0.01MB

     

    전체 워크플로우입니다. 기본적인 이미지 생성 워크플로우에 Load image 노드와 InpaintModelConditioning 노드가 추가되었습니다. XY Plot과 XY Input: Denoise 노드는 선택사항이지만, inpaint의 특성상 denoise 값을 조정하며 생성해야 하므로 처음부터 XY Plot을 사용해 그리드를 구성하는 것이 더 효율적일 수 있습니다. 

    Load image 노드

    이 노드는 원본 이미지를 불러오는 기능을 제공합니다. 이미지를 불러온 후, 수정할 부분을 선택할 수 있습니다. 

    MaskEditor 화면. 여기서 수정할 부분을 선택할 수 있다

    불러온 이미지에서 마우스 오른쪽 버튼을 클릭하면 메뉴가 나타나고, 그중에서 'Open in MaskEditor'를 선택하면 위 그림과 같은 MaskEditor가 나타납니다. 여기서 수정할 부분을 마우스로 직접 표시할 수 있습니다. 

    MaskEditor 화면 아래에는 몇 가지 메뉴가 있는데, 간단한 기능들이므로 한 번씩 눌러보면 쉽게 이해할 수 있습니다. 중요한 점은 작업이 끝난 후 반드시 'Save to node' 버튼을 눌러야 수정한 내용이 반영된다는 것입니다. 이 부분을 꼭 기억하시기 바랍니다.  

    Inpaintmodelconditioning 노드

    이 노드는 Img2img 생성을 위한 원본 이미지와 수정할 mask 부분을 처리하기 위한 역할을 합니다. 왼쪽의 포인트에서 입력을 받아 Sampler 노드에 연결하면 됩니다. 중요한 점은 Load image 노드에서 pixels와 mask 두 포인트를 모두 연결해야 한다는 것입니다. 

    Load image와 InpaintModelConditioning 노드의 연결

    Anything Everywhere 노드

    이 노드는 리모컨 역할을 하는 노드입니다. 아래 그림과 같이 특정 포인트를 Anything Everywhere 노드와 연결하면, 직접 포인트를 연결하지 않아도 마치 연결된 것처럼 사용할 수 있습니다. 무선 연결된 포인트는 그림에서처럼 붉은 불이 들어와 연결 상태를 확인할 수 있습니다. 특히 Checkpoint나 VAE를 불러오는 노드의 경우, 이 노드를 사용하면 매우 편리하게 작업할 수 있습니다. 

    Anything Everywhere 노드의 연결. 포인트에 불이 들어오면 원격 연결이 되었다는 뜻이다

    이미지 생성

    이제 위 워크플로우를 활용해 원본 이미지에 우주선을 생성해 보겠습니다. 이미지의 왼쪽 하늘 부분이 빈 공간이므로, 이곳에 우주선을 추가할 예정입니다. 먼저, 아래 그림과 같이 해당 부분을 마스킹합니다. 그런 다음, positive prompt에 'spaceship'을 입력하고 이미지를 생성합니다. Img2img 생성이므로 프롬프트는 간단하게 입력해도 충분합니다. 이번에는 negative prompt는 따로 입력하지 않았습니다. 

    Denoise 값이 얼마가 적절한지 알 수 없으므로, 먼저 XY plot을 이용해 다양한 denoise 값으로 그리드를 생성하여 최적의 값을 찾아보겠습니다. 

    원본이미지의 masking. 왼쪽 위의 하늘을 masking 하였다
    Grid 생성 결과

    생성 결과, denoise 값이 0.75 이상에서 우주선이 잘 생성되었습니다. 그러나 denoise 값이 1.0일 때는 이미지의 구도가 어색해지므로, 0.75와 1.0 사이의 값을 사용하는 것이 좋습니다. 

    몇 가지 값을 더 테스트한 결과, denoise 값 0.8에서 가장 좋은 결과가 나왔습니다. 아래는 원본 이미지와 우주선을 추가한 이미지입니다. 처음 생성할 때 왼쪽에 구름이 이상하게 생성되었지만, inpaint를 한 번 더 진행해 구름을 제거한 후 원본 이미지에 자연스럽게 우주선을 추가할 수 있었습니다. 

    좌) 원본, 중간) 1차 inpaint, 우) 2차 inpaint

    다음은 inpaint의 또 다른 샘플입니다. Inpaint 하려는 대상에 따라 최적의 denoise 값이 다르다는 점을 확인할 수 있었습니다. 대상의 특성에 맞는 denoise 값을 설정하면, 더 자연스럽고 일관된 결과를 얻을 수 있습니다. 

    웃는 표정으로 inpaint
    눈과 입술의 색을 inpaint

    Additional notes

    위 글에는 잘 생성된 이미지들만 업로드했지만, 실제로 작업을 진행하다 보면 원하는 이미지가 항상 잘 생성되는 것은 아닙니다. 특히, 아래 이미지처럼 배경을 변경하는 경우 mask 경계 부위가 자연스럽게 이어지지 않아 결과가 부자연스러울 수 있습니다. 

    인물과 배경의 경계가 자연스럽지 않다

    또한, 아래 예시에서처럼 옷의 색상이나 종류를 변경하는 작업도 기대만큼 쉽게 이루어지지 않을 때가 많습니다. 

    이 여자는 검은색 옷으로 갈아입지 않는다

    이러한 문제들을 해결하려면 denoise 값을 세밀하게 조정하고, masking을 더 신중하게 다루는 등 반복적인 시도가 필요합니다. 여러 번의 실험과 수정을 통해 최적의 결과를 얻을 수 있으며, 인내심을 가지고 작업하는 것이 중요합니다. 

    반응형

    댓글

Designed by Vitual Stylist