-
[AI] Stable Diffusion프로젝트/당일 2024. 5. 27. 20:35
Stable Diffusion 왜 궁금했을까❓
SSAFY 자율 프로젝트로 사용자가 일기를 작성하면 그 하루를 대표하는 그림을 뽑아주는 서비스를 하기로 했다. Text to Img를 지원하는 생성형 AI를 찾아봤고 그 중 Stable Diffusion을 선택했다. 선택한 이유를 알아보고 Stable Diffusion의 원리를 알아보도록 하겠다.
위 포스팅을 통해 그림일기 생성 기능 구현 과정을 살펴볼 수 있다.
1. Stable Diffusion vs Midjourney vs Dall-e
Text to Img AI 모델에는 대표적으로 Stable Diffusion, Midjourney, Dall-e가 존재한다. 3개를 비교해보고 프로젝트에 적절한 AI 모델을 사용해보려고 한다.
프로젝트에 활용 가능한 AI 모델의 조건
- 모델 서빙이 가능한 모델
- 그림의 화풍을 커스터마이징 가능한 모델
- 최대한 짧은 시간 안에 이미지를 뽑을 수 있는 모델
- 무료로 사용 가능한 모델
- Stable Diffusion
- 모델링 서버를 구축하여 모델 서빙 가능
- LORA를 활용하여 화풍 커스텀 가능
- GPU 성능에 따라 시간 소요
- 무료
- Midjourney
- 모델 서빙은 불가능하지만 API를 통해 사용 가능
- 화풍 커스텀 가능
- 한 장에 이미지 생성 시간 약 1분 ~ 2분 소요
- 유료
- Dall-e
- 모델 서빙은 불가능하지만 API를 통해 사용 가능
- 화풍 커스텀 가능
- 트래픽에 따라 생성 시간이 변경되며 평균적으로 약 20초 소요
- 유료
결론적으로는 Stable Diffusion을 사용하는 게 맞다는 생각이 들었다. Midjourney와 Dall-e의 경우 각 API를 제공하는 플랫폼에 종속적이게 되어 안정적인 서비스를 지원하지 못할 것이다. 또한, GPU서버를 지원받고 자본은 지원받지 못했기에 유료로 진행할 수 없었다.
2. Stable Diffusion
1. Diffusion 원리
1.1 Forward Diffusion
- 학습용 이미지를 선택
- 무작위 잡음 이미지 생성
- 학습용 이미지에 정해진 단계만큼 무작위 잡음 이미지를 추가하여 손상
- UNet에게 잡음 추가량을 학습시킨 뒤 가중치를 조정하고 정답을 보여주는 방식
- 최종적으로 이미지에 추가된 잡음을 예측할 수 있는 UNet을 확보
1.2 Reverse Diffusion
- 잡음 이미지 생성
- UNet(Predicted noise)에게 잡음이 얼마나 포함되어 있는 지 질문
- UNet이 반환한 예측 잡음을 기존의 잡음 이미지에서 제거한 뒤 다음으로 전달
- 이 과정을 사용자가 지정한 Step만큼 반복하다보면 최종적으로 이미지 생성
2. Stable Diffusion 대표 구성 요소
- Text Encoder
- Text Prompt를 text Embedding 형태로 변환
- UNet
- 입력받은 text Embedding과 노이즈 그리고 N번의 추론을 통해 VAE에 넣을 latent vector를 추출
- Scheduler
- 노이즈의 세기, 종류, 확률 편미분 방정식 이용 등을 설정
- DDPM, DDIM, PNDM, Euler, Euler a, DPM++ 등이 존재
- VAE
- VAE는 하나의 모델로 Pretrained Model을 사용
- UNet을 학습하거나 UNet에서 나온 값을 Decode하여 고해상도 이미지를 추출
- Encoder를 통해 UNet의 학습 데이터를 만들고 UNet에서 나온 값을 Decoder에 넣으면 이미지 추출하는 방식
3. Stable Diffusion 작동 과정
- 사용자 텍스트 입력
- 입력된 텍스트 데이터를 Stable Diffusion AI 모델에 입력
- 텍스트를 기반으로 이미지 추론 및 생성
간단하게 설명하자면 위와 같이 설명할 수 있다. 하지만, Stable Diffusion을 커스터마이징 하기 위해서는 좀 더 상세하게 알아야 하기에 아래에 디테일하게 설명하겠다.
- 사용자가 일기를 입력하여 서버에 전송
- 비즈니스 로직이 실행되어 Stable Diffusion 모델에 데이터 입력
- 텍스트 인코더가 받아 Tokenizer를 이용하여 단어를 추출하고 숫자로 변환(tokenize)
- 이후, 숫자를 latent vector 형태인 text embedding로 변환하고 노이즈로 구성된 다차원의 텐서를 UNet에 입력
- UNet은 text embedding에 따라 conditioning된 채로 random latent vector를 지정한 Loop 만큼 반복하며 denoise
- 위 과정을 거치면 저해상도의 latent vector를 생성하여 이미지 디코더(VAE)로 전달하여 고해상도의 그림을 출력
다음 포스팅에서는 fine-tuning을 쉽게 할 수 있게 도와주는 Lora에 대해서 알아보도록 하겠다.
'프로젝트 > 당일' 카테고리의 다른 글
[Infra] STOMP를 통한 Spring Boot - FastAPI 통신 (0) 2024.06.02 [FastAPI] AWS S3를 활용한 이미지 저장 (0) 2024.06.01 [AI] Stable Diffusion 성능 향상 (0) 2024.05.31 [AI] Stable Diffusion + LoRA를 통한 이미지 생성 기능 구현 (0) 2024.05.29 [AI] Stable Diffusion fine-tuning(LoRA) (0) 2024.05.28