기본적으로 생성형 인공지능 이미지 도구인 스테이블 디퓨전은 무에서 유를 창조해내는 능력이 탁월합니다. 하지만 아직까지 일관성이라는 부분을 정밀하게 제어하는 능력이 부족해 상업적으로 이용하는데는 큰 제약이 되고 있습니다. 이 또한 기술이 더욱 발전하면 곧 극복할 수 있을 것으로 보입니다.
하지만 일관성이 좀 떨어지는 스테이블 디퓨전일지라도 개인적으로는 지금 당장 활용도를 극대화 할 수 있는 부분이 있다고 생각하는데요, 바로 이미지 수정 및 디테일링이 그 영역입니다. 그리고 이를 가능케 하는 핵심 기술이 바로 스테이블 디퓨전 인페인트(inpaint)라고 생각합니다. 본 글에서는 인페인트의 기초부터 몇가지 필수 응용 기술을 자세히 살펴보고자 합니다.
스테이블 디퓨전 인페인트 기본
인페인트는 기본적으로 img2img 기술의 확장기술(?) 입니다. 즉, 아래 예시처럼 기존의 이미지에서 사용자가 원하는 부분을 특정해서 그 부분만 선택적으로 다시 그려주는 기술입니다.
스테이블 디퓨전 인페인트 기본 조작법
스테이블 디퓨전 인페인트 사용법의 가장 기초가 되는 기본 절차는 다음과 같습니다.
원본 이미지 업로드 > 인페인트 영역 마스킹 > 옵션 설정 > Generate
이 때 옵션 설정 단계에서 사용자가 직접 제어할 수 있는 옵션을 살펴보면 다음과 같습니다.
- Resize mode : Just resize / Crop and resize / Resize and fill / Just rezise(latent upscale)
- Mask mode : Inpaint masked / Inpaint not masked
- Masked content : fill / original / latent noise / latent nothing
- Inpaint area : Whole picture / Only masked
이외 해상도와 Denoising strength 등 인페인트 작업시 중요한 각각의 옵션에 대해 자세히 살펴보면 다음과 같습니다.
Resize mode
지정한 인페인트 영역의 그림을 생성한 뒤 원본 이미지에 다시 붙여넣을 때 사용자가 입력한 해상도를 기반으로 어떤 방식으로 붙여넣을 지 선택하는 옵션입니다. 대부분의 경우 새로 생성된 그림이 원본 이미지와 잘 스며들기 바라기 때문에, Just resize 또는 Just resize(latent upscale)옵션을 사용하면 됩니다. Just resize(latent upscale)은 사용자가 지정한 해상도가 원본 이미지의 마스킹 영역보다 작을 경우 스테이블 디퓨전이 알아서 해상도를 잠재영역(latent)에서 업스케일링하여 붙여넣는 방식입니다.
Mask mode
마스크 모드는 말 그대로 사용자가 마스킹한 영역을 어떻게 다룰지를 결정하는 옵션입니다. 마스킹 된 영역만 다시 그리려면 Inpaint masked를, 마스킹된 영역을 제외하고 나머지를 다시 그리려면 Inpaint not masked를 선택합니다.
위 이미지는 사과 바구니 원본 그림에서 사과 한 알을 마스킹한 뒤, 프롬프트에 (baseball:1.5)를 입력하고 인페인트로 만든 그림입니다. Inpaint masked는 마스킹한 한 알의 사과가 야구공으로 바꼈지만, Inpaint not masked는 사과 한알은 그대로 두고 나머지 배경에서 사과들을 찾아 야구공으로 바꾼 것을 확인할 수 있습니다.
Masked content
Masked content는 마스킹한 영역의 그림을 새로 그릴 때 베이스가 되는 이미지로 어떤 것을 사용할지 정해주는 옵션입니다. 스테이블 디퓨전은 잠재영역 노이즈 이미지로부터 모델에 학습되어 있는 노이즈-실제그림 간 연계정보를 바탕으로 그림을 그려낸다고 설명드렸습니다.
인페인트를 할 때도 마찬가지인데요, 이 때 그림을 그리는 출발점이 되는 잠재영역 노이즈 이미지를 어떻게 만들어서 그림을 그릴 것인지 사용자가 결정할 수 있습니다.
- Fill : 마스킹 영역을 스테이블 디퓨전이 알아서 가득채워 새로 그림.
- Original : 마스킹 영역의 형상과 색상을 참고하여 새로운 그림을 그림.
- Latent noise : 마스킹 한 영역에 임의의 잠재노이즈 이미지를 추가해 그림.
예시 이미지는 에펠타워를 그린 뒤, 이를 원본이미지로 하여, 자유의 여신상으로 인페인트 작업을 한 결과입니다. Fill로 그린 경우 마스킹한 영역을 최대한 가득 채워(에필타워 외의 하늘 공간도 마스킹 된 부분까지 채워 그림) 자유의 여신상을 그려넣은 것을 볼 수 있습니다.
반면 Original의 경우 원본 이미지에서 에펠타워가 차지하는 공간 만큼만 자유의 여신상으로 바꾸고, 원래 하늘이었던 공간은 하늘을 유지하는 것을 볼 수 있습니다.
Latent noise를 사용할 경우 사용자가 디노이징 강도(denoising strength)를 잘 제어해야 합니다. 만약 denoising strength 값을 충분히 주지 못하면 이미지 생성 과정에서 추가한 잠재 노이즈 이미지가 결과물로 튀어나올 수 있습니다. 위 예시에서도 denoising strength를 0.6으로 줬을 때(예시 이미지의 Original과 Fill 모두 0.6 값으로 생성)는 결과 이미지가 마치 픽셀이 깨진 것 같은 노이즈 이미지인 반면, 0.7으로 줬을 때는 그래도 꾀나 자유의 여신상의 모습을 하고 있는 것을 볼 수 있습니다.
Fill, Latent noise는 원본과 다른 그림을 그릴 때 유용하고, Original은 원본과 유사한 그림을 그릴 때 유용합니다. 즉, 프롬프트를 원본과 다르게 작성하고 Denosing strength를 강력하게 걸어줘도, Original을 선택하면 그 변화가 제한적인 반면, Fill 또는 Latent noise는 원본과 상관없는 새로운 이미지를 그려넣을 수 있습니다. 하지만 Fill과 Latent noise를 활용해 인페인트를 할 때는 위의 예시에서 살펴본 바와 같이 마스킹 영역과, Denoising strength 등 사용자가 조금 더 세밀한 세팅값을 줘야 합니다.
Inpaint area
인페인트 영역(inpaint area)는 마스킹한 영역과 별개로 그림을 새로 그려넣을 때 참고할 이미지의 영역을 의미합니다. Whole picture를 선택하면 원본 이미지 전체의 색감 밸런스를 고려해 그림을 그리지만, Only maksed를 선택하면 마스킹 영역의 정보만 참고해 그림을 그리게 됩니다.
주의할 점은 Only masked와 달리 Whole picture를 선택한 경우 원본 이미지와 해상도를 동일하게 맞춰줘야만 인페인트가 동작합니다.
Denoising Strength의 중요성
스테이블 디퓨전 인페인트 사용법을 설명할 때 위에서 살펴본 기본 세팅값들도 중요하지만, 무엇보다 가장 먼저 알아야 하는 부분이 바로 디노이징 강도(Denoising Strength)입니다. 앞서 여러차례 말씀드린 것처럼 스테이블 디퓨전이 잠재영역에서 노이즈 이미지를 추가하여 그림을 생성하는데, 이 때 추가되는 노이즈의 강도를 얼마나 주느냐에 따라 생성되는 이미지의 변형 정도와 디테일의 변화 등이 달라지기 때문입니다.
위 이미지는 에펠타워가 있는 파리 배경의 그림에서 배경에 마스킹을한 뒤, (London:1.5)를 프롬프트로 주고 Denoising strength만 0.1 > 1.0으로 변경하며 그림을 생성한 결과입니다. 디노이징 강도에 따른 변화는 다음과 같습니다.
- 0.1~0.2 : 원본을 거의 그대로 유지함
- 0.3~0.4 : 원본을 거의 그대로 유지한 상태에서 디테일에 미묘한 변화가 시작됨.(에필타워가 달라짐)
- 0.5~0.6 : 원본을 유지한 상태에서 유의미한 변화를 주기 시작함.
(0.5에서는 새로운 강이 생기고 0.6에서는 드디어 건물의 형상이 달라짐) - 0.7~1.0 : 원본의 느낌이 없어지고 새로운 그림을 그려냄. 강도가 높을수록 더욱 과감하게 그려냄
저해상도 이미지 인페인트 주의사항
인페인트를 하실 때 또 한가지 주의하실 부분은 바로 해상도입니다. 원본이미지의 해상도가 지나치게 낮은 경우 인페인트를 하더라도 새로 그린 그림이 원본에 합쳐지면서 해상도가 다시 낮아지게 됩니다. 이런 상황에서는 인페인트를 제대로 했다고 하더라도 큰 변화를 못느끼는 경우가 간혹 생기는데요, 이럴 때는 원본 이미지 자체를 먼저 업스케일한 뒤에 업스케일링된 이미지를 기반으로 인페인트를 하시는 것이 좋습니다.
왼쪽의 경우 원본 이미지 인물의 얼굴을 그대로 인페인트한 결과이고, 오른쪽은 원본 이미지를 먼저 2배 upscale한 뒤 인페인트한 결과입니다. 해상도를 올린 뒤 인페인트를 했을 경우 얼굴의 디테일이 훨씬 살아나는 것을 확인할 수 있습니다.
인페인트 점 찍기 노하우
앞서 살펴본 노하우는 업스케일링을 통해 인페인트의 디테일을 끌어올리는 기술이었다면 반대로 인페인트를 통한 디테일을 임의로 낮추는 방법도 있습니다. 물론 대부분의 경우 딱히 필요없을 수 있는 기술이지만 인페인트 해상도 설정만으로 디테일 제어가 어려운 경우 이 방식도 꽤나 유용하게 사용할 수 있습니다.
스테이블 디퓨전 인페인트는 마스킹을 하고 해상도를 설정하면, 마스킹 영역을 포함한 사각형 영역을 설정해 해상도만큼의 크기로 이미지를 그리고 다시 원본 이미지에 집어넣는 방식으로 동작합니다. 이 때 해상도는 그대로 두고 사각형 영역을 일부러 크게 설정하면 인페인트 되는 디테일을 조금 약화시킬 수 있습니다.
위 그림은 인페인트 해상도를 512×512로 지정하고 마스크를 위와 같이 칠했을 때 실제로 스테이블 디퓨전이 수정 영역으로 잡는 공간을 예시로 표현한 것입니다. 얼굴을 바꾸는 것이 인페인트의 주요 목적이지만, 보시다시피 아주 작은 점 마스킹을 추가함으로써 선택영역을 사용자가 원하는 만큼 늘릴 수 있습니다.
여기서 중요한 점은 그림을 그리는 해상도는 그대로인데 인페인팅 영역만 넓어졌기 때문에 실제 그림을 그려내는 디테일링은 반대로 약해진다는 점입니다. 위와 같이 마스킹을 했을 때 각 결과 이미지를 보면 아래와 같습니다.
예상한 바와 같이 마스킹 영역을 임의로 확장시킬수록 인물의 얼굴 뭉개짐(디테일)이 점차 떨어지고 있습니다.
마스킹 영역 색상 바꾸기
인페인트 마스킹을 할 때 기본 흰 색상으로 마스킹이 어려운 경우가 간혹 있습니다. 예를 들어 흰색 이미지 부분을 인페인트 하려면 흰색 마스킹으로는 분간이 안돼 어렵습니다. 이럴 때를 대비해 마스킹 색상을 수정해서 사용하시는 것이 좋습니다.
Settings > img2img 에서 위 이미지를 참고하여 마스킹 색상을 변경하실 수 있습니다. 색상을 바꾼 뒤에는 WebUI를 재시작해야 색상 변경이 적용됩니다.
위 이미지는 마스킹 색상을 붉은색, 녹색으로 바꿔본 예시 이미지입니다. 기본 흰색 마스킹에 비해 내가 마스킹 한 영역이 확실히 눈에 띄는 것을 알 수 있습니다.
인페인트 응용
위에서 살펴본 스테이블 디퓨전 인페인트 기본을 모두 숙지하셨다면, 이제 인페인트를 자유자재로 활용하면서 원하는 이미지를 생성하실 수 있습니다. 아래에서는 인페인트 응용 기술에 대해 조금 더 구체적으로 살펴보겠습니다.
인페인트 업로드로 정교한 작업하기
위에서는 WebUI에서 인페인트 작업을 하기 위해 직접 마우스로 마스킹을 했습니다. 대부분의 작업은 마우스 마스킹으로도 충분하지만 만약 정교한 마스킹이 필요한 경우 외부 이미지 편집 툴에서 누끼를 따서 마스크 이미지를 따로 만들어 사용할 수도 있습니다.
위 그림과 같이 img2img의 Inpaint upload 탭에서 위에는 원본이미지를, 아래에는 마스크 이미지를 업로드 합니다. 마스크 이미지는 흰색이 마스킹 부위로 인식됩니다.
위에서 세팅한 그대로 Inpaint upload를 실행하여 인물의 옷차림을 바꾼 결과입니다. 프롬프트에는 베이지 트렌치코트, 화이트 셔츠 및 레드 체크무늬 치마를 입력했습니다. 마스크 이미지는 포토샵으로 원본 이미지의 인물만 누끼를 따서 진행했기 때문에 정확하게 인물에만 인페인트가 적용된 것을 확인할 수 잇습니다.
인페인트 + 컨트롤넷
스테이블 디퓨전 인페인트를 단독으로 사용하면 여전히 다시 그리는 이미지의 일관성을 유지하는 것이 쉽지 않습니다. 물론 마스킹 영역을 아예 전혀 다른 형상으로 그릴 때는 문제가 되지 않지만, 특정 부위를 특정 구도나 컬러로 사용자의 의도대로 수정하기 위해서는 컨트롤넷을 함께 사용하는 것이 큰 도움이 됩니다. 인페인트와 함께 컨트롤넷을 사용했을 때 가능한 몇가지 대표적인 작업들을 살펴보도록 하겠습니다.
옷 갈아 입기
인페인트와 컨트롤넷을 잘 활용하면 인물의 옷을 바꿔 입힐 수 있습니다. 자신의 취향에 따라 컨트롤 넷의 다양한 기능을 선택적으로 사용 가능하지만, 옷을 바꿔 입히는 것은 경험상 Depth 모델이 가장 훌륭한 결과를 보여줬습니다. 물론 컨트롤넷 모델을 여러개 동시에 사용해도 되지만, 이 때에도 Depth 모델을 함께 사용해주시는 것이 좋습니다.
위 이미지는 웨딩드레스를 입은 원본 이미지에서부터 옷부위를 인페인트 마스킹하고, 컨트롤넷은 Depth를 선택한 뒤 프롬프트에 pink cocktail dress를 입력해 옷을 바꾼 결과입니다. 한편 단순히 옷을 갈아입는 것을 넘어 AI 쇼핑몰 모델을 만드는 것도 가능합니다. 조금 더 자세한 내용은 아래를 참고하시기 바랍니다.
얼굴 바꾸기
인페인트와 함께 컨트롤넷의 타일리샘플(tile resample)을 활용하면 사실적인 얼굴 디테일을 유지하면서 사용자가 원하는 모델 또는 로라 모델의 얼굴로 고정이 가능합니다.
이 밖에도 스테이블 디퓨전 인페인트와 함께 컨트롤넷의 IP-Adapter를 활용하면 특정 사진으로부터 얼굴을 추출해 원본 이미지의 얼굴을 바꾸고 싶은 다른 얼굴로 바꿀 수도 있습니다. 인페인트로 인물의 얼굴을 바꾸는 방법에 대한 더욱 자세한 설명은 아래 글을 참고하시기 바랍니다.
배경 바꾸기
스테이블 디퓨전 인페인트 기술을 응용하면 얼굴을 바꾸는 것과 반대로 배경을 바꾸는 것도 가능합니다. 본 글의 앞선 챕터에서는 프롬프트를 주고 디노이징 강도에 따른 인페인트 변화를 확인하는 과정에서 파리 배경을 런던 배경으로 변화시켜보기도 했습니다.
컨트롤넷을 함께 활용하면 프롬프트와 더불어 사용자가 원하는 배경 이미지를 합성하듯 기존 이미지의 배경을 변경할 수 있습니다.
배경 속에 인물 집어넣기
한편 인페인트 마스킹 영역을 지정하고 디테일링 작업을 어떻게 하느냐에 따라 배경 속에 새로운 인물을 합성해 넣는 것도 가능합니다. 스테이블 디퓨전 인페인트 기능 하나만으로 무에서 유를 창조하는 그림 과정을 생략할 수 있기 때문에 배경 속에 인물 합성을 해야 하는 상황이라면 작업시간을 굉장히 단축시키고, 그 시간을 후보정에 투자함으로써 이미지 퀄리티를 상당히 향상시킬 수 있습니다.