Stable Diffiusion
Stable diffusion이란 diffusion을 활용한 딥러닝 모델이며, 여러 연구자들이 모여 오픈 소스로 공개하기 위한 목적으로 개발된 이미지 생성 모델입니다.
Stable diffusion 이전에 OpenAI의 DALLE, DALLE2, Google의 Imagen 등 여러 모델이 공개되었지만, 모델의 전체 구조나 학습 파라미터들이 오픈 소스로 공개되지는 않았습니다.
하지만 Stable diffusion은 Stability.ai라는 곳에서 후원을 받아 모델을 개발한 이후 전부 오픈 소스로 공개하였습니다.
Stable Diffiusion의 특징은 다음과 같습니다.
- 모두 공개된 오픈 소스이다.
- GPU 1장으로도 inference가 가능해 쉽게 이미지 생성을 경험해 볼 수 있다.
Stable Diffiusion 구조
TBU
Quick Start Stable Diffusion
딥러닝을 공부하신 분들이라면 한번쯤 들어봤을 법한 Hugging face에서 제공하는 diffusers 라이브러리를 이용하면 stable diffusion을 간편하게 이용할 수 있습니다.
from diffusers import DiffusionPipeline
# Pipeline 정의
# Pipeline 정의 같은 경우 딥런닝 모델을 정의하는 것과 동일한 개념으로 이해.
pipeline = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
# gpu 사용
pipeline.to("cuda")
# 이미지 생성
# 현재 영어만 지원
prompt = "An image of a tiger in Picasso style"
image = pipeline(prompt = prompt).images[0]
image
생성된 이미지
이미지 생성 코드는 라이브러리를 import 하는 코드를 포함하더라도 4~5줄로 이미지를 생성할 수 있습니다. 이미지 생성 코드를 살펴보시면 prompt라는 변수가 있는데, 해당 변수에 정의된 문장을 바탕으로 이미지를 생성하게 됩니다.
이미지 생성을 잘 하기 위해서는 prompt를 잘 정의할 필요가 있습니다. 다음으로는 prompt를 잘 작성하는 방법에 대해 알아보겠습니다.
Prompt를 잘 작성해보자.
아래 내용은 링크의 내용을 요약하였습니다.
stable diffusion으로 이미지를 생성할 때 좋은 퀄리티의 이미지를 생성하기 위해서는 prompt에 아래 객체들이 포함되면 좋습니다.
- Subject - 주제
- 가능한 이미지의 주제에 대해 상세히 설명하는 게 좋습니다.
- ex) 하늘색 원피스를 입은 젊은 여성이 나무 창문 옆에 앉아 책을 읽고 있습니다.
- 예시는 이해를 돕기 위해 한국어로 작성되었지만, 영어로 작성해야 prompt가 정상작동합니다.
- Medium - 작품에 사용되는 재료
- Medium은 작품을 만드는 데 사용되는 재료를 의미합니다. 예를 들어 illustration, oil painting, 3D rending and photography 등이 될 수 있습니다.
- Medium에 따라 작품이 크게 변할 수 있으니 주의해서 활용해야 합니다.
- style - 이미지 스타일
- 작품의 예술적 스타일을 나타 냅니다. 예를 들면 impressionist, surrealist, pop-art 등이 될 수 있습니다.
- Artist - 작가 스타일
- Artist는 작가 스타일을 정의합니다. 빈센트 반고흐와 같은 유명한 작가를 이용하면 해당 작가의 그림체로 이미지를 생성합니다. 작가 스타일의 경우 이미지 생성에 큰 영향을 끼치므로 사용 시 유의해야 합니다.
- Resolution - 해상도
- 4K, 8K와 같은 이미지 해상도를 의미하는 단어를 넣어주면 고품질의 이미지를 얻을 수 있습니다. 100% 작동하지는 않는다는 단점이 있습니다.
- 또한 highly detailed ****과 같이 작품에 prompt의 특징을 더 잘 나타내게 유도할 수 있습니다.
- Lighting - 조명
- 작품에 사용되는 조명을 지정할 수 있습니다. 어두운 조명, 밝은 조명, Neon 조명 등이 될 수 있습니다.
잘 작성된 prompt를 활용하여 이미지를 생성하면 아래와 같은 이미지를 얻을 수 있습니다.
prompt
[amber heard:Ana de Armas:0.7], (touching face:1.2),
shoulder, by agnes cecile, half body portrait, extremely luminous bright design, pastel colors, (ink drips:1.3), autumn lights
프롬프트에서 숫자로 적혀있는 부분은 해당 단어에 대한 weight입니다. 0~1 사이 숫자면 다른 단어에 비해 영향력을 적게 주고, 1 이상의 숫자는 다른 단어에 비해 영향력을 크게 준다는 의미입니다.
생성 이미지
마지막으로 알아볼 내용은 stable diffusion의 Negative prompt 기능입니다.
Negative prompt는 ugly, deformed처럼 작품 생성 시 작품이 해단 단어는 최대한 피해 작품이 더 잘 생성될 수 있도록 보조하는 prompt로 활용됩니다. 풍경을 그릴 때 human을 negative prompt를 지정해 사람이 없는 풍경을 그리도록 유도할 수도 있습니다.
Negative prompt 활용 방법과 사용 전/후를 간단히 비교해보겠습니다.
prompt = 'autumn in paris, ornate, beautiful, atmosphere, vibe, mist, smoke, fire, chimney, rain, wet, pristine, puddles, melting, dripping, snow, creek, lush, ice, bridge, forest, roses, flowers, by stanley artgerm lau, greg rutkowski, thomas kindkade, alphonse mucha, loish, norman rockwell.'
negative_prompt = 'human'
image = pipeline(prompt = prompt, negative_prompt = negative_prompt).images[0]
image
negative prompt를 활용하는 방법은 prompt를 입력하는 것과 동일하게 negative_prompt 파라미터에 원하는 단어들을 넣어주면 됩니다.
첫 번째 사진은 negative prompt를 적용하지 않은 이미지이고 두 번째 이미지는 negative prompt로 human을 적용한 이미지입니다.
이 외에도 negative prompt를 활용하는 방법은 아래 링크에서 확인할 수 있습니다.
이미지 생성에 사용한 모델은 runwayml/stable-diffusion-v1-5 모델입니다. 해당 모델 이외에도 원하는 카테고리의 이미지를 생성하기 위해서는 특정 모델이 유리한 경우가 많습니다. 다양한 모델은 아래 링크에서 탐색 가능합니다.
- https://huggingface.co/models?pipeline_tag=text-to-image&sort=trending
여기까지 간략하게 stable diffusion에 대해 알아보았습니다.
결론
Stable Diffusion은 이미지 생성 분야에서 혁신적인 변화를 가져온 모델입니다. 오픈 소스로 공개된 덕분에 누구나 쉽게 접근할 수 있고, 단일 GPU로도 충분히 이미지 생성 작업을 수행할 수 있는 장점이 있습니다.
특히, Prompt 설계의 중요성이 강조되며, 잘 작성된 Prompt는 고품질의 이미지를 생성할 수 있게 합니다. 또한 Negative Prompt 기능을 통해 생성된 이미지의 특정 요소를 배제함으로써 더 정밀한 결과물을 얻을 수 있습니다.
Stable Diffusion은 접근성과 성능 면에서 뛰어나며, 이를 통해 창의적이고 다양한 이미지를 생성할 수 있는 가능성이 크게 열렸습니다. 앞으로도 이 기술은 이미지 생성뿐만 아니라 다양한 분야에서 더 널리 활용될 것으로 기대됩니다.
'딥러닝 > Vision' 카테고리의 다른 글
deepfloyd-if (0) | 2023.07.04 |
---|---|
diffusion (0) | 2023.07.04 |
Semantic Segmentation (0) | 2022.03.30 |
Mask R-CNN (0) | 2022.03.30 |
Object Detection (0) | 2022.03.30 |