내일배움캠프 57일차

김서영·2022년 11월 22일
0

내일배움캠프 TIL

목록 보기
59/85

1. 오늘 내가 한 일!

  • 딥러닝 모델 찾기!! : 열심히..진짜 하루종일 열심히 찾아봤는데 다 오류가 뜨고 실행이 잘 안돼서 다른 팀원분이 찾은걸로 진행하기루 했다😭😱

2. 딥러닝 모델 코드 리뷰

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)

3. 새로 알게된 사실!

- 가정설정문 assert

파이썬에서 예외처리에 사용하는 방법 중 하나
뒤의 조건문이 True가 아니면 AssertError를 발생시키는 함수이다.

형식 : assert 조건문, 에러메세지

예)
=> 이렇게 에러 상황을 확인하고 처리할 수 있게 한다.

  • assert를 쓰는 이유?
    프로그램 중간 점검을 하기 위해 많이 사용한다.
    즉, 개발자가 프로그램을 만드는 과정에서 원하는 조건의 변수 값을 받을 때까지 assert로 테스트가 가능하다!
    이는 결과적으로 단순히 에러를 찾는것이 아니라 값을 보장하기 위해 사용하는 것!!
    예) 반드시 정수만을 입력받아 처리하게 만드는 프로그램에서 assert문을 사용하여 정수 값만 보장하게 만들어 성능을 높인다.
    => 방어적 프로그래밍

- numpy

profile
개발과 지식의 성장을 즐기는 개발자

0개의 댓글