グラフィックボードの容量の関係で、
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になるものの、値は整数値になります
何の為に丸めているのかな、、、???
この関数は要注意です