William Jung
이미지 AI 얼라이언스
생각을 현실로 표현해주는 비주얼 생성 AI 와 함께 더 나은 크리에이티브를 생각해보는 사람들의 모임
가이드라인
["이미지 AI 관련 글 포스팅, 웨비나를 진행합니다","이미지 AI 관련 주제라면 어떤 게시글도 환영입니다","관련한 주제를 공지 내에 적어두었습니다","폭력 또는 선정적인 이미지, 공격적인 발언이 공유될 경우 강제 조치를 취하겠습니다","우리는 앞선 사람들입니다"]
박종한
[이벤트 종료!] 무료로 3D 프로필 이미지를 만들어 드립니다!
안녕하세요, 그리다의 COO 박종한입니다. LSD Pro를 런칭하면서 댓글로 내용을 적어주시면 무료로 3D 프로필 이미지를 만들어 이메일로 보내드리는 이벤트를 이번 주 동안 진행합니다 🎁
아래 예시를 참고하여 댓글로 이메일 주소, 템플릿 번호, 영문 텍스트(3-5자)를 적어주세요. 24시간 내로 이미지를 보내드립니다.
댓글 예시
han@grida.co / 2번 Iron / Han만약 24시간을 기다릴 수 없다면? -> LSD Pro를 무료로 체험해보세요.
1번 Glass
2번 Iron
3번 Plastic
4번 Y2K
템플릿에 따라 폰트 또는 색상 커스텀이 가능하기도 한데요, 체험해보고 싶은 분은 LSD Pro 무료체험을 이용해주시면 됩니다. 72시간 이내 취소하면 결제가 되지 않습니다.
LSD Pro by Grida
🎁 무료체험 프로모션 중 | 3D Text Image Generator
이정민
[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. 마케팅 관점에서 상품 이미지의 중요성
이정민
[Tip] 스노우가 2달 동안 150억 번 AI 프로필 이미지 만드는 방법 📷
바야흐로 대 AI 프로필 시대입니다.
출처: 세계일보 - 링크 (장원영 스노우 프로필)
혹시 본인의 얼굴 사진 몇 장 만으로도 기깔나는 프로필 사진을 만들 수 있는 사실 알고 계셨나요?
AI 아바타는 사실 Lensa.ai 에서 매직 아바타라는 이름으로 '22 11월 말에 출시한 것이 처음입니다. (공오공 님께서 관련한 글을 작성하신 적이 있죠)
실제로 매출을 정말 많이 낸 서비스였습니다.
나만의 것 + 외모 보정 (+앱이라는 채널) 이라는 엄청난 가치를 주었기 때문인데요.
외국 뿐만 아니라 국내에서도 관련 서비스가 많이 등장하고 있습니다. 국내 기준으로도 꾸준한 매출이 나오는 시장으로 알려져 있기 때문입니다.
현재 네이버 스노우, 패러닷, 팀러너스, 마루AI, 십단콤보 등이 관련 서비스를 출시한 상태인데요.
(혹시 추가해야 할 기업은 알려주시면 수정하겠습니다)
그 중 AI 프로필 시장의 대표 주자인 네이버 스노우와 렌사와의 비교, 그리고 우리가 직접 해볼 수는 없는지를 확인해 보겠습니다.
1. 필터 특징
(좌) 스노우 (우) 렌사
우선 스노우는 한국인이 좋아할 만한 포인트를 가장 잘 살린 AI 아바타 서비스를 운영 중입니다.
사진 촬영 스튜디오 중 가장 유명한 시현하다, 포토매틱 등의 느낌을 가장 잘 살려준다고 해야 할까요?
반면 렌사는 해당 시장 원조답게 정말 많은 필터를 보유하고 있습니다.
대신 한국인 취향의 필터는 아니고 밝은 톤의 강한 라인을 띄는 이미지를 주로 생성하고 있습니다.
2. 필요한 사진 내용
(좌) 스노우 (우) 렌사
두 서비스 모두 10-20 장의 이미지를 요구하는 것은 동일합니다.
등록 가능한 사진 기준도 거의 유사한 것을 보면 알 수 있는데요.
우선 얼굴을 학습해야 하기 때문에, 동일한 인물 셀카 사진을 필요로 합니다.
반면 얼굴이 작게 나오거나, 흑백, 여러 명의 인물, 일부 부분이 가려지는 등 얼굴 특징을 추출해내기 어려운 이미지는 사용하실 수 없습니다.
참고로 한국은 행정안전부에서 6월 27일 자로 "주민등록증 사진에 변형이 가능하거나 본인 확인이 어려운 사진은 사용할 수 없다" 라고 규정한 상태입니다. 이에 따라 스노우 화면 하단에 관련 내용이 병기되어 있음을 확인할 수 있습니다.
3. 비용 및 시간
(좌) 스노우 (우) 렌사
우선 스노우는 시간으로 비용을 설정한 것이 특징입니다.
제공되는 이미지 수는 30장 (마음에 드는 사진은 몇 장 이내) 으로 고정되어 있지만, 24시간 내에 전달 받고 싶은 경우, 1시간 내에 전달 받고 싶은 경우에 따라 3,300원 -> 6,600원으로 2배 차이가 나는 것을 확인할 수 있습니다. 빨리빨리 한국인의 특성을 잘 간파한 것으로 봐야 할 것 같습니다. (보통 가격을 얘기할 때 커피에 빗대어 표현하기 때문에, 빨리 받고 싶으면 커피 한 잔 덜 마셔라 같은 느낌)
반면 렌사는 제공되는 이미지 수에 따라 비용이 달라집니다. (50장, 100장, 200장 -> 118원, 89원, 60원)
생성 이미지 50장 기준 스노우에 비해 한 장당 가격이 8원 정도 비싸지만 20분 정도 밖에 소요되지 않아 스노우보다 빠른 결과물 확인이 가능합니다.
그러면 여기서 확인할 수 있는 내용은 다음과 같습니다. ✅
멋지고 예쁜게 최고다 (그런데 '어떻게' 서비스 브랜딩을 할 지는 잘 생각해보자)
이미지, 아직은 맘에 드는 것이 많이 없다 (성공률을 높이자)
시간 너무 오래 소요된다 (더 빨리 학습 가능하게 하자)
사실 원가는 GPU 시간에 비례한다 (위 내용을 달성하면 가격 경쟁력이 높아진다)
셀피 10-20 장은 꽤나 많이 요구하는 것이긴 하다 (향후 개인정보 이슈에 대해 민감해질 수도 있다, 적은 사진으로 효과적인 학습을 하자)
그렇다면 직접 만들어 볼 수는 없을까요? 🤔
간단히 설명을 드리겠습니다.
우선 사진을 준비한다.
저는 5장을 찍었습니다, 정면은 부담스러워서 제외하고 공유합니다.
여러 각도에서 찍으면 더욱 좋습니다. 다만 얼굴을 크게 찍어주세요. (해당 예시는 조금 잘못된 예시입니다)
구글 코랩 (GPU) 을 연다.
스테이블 디퓨전의 파인 튜닝 기법인 드림부스(Dreambooth) 나 로라(LoRA) 를 진행하기 위해선 GPU 가 필요합니다.
코랩은 연구/학습용으로 구글이 제공하는 클라우드 기반 Jupyter Notebook 환경입니다. 무료로도 사용 가능합니다.
다음 코드를 입력해주세요.
구글 드라이브 연결 (승인 버튼 클릭 필요)
from google.colab import drive
drive.mount('/content/drive')필요 라이브러리 설치 (5분 소요)
!pip install -U autotrain-advanced!autotrain setup --update-torch!pip install xformers torch torchvision # in case for using xformers자동 학습 진행 (A100-40GB, 5장 이미지, 배치 사이즈 1, 스텝 수(epoch) 1,000 기준 1시간 -> 배치 사이즈 키우고, 스텝 수 줄이면 시간 단축 가능) - (24.05.02 수정)
import os
model_name = 'stabilityai/stable-diffusion-xl-base-1.0'
keyword = ' ' # Need_to_fix_a_keyword
prompt = f"photo of a {keyword}" # Need_to_fix_a_keyword
output_path = "/content/drive/MyDrive"
image_path = f"/content/drive/MyDrive/{keyword}" # Need_to_fix_a_keyword
learning_rate = 1e-4
num_steps = 1000
batch_size = 2
gradient_accumulation = 4
resolution = 1024
use_8bit_adam = True
use_xformers = True
mixed_precision = 'fp16'
use_fp16 = True
train_text_encoder = False
disable_gradient_checkpointing = False
os.environ["MODEL_NAME"] = model_name
os.environ["PROJECT_NAME"] = keyword
os.environ["PROMPT"] = prompt
os.environ["IMAGE_PATH"] = image_path
os.environ["LEARNING_RATE"] = str(learning_rate)
os.environ["NUM_STEPS"] = str(num_steps)
os.environ["BATCH_SIZE"] = str(batch_size)
os.environ["GRADIENT_ACCUMULATION"] = str(gradient_accumulation)
os.environ["RESOLUTION"] = str(resolution)
os.environ["USE_8BIT_ADAM"] = str(use_8bit_adam)
os.environ["USE_XFORMERS"] = str(use_xformers)
os.environ["MIXED_PRECISION"] = str(mixed_precision)
os.environ["TRAIN_TEXT_ENCODER"] = str(train_text_encoder)
os.environ["DISABLE_GRADIENT_CHECKPOINTING"] = str(disable_gradient_checkpointing)
!autotrain dreambooth \
--train \
--xl \
--model ${MODEL_NAME} \
--project-name ${PROJECT_NAME} \
--image-path ${IMAGE_PATH} \
--prompt "${PROMPT}" \
--resolution ${RESOLUTION} \
--batch-size ${BATCH_SIZE} \
--num-steps ${NUM_STEPS} \
--gradient-accumulation ${GRADIENT_ACCUMULATION} \
--lr ${LEARNING_RATE} \
--mixed-precision ${MIXED_PRECISION} \
$( [[ "$USE_XFORMERS" == "True" ]] && echo "--xformers" ) \
$( [[ "$TRAIN_TEXT_ENCODER" == "True" ]] && echo "--train-text-encoder" ) \
$( [[ "$USE_8BIT_ADAM" == "True" ]] && echo "--use-8bit-adam" ) \
$( [[ "$DISABLE_GRADIENT_CHECKPOINTING" == "True" ]] && echo "--disable_gradient_checkpointing" )변수(parameter)에 대한 설명은 다음에...
그러면 .safetensor 형식의 파일이 구글 드라이브("/content/drive/MyDrive") 에 저장되어 있을 것입니다.
해당 파일은 얼굴 이미지를 스테이블 디퓨전에 바로 적용 가능하도록 한 일부 레이어의 웨이트 값입니다.
이걸 이제 사용해서 이미지를 만들어 봐야겠죠?
계속 작업한다.
필요 라이브러리 설치
!pip install torch torchvision invisible_watermark transformers accelerate safetensors
!pip install git+https://github.com/huggingface/diffusers스테이블 디퓨전 (SDXL) 세팅
from diffusers import DiffusionPipeline, StableDiffusionXLImg2ImgPipeline
import torch
model = "stabilityai/stable-diffusion-xl-base-1.0"
pipe = DiffusionPipeline.from_pretrained(
model,
torch_dtype=torch.float16,
)
pipe.to("cuda")
pipe.load_lora_weights("/content/drive/MyDrive/{filename}.safetensors")
refiner = StableDiffusionXLImg2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
torch_dtype=torch.float16,
)
refiner.to("cuda")이미지 생성
prompt = "A {keyword} man, photorealistic, bold and elegant, close up, sharp expression, look at camera, block noise, vibrant colors, glitchcore, fuzz, color bars, abstract background, pop kei, bold outlines, ultrafine detailed, best quality"
negative_prompt = "ugly, deformed, noisy, blurry, distorted, grainy, text, cropped"
#for seed in range(10):
generator = torch.Generator("cuda").manual_seed(43)
image = pipe(prompt=prompt, negative_prompt=negative_prompt, generator=generator, num_inference_steps=40)
image = image.images[0]
image = refiner(prompt=prompt, negative_prompt=negative_prompt, generator=generator, image=image)
image = image.images[0]의 과정을 거치면 나오는 이미지들은 다음과 같습니다,
짜잔 🌟
당장은 작업 시간이 많이 걸리는데
저품질 이미지로도 특징을 추출하는 기술을 통해 빠른 학습 및 추론
좋은 결과물을 만들어 내는 키워드
를 고민해 보고 있습니다.
앞으로 이런 내용들을 많이 공유해드릴게요. 기술적인 내용도 자세하게 다룰 수도 있고요 ㅎㅎ
이정민 (스모어톡, tonylee@smoretalk.io)