본문 바로가기
DNN with Keras/Transfer Learning

Transfer Learning for Keras Style Transfer

by goatlab 2024. 2. 14.
728x90
반응형
SMALL

Transfer Learning for Keras Style Transfer

 

스타일 전송 기술은 두 개의 이미지를 입력으로 받아 세 번째 이미지를 생성한다. 첫 번째 이미지는 변형하고자 하는 기본 이미지이다. 두 번째 이미지는 소스 이미지에 적용하려는 스타일을 나타낸다. 마지막으로 알고리즘은 스타일 이미지가 특징인 스타일을 에뮬레이트하는 세 번째 이미지를 렌더링다. 이 기술을 스타일 전송이라고 한다.

 

 

제시된 코드는 François Chollet이 만든 Keras 문서의 스타일 전송 예제를 기반으로 했다.

 

  • base_image_path : 스타일을 적용할 이미지
  • style_reference_image_path : 스타일을 복사할 이미지

 

먼저, 스타일을 적용할 기본 이미지를 업로드다.

 

import os
from google.colab import files

uploaded = files.upload()

if len(uploaded) != 1:
    print("Upload exactly 1 file for source.")
    
else:
    for k, v in uploaded.items():
        _, ext = os.path.splitext(k)
        os.remove(k)
        base_image_path = f"source{ext}"
        open(base_image_path, 'wb').write(v)

 

또한, 스타일 이미지도 업로드한다.

 

uploaded = files.upload()
if len(uploaded) != 1:
    print("Upload exactly 1 file for target.")
    
else:
    for k, v in uploaded.items():
        _, ext = os.path.splitext(k)
        os.remove(k)
        style_reference_image_path = f"style{ext}"
        open(style_reference_image_path, 'wb').write(v)

 

손실 함수는 다음 세 가지 가중치로 정의된 세 가지 목표의 균형을 맞춘다. 이러한 가중치를 변경하면 이미지 생성을 미세 조정할 수 있다.

 

  • total_variation_weight : 주변 픽셀의 시각적 일관성을 얼마나 강조할지 결정
  • style_weight : 참조 이미지의 스타일을 에뮬레이트하는 데 얼마나 강조할지 결정
  • content_weight : 기본 이미지와 비슷한 모양을 유지하는 데 얼마나 강조할지 결정
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.applications import vgg19

result_prefix = "generated"

# Weights of the different loss components
total_variation_weight = 1e-6
style_weight = 1e-6
content_weight = 2.5e-8

# Dimensions of the generated picture.
width, height = keras.preprocessing.image.load_img(base_image_path).size
img_nrows = 400
img_ncols = int(width * img_nrows / height)

 

이제, 사용할 두 개의 이미지를 표시한다. 먼저 기본 이미지와 스타일 이미지가 표시된다.

 

from IPython.display import Image, display

print("Source Image")
display(Image(base_image_path))

print("Style Image")
display(Image(style_reference_image_path))

 

이미지 전처리 및 후처리

 

preprocess_image 함수는 Keras를 사용하여 이미지를 로드하는 것으로 시작한다. img_nrows와 img_ncols로 지정된 크기로 이미지의 크기를 조정한다. img_to_array는 이미지를 Numpy 배열로 변환하고, 여기에 일괄 처리를 고려하기 위해 차원을 추가한다. VGG에서 예상하는 차원은 색상 깊이, 높이, 너비 및 배치이다. 마지막으로 Numpy 배열을 텐서로 변환한다.

 

deprocess_image는 반대로 스타일 전송 프로세스의 출력을 일반 이미지로 다시 변환하는 작업을 수행한다. 먼저, 배치 차원을 제거하기 위해 이미지의 모양을 변경한다. 그런 다음 RGB 색상의 평균값을 더하여 출력을 0 ~ 255 범위로 다시 이동한다. 또한, VGG의 BGR (파랑, 초록, 빨강) 색상 공간을 보다 표준적인 RGB 인코딩으로 변환해야 한다.

 

def preprocess_image(image_path):
    # Util function to open, resize and format pictures into appropriate tensors
    img = keras.preprocessing.image.load_img(image_path, target_size=(img_nrows, img_ncols))
    img = keras.preprocessing.image.img_to_array(img)
    img = np.expand_dims(img, axis=0)

    img = vgg19.preprocess_input(img)
    
    return tf.convert_to_tensor(img)

def deprocess_image(x):
    # Util function to convert a tensor into a valid image
    x = x.reshape((img_nrows, img_ncols, 3))
    
    # Remove zero-center by mean pixel
    x[:, :, 0] += 103.939
    x[:, :, 1] += 116.779
    x[:, :, 2] += 123.68
    
    # 'BGR'->'RGB'
    x = x[:, :, ::-1]
    x = np.clip(x, 0, 255).astype("uint8")
    
    return x
728x90
반응형
LIST