グラフィックボードの容量の関係で、
Deep Learningに使う画像を圧縮することはよくあると思います
tensorflowにも、resize_imageという関数があります
当然のことですが、圧縮すれば画像に含まれる情報が減ります
それにどの程度のリスクがあるのか、確かめて見ました
元画像(512x512)はこれです

これを圧縮してmatplotlibを使って表示します
選択可能な4種類のアルゴリズムを試しました
(BILINEAR、NEAREST_NEIGHBOR、BICUBIC、AREA)
画像出力ではなくmatplotlibでカラーマップ表示しました
平均処理した輝度値は浮動少数値になる筈だからです
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
IMG_SIZE = 256
if __name__ == "__main__":
init = tf.global_variables_initializer()
sess = tf.Session()
with sess.as_default():
filename = './data/Class1_def/1.png'
print(filename)
imgtf = tf.read_file(filename)
img = tf.image.decode_png(imgtf, channels=1)
resized01 = tf.image.resize_images(img, [IMG_SIZE, IMG_SIZE], method=tf.image.ResizeMethod.BILINEAR)
array01 = resized01.eval()
resized02 = tf.image.resize_images(img, [IMG_SIZE, IMG_SIZE], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
array02 = resized02.eval()
resized03 = tf.image.resize_images(img, [IMG_SIZE, IMG_SIZE], method=tf.image.ResizeMethod.BICUBIC)
array03 = resized03.eval()
resized04 = tf.image.resize_images(img, [IMG_SIZE, IMG_SIZE], method=tf.image.ResizeMethod.AREA)
array04 = resized04.eval()
plt.figure(figsize=(10, 10))
plt.subplot(2, 2, 1)
for i in range(IMG_SIZE):
for j in range(IMG_SIZE):
plt.plot(j, IMG_SIZE - i, '.', color=cm.jet(int(array01[i, j, 0])))
print('BILINEAR' + str(i))
plt.xlim(0, IMG_SIZE)
plt.ylim(0, IMG_SIZE)
plt.xticks(color='None')
plt.yticks(color='None')
plt.subplot(2, 2, 2)
for i in range(IMG_SIZE):
for j in range(IMG_SIZE):
plt.plot(j, IMG_SIZE - i, '.', color=cm.jet(int(array02[i, j, 0])))
print('NEAREST_NEIGHBOR' + str(i))
plt.xlim(0, IMG_SIZE)
plt.ylim(0, IMG_SIZE)
plt.xticks(color='None')
plt.yticks(color='None')
plt.subplot(2, 2, 3)
for i in range(IMG_SIZE):
for j in range(IMG_SIZE):
plt.plot(j, IMG_SIZE - i, '.', color=cm.jet(int(array03[i, j, 0])))
print('BICUBIC' + str(i))
plt.xlim(0, IMG_SIZE)
plt.ylim(0, IMG_SIZE)
plt.xticks(color='None')
plt.yticks(color='None')
plt.subplot(2, 2, 4)
for i in range(IMG_SIZE):
for j in range(IMG_SIZE):
plt.plot(j, IMG_SIZE - i, '.', color=cm.jet(int(array04[i, j, 0])))
print('AREA' + str(i))
plt.xlim(0, IMG_SIZE)
plt.ylim(0, IMG_SIZE)
plt.xticks(color='None')
plt.yticks(color='None')
plt.savefig('./img/resizedImg' + str(IMG_SIZE) + '.png')
64x64にリサイズ

128x128にリサイズ

256x256にリサイズ

左上: BILINEAR
右上: NEAREST_NEIGHBOR
左下: BICUBIC
右下: AREA
IMG_SIZE=256はメチャクチャ時間かかりました
先日のトライ*1ではBILINEARで64x64に圧縮していたんですが、
元画像の傷がほぼ見えません(汗)
学習が失敗するのも納得です
AREAが元画像のテクスチャが一番残る様なので、
これを使って、かつ圧縮比を下げてみようと思います
調べてみると、AREAを除く3つのアルゴリズムでの圧縮画像は、
データ型こそfloat32になるものの、値は整数値になります
何の為に丸めているのかな、、、???
この関数は要注意です