GANs 6 - 초해상도 GAN(Super Resolution GAN)

김성빈·2024년 6월 13일
0

Modern Computer Vision

목록 보기
109/117

참고자료

Efficient Subpixel CNN이라고 불리는 모델을 구현

데이터 준비

Berkeley의 Computer Vision Group에서 제공하는 BSD 500 데이터셋을 사용

dataset_url = "http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/BSR/BSR_bsds500.tgz"
data_dir = keras.utils.get_file(origin=dataset_url, fname="BSR", untar=True)
root_dir = os.path.join(data_dir, "BSDS500/data")

데이터셋을 훈련용과 검증용으로 나누고, 전처리 0~1

crop_size = 300
upscale_factor = 3
input_size = crop_size // upscale_factor
batch_size = 8

train_ds = image_dataset_from_directory(
    root_dir,
    batch_size=batch_size,
    image_size=(crop_size, crop_size),
    validation_split=0.2,
    subset="training",
    seed=1337,
    label_mode=None,
)

valid_ds = image_dataset_from_directory(
    root_dir,
    batch_size=batch_size,
    image_size=(crop_size, crop_size),
    validation_split=0.2,
    subset="validation",
    seed=1337,
    label_mode=None,
)
def scaling(input_image):
    input_image = input_image / 255.0
    return input_image


# Scale from (0, 255) to (0, 1)
train_ds = train_ds.map(scaling)
valid_ds = valid_ds.map(scaling)

이미지 데이터셋 확인


이미지를 YUV 색 공간으로 변환

YUV는 인간이 이미지를 인식하는 방식과 유사하며,

RGB보다사람의 인식에 의해 더 효율적으로 마스킹될 수 있게 한다

YUV

참고

저,고해상도 이미지 출력

for batch in train_ds.take(1):
    for img in batch[0]:
        display(array_to_img(img))
    for img in batch[1]:
        display(array_to_img(img))

batch[0]에는 저해상도 이미지, batch[1]에는 고해상도 이미지가 있다.

저해상도

고해상도


출력


해당 모델로 학습을 진행했고,

에포크 = 100으로 학습했다.

Epoch 1/100
Mean PSNR for epoch: 22.22

50/50 - 11s - loss: 0.0261 - val_loss: 0.0061 - 11s/epoch - 218ms/step
Epoch 2/100
Mean PSNR for epoch: 24.28
50/50 - 2s - loss: 0.0051 - val_loss: 0.0036 - 2s/epoch - 40ms/step
Epoch 3/100
Mean PSNR for epoch: 25.52
50/50 - 2s - loss: 0.0037 - val_loss: 0.0029 - 2s/epoch - 33ms/step
Epoch 4/100
Mean PSNR for epoch: 26.33
50/50 - 2s - loss: 0.0031 - val_loss: 0.0026 - 2s/epoch - 33ms/step
Epoch 5/100
Mean PSNR for epoch: 26.07
50/50 - 2s - loss: 0.0029 - val_loss: 0.0025 - 2s/epoch - 40ms/step
Epoch 6/100
Mean PSNR for epoch: 26.30
50/50 - 2s - loss: 0.0028 - val_loss: 0.0025 - 2s/epoch - 33ms/step
Epoch 7/100
Mean PSNR for epoch: 26.27
50/50 - 2s - loss: 0.0029 - val_loss: 0.0025 - 2s/epoch - 33ms/step
Epoch 8/100
Mean PSNR for epoch: 26.28
50/50 - 2s - loss: 0.0028 - val_loss: 0.0024 - 2s/epoch - 33ms/step
Epoch 9/100
Mean PSNR for epoch: 26.42
50/50 - 2s - loss: 0.0027 - val_loss: 0.0024 - 2s/epoch - 34ms/step
Epoch 10/100
Mean PSNR for epoch: 26.25
50/50 - 2s - loss: 0.0027 - val_loss: 0.0024 - 2s/epoch - 35ms/step
Epoch 11/100
Mean PSNR for epoch: 26.30
50/50 - 2s - loss: 0.0027 - val_loss: 0.0024 - 2s/epoch - 33ms/step
Epoch 12/100
Mean PSNR for epoch: 25.96
50/50 - 2s - loss: 0.0028 - val_loss: 0.0025 - 2s/epoch - 33ms/step
Epoch 13/100
Mean PSNR for epoch: 26.31
....
Mean PSNR for epoch: 26.07
50/50 - 2s - loss: 0.0025 - val_loss: 0.0024 - 2s/epoch - 33ms/step
Epoch 96/100
Mean PSNR for epoch: 26.46
50/50 - 2s - loss: 0.0026 - val_loss: 0.0022 - 2s/epoch - 32ms/step
Epoch 97/100
Mean PSNR for epoch: 26.40
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 98/100
Mean PSNR for epoch: 26.31
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 34ms/step
Epoch 99/100
Mean PSNR for epoch: 26.57
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 34ms/step
Epoch 100/100
Mean PSNR for epoch: 27.07
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 34ms/step
<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7fc0a7709790>

초기 학습 과정

처음 몇 에포크 동안 PSNR 값이 빠르게 상승하고있는데,

이는 모델이 저해상도 이미지를 고해상도로 변환하는 능력이 향상되고 있음을 의미한다.

첫 에포크에서 PSNR 값이 22.22였으며, 아직 학습초기 단계를 나타냄

아래 사진은 PSNR 값이 22.22인 첫 에포크의 예측 해상도 결과이다.

1 예측 출력

중간 학습 과정

에포크 20 마다 예측결과를 출력하게 했다.

에포크 10을 넘어서면서 PSNR 값이 26.25 이상으로 안정화되기 시작

21 예측 출력


에포크 20 이후로는 PSNR 값이 26.5 이상을 유지하며, 소폭 상승하는 경향을 보인다.

41 예측 출력

Epoch 19/100
Mean PSNR for epoch: 26.77
50/50 - 2s - loss: 0.0027 - val_loss: 0.0024 - 2s/epoch - 33ms/step
Epoch 20/100
Mean PSNR for epoch: 25.47
50/50 - 2s - loss: 0.0029 - val_loss: 0.0030 - 2s/epoch - 33ms/step
Epoch 21/100
Mean PSNR for epoch: 26.54
50/50 - 2s - loss: 0.0027 - val_loss: 0.0023 - 2s/epoch - 46ms/step
Epoch 22/100
Mean PSNR for epoch: 26.24
50/50 - 2s - loss: 0.0026 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 23/100
Mean PSNR for epoch: 26.64
50/50 - 2s - loss: 0.0026 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 24/100
Mean PSNR for epoch: 26.70
50/50 - 2s - loss: 0.0026 - val_loss: 0.0023 - 2s/epoch - 40ms/step
Epoch 25/100
Mean PSNR for epoch: 27.04
50/50 - 2s - loss: 0.0026 - val_loss: 0.0023 - 2s/epoch - 34ms/step

후기 학습 과정

에포크 50 이후로는 PSNR 값이 26.5에서 27.0 사이에서 변동하며 안정화 되는 모습이다.

Epoch 49/100
Mean PSNR for epoch: 26.54
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 50/100
Mean PSNR for epoch: 26.42
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 51/100
Mean PSNR for epoch: 26.72
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 52/100
Mean PSNR for epoch: 26.44
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 53/100
Mean PSNR for epoch: 26.92
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 35ms/step
Epoch 54/100
Mean PSNR for epoch: 26.63
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 55/100
Mean PSNR for epoch: 26.86
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 41ms/step
Epoch 56/100
Mean PSNR for epoch: 26.80
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 34ms/step
Epoch 57/100
Mean PSNR for epoch: 26.68
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 58/100
Mean PSNR for epoch: 26.49
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 36ms/step
Epoch 59/100
Mean PSNR for epoch: 26.84
50/50 - 2s - loss: 0.0025 - val_loss: 0.0023 - 2s/epoch - 34ms/step
Epoch 60/100
Mean PSNR for epoch: 26.12
50/50 - 2s - loss: 0.0026 - val_loss: 0.0024 - 2s/epoch - 34ms/step
Epoch 61/100
Mean PSNR for epoch: 26.69

61 예측 출력

Epoch 78/100
Mean PSNR for epoch: 26.90
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 34ms/step
Epoch 79/100
Mean PSNR for epoch: 26.93
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 40ms/step
Epoch 80/100
Mean PSNR for epoch: 27.01
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 81/100
Mean PSNR for epoch: 26.90

50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 47ms/step
Epoch 82/100
Mean PSNR for epoch: 26.66
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 83/100
Mean PSNR for epoch: 26.85
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 32ms/step
Epoch 84/100
Mean PSNR for epoch: 26.70
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 85/100
Mean PSNR for epoch: 26.85
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 86/100
Mean PSNR for epoch: 26.19
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 87/100
Mean PSNR for epoch: 26.52
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 33ms/step
Epoch 88/100
Mean PSNR for epoch: 26.38
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 39ms/step
Epoch 89/100
Mean PSNR for epoch: 26.59
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 39ms/step
Epoch 90/100
Mean PSNR for epoch: 26.37
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 32ms/step

81 예측 출력

Epoch 100/100
Mean PSNR for epoch: 27.07
50/50 - 2s - loss: 0.0025 - val_loss: 0.0022 - 2s/epoch - 34ms/step

최종 에포크(100) 에서 PSNR 값이 27.07로 기록되었고, 이는 모델이 충분히 학습되었음을 나타내며, 고해상도

이미지를 효과적으로 생성할 수 있음을 의미한다.

일정 수준 이후 부터는 이미지가

모델 이용해서 다른 이미지 예측

!wget -q https://github.com/rajeevratan84/ModernComputerVision/raw/main/birdy.jpg

모델을 사용하여 예측할 이미지를 가져온다.

총 3개의 이미지를 출력했다

  1. 저해상도 이미지(lowers)

  2. 실제 고해상도 이미지(highres)

  3. 예측된 고해상도 이미지(prediction)

1,2 번은 무슨 작업을 하지 않은 오리지널 값이다.

3번은 1번을 모델을 사용해서 고해상도로 바꾼것이다.

highres vs prediction

원본의 고해상도 이미지는 훨씬 깔끔하다.

모델로 예측한 해상도와 차이가 많이나서 이게 한건가?

싶은 느낌이 든다.

lowers vs predition

하지만 저해상도와 비교했을땐, 위에 highres vs prediction 만큼의 차이가 난다.

모델로 고해상도를 만든 부분이 차이가 느껴진다.

이번 실습 결론
lowers < prediction < highres

현재는 데이터 양도 적고, 모델의 성능이 시중에 나와있는것만큼 뛰어나지 않아서 그렇지 실제로는 아래와 같다.

lowers < prediciton < = highres

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글