Develop/AI

자연어 이미지 멀티모달 - 이미지 생성, Image Captioning 알아보자.

YOOZI. 2025. 4. 10. 22:07
728x90
이미지와 언어의 경계를 허물다

 

 

 

오늘은 자연어 이미지 멀티모달 - 이미지 생성, Image Captioning 알아보자.

오늘의 배움
  • 멀티모달 학습의 기본 개념과 원리
  • 이미지 캡셔닝(Image Captioning)의 작동 방식
  • 텍스트-이미지 생성 기술과 대표 모델들

01. 자연어-이미지 멀티모달

 

  • 정의: 텍스트와 이미지라는 서로 다른 형태(모달리티)의 데이터를 함께 처리하고 이해하는 AI 학습 방법
  • 한 줄 요약: "보는 것과 읽는 것을 동시에 이해하고 연결하는 AI의 능력"
  • 특징:
    • 단일 모달리티보다 풍부한 정보 처리 가능
    • 상호보완적 학습 효과
    • 인간의 다감각적 인지 능력에 더 가까운 접근
  • 필요성:
    • 실제 세계의 정보는 대부분 여러 형태로 존재
    • 이미지만으로 설명하기 어려운 맥락 정보 보완
    • 텍스트만으로 표현하기 어려운 시각적 요소 보완
  • 장점/단점:
    • 장점: 표현력 향상, 복잡한 컨텍스트 이해 능력 증가, 현실적인 응용 가능성
    • 단점: 학습 난이도 증가, 다양한 모달리티 간 정렬 문제, 계산 비용 증가
  • 예시:
    • 사진을 보고 설명문 작성(이미지 캡셔닝)
    • 텍스트 설명으로 이미지 생성(DALL-E, Stable Diffusion)
    • 사진 속 물체에 대한 질문에 답변(VQA)

 

02. 핵심 개념 정리

02-01. 멀티모달 학습

  • 정의: 서로 다른 종류의 데이터(모달리티)를 함께 처리하고 학습하는 방법
  • 작동 원리:
    • 각 모달리티별 특화된 인코더로 특징 추출
    • 추출된 특징들을 공통 잠재 공간(latent space)에 매핑
    • 매핑된 특징들 간의 상호작용 및 정렬 학습
  • 특징:
    • 모달리티 간 상호보완적 정보 활용
    • 단일 모달리티보다 풍부한 컨텍스트 이해
    • 교차 모달 표현 학습(cross-modal representation learning)
  • 장점/단점:
    • 장점: 복합적 정보 처리, 현실 세계와 유사한 학습 방식
    • 단점: 모달리티 간 정렬의 어려움, 계산 비용 증가
  • 필요성:
    • 실제 세계의 정보는 다양한 형태로 존재
    • 단일 모달리티의 한계 극복
  • 대표적인 활용 분야
    • 이미지 캡셔닝 (Image Captioning): 시각 정보를 문장으로 표현
    • 텍스트 기반 이미지 생성: 상상한 장면을 그림처럼 표현
    • 이미지 기반 검색: 문장을 통해 유사한 이미지를 검색
    • VQA (Visual Question Answering): 이미지에 대한 자연어 질문에 답변
  • 예시:
# 간단한 멀티모달 모델 구조 예시 (PyTorch)
class MultimodalModel(nn.Module):
    def __init__(self):
        super(MultimodalModel, self).__init__()
        # 이미지 인코더 (예: ResNet)
        self.image_encoder = torchvision.models.resnet50(pretrained=True)
        self.image_encoder.fc = nn.Linear(2048, 512)  # 특징 차원 변환
        
        # 텍스트 인코더 (예: BERT)
        self.text_encoder = BertModel.from_pretrained('bert-base-uncased')
        self.text_projection = nn.Linear(768, 512)  # BERT 출력 차원 변환
        
        # 멀티모달 퓨전 레이어
        self.fusion = nn.Sequential(
            nn.Linear(512 * 2, 512),
            nn.ReLU(),
            nn.Linear(512, 256)
        )
        
        # 작업별 출력 레이어 (예: 분류)
        self.classifier = nn.Linear(256, num_classes)
    
    def forward(self, images, text_inputs):
        # 이미지 특징 추출
        img_features = self.image_encoder(images)
        
        # 텍스트 특징 추출
        text_outputs = self.text_encoder(**text_inputs)
        text_features = self.text_projection(text_outputs.pooler_output)
        
        # 특징 결합 (concatenation)
        combined = torch.cat([img_features, text_features], dim=1)
        
        # 퓨전 및 분류
        fused = self.fusion(combined)
        output = self.classifier(fused)
        
        return output

02-02. 이미지 캡셔닝

  • 정의: 주어진 이미지의 내용을 자연어 문장으로 설명하는 기술
  • 작동 원리:
    • CNN으로 이미지에서 시각적 특징 추출
    • RNN/LSTM으로 추출된 특징을 기반으로 순차적 문장 생성
    • Attention 메커니즘으로 이미지의 중요 영역에 집중
  • 특징:
    • 시각적 인식과 언어 생성의 결합
    • 엔코더-디코더 구조 활용
    • 이미지의 다양한 요소를 언어적으로 해석
  • 장점/단점:
    • 장점: 이미지 검색 향상, 시각 장애인 접근성 개선
    • 단점: 미묘한 시각적 차이 표현의 어려움, 주관적 해석 발생
  • 필요성:
    • 시각 데이터의 자동 색인화
    • 접근성 향상
    • 시각-언어 통합 AI 발전
  • 예시:
# 간단한 이미지 캡셔닝 모델 구조 (PyTorch)
class ImageCaptioningModel(nn.Module):
    def __init__(self, embed_size, hidden_size, vocab_size, num_layers=1):
        super(ImageCaptioningModel, self).__init__()
        # CNN 이미지 인코더
        cnn = torchvision.models.resnet152(pretrained=True)
        modules = list(cnn.children())[:-1]  # 마지막 FC 레이어 제외
        self.cnn = nn.Sequential(*modules)
        
        # CNN 출력을 임베딩 크기로 변환
        self.fc = nn.Linear(cnn.fc.in_features, embed_size)
        
        # 단어 임베딩 레이어
        self.embed = nn.Embedding(vocab_size, embed_size)
        
        # LSTM 디코더
        self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first=True)
        
        # 출력 레이어
        self.linear = nn.Linear(hidden_size, vocab_size)
        
    def forward(self, images, captions):
        # 이미지 특징 추출
        with torch.no_grad():
            features = self.cnn(images)
        features = features.reshape(features.size(0), -1)
        features = self.fc(features)
        
        # 캡션 임베딩
        embeddings = self.embed(captions)
        
        # 이미지 특징을 LSTM의 첫 입력으로 사용
        embeddings = torch.cat((features.unsqueeze(1), embeddings), 1)
        
        # LSTM으로 캡션 생성
        lstm_out, _ = self.lstm(embeddings)
        outputs = self.linear(lstm_out)
        
        return outputs

02-03. 텍스트-이미지 생성

  • 정의: 자연어 설명을 기반으로 해당 내용을 시각화한 이미지를 생성하는 기술
  • 작동 원리:
    • 텍스트 인코더로 문장의 의미적 특징 추출
    • 생성 모델(GAN, Diffusion Model 등)을 통해 조건부 이미지 생성
    • 텍스트-이미지 정렬성 향상을 위한 CLIP 등의 사전학습 모델 활용
  • 특징:
    • 창의적인 이미지 합성 능력
    • 텍스트 프롬프트에 대한 높은 민감도
    • 스타일과 내용의 분리 가능
  • 장점/단점:
    • 장점: 상상력을 시각화, 디자인 과정 자동화, 인간-AI 공동창작
    • 단점: 텍스트 지시의 완벽한 반영 어려움, 윤리적 문제 존재
  • 필요성:
    • 창의적 표현 도구
    • 디자인 프로토타이핑 가속화
    • 콘텐츠 제작 민주화
  • 예시:
# Stable Diffusion을 활용한 텍스트-이미지 생성 예시
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 = "우주 정거장에서 바라본 지구의 일출, 고해상도, 사실적인 스타일"
image = pipe(prompt).images[0]
image.save("space_sunrise.png")

 


02-04. CLIP

  • 정의: 텍스트와 이미지를 동일한 벡터 공간에 매핑하여 의미적 유사성을 측정하는 모델
  • 작동 원리:
    • 텍스트와 이미지 인코더를 병렬로 학습
    • 대조학습(Contrastive Learning)으로 관련 쌍은 가깝게, 무관한 쌍은 멀게 표현
    • 대규모 텍스트-이미지 쌍 데이터셋으로 학습
  • 특징:
    • Zero-shot 추론 능력
    • 다양한 시각-언어 태스크에 적용 가능
    • 400M 텍스트-이미지 쌍으로 학습한 강력한 표현력
  • 장점/단점:
    • 장점: 새로운 클래스 인식 가능, 유연한 응용성, 풍부한 의미 포착
    • 단점: 특정 도메인 지식 부족, 모호한 설명 처리 한계
  • 필요성:
    • 시각-언어 간 의미적 브리지 역할
    • 데이터 효율적인 전이학습 가능
  • 예시:
# CLIP을 활용한 이미지 검색 예시
import torch
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel

# 모델 로드
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

# 이미지 준비
image_urls = [
    "https://example.com/beach.jpg",
    "https://example.com/mountain.jpg",
    "https://example.com/city.jpg"
]
images = [Image.open(requests.get(url, stream=True).raw) for url in image_urls]

# 텍스트 쿼리
text = ["해변에서의 휴가", "도시의 야경", "산에서의 하이킹"]

# CLIP 처리
inputs = processor(text=text, images=images, return_tensors="pt", padding=True)
outputs = model(**inputs)

# 유사도 계산
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
print("텍스트-이미지 매칭 확률:", probs)

02-05. DALL·E

  • 정의: GPT 계열의 모델을 기반으로, 텍스트에서 이미지를 직접 생성하는 모델
  • 주요 특징
    • "두 마리 고양이가 무지개 앞에서 피아노를 연주하고 있다" 같은 문장을 시각화할 수 있는 높은 표현력
    • DALL·E 2부터는 CLIP을 함께 사용하여 텍스트-이미지 정합도 향상
    • 다양한 기능: 이미지 변형(Inpainting), 스타일 변화, 이어그리기

02-06. Stable Diffusion

  • 정의: 오픈소스로 공개되어 누구나 자유롭게 사용하고 커스터마이징할 수 있는 텍스트 기반 이미지 생성 모델이다.
  • 기술 구성
    • Latent Diffusion Model (LDM): 이미지 전체가 아닌 잠재 공간(latent space)에서 디퓨전 수행 → 속도와 효율성 개선
    • Autoencoder: 이미지를 latent 공간으로 인코딩/디코딩
    • UNet: 노이즈 제거 예측
    • Text Encoder: CLIP을 사용해 텍스트를 조건으로 반영
  • 특징
    • 로컬 GPU 환경에서 실행 가능
    • Prompt engineering, Negative prompt, Style control 등 고급 기능 다수

02-07. DrawBench 평가 방식

  • 정의: 텍스트 기반 이미지 생성 모델의 성능을 비교·평가하기 위한 기준
  • 한 줄 설명: 다양한 유형의 문장을 제시하고, 각 모델이 얼마나 적절하고 창의적인 이미지를 생성했는지를 비교
  • 주요 평가 지표
    • 정확도: 텍스트와 이미지가 의미상 얼마나 잘 맞는가
    • 다양성: 같은 프롬프트로 생성된 이미지의 다양성
    • 현실성: 이미지가 얼마나 자연스럽고 사실적인가
    • 창의성: 새로운 조합이나 독창적인 표현을 잘 수행하는가
  • 비교 대상: Imagen (Google), Parti (Google Brain), DALL·E 2, Stable Diffusion 등

 

728x90