saver . restore(sess, checkpoint. model_checkpoint_path) tf. train . start_queue_runners(sess=sess, coord=coord) threads 表 2.1 の条件で学習した場合の誤差の変化が図 2.4 です。 coord . join(threads) # Wait for threads to finish . coord. request—stop() finally: epoch limit reached ' ) print('Done training except tf. errors. OutOfRangeError: break saver. save(sess, checkpoint—path, global_step=step) print('step limit %d reached' % FLAGS. max_step) if FLAGS. max_step > 0 and FLAGS. max_step く = step: saver. save(sess, checkpoint—path, global_step=step) if (step % 1@@@@ , 。 (step, loss—value)) p ri nt ( ' Step : 96d LOSS : %. 6f , 。 , if step % 1@@@ N a N ' 'ModeI diverged with toss assert not np . isnan(loss_value) , \ [train—op, global—step, toss] sess . run( step, toss—value while not coord . should_stop() : 表 2.1 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) 、ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 値 0. 開 1 128 100 開 0 1 ( グレースケール ) 第 2 章 CNN で超解像 31
MODEL . inference(tr_image_batch, is_train=True, extra_ops=extra_ops) extra_ops sr_nmages IOSS loss(sr—images, ground—truth—batch) gtobal—step tf.VariabIe(), trainabIe=Fatse) init_optimizer(FLAGS . learning_rate) opt train—op opt. minimize(loss, globat_step=global—step) tf. group(train—op, *extra—ops) 図 4.13 は、表 4.5 の条件で学習した場合の誤差の変化です。 表 4.5 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) train—op 2 3 (RGB カラ 図 4.13 誤差の変イヒ (smoothing=O. 9) 6.88-3 5.3-7 ( 総 -3 町工 0 ま 3 3 ℃ 0 コチ 3 2. C00 チ 3 1 ℃ 0 ( 辱 3 C.a コ 28- 18. 0.80 4C00k 0 BatchNormalization がないモデルと比べると幾分、誤差のバラッキが小さくなっているよう です。 図 4.14 は、評価用の画像を 2 倍に拡大後、学習済みのモデルを使って超解像処理をした結果 第 4 章 さまざまなモデル 73
def __train(file_list, patches_count, train_dir) : checkpoint—path = OS . path . join(train—dir, 'model . ckpt') math . ceil(patches—count / FLAGS . batch_size) step—of—epoch toad—image ( images, ground—truths fite list, MODEL . INPUT_SIZE, MODEL . OUTPUT_SIZE, channeIs=MODEL . CHANNELS, scaIe=FLAGS. scale, batch_size=FLAGS . batch—size / / 4 ) FLAGS. min_after_dequeue + 4 ☆ FLAGS. batch_size capacity lr—image—batch, ground—truth-batch = tf. train . shuffte—batch( [images' ground—truths] , batch size=FLAGS . batch_size, capacity=capacity, enqueue_many=True, min_after_dequeue=FLAGS. min_after_dequeue, num_threads=FLAGS . num_threads) MODEL . inference(tr_image—batch) loss(sr—images, ground—truth-batch) sr_nmages IOSS tf.VariabIe(), trainable=FaIse) gtobal—step init_optimizer(FLAGS. learning—rate) opt opt. minimize(toss, global—step=global—step) train_op config = tf. ConfigProto( at10w_soft_pIacement=True, Iog—device—ptacement=FLAGS. tog—device—ptacement) saver = tf. train . Saver(tf. global—variables()) tf. train . Coordinator() coord with tf. Session(config=config) as sess: tf. train . get_checkpoint—state(train_dir) checkpoint if not (checkpoint and checkpoint. model—checkpoint—path) : sess . run(tf. global—variables—initializer()) else: 30 第 2 章 CNN で超解像
MODEL . INPUT_SIZE, MODEL . OUTPUT_SIZE, channets=MODEL. CHANNELS, scaIe=FLAGS. scate, batch—size=FLAGS . batch—size / / 4 ) # 省略 図 4.6 は、表 4.3 の条件で学習した場合の誤差の変化です。カラー画像なので、学習に時間が かかると予想して 60 万ステップに設定しましたが、実際には、 10 万ステップ以降は大きな変化 がありませんでした。 表 4.3 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 値 2 3 (RGB カラ 図 4.6 誤差の変イヒ (smoothing=O. 9) 7 ℃び」 e ・ 3 6 き 3 5 ℃ CCe -3 3 [ 0 」 e ・ 3 2.0C0 き 3 0 CC 6 : . Ck 5C0. 20C ℃ k 100. 400. 00k 0. 縦横 510PX のカラー画像を用意しました ( 図 4.7 ) 。 一平価用の画像として、 66 第 4 章 さまざまなモデル
表 3.3 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) 、ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 1 ( グレースケール ) 図 3.17 誤差の変化 (smoothing=O. 9) 3 開 .0 開 128 0.81 2x 6. CCOe -3 5.80e -3 4.80e -3 3 ℃℃ 0 3 2.000e -3 1. 総 -3 0 、 80 10 ℃ 0 え 20 : ℃ Ok 40 k 50 、 60. : 光 k ℃ 0 イ 日 ) よ : k ℃ Ok 1 【℃ . 図 3.18 は、評価用の画像を 2 倍に拡大後、学習済みのモデルを使って超解像処理をした結果 です。 低解像度の画像にあった荒さが消えて、なめらかになっているのがわかります。また、目立 っノイズも見当たりません。 ずいぶん遠回りした気がしますが、ようやく、 CNN を使った超解像のモデルができました。 第 3 章 超解像奮闘記 57
weights—shape=[5, 5 , 64 , 32 ] , weight—stddev=le-l, biases—shape=[32] , biases—vatue=@ . @, st ri des= [ 1 , 1 , 1 , 1 ] , padding='VALID') tf. nn . reIu(conv2) conv2d( 'conv3' input_Iayer=conv2, weights—shape=[5, 5 , 32 , weight—stddev=1e—3, biases—shape=[CHANNELS] , st ri des= [ 1 , 1 , 1 , 1 ] , padding='VAL 工 D') tf. nn . sigmoid(conv3) 1 ( グレースケール ) conv3 conv3 conv2 図 42 は、表 4.1 の条件で学習した場合の誤差の変化です。 return conv3 CHANNELS] , biases value=@ . @, 表 4.1 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 図 4.2 誤差の変化 (smoothing=O. 9) 000 5 ℃ 00e -3 0.018 0.0150 0.02C0 0025 つ 00 三 ) ン 値 0. 開 1 128 300 , 開 0 1 CC :. 150. 28 し 250. ⅸ 第 4 章 3 〔 00 ス . さまざまなモデル 61
図 . 畳み込み層にパティングを設定したモデル convl 33X33X1 9X9X64 ReLU 1 ( グレースケール ) 1XIX32 conv2 ReLU 図 3.7 は、表 3.1 の条件で学習した場合の誤差の変化です。 70 ℃ Ck conv3 5X5X1 ユ 0 ReLU 表 3.1 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 図 3.7 誤差の変化 (smoothing=O. 9) 値 0.81 128 18 ( 期 ) 4.5 ユ第 -3 4. 工 Ce -3 3 5 こ℃ e -3 3 工℃ e -3 2 、ツェ e -3 2. よて : e -3 1 5 こ Ce ・ 3 1 ℃ e -3 5 0 : e -4 0.8 です。 C. 00 こ 1000k 20 に Ck 30CCk 400 こ 50 」 を). Xk 33X33X1 1 : 8. Ok 46 図 3.8 は、評価用の画像を 2 倍に拡大後、学習済みのモデルを使って超解像処理をした結果 超解像奮闘記 第 3 章
return result—file, padded-file 畳み込み層を通るときに失われるピクセル分、出力サイズは小さくなります。出力プロック が小さくなる分、画像の左端と上端のピクセルが失われます。 関数 --calc-padding を変更して、付加するパディングを 1 プロック ( スライド幅 ) 分加算 します ( リスト 3.7 ) 。 さらにリスト 3.6 の関数ーー srcnn を、パディングを取り除く前に、パディングの量を再計算 するように変更します。 リスト 3.7 : srcnn/eval.py catc—padding(image, stride) : def strideCINDEX_VERTICAL] \ padding—vertical image . height % stride[INDEX—VERTICAL] stride[INDEX_HORIZONTAL] \ image. width % stride[INDEX_HORIZONTAL] padding—horizontal # パディングを追加 padding—vertical + = stride[lNDEX—VERTICAL] padding—horizontat + = stride[INDEX—HORIZONTAL] padding padding[INDEX padding[INDEX paddingC 工 NDEX PADDING_LEFT] PADDING_TOP] padding—horizontal / / 2 padding—vertical / / 2 PADDING_RIGHT] padding[INDEX_PADDING_BOTTOM] return padding padding—horizontat \ padding[INDEX_PADDING_LEFT] padding—vertical \ padding[INDEX_PADD 工 NG—TOP] 図 3.11 は、表 32 の条件で学習した場合の誤差の変化です。 表 3.2 : 学習条件 条件 画像の倍率 (scale) 学習率 (learning-rate ) ニバッチサイズ (batch_size) ステップ数 (max_step) チャンネル数 (CHANNELS) 値 2x 0. 開 1 128 1 開Ⅱ ) 1 ( グレースケール ) 52 第 3 章超解像奮闘記
m a 1 n name tf. app . run() 表 4.2 : 画質指標の比較 モデノレ BICUBIC mode1915-sigmoid mode1955-sigmoid SSI M 0.85 0. 18 0 29 PSNR 21. 跖 23.20 23.18 モデル 9 ー 1 ー 5 とモデル 9 ー 5 ー 5 を高解像度画像と比較した結果は、表 value-models の通りで す。 PSNR はわずかながら低下しています。一方、 SSIM では向上していますが、どちらも誤差 の範囲内のように思えます。 カラー画像対応 モデルを 3 チャンネル (RGB) のカラー画像を処理できるように変更します。 リスト mode1955—sigmoid-color は、定数 CHANNELS を変更することで 3 チャンネル (RGB) に 対応したモデルを構築します。関数 inference は、リスト 4.1 と同じです。 リスト 4.3 : srcnn/modeI/mode1955—sigmoid—color. py 'mode1955_sigmoid_coIor' NAME INPUT S 工 ZE 33 INPUT SIZE OUTPUT SIZE CHANNELS # 関数 inference は、 m0de1955 ー sigmoid . py のものと同じ 画像の読み込みの際、引数 channels にチャンネル数の値を指定していたことを思い出して ください ( リスト 4.4 ) 。モデルの定数を変更すると、自動的に 3 チャンネルの画像として読み込 まれます。 リスト 4.4 : srcnn/train. py train(fite_list, patches—count, train—di r) : def checkpoint—path = OS. path. join(train—dir' 'modet. ckpt') step—of—epoch = math. ceil(patches—count / FLAGS. batch—size) ( 5 ー 1 ) ( 5 ー 3 load—image( images, ground—truths fite tist, 65 第 4 章さまざまなモデル
ムを検討するようにしてます。 リスト 2.5 : srcnn/train. py def __init_optimizer(learning_rate) : tf. train. AdamOptimizer(Iearning_rate) opt return opt 学習の実行 関数 __train は、これまで作成したプログラムを使ってモデルの学習を行います ( リスト 2.6 ) 。 load-image で学習データの画像を読み込み、 images と ground_truths を得ます 次に、 tf. trai n . shuffle_batch を通してミニバッチの数だけまとめた学習データを MODEL . inference に与えます。 得られる結果 (sr-images) が、超解像処理を施した画像です。 sr—images と ground—truth—batch の誤差を計算 (__toss して、 opt . minimize で 誤差が小さくなるようにパラメーターを更新します。 リスト 2.6 : srcnn/train. py tf. app . flags . FLAGS FLAGS tf. app . ftags . DEFINE—string('image_dir' tf. app . flags. DEFINE_integer('batch_size' None, " 学習画像のディレクトリ " ) 128 " ニバッチのサイズ " ) 0 . 001 , " 学習率 " ) tf. app. flags. DEFINE—float('learning_rate' tf. app. ftags. DEFINE_string('train_dir' . /train_sr' " 学習結果を保存するディレクトリ " ) tf. app. flags. DEFINE_integer('scate' 第 2 章 CNN で超解像 MODEL = m0de1915 # 使用するモデルを設定 tf. app . flags . DEFINE—integer('max_step' , ー 1 , " 学習する最大ステップ数 " ) 16 , " 処理するスレッド数 " ) tf. app . ftags. DEFINE_integer('num_threads' " dequeue をはじめるサンプル数 " ) 30000 , tf. app. flags. DEFINE—integer('min_after—dequeue' " op が実行されるデバイスを表示するかを選択 " ) Fatse, tf. app. flags. DEFINE—bootean( 'tog—device_placement' 29