オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

tensorflowで画像をresizeする事のリスク

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

元画像(512x512)はこれです
f:id:changlikesdesktop:20190321063516p:plain:w400

これを圧縮して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にリサイズ
f:id:changlikesdesktop:20190321064209p:plain:w400

128x128にリサイズ
f:id:changlikesdesktop:20190321064252p:plain:w400

256x256にリサイズ
f:id:changlikesdesktop:20190321080041p:plain:w400

左上: BILINEAR
右上: NEAREST_NEIGHBOR
左下: BICUBIC
右下: AREA

IMG_SIZE=256はメチャクチャ時間かかりました

先日のトライ*1ではBILINEARで64x64に圧縮していたんですが、
元画像の傷がほぼ見えません(汗)
学習が失敗するのも納得です
AREAが元画像のテクスチャが一番残る様なので、
これを使って、かつ圧縮比を下げてみようと思います

調べてみると、AREAを除く3つのアルゴリズムでの圧縮画像は、
データ型こそfloat32になるものの、値は整数値になります
何の為に丸めているのかな、、、???
この関数は要注意です