일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- PYTHON
- AI 기술
- LLM
- javascript
- 메타
- 우분투
- 시간적 일관성
- 오픈AI
- LORA
- 가상환경
- ControlNet
- 서보모터
- 일론 머스크
- 생성형 AI
- 딥마인드
- AI
- 트랜스포머
- TRANSFORMER
- 오블완
- 이미지 편집
- ubuntu
- ChatGPT
- 아두이노
- 멀티모달
- 뉴럴링크
- OpenAI
- 인공지능
- tts
- 확산 모델
- 티스토리챌린지
- Today
- Total
AI 탐구노트
이미지 배경 제거 : carvekit과 rembg를 이용한 배경 제거 본문
1.서론
1.1.이미지 배경 제거
사진 작업을 하다 보면 배경을 제거하는 작업, 흔히 ‘누끼따기’로 불리는 과정은 누구나 한 번쯤 경험해 보셨을 겁니다. 이 작업은 단순한 이미지 편집처럼 보이지만, 실제로는 많은 시간과 노력이 필요합니다. 보통은 Photoshop 같은 도구를 사용하고, 한땀한땀 추출해 낼 대상의 외곽을 지정하고 이를 추출합니다. 사실 그걸로 끝나는 건 아니구요... 추출한 대상을 배치할 다른 배경 이미지에 놓고 개체가 배경과 잘 어울릴 수 있도록 주변 색상이나 형태를 비슷하게 맞춰주는 작업도 필요하죠. 조명이나 질감 등까지 잘 맞춰주는 것은 물론이구요. 그러니, 이런 작업은 고도의 숙련도가 요구되며, 비전문가에게는 어려운 작업으로 느껴지기 쉽습니다.
최근에는 이처럼 복잡한 작업을 자동화하려는 시도가 활발히 이루어지고 있습니다. 단순히 인간의 업무를 돕는 수준을 넘어 효율성을 극대화하는 단계로 진화하고 있는거죠. 아주 가까운 예로는 애플, 구글 등은 스마트폰 OS에 탑재된 사진 앱에 AI 기반 배경제거 기능을 기본으로 제공해서 사용자들에게 큰 편의를 제공하고 있습니다. 이러한 트렌드는 ‘누구나 쉽고 빠르게 고품질의 결과물을 얻을 수 있는’ 세상을 만들어 가는 데 중요한 역할을 하고 있습니다.
이 글에서는 이미지 배경 제거를 위해 사용되는 기술의 실제 적용 사례에 대해 알아 보겠습니다.
1.2 테스트 대상 선정
이번에 테스트 할 것은 rembg와 carvekit이라는 2개의 솔루션입니다. 이들을 선택한 이유는 라이선스 측면에서 자유롭고 오픈로스이며 설치 및 사용이 아주아주 간단하는 장점이 있기 때문입니다. 잘만 활용하면 웬만한 이미지들은 유료 배경제거 서비스나 많은 시간이 소요되는 노가다 작업을 하지 않을 수 있습니다.
2.환경구성
2.1. 가상환경 생성
우선 테스트를 위한 가상환경을 생성합니다.
$ conda create -n rembg python=3.10
$ conda activate rembg
2.2.솔루션 설치 (carvekit)
# 설치 (일반)
$ pip install carvekit
# CPU 버전
$ pip install carvekit --extra-index-url https://download.pytorch.org/whl/cpu
# GPU 버전 (cuda는 사전 설치되어 있어야 함)
$ pip install carvekit --extra-index-url https://download.pytorch.org/whl/cu124
2.3.솔루션 설치 (rembg)
# CPU 버전
$ pip install rembg # for library
$ pip install "rembg[cli'] # for library + cli
# GPU 버전
$ pip install "rembg[GPU]" # for library
$ pip install "rembg[gpu,cli]" # for library + cli
2.4 테스트 용 이미지 다운로드
Unsplash에서 검색한 사진으로 합니다. 기본적인 배경제거는 당연히 잘 될 것이므로, 난이도가 높은 머리카락까지 처리할 수 있는 수준인지를 테스트 해 보고 싶어서입니다.
3.코드
3.1. carvekit 코드
import torch
from PIL import Image
from carvekit.api.high import HiInterface
# 배경제거를 위한 인터페이스 로딩
interface = HiInterface(batch_size_seg=5, batch_size_matting=1,
device='cuda' if torch.cuda.is_available() else 'cpu',
seg_mask_size=320, matting_mask_size=2048)
# 원본 이미지 로드
img_org = Image.open('tests/data/man1.jpg')
imgsize = img_org.size
# 배경 제거
img_bgrm = interface([img_org])[0]
# 이미지 hstack
img_comb = Image.new('RGBA', (imgsize[0]*2, imgsize[1]), (255,0,0,0))
img_comb.paste(img_org, (0,0))
img_comb.paste(img_bgrm,(imgsize[0],0))
# 이미지 표출
img_comb.show()
다음 예시코드에서처럼 적용할 백엔드 모델이나 처리 방식을 세부적으로 설정할 수도 있습니다.
from PIL import Image
from carvekit.api.interface import Interface
from carvekit.ml.wrap.fba_matting import FBAMatting
from carvekit.ml.wrap.u2net import U2NET
from carvekit.pipelines.postprocessing import MattingMethod
from carvekit.pipelines.preprocessing import PreprocessingStub
from carvekit.trimap.generator import TrimapGenerator
device = 'cuda'
u2net = U2NET(device=device,
batch_size=1)
fba = FBAMatting(device=device,
input_tensor_size=2048,
batch_size=1)
trimap = TrimapGenerator()
preprocessing = PreprocessingStub()
postprocessing = MattingMethod(matting_module=fba,
trimap_generator=trimap,
device=device)
interface = Interface(pre_pipe=preprocessing,
post_pipe=postprocessing,
seg_pipe=u2net)
# 원본 이미지 로드
img_org = Image.open('img.jpg')
imgsize = img_org.size
# 배경 제거
img_bgrm = interface([img_org])[0]
# image = PIL.Image.open('tests/data/cat.jpg')
# cat_wo_bg = interface([image])[0]
# 이미지 hstack
img_comb = Image.new('RGBA', (imgsize[0]*2, imgsize[1]), (255,0,0,0))
img_comb.paste(img_org, (0,0))
img_comb.paste(img_bgrm,(imgsize[0],0))
# 이미지 표출
img_comb.show()
3.2. rembg 코드
rembg의 경우도 코드는 아주 심플합니다.
from rembg import remove, new_session
from PIL import Image
# 입력, 출력 이미지 지정
input_path = 'img.jpg'
output_path = 'output.png'
# 이미지 파일 읽기
input = Image.open(input_path)
# 사용할 모델 설정
# my_session = new_session("u2net")
# 배경 제거 및 저장
#output = remove(input, session=my_session)
output = remove(input)
output.save(output_path)
다음은 배경 제거를 할 때 사용할 모델을 선택할 수 있도록 하는 코드입니다. 적용 가능 모델의 목록은 다음과 같습니다.
[
"u2net", "u2netp", "u2net_human_seg", "u2net_cloth_seg", "silueta", "isnet-general-use",
"isnet-anime", "sam", "birefnet-general", "birefnet-general-lite", "birefnet-portrait",
"birefnet-dis", "birefnet-hrsod", "birefnet-cod", "birefnet-massive"
]
참고로 rembg의 cli를 이용해서 처리하는 방법도 다음과 같이 아주 간단합니다.
# 일반 파일 처리
$ rembg i path/to/input.png path/to/output.png
# 특정 모델 백엔드 적용
$ rembg i -m u2netp path/to/input.png path/to/output.png
# 마스크만 저장
$ rembg i -om path/to/input.png path/to/output.pn
# 로컬 알파매팅 파일 적용
$ rembg i -a path/to/<alpha-matting-file> path/to/output.png
# 특정 폴더 내 파일 전체 배경 제거
$ rembg p path/to/input path/to/output
# API 서비스 서버 구동
$ rembg s --host 0.0.0.0 --port 7000 --log_level info
3.3 Gradio 버전
carvekit 버전만 작성합니다. rembg도 같은 방식으로 만들면 됩니다.
import torch
from PIL import Image
from carvekit.api.high import HiInterface
import gradio
def removebg(img):
img_input=Image.fromarray(img)
result = interface([img_input])[0]
return result
if __name__ == '__main__':
interface = HiInterface(batch_size_seg=5, batch_size_matting=1,
device='cuda' if torch.cuda.is_available() else 'cpu',
seg_mask_size=320, matting_mask_size=2048)
iface = gradio.Interface(
fn=removebg,
inputs='image',
# inputs=[gr.Image(label="Input Image", source="webcam")]
outputs='image',
title='Remove background',
description='removing background Demo',
examples=["tests/data/woman3.jpg"])
iface.launch()
4.테스트 및 결과확인
carvekit 테스트 결과
rembg 테스트 결과
각각의 배경 제거 코드를 실행하고 그 결과를 비교해 봅니다. 오호... 둘 다 생각보다 잘 하네요. 언뜻 보기엔 상당히 좋습니다. mask도 적절히 생성된 것 같고... 물론 완벽하진 않습니다. 왼쪽 머리카락 쪽 공백 부분이 제대로 처리되지 못한 부분도 있으니까요. 하지만, 이 정도면 기대 수준 이상은 되는 것 같습니다. 같은 배경색이면 거의 구분되지 않을 정도로 자연스런 이미지가 될테구요... 게다가 정말 정밀하게 배경제거를 해야하는 상황이면 여기에 약간의 수작업 터치를 가하면 되지 않을까 싶네요.
5.후기
최근에는 Canva, Figma, Photoshop 등 기존 이미지 편집 도구에서 기본적으로 AI 기반의 배경 제거 기능을 제공하고 있습니다. 얼마 전 Photoshop에서 머리카락 한올 한올까지 살려가며 배경제거가 되는 장면을 봤는데 아... 놀라웠습니다. 아무리 숙련된 기존 포토샵 전문가라고 하더라도 머리카락 한올까지 일명 '누끼'를 따는 것은 불가능 하다시피 했는데 이젠 순식간에 그게 됩니다. 정말 기술이 놀라우리만치 좋아졌습니다! 하지만 경우에 따라서는 코드를 이용해서 작업 자동화를 해야 하는 경우가 생길 수도 있을테니 그런 때를 위해 rembg나 carvekit 과 같은 솔루션을 알아두면 도움이 될 것 같습니다.
이번 글에서는 이미지 배경 제거를 하는 간단한 방법을 알아 봤습니다.
참고자료
1.Image-background-remove-tool
위에 설명한 carvekit이 제공되는 github repository입니다.
2.rembg
위에 설명한 rembg의 github repository입니다. MIT 라이선스를 따르고 있고 cli 도구도 제공하고 있어 굉장히 사용이 간단하고 용이합니다. 한 폴더 내의 모든 이미지를 한번에 처리한다거나 하는 작업도 용이하고 심지어는 웹 API를 제공하는 것도 한 줄이면 됩니다. 오픈소스 답게 백엔드 모델도 다양하게 선택해서 적용할 수 있습니다.
3.remove.bg
가장 잘 알려진 서비스입니다. 이미지 당 가격 정책인데, 생각보다 가격대가 높습니다. 물론 예전에 누끼따던 수고를 대신하는 거긴 하지만 최근에는 아주 높은 품질로 배경제거를 해 주는 도구들이 워낙 많이 나와서 예전만큼의 경쟁력이 있을지 모르겠습니다. 기존에는 기업들 대상 비즈니스를 많이 해 왔었습니다.
'DIY 테스트' 카테고리의 다른 글
Mediapipe를 이용한 졸음감지 (3) | 2024.11.02 |
---|---|
웹캠과 터미널로 ASCII Camera 구현하기 (3) | 2024.11.01 |
DeepFace를 이용한 안면 속성 분석 (표정,연령 등) (2) | 2024.10.30 |
군중(Crowd) 카운팅 (1) | 2024.10.29 |
차량 번호판 인식 (6) | 2024.10.28 |