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는 인간이 이미지를 인식하는 방식과 유사하며,
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인 첫 에포크의 예측 해상도 결과이다.
에포크 20 마다 예측결과를 출력하게 했다.
에포크 10을 넘어서면서 PSNR 값이 26.25 이상으로 안정화되기 시작
에포크 20 이후로는 PSNR 값이 26.5 이상을 유지하며, 소폭 상승하는 경향을 보인다.
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
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
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개의 이미지를 출력했다
저해상도 이미지(lowers)
실제 고해상도 이미지(highres)
예측된 고해상도 이미지(prediction)
1,2 번은 무슨 작업을 하지 않은 오리지널 값이다.
3번은 1번을 모델을 사용해서 고해상도로 바꾼것이다.
원본의 고해상도 이미지는 훨씬 깔끔하다.
모델로 예측한 해상도와 차이가 많이나서 이게 한건가?
싶은 느낌이 든다.
하지만 저해상도와 비교했을땐, 위에 highres vs prediction 만큼의 차이가 난다.
모델로 고해상도를 만든 부분이 차이가 느껴진다.
이번 실습 결론
lowers < prediction < highres
현재는 데이터 양도 적고, 모델의 성능이 시중에 나와있는것만큼 뛰어나지 않아서 그렇지 실제로는 아래와 같다.
lowers < prediciton < = highres