[Tip] 이커머스 고객 전환율 30% 높이는 방법, AI 상품 이미지 만들기 🛒
이미 225조원 (2023년 예상) 규모로 커져 버린 이커머스 시장,
수많은 제품에서 소비자의 관심을 끄는 요소에는 무엇이 있을까요?
출처: 쿠팡
소비자 5명 중 4명은 온라인에서 상품 구매 시 이미지를 참고한다고 합니다.
온라인에서 상품을 직접적으로 확인할 수 있는 유일한 방법이 이미지이기 때문인데요.
이커머스 중에서는 플랫폼의 직접적인 판매(직매입) 외에도 소상공인 셀러의 입점 판매(오픈마켓)도 있습니다.
물론 디스콰이엇이 창업자가 많은 곳이기는 하지만 일반적으로 사람들이 플랫폼을 창업하기 보다는 셀러로 입점하는 경우가 많을 것입니다. 다행히 다양한 참고 자료 또는 양질의 교육이 제공되고 있지만 '잘하는' 셀러로 거듭나기에는 어려운 점이 많습니다.
그 중 하나의 이유로 '소비자의 이목을 끄는 이미지의 부재' 일 것입니다.
기술이 많이 좋아졌다고는 하지만 사용 방법을 잘 모르는 소상공인에게는 일명 '누끼(배경 제거)', 그리고 배경, 구도 등의 설정을 통한 전문적인 상품 이미지 촬영이 어렵습니다.
그런 점에서 이미지 AI 기술은 소상공인에게도 기회를 줄 수 있습니다. 핸드폰으로 적당히 사진을 찍어도 괜찮은 이미지를 만들 수 있기 때문인데요.
해외에는 Booth.ai, Flair.ai, Pebblely, Claid.ai 등이 있으며(더 자세한 내용은 링크), 국내에서는 드랩, 파이온코퍼레이션 등이 해당 시장을 목표로 움직이고 있습니다.
(혹시 추가해야 할 기업은 알려주시면 수정하겠습니다)
오늘은 관련한 해외 프로덕트 중 Flair.ai 와 Pebblely 에 대해 살펴 보겠습니다.
(빨리 직접 코드로 만들어보고 싶은 분께서는 아래로 스크롤 해주세요)
1. 배경 제거
출처 : 스모어톡
별도의 편집 과정 전 가장 중요한 것은 상품의 이미지만 잘 남기는 것입니다.
그래야 배경 없이 상품만 깔끔하게 보여줄 수도, 차별화된 배경 이미지를 보여줄 수도 있기 때문입니다.
먼저 Flair 는 2단계에 나누어 배경 제거 및 해당 이미지 이름 지정을 진행합니다. 이는 물체 지정을 통해 텍스트를 통한 생성 시 사용자가 원하는 설정에 최적으로 생성하기 위함으로 보여집니다.
반면 Pebblely 는 이미지를 올리는 순간 바로 배경을 제거합니다. 또한 물체 이름을 별도로 지정하지 않습니다. 따라서 한 번에 전 작업 과정을 수행해 간편하다는 인상을 줍니다.
2. 배경 이미지 생성
(좌) Flair, (우) Pebblely
두 서비스 모두 기본 템플릿과 커스텀 생성 모드를 제공합니다. 이는 사용자에게 이미지를 생성하는 과정 자체가, 그리고 장면에 대한 영감을 한 번에 떠올리기에는 어려움이 있음을 인지하고 있다고 해석됩니다. (다른 서비스이지만 플라멜도 이를 참고하고 있습니다.)
Flair 나 Pebblely 의 큰 차이점은 UI의 구성입니다. 두 서비스 모두 배경이 제거된 이미지를 사각형 안에서 자유롭게 배치할 수 있는 것은 동일하지만 결과 이미지를 제시하는 방법에서 다소 구별되는 모습입니다.
Flair 는 물체 이미지 바로 옆에 생기는 하나의 큰 이미지로 변화를 확인할 수 있다는 점에서, Pebblely 는 물체 이미지 하단에 여러 개의 작은 이미지를 한 번에 보여주어 비교를 할 수 있는 점이 특징입니다.
(좌) Flair, (우) Pebblely
참고로 비용은,
Flair 의 경우 월 $10 로 무제한 생성이 가능하며,
Pebblely 의 경우 월 $19 로 1,000장 생성 또는 월 $39 로 무제한 생성이 가능합니다. (업스케일 기능이 추가적으로 있습니다)
그러면 여기서 확인할 수 있는 내용은 다음과 같습니다. ✅
가벼운 편집 기능도 의미가 있다 (배경 제거만 잘해도 상품 이미지 반 이상은 간다)
사용자들에게 생성 이미지 서비스는 아직 어렵다 (팀의 템플릿 콘텐츠가 중요하다)
UI 로 사용자가 받는 인상이 달라진다 (물론 결과물에 영향을 주는 생성 모델도 중요하다)
비용이 꽤 많이 차이가 난다 (그래서 지불 의향도에 변화가 생긴다)
그렇다면 직접 만들어 볼 수는 없을까요? 🤔(핵심이죠?)
간단히 설명을 드리겠습니다.
해당 방법은 Meta 에서 공개한 SAM (객체 인식 및 마스킹 이미지 생성) 과 Stable Diffusion 의 인페인팅 (마스킹 영역에서 이미지를 새로이 생성) 기능을 활용합니다.
상품 이미지를 준비한다.
아무거나 상품을 찍은 이미지 한 장을 준비합니다.
구글 코랩 (GPU) 을 연다.
SAM 과 Stable Diffusion 을 사용하기 위해선 GPU 가 필요합니다.
코랩은 연구/학습용으로 구글이 제공하는 클라우드 기반 Jupyter Notebook 환경입니다. 무료로도 사용 가능합니다. (다만 V100 이상 부터 사용이 원활합니다)
다음 코드를 입력해주세요.
SAM을 사용해서 마스킹 이미지를 만든다.
구글 드라이브 연결 (승인 버튼 클릭 필요)
from google.colab import drive
drive.mount('/content/drive')필요한 라이브러리 설치
!pip install -q transformersSAM을 GPU에 올리기
import torch
import torchvision.transforms as transforms
from PIL import Image
import cv2
import requests
from transformers import SamModel, SamProcessor
import numpy as np
import matplotlib.pyplot as plt
device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamModel.from_pretrained("facebook/sam-vit-large").to(device) #Inference SAM
processor = SamProcessor.from_pretrained("facebook/sam-vit-large") facebook의 github repo clone 을 통한 방법도 있지만, 저는 hugging face 의 transformers 라이브러리를 사용했습니다.
이미지 열기 (name_what_you_want 수정 필요)
home_path = "/content/drive/MyDrive"
filename = "/{name_what_you_want}"
format = ".png"
image_path = home_path + filename + formatimage = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
fig, axes = plt.subplots(1, 1, figsize=(15, 15))
axes.imshow(np.array(image))
axes.axis("off")
plt.show()사물 지정하기
h1, w1 = image.shape[:2]
input_points = [[[int(w1/2), int(h1/2)]]] #take center point for the targetSAM을 사용해 사물 인식하기
inputs = processor(image, input_points=input_points, return_tensors="pt").to(device)
with torch.no_grad():
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu(), mask_threshold=0.2) #default of mask_threshold = 0.0
scores = outputs.iou_scores마스킹 결과 확인하기
def show_mask(mask, ax, random_color=False):
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
color = np.array([30/255, 144/255, 255/255, 0.6]) #normalize
h, w = mask.shape[-2:]
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
ax.imshow(mask_image)
def show_masks_on_image(raw_image, masks, scores):
if len(masks.shape) == 4:
masks = masks.squeeze()
if scores.shape[0] == 1:
scores = scores.squeeze()
max_score = torch.argmax(scores)
fig, axes = plt.subplots(1, 1, figsize=(15, 15))
mask = masks[max_score].detach().cpu().numpy()
axes.imshow(np.array(raw_image))
show_mask(mask, axes)
axes.axis("off")
plt.show()
# Show with Masked Image
show_masks_on_image(image, masks[0], scores)마스킹 이미지 만들기
max_iou_score_index = torch.argmax(scores).detach().cpu().numpy() #iou=Area_of_overlap/Area_of_Union
mask_boolean = masks[0].squeeze()[max_iou_score_index] #Take boolean tensor with maximum iou score
mask_img = ~mask_boolean.detach().cpu().numpy().squeeze() #Convert tensor to numpy #Get a Mask of Background
Image.frombytes(mode='1', size=mask_img.shape[::-1], data=np.packbits(mask_img, axis=1))마스킹 이미지 저장하기 (name_what_you_want 수정 필요)
cocacola_mask = Image.frombytes(mode='1', size=mask_img.shape[::-1], data=np.packbits(mask_img, axis=1))
mask_image_path = home_path + "/{name_what_you_want}" + format
cocacola_mask.save(mask_image_path,"png")이렇게 마스킹 이미지를 생성했습니다. 그러면 배경 이미지를 만들어봐야겠죠?
Stable Diffusion을 사용해서 배경 이미지를 만든다.
필요한 라이브러리 설치
!pip install diffusers스테이블 디퓨전 (SDXL) 세팅 (Refiner 는 설정하지 마세요)
from diffusers import StableDiffusionXLInpaintPipeline
from diffusers.utils import load_image
pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
variant="fp16",
use_safetensors=True,
)
pipe.to("cuda")배경 이미지 생성하기
img_url = image_path
mask_url = mask_image_path
init_image = load_image(img_url).convert("RGB")
mask_image = load_image(mask_url).convert("RGB")
prompt = "watercolor splatter"
negative_prompt = "ugly, deformed, noisy, blurry, distorted, grainy, text, cropped"
generator = torch.Generator("cuda").manual_seed(2023)
generated_image = pipe(
prompt=prompt, negative_prompt=negative_prompt, image=init_image, mask_image=mask_image, generator=generator, num_inference_steps=50, strength=0.9
).images[0]
generated_image의 과정을 거치면 나오는 이미지들은 다음과 같습니다,
짜잔 🌟
나름 만족하는 편...
타 서비스를 사용하는 것과 비교해 아쉬운 점은 두 가지입니다.
다소 떨어지는 객체 인식 정확도 (SAM 보다 나은 모델이 있습니다, 스모어톡 또한 별도로 훨씬 배경이 잘 제거가 되는 모델을 가지고 있습니다)
아웃페인팅 방식이 생성 이미지 퀄리티는 좋아 보인다 (대신 이미지가 깨질 것으로 보여 방법을 달리 해야 한다)
같이 고민해보고 싶은 분들 또는 서비스하고 싶은데 AI 모델 관련 협업이 필요하시면 연락주세요!
저번 AI 아바타에 이어 AI 상품 이미지 까지 직접 만들어 볼 수 있는 방법에 대해 정리해 보았습니다. 계속해서 이미지 AI 와 관련해 재밌는 이야기, 그리고 기술적인 내용도 한 번씩 다루어 보겠습니다 ㅎㅎ
이정민 (스모어톡, tonylee@smoretalk.io)
p.s. 상품 이미지 썸네일 관련 팁
p.s. 마케팅 관점에서 상품 이미지의 중요성
댓글
로그인 후 댓글을 남길 수 있습니다.
코드까지 정리해주시는 친절함 감사합니다 ㅎㅎㅎ
와 저희 팀에게 정말 도움이 되는 내용이에요! 늘 로컬호스트로만 돌렸었는데 코랩도 좋네요! @Hongmin Park 님도 읽어보시면 좋을 것 같네요!
종한님 오랜만이에요, 기술 관련 이야기 필요하시면 언제든 연락주세요!