Transfer Learning for Keras Style Transfer
스타일 전송 기술은 두 개의 이미지를 입력으로 받아 세 번째 이미지를 생성한다. 첫 번째 이미지는 변형하고자 하는 기본 이미지이다. 두 번째 이미지는 소스 이미지에 적용하려는 스타일을 나타낸다. 마지막으로 알고리즘은 스타일 이미지가 특징인 스타일을 에뮬레이트하는 세 번째 이미지를 렌더링다. 이 기술을 스타일 전송이라고 한다.
제시된 코드는 François Chollet이 만든 Keras 문서의 스타일 전송 예제를 기반으로 했다.
|
먼저, 스타일을 적용할 기본 이미지를 업로드다.
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)
손실 함수는 다음 세 가지 가중치로 정의된 세 가지 목표의 균형을 맞춘다. 이러한 가중치를 변경하면 이미지 생성을 미세 조정할 수 있다.
|
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
'DNN with Keras > Transfer Learning' 카테고리의 다른 글
스타일, 콘텐츠 및 변형 손실 계산하기 (0) | 2024.02.14 |
---|---|
StyleGAN을 위한 이미지 전처리 (0) | 2024.02.14 |
Transfer Learning for Facial Points and GANs (0) | 2024.02.14 |
조기 중지의 이점 (0) | 2024.02.13 |
Transfer Learning for NLP with Keras (0) | 2024.02.13 |