주로 기존의 사진이나 그림을 주어진 그림 내에서 수정하는 형태로 사용해봤는데요, 오늘은 반대로 원본 이미지를 기반으로 바깥으로 확장하여 그림을 그려볼 예정입니다. 즉, 인페인트가 아닌 아웃페인팅 AI 그림을 그리는 방법에 대해 살펴보고자 합니다. 본문을 통해 아웃페인팅의 개념과 이를 스테이블 디퓨전 WebUI에서 구현하는 방법 등을 확인해보세요.
아웃페인팅 AI 그림
스테이블 디퓨전은 생성형 AI 이미지 툴이며, 이는 프롬프트만 던져주면 무에서 유를 창조할 수 있다는 뜻입니다. 그럼 대략 “빈 도화지에 그림을 만들어내는 게 가능하다면, 어떤 이미지를 줘도 바깥 이미지까지 금방 생성해서 그려줄 수 있지 않느냐?” 라고 반문하실 수 있습니다. 네, 맞습니다. 스테이블 디퓨전은 사용자가 프롬프트만 준다면 빈 도화지뿐만 아니라 주어진 이미지의 바깥부분도 그려줍니다. 심지어 프롬프트 없이도 그림을 확장해서 그릴 수는 있습니다.
하지만 여기서 문제점은 또다시 “일관성”입니다. 여러번 말씀드렸다시피 스테이블 디퓨전의 그림 생성 원리는 프롬프트를 참고해 잠재영역에서의 랜덤 노이즈를 실제 이미지로 변환하는 것입니다. 따라서 매번 그림을 생성할 때마다 다른 그림이 생성됩니다.
이는 아웃페인팅을 할 때도 마찬가지인데요, 무지성으로 그냥 그림의 공간만 확대하여 새로 그려달라고 요청하면 스테이블 디퓨전은 기존 그림과 이질감을 느끼지 않을만큼 자연스러운 그림을 만들지 못합니다.
아웃페인트 방법 3가지
WebUI에서 아웃페인트(outpaint)를 할 수 있는 방법 3가지에 대해 살펴보고자 합니다. 물론 꼭 3개의 방법이 정답은 아니지만, 쉽게 접근할 수 있고 편리하게 따라할 수 있는 방법이므로 아웃페인팅을 시도해보시려는 분들은 아래 3가지 중 자신에게 맞는 제일 편리한 기능을 사용하시면 되겠습니다.
아웃페인팅 공통 주의사항 및 팁
3가지 아웃페인팅 방법을 소개하기에 앞서 자연스러운 아웃페인팅 AI 그림을 얻기 위해 공통적으로 주의해야 할 사항에 대해 먼저 말씀드리고자 합니다. 아웃페인팅 AI 그림의 가장 큰 쟁점은 바로 자연스러움입니다.
원본이미지가 존재하는 이상 그 원본을 확장해서 그린 부분이 원본과 이질감이 있다면 매우 부자연스러운 이미지가 생성될 것입니다. 사람의 눈은 간사해서, 이런 이질감에 대해서는 귀신같이 파악하는 놀라운 능력을 보여주기 때문에 더더욱 아웃페인팅은 자연스럽게 이뤄져야 합니다. 기본적으로 자연스러운 아웃페인팅을 하려면, 다음의 2가지 사항을 꼭 기억해야 합니다.
확장은 조금씩
아웃페인트를 통해 그림을 확장시킬 때는 욕심을 내서 한 번에 많은 영역을 생성하기보다는 천천히 단계별로 조금씩 늘려가는 것이 자연스러운 이미지를 얻는데 더욱 도움이 됩니다. 아래는 원본 이미지를 각각 전방향 64px, 128px, 256px만큼 확장한 아웃페인팅 AI 그림 결과물입니다.
+64px 4회 아웃페인팅
+128px 2회 아웃페인팅
+256px 아웃페인팅
언뜻 보기에는 큰 차이가 없는 것처럼 보일 수 있으나, 아웃페인트로 최종 전방향 256픽셀만큼 확장된 결과물만 비교해보면 확장된 그림에 꽤 차이가 있다는 것을 알 수 있습니다.
최종 결과 이미지 비교
위 이미지는 중앙의 원본이미지(옅은 빨간 테두리, 1024×1536)로부터 각각 64px 4회, 128px 2회, 256px 1회 아웃페인팅한 결과 이미지만 따로 비교한 것입니다.
한 번에 많은 영역을 아웃페인팅한 결과일수록 원본 이미지와 확장영역 간의 깊이감 표현이 떨어지는 것을 볼 수 있습니다. 예를 들어 확장된 이미지 좌측을 보면, 아웃페인팅을 한 번에 많이 한 이미지일수록 튀어나온 수풀의 영역이 많습니다. 심지어 256px을 확장한 이미지는 좌측 수풀이 모두 전방으로 튀어나와 있습니다.
우측도 마찬가지입니다. 64px만큼 천천히 확장한 이미지와 256px을 한 번에 확장한 이미지를 보면 우측 수풀의 이파리 크기부터 디테일의 차이가 명확합니다. 256px을 한 번에 확장한 이미지의 경우 이파리가 더욱 큼직하고 듬성듬성 나있어 확실히 디테일이 떨어지는 것을 볼 수 있습니다.
가장자리는 항상 비울것
아웃페인팅을 하기 전 원본이미지의 가장자리에 기둥같은 프레임이 있는 이미지라면, 아웃페인팅 전에 한 번 가공을 해주시는 것이 좋습니다. 가공없이 이미지를 바로 확장하면 아웃페인팅 AI는 아래 그림처럼 기둥 자체를 연장해서 그려줄 확률이 매우 높습니다. 이렇게 기둥이 연장되면 이미지 자체가 매우 답답해질 수 밖에 없고, 이는 우리가 애초에 아웃페인트를 통해 얻고자 한 결과는 아닐 것입니다.
반면 기둥을 좌측의 기둥을 잘라낸 이미지를 확장하면 확장 영역이 조금 더 알차게 다른 사물들로 공간감을 가지고 채워진 결과물을 얻을 수 있습니다.
Poor Man’s Outpainting
스테이블 디퓨전 WebUI의 img2img 탭에서 스크롤을 가장 하단까지 내리면, Script라는 항목이 있습니다. 빈자의 아웃페인팅(Poor Man’s Outpainting)은 기본적으로 설치된 스크립트 중 하나인데요, 이 스크립트를 활용하면 가난한 자의 아웃페인팅이라는 이름과 달리 굉장히 좋은 퀄리티의 아웃페인팅 결과물을 보여줍니다.
확장할 픽셀을 직접 입력하고, 좌,우,상,하, 확장 방향을 선택하면 해당 방향으로 입력한 픽셀수만큼 이미지가 확장됩니다. 이때 img2img의 리사이즈 설정은 원본이미지의 해상도를 입력(결과물은 원본해상도 + 입력한 확장 픽셀만큼 늘어남)하고, denoising strength는 상황에 따라 입력해주셔야 합니다. 아웃페인트는 원본 이미지와 일관성도 유지해야하지만, 동시에 새로운 그림을 만들어내야 하기때문에 생각보다 꽤 높은 값을 설정해줍니다. 보통 0.6~ 0.9 값 사이에서 좋은 결과물을 보여줍니다.
Outpainting MK2
마찬가지로 스크립트에 위치한 다른 아웃페인팅 기능입니다. Poor man’s outpainting 대비 2가지 설정 옵션이 추가되어 있습니다.
Fall-off exponent 값은 높여줄수록 이미지 디테일이 상승하며, Color variation은 확장되는 이미지와 원본 이미지 간 색상 유사도를 설정하는 값입니다. 값이 높을수록 변화 폭이 증가합니다.
ControlNet Inpaint Only + Lama
WebUI img2img 탭이 아닌 컨트롤넷의 기능 중 inpaint가 따로 있습니다. 아래와 같이 txt2img 탭에서 컨트롤넷 항목으로 이동한 뒤 Control Type을 인페인트(Inpaint)로 설정합니다.
전처리를 inpaint_only+lama라는 기능으로 활성화하면 컨트롤넷이 알아서 사용자가 입력한 해상도의 빈 캔버스 위에 원본이미지를 넣고 아웃페인팅(=빈 공간을 인페인트)으로 채워줍니다. 프롬프트와 생성할 이미지의 해상도를 입력합니다.
이 때 해상도는 원본 이미지의 해상도가 아닌, 결과물 해상도를 입력해야 합니다. 예를 들어 위 예시에서는 512×768 세로 이미지를 가로로 각각 128px씩 늘려 768×768 해상도로 만들기 위해 Width와 Height를 768, 768로 입력했습니다. 재밌는 점은 해상도를 꼭 원본보다 크게 지정할 필요는 없습니다. 512×512로 지정하면 컨틀롤넷이 알아서 원본 이미지를 줄이고, 가로로 빈공간을 채워넣습니다.
단, 여기서 중요한 점은 Resize Mode에서 Resize and Fill을 체크해줘야 제대로 아웃페인팅이 된다는 점입니다. Just Resize는 이미지를 단지 입력 해상도에 맞게 변형할 뿐이며, Crop and Resize 또한 마찬가지로 원본 이미지의 일부를 입력 해상도의 비율에 맞춰 잘라내고 확대/축소할 뿐입니다. 컨트롤넷 설치 방법 및 모델 다운로드 관련 정보는 아래에서 확인하시기 바랍니다.
위의 세가지 방법을 모두 적용해 아웃페인팅 AI 그림을 생성해보면 아무래도 컨트롤넷의 inpaint_only + lama 기능이 가장 뛰어나다는 결론입니다. 더구나 컨트롤넷의 경우 txt2img에서 진행 가능하므로 denoising strength를 설정하는데 스트레스를 받지 않아도 됩니다. 프롬프트만 잘 작성해주고 나머지는 컨트롤넷이 알아서 하도록 맡기면 됩니다.