Stable Diffusion을 스스로 배우다.
https://huggingface.co/models?other=stable-diffusion
1 - 1. Stable Diffusion 1.5v 사용하기
안녕하십니까, 프롬프트 연구소장 이뮨01입니다.
Karlo 모델보다 성능이 좋은 Stable Diffusion을 사용하기위해서 해당 모델에 대한 정보를 수집했다. 스테이블 디퓨전은 오픈소스로 공개되었기 때문에 무료로 모델을 사용할 수 있다는 장점이 있다. 스테이블 디퓨전 모델 버전은 1.5 버전과 2.1 버전이 있다고 한다. 2.1버전이 최신버전인데 1.5버전과 다른 점은, 1.5버전은 프롬프트를 단순하게해도 품질이 괜찮게 나오지만 고점이 2.1 버전에 비해 낮다고한다. 2.1버전은 프롬프트만 정확하고 자세하게 작성한다면 성능이 1.5버전보다 좋다고한다.
현재 나는 프롬프트에 대한 개념이 많지 않기 때문에 1.5버전을 사용해서 이미지를 생성하려고 한다. 오픈소스를 사용하는 방법을 몰라서 AI모델이 많은 허깅페이스에서 스테이블 디퓨전을 검색했다.
딱 봐도스테이블 디퓨전 v1.5는 이 녀석이 다운로드 수도 많고 좋아요 수도 많아서 이걸 사용하면되겠다 싶었다. 들어가보면 친절하게 파이썬 코드까지 주면서 그대로 복붙만 하면 사용할 수 있게 해준다.
# 복붙한 코드
from diffusers import StableDiffusionPipeline
import torch
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
image.save("astronaut_rides_horse.png")
보면 프롬프트가 하나 뿐인데 긍정프롬프트만 되어있다. 하지만 나는 부정 프롬프트까지 사용하고 싶다. pipe에 스테이블 디퓨전 모델이 들어가 있고 매개변수로 긍정프롬프트, 부정 프롬프트를 받는다.
1 - 2. 프롬프트 연구
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
prompt = "((best quality)), ((masterpiece)), ((detailed)), Intricate, ((Captivating)), ((Magnificent)), wolf head vector logo, simple, black and white, Vector Art,Logo Icon, Vector graphics, Adobe illustrator, white background, Sunlight, Soft natural light"
negative_prompt = "(worst quality, low quality:1.4), lowres, ugly, tiling, cow, poorly drawn hands, poorly drawn feet, Trypophobia,poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, bad anatomy, watermark, signature, cut off, low contrast, underexposed, overexposed, bad art, beginner, amateur, distorted face"
image = pipe(prompt=prompt, negative_prompt=negative_prompt).images[0]
plt.imshow(image)
plt.axis("off")
plt.show()
위 코드 블럭은 내가 수정한 스테이블 디퓨전 1.5버전 코드이다. 긍정 프롬프트와 부정 프롬프를 하드코딩해서 작성했다. image 변수 정의하는 곳 보면 긍정, 부정 프롬프트를 매개변수로 넣어주는 것을 볼 수 있다. 어떤 이미지를 생성하려는지 대충 설명하자면 검정색과 하얀색으로 이루어진 늑대 얼굴 이미지를 생성하려고 한 것이다.
생성한 결과 굉장히 흡족한 결과를 얻을 수 있었다. 하지만 여기서 기뻐하긴 이르다. 다시 실행시키면 다른 결과가 나온다. 좋은 결과가 나올지 안좋은 결과가 나올지 알 수 없다. 랜덤이다. 대부분의 결과가 좋은 결과일 순 없을까? 라는 고민에 빠지게 되었다. 저 늑대 로고를 만들어내기 위해서 나는 프롬프트에 대해 연구했다. 좋은 프롬프트가 좋은 결과를 내보내기 때문에 프롬프트에 어떤 키워드를 사용하는지 어떤 기능들이 있는지 조사했다. 키워드에 소괄호를 주면 가중치가 더해진다. 소괄호 1개는 1.1, 2개는 1.21로 괄호는 곱연산이 적용된다. 보통 기본적으로 적용되는 프롬프트는 다음과 같다.
prompt = "((best quality)), ((masterpiece)), ((detailed)), Intricate, ((Captivating)), ((Magnificent)), white background, Sunlight, Soft natural light"
negative_prompt = "(worst quality, low quality:1.4), ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, bad anatomy, watermark, signature, cut off, low contrast, bad art, beginner, amateur, distorted face"
내가 생각한 default로 사용되는 프롬프트이다. 여기서 추가로 사용자가 만들고 싶은 키워드만 추가해서 넣으면 될 거 같다고 생각했다. 그럼에도 품질이 별로인 로고들이 생성되서 '스테이블 디퓨전 로고 프롬프트'를 구글링 하던 도중 다음과 같은 정보를 발견했다.
스테이블 디퓨전을 알아보던 중 LORA에 대해 알게되었다. 정확히는 모르겠지만 모델에 적용시키면 특정 컨셉의 이미지를 잘 만들어내는 모델이 되는 그런 느낌이었다.
2. LORA를 알게되다
커스텀 로고 LORA
https://civitai.com/models/124609/logoredmond-logo-lora-for-sd-xl-10
해당 사이트에서는 사용자가 만들어낸 AI이미지에 사용된 프롬프트를 공유하고 사용한 모델, LORA를 공유하는 사이트이다. 로고를 검색해보니 괜찮은 컨셉의 이미지가 있어서 해당 이미지를 만들 때 사용한 LORA를 다운받았다. 어떻게 사용하는지는 모르지만 일단 다운받고 알아봤다. 저 분이 직접 만든 LORA를 허깅페이스에 올린 것도 찾을 수 있었다.
커스텀 로고 LORA 허깅페이스
https://huggingface.co/artificialguybr/LogoRedmond-LogoLoraForSDXL-V2
보통 이런 곳에선 자신이 만든 걸 어떻게 사용하는지 적어두는데 여기도 분명 어딘가에 있을 것이다라는 신념하나로 이것 저것 눌러보던 도중 찾아버렸다.
스테이블 디퓨전 LORA 사용법을 검색했을 때 진짜 전부 다 스테이블 디퓨전 WEB UI에서 LORA를 사용하는 법을 가르쳐주고 무슨 이상한 여자 AI 사진이나 만들고 있는 게 대부분이었다. 나는 그런거 필요없고 파이썬 코드로 LORA를 사용하는 법을 알고 싶었는데 이것을 찾자마자 너무 좋았다. 이제 LORA를 스테이블 디퓨전에 적용해보려고 했지만 Colab의 하루 할당량을 전부 사용해버려서 사용하지 못했다. 다음에 저 이미지를 만든 프롬프트들을 사용해서 비슷한 이미지를 만들어보려고한다. 지금 보면 사용되는 스테이블 디퓨전 모델의 버전? 종류가 다른데 그것도 다음에 설명하겠다.