AI 이미지/워크플로 따라하기

이미지 배경을 바꾸는 방법

하늘이푸른오늘 2023. 12. 24. 17:18

스테이블 디퓨전을 사용해 이미지의 배경을 추가하거나 교체할 수 있습니다. 이 기법은 인공지능 이미지 뿐 만 아니라, 일반 사진에도 적용할 수 있습니다. 아래는 배경을 바꾼 예입니다.

이 글에서 다루는 내용은 다음과 같습니다.

이 글에서는 Stable Diffsion을 위한 가장 널리 사용되고 있는 오픈 소스 웹 UI인 AUTOMATIC1111을 사용합니다. AUTOMATIC1111 설치 방법은 여기를 읽어보세요. 초보자 가이드도 참고하세요.

이미지 생성하기

이 글에서는 Rembg라는 AUTOMATIC1111 확장을 사용합니다. 확장(extension) 설치 방법은 이 글을 참고하세요.

확장이 설치되면, [Extra] 페이지  맨 아래와 같은 메뉴가 추가됩니다.

다음으로 이미지를 생성합니다. 별도로 이미지를 가지고 있는 경우에는 이 단계를 건너뛰면 됩니다. 아래는 txt2img 설정입니다. 

체크포인트 모델: DreamShaperXL
프롬프트: a woman in space suit , close-up, highly detailed face, deep blue eyes, high in space, background moon, stars and earth, 8k
부정적 프롬프트: disfigured, deformed, ugly
샘플링 방법 : DPM++ 2M Karras
샘플링 단계 : 25
이미지 크기 : 1216x832
CFG 척도 : 7

설정이 끝나면 [Generate] 버튼을 누릅니다. 아래는 이렇게 생성된 이미지들 중 하나입니다.

마음에 드는 이미지가 있다면, 그 이미지 아래에 있는 버튼들 중에서 맨 오른쪽에 있는  삼각형 모양 아이콘 [Send to Extra]를 누릅니다. 그러면 이미지와 프롬프가 Extra 페이지로 이동됩니다.

배경 삭제하기

참고: AUTOMATIC1111에서 생성한 이미지가 아니고, 자신이 가지고 있는 이미지의 경우, [Extra] 탭으로 들어가서 캔버스에 해당 이미지를 불러와야 합니다.

Extra 페이지에서 맨 아래쪽에 있는 [Remove Background] 드롭다운 메뉴에서 u2net 만 선택하고, [Generate] 버튼을 선택하면, 아래와 같이 배경이 삭제된 이미지가 생성됩니다.

참고: 이 이미지에서 경계선이 두드러져 보이고, 왼쪽 카메라는 날라가버렸는데,  이런 현상을 없애려면 Alpha matte(알파 채널)를 조정해주면 됩니다(그런데 잘 안되네요ㅠ).

인페인트 마스크 선택하기

배경이 없는 이미지를 생성하는 게 아니라, 배경을 다른 그림으로 대체할 경우, 이미지를 생성하는 대신 마스크를 생성해야 합니다. 이 경우, 아래 그림과 같이 [Remove Background] 드롭다운 메뉴에서 u2net을 선택하고, [Return mask]를 선택한 뒤 [Generate] 버튼을 선택합니다.

작업이 끝나면 아래와 유사한 전경에 대한 마스크가 생성됩니다. 마우스 우클릭하고 해당 마스크를 이미지로 저장합니다. 그런데 역시 좌측 카메라는 날라가네요.

그래도 혹시... 싶어서 여러가지 모델로 테스트를 해봤는데, u2net_human_seg를 사용하니 그나머 원하던 형태가 나오네요.

고급: Alpha matte(알파채널) 조정

대부분의 경우 이와 같은 설정만으로도 전경(인물)과 배경을 충분히 잘 분리해줍니다. 하지만, 전경 이미지가 배경 이미지와 비슷한 경우, 전경중 일부가 잘려 나가거나, 배경이 전경으로 추출될 경우가 있습니다. 이러한 경우, Alpha matte 설정을 바꿔서 해결해야 합니다.

알파 채널이란 배경과 전경을 분리해주는 픽셀맵을 말합니다. 원래 이미지는 RGB 삼색으로 표현하지만, 보이거나 숨기는 영역을 별도로 지정하는 A(알파) 채널이 추가된 경우가 많습니다. 배경을 제거하거나 대체할 때 가장 중요한 작업이 정확한 알파 채널(Alpha matte)를 찾아내는 것입니다(원래 알파 매트와 알파 채널은 약간 다른 뜻입니다만, 디지털 이미지 처리에서는 거의 동일한 의미로 사용됩니다)

[Alpha matte] 옵션을 선택하면 아래와 같이 세가지 선택사항이 추가됩니다.

  • Forground Threshold(전경 임계값) : 어느 픽셀값까지는 전경으로 사용할 것인지를 결정하는 값입니다. 이 값을 낮추면 전경 영역이 넓어집니다.
  • Background Treshold(배경 임계값) : 어느 픽셀값까지는 배경으로 사용할 것인지를 결정하는 값입니다. 이 값을 높면 배경 영역이 넓어집니다.
  • Erode Size(침범 크기) : 이 값을 크게하면 경계가 좀 더 자세하게 조정됩니다.

이 값들을 조정해가면서 마스크가 적당히 만들어지는지 테스트해보셔야 합니다. 그런데... 저의 경우엔 아무리 이런 값들을 바꿔도 별로 마스크 크기 변화가 없었고, 오히려, [Remove background] 모델을 바꾸니 마스크를 잘 파악했습니다.

마스크를 사용한 인페인트

이제 위에서 생성한 마스크와 인페인트 기법을 사용하여, 전경은 그대로 두고 배경만 대체합니다. 

img2img 페이지로 들어가서 [Inpaint Upload] 탭으로 들어갑니다. 윗쪽 캔버스에는 원래의 이미지, 아래쪽 캔버스에는 마스크로 저장한 이미지를 선택합니다.

이제 새로운 배경을 생성할 수 있는 프롬프트를 지정합니다. 단, 프롬프트에는 배경에 관한 내용 뿐만 아니라, 전경에 관한 내용(아래 예에서는 womain in space suit)도 포함되어야 합니다. 이 글에는 아래와 같은 프롬프트를 사용했습니다. 

프롬프트: woman in space suit, underwater, full body, floating in water, air bubbles, detailed eyes, deep sea in background, water surface, god ray, tropical fishes
부정적 프롬프트: disfigured, deformed, ugly

아래는 기타 설정입니다.

  • Mask mode: Inpaint not masked (마스크가 없는 영역(검은 색 영역)만 인페인트 하라는 뜻입니다)
  • Mask Content: Original
  • Inpaint area: Whole picture
  • 샘플링 방법: Euler a
  • 샘플링 단계: 25
  • 이미지 크기: 1216 x 832
  • CFG 척도: 7
  • 잡음 제거 강도: 1 (값을 높여야만 원 이미지를 참고하지 않습니다)

이제 [Generate]를 누르면 물속에서 우주복을 입은 그림으로 재탄생하게 됩니다!

선택: 콘트롤넷을 사용한 인페인트

배경이 마음에 들지 않을 경우, 인페인팅 단계에서 ControlNet을 추가해주면 문제가 해결될 수 있습니다. 콘트롤넷이 무엇인지 모르시거나 설치하는 방법 등은 이 글을 읽어보시기 바랍니다.

여기에서 사용하는 콘트롤넷 모델은 ControlNet XL Delpth 입니다. SDXL 용 콘트롤넷 모델은 이 글을 읽어보시면 설치할 수 있는데, depth 모델도 상당히 여러가지 종류가 있지만, depth가 포함된 모델중 적당한 것을 다운로드 받으시면 됩니다.

Depth 모델은 이미지에서 전경이 어디인지 배경이 어디인지를 구분하고, 등고선식으로 얼마나 카메라에 가까운지를 예측하는 모델입니다. 이 모델을 사용하면 전경과 배경을 확실하게 구분할 수 있습니다. 

위에서 설정했던 내용은 그대로 둔 상태에서 아래로 내려가서 ControlNet 영역을 펼치고, 아래와 같이 설정합니다.

  • Enable: Yes
  • Pixel Perfect: Yes
  • Allow Preview: Yes
  • Upload independent control image: Yes
  • Control Type: Depth
  • Preprocessor: Depth Midas
  • Model: sai_xl_depth_256lora

위에서 Upload independent control image 를 선택해야 만 별도의 이미지를 추가할 수 있습니다.

이렇게 설정한 후, 빨간색 화살표가 있는 별표(Preview)를 누르면 오른쪽에 Depth 전처리의 결과가 표현됩니다. Depth 맵이 잘 표현되지 않는다면 모델을 다른 것으로 바꿔 시도해 보실 수 있습니다.

이제 [Generate] 버튼을 누르면 아래와 같은 이미지를 얻을 수 있습니다. 

다만, 이 방법을 사용하니, 이미지 생성 시간이 3배 이상 늘어나므로, 꼭 필요할 때 사용하면 좋을 듯 합니다.

제품 이미지 사례

아래는 제가 좋아하는 인형을 촬영한 사진입니다.

아래는 이 사진으로 마스크를 추출한 결과고요.

모델과 프롬프트는 아래와 같이 지정했습니다.

모델: realvisxlV20
프롬프트: a teddy bear sitting on a wooden table, modern living room

아래는 결과입니다. 그런데 인형 주변에 찌꺼기가 남아 있네요. 아무래도 배경색이 너무 어두웠던 것이 문제일 듯 싶습니다.

이것을 수정하기 위해 다시 Inpaint를 사용하기로 했습니다. 아래와 같이 검은 색 줄이 보이는 곳을 마스킹하고... (콘트롤넷은 사용하지 않도록 했습니다)

아래가 최종 결과입니다.

그런데.... 물론 배경 바꾸기에도 유용하긴 할 것 같은데, 그냥 원본 사진에서 포토샵등에서 마스크를 생성하는 것이 오히려 낫지 않을까... 하는 생각도 드네요. 완벽하지도 않고, 여러번 반복작업이 필요하다면 구지 인공지능일까 싶어요. ㅎ

민, 푸른하늘

====