import tensorflow_hub as hub
import tensorflow as tf
import matplotlib.pylab as plt
import numpy as np
import PIL.Image
def tensor_to_image(tensor): # 아래 코드에서 나온 output을 tensor자리에 넣어서 사진을 후처리를 해준다.
tensor = tensor*255 # 나눴던 255 다시 곱해주기
tensor = np.array(tensor, dtype=np.uint8) # dtype을 다시 np.uint8 형태로 바꿔주기
print("함수", tensor)
if np.ndim(tensor)>3: # ndim은 배열의 차원 수를 알려줌
assert tensor.shape[0] == 1
tensor = tensor[0]
return PIL.Image.fromarray(tensor)
content_img = plt.imread('imgs/02.jpg') # input 이미지
style_img = plt.imread('imgs/test3.jpg') # filter 이미지
content_img = content_img.astype(np.float32)[np.newaxis] / 255.
# numpy 배열 ndarray의 메소드 astype()로 데이터형 dtype을 float32로 변경, np.newaxis는 np 행렬의 차원을 확장하는 함수 , 0~255의 숫자로 이루어져 있는 채널을 0~1사이의 값으로 만들어주기 위해 255로 나누어 준다.
style_img = style_img.astype(np.float32)[np.newaxis] / 255.
a, h, w, c = content_img.shape # (1, 3024, 4032, 3)
a1, h1, w1, c1 = style_img.shape
content_img = tf.image.resize(content_img, (1000, int(h / w * 1000)))
# 이미지를 너비 1000, 높이는 너비와 비율이 맞게 이미지의 크기를 변형시켜서 아무리 큰 이미지를 사용해도 모델의 추론 속도가 비슷하도록 만들기! 왜냐하면 큰 이미지를 사용 할 수록 연산 속도가 느리기 때문!!(전처리)
style_img = tf.image.resize(style_img, (600, int(h1 / w1 * 600)))
# Hub로부터 style transfer 모듈을 불러오기
hub_module = hub.load('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')
output = hub_module(tf.constant(content_img), tf.constant(style_img))[0] # 모델에 콘텐트 이미지, 스타일 이미지를 넣어서 합치고 그 결과의 0번째 인덱스 불러오기
print(output)
print(output.shape)
# 결과를 출력
result_img = tensor_to_image(output)
result_img.show()
# print("넌뭐냐",result_img)
파이썬에서 예외처리에 사용하는 방법 중 하나
뒤의 조건문이 True가 아니면 AssertError를 발생시키는 함수이다.
형식 : assert 조건문, 에러메세지
예)
=> 이렇게 에러 상황을 확인하고 처리할 수 있게 한다.