Segment Anything 포토샵 없이 WebUI에서 바로 누끼 따기

스테이블 디퓨전으로 그림을 생성할 때 이미지를 한 번에 딱 원하는대로 만들어낼 수 있으면 좋겠지만, 실제로는 대부분의 이미지는 여러번의 수정을 거쳐야 합니다. 수정을 할 때도 원하는 부위만 콕 집어서 하려면 마스킹이 필수인데요, 정교한 마스킹을 해야하는 경우 WebUI 또는 ComfyUI에서 생성한 그림을 다시 포토샵 등의 이미지 편집프로그램으로 불러와 마스크를 만들고, 또다시 이 이미지들을 스테이블 디퓨전으로 불러와 작업하면 효율이 떨어집니다. Segment Anything 확장기능을 사용하면 이런 고민 없이 WebUI에서 바로 원하는 부위(segment)만 마스킹이 가능합니다. 본문에서 한 번 그 설치방법과 사용법에 대해 자세히 살펴보겠습니다.

Segment Anything 설치

먼저 Segment Anything을 설치하기 위해 WebUI Extensions탭의 Available에서 확장기능을 검색하거나 아래 주소를 Install from URL에 붙여넣어 설치합니다.

segment anything 설치

https://github.com/continue-revolution/sd-webui-segment-anything

언제나 그렇듯 확장기능을 설치하신 뒤에는 WebUI를 재시작해주신 뒤 Segment Anything 탭이 새로 생긴 것을 확인하시기 바랍니다. 스테이블 디퓨전 WebUI 확장기능 설치 방법이 낯선 분들은 아래 글을 참고해주시기 바랍니다.

SAM(Segment Anything Model) 다운로드

Segment Anything을 사용하기 위해서는 전용 모델을 다운로드 받아야 합니다. 깃허브 페이지 가이드라인에 따르면 다양한 모델을 사용할 수 있는데요, 본문에서는 가장 먼저 소개하고 있는 Meta AI의 모델을 다운받아 테스트해보겠습니다. 아래의 모델들은 모두 현재 Segment Anything에서 지원하고 있는 모델들입니다. 모델은 WebUI 설치 위치 > models > sam 폴더 또는 WebUI 설치 위치 > extentions > sd-webui-segment-anything > models > sam 폴더로 옮겨주시면 됩니다. 사용중인 그래픽카드의 VRAM 용량이 넉넉하지 않은 경우 고용량 모델 사용 중 VRAM 부족으로 오류가 발생할 수 있습니다.

Meta AI Segment Anything Model

SysCV Segment Anything Model

경희대학교 Mobile Segment Anything Model

Segment Anything 사용법

위의 설치 절차를 잘 따라오셨다면 WebUI 실행시 txt2img 또는 img2img 탭에서 하단으로 쭉 내려오면 ControlNet보다 더 아래 Segment Anything 탭이 새로 생기게 됩니다. Segment Anything을 활용한 마스킹 방법은 매우 간단합니다. 우선 마스킹 하고싶은 이미지를 Segment Anything 창으로 드래그 & 드롭해줍니다.

segment anything 마스킹 방법

SAM model은 앞서 설명드린 것처럼 사용중인 GPU의 성능을 고려하여 선택해주시면 됩니다. 개인적으로 테스트해본 결과 모델간 요소 분리 선택 성능에 큰 차이는 없었습니다. 가장 저용량인 sam_vit_b을 선택해도 충분히 잘 분리해주는 모습입니다.

마스킹은 마우스 좌클릭과 우클릭으로 진행합니다. 드래그 & 드롭하여 올려놓은 이미지 위에서 마우스 좌클릭을 하면 검은색 점이 찍히고, 우클릭을 하면 빨간색 점이 찍힙니다. 검은색 점은 마스킹에 포함시킬 부위를, 빨간색 점은 제외할 영역을 의미합니다.

위 예시에서는 의자에 앉아있는 인물만 추출하기 위해 인물의 얼굴, 몸통, 팔, 다리 부위에 검은색 점을, 그 외 인물 가까이 있는 주변을 다수의 빨간색 점으로 마킹했습니다. 마킹을 마친 후 하단의 Preview Segmentation 버튼을 누르면 사용자가 마킹한 검은색 및 빨간색 점을 기준으로 AI가 알아서 3개 버전의 마스크를 생성합니다. 본 예시에서는 의도한 바 대로 2번째 마스크가 인물을 배경으로부터 깔끔하게 분리해낸 모습입니다.

segment anything 마스킹 결과

스크롤을 아래로 더 내려보면 마스크 이미지대로 선택된 요소만 따로 보여주는 이미지도 생성이 되어 있습니다. 위의 상태로 마스크 이미지를 마우스 우클릭, 다름 이름으로 저장하여 사용해도 무방하지만, 세그먼트 애니띵 하단으로 조금 더 내려오면, 이 마스크 영역을 어느정도 더 확장할 수 있는 기능이 있습니다.

segment anything 마스크 확장 방법

2번 마스크 결과가 마음에 들었기 때문에 Choose your favorite mask는 두번째를 의미하는 1을 선택했습니다. Expand Mask를 활성화하여 슬라이더를 권장값인 30으로 올린 뒤 하단의 Update Mask 버튼을 눌러 마스크 영역을 확장한 모습입니다.

segment anything 확장 마스크 비교

확장 전후 선택된 인물의 영역과 마스크를 비교해보면 위와 같습니다. 이제 확장된 마스크를 활용해 이미지를 수정해보겠습니다. 마스크 이미지를 바로 ControlNet으로 보내는 메뉴가 있지만, 제대로 동작하지 않아 직접 마스크를 다운받고 이를 img2img의 인페인트 업로드(inpaint upload)로 불러왔습니다.

인페인트 업로드 설정

인페인트 업로드에서 원본 이미지와 마스크 이미지를 설정해준 뒤, inpaint 옵션은 only masked, desnoising strength는 1.0으로 설정하고, 컨트롤넷의 오픈포즈에서 전처리를 DW openpose로 선택한 뒤, 프롬프트에 의상의 변화만 준 채로 그림을 생성한 결과 아래와 같은 이미지를 얻을 수 있었습니다.

segment anything inpaint upload 결과

첫번째 이미지가 원본이고, 두번째 세번째 이미지가 각각 blue dress, white collared shirt, plaid skirt를 프롬프트로 두고 생성한 결과입니다. 업로드한 마스크가 인물의 발끝을 다 커버해주지 못해서 결과 이미지에서도 약간의 어색함이 있지만 그 외에는 훌륭하게 인물만 마스킹하여 의상을 바꿔준 것을 볼 수 있습니다. 예시에서는 Segment Anything의 작업 과정 설명 차원에서 간략히 진행했으나, 만약 세그먼트 애니띵에서 마스킹 설정을 더 정교하게 진행했다면 인페인트 업로드 또한 충분히 더 정교한 수정 이미지를 결과로 얻을 수 있었을 것으로 보입니다.