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 で超解像
convl convl conv2 conv2 conv2 conv3 conv3 conv3 batch—norm('bnl' tf. nn. retu(convl) convl, conv2d( 'conv2' extra_ops, is_train) input_layer=convl, weights—shape=[5, 5 , 64 , 32 ] , weight—stddev=le-l, biases—shape=None, biases value=@ . @, strides=[l, 1 , 1 padding='VALID') batch norm('bn2' conv2, tf. nn . reIu(conv2) conv2d( 'conv3' extra_ops, is_train) input—tayer=conv2, weights—shape=C5, 5 , 32 , CHANNELS] , weight—stddev=1e—3, biases_shape=None, strides=[l, 1 , 1 , padding='VAL 工 D') batch_norm('bn3' conv3, tf. nn . sigmoid(conv3) biases_value=@ . @, 1 ] , extra_ops, is_train) return conv3 def batch_norm(name, input, extra_ops, is_train) : リスト 4.6 : srcnn/model/model 955_sigmoid bn_color. py Batch NormaIization の処理は、関数 batch ー norm で定義しています ( リスト 4.6 ) 。 with tf. variable_scope(name) : params shape [input ・ get-shape() [ ー 1 ] ] beta variabte on_cpu( 'beta ' params_shape, initializer=tf. constant_initializer(@ . @, variable on_cpu( gamma params shape, gamma initializer=tf. constant_initializer(l . @, tf. f10at32)) tf. f10at32)) -i f -i S ra-i n : mean, varnance tf. nn . moments(input, [@, 1 , 2 ] , name= 'moments ' ) 70 第 4 章 さまざまなモデル
ⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢ コラム : 注意 Batch No 「 ma ⅱ zation を扱うときは、学習時と評価時で動作を変える必要があります。 tf . nn . batch_normalization に与える平均 (mean) と分散 (variance) は、学習時は学習データ から計算した値を使いますが、評価時には学習時に保存した値を使わなければなりません。もし mean と variance を 保存していなかった場合、今回の超解像のモデルに関して、正しい結果となりません ( 図 4.12 ) 。 図 4.12 平均 (mean) と分散 (variance) を保存 しなかった場合 なお、 tf. layers . batch normalization というレイヤーを定義するのに便利な関数が提供されています。 今後はこちらカ住流になっていくと思われますが、本書では現時点で利用例の多い tf . nn . batch normalization を使用しています。 ⅢⅢⅢⅢⅢ日ⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢ日ⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢⅢ ニバッチのデータの平均 (mean) リスト 4.6 では、学習時 (is_train が True の場合 ) は、 と分散 (variance) を求めたあと、 2 つの値をセッションに紐付く変数として保持していま す。具体的には、 moving_averages ・ assign_moving-average を使って、移動平均をとり ながら変数に assign しています。この moving_averages ・ assign—moving—average は、 独立したオペーレーションとして実行する必要があります。 これまでグラフを構築する際、最終的には 1 つの出力で済んでいました。しかし、 Batch NormaIization を使うと、複数のオペレーションを同時に実行しなくてはなりません。 そこで、リスト 4.6 では、随時引数に指定されたリスト extra_ops に追加し、学習 (opt. minimize) のオペレーションと合わせてグループ化 (tf. group) した後、まとめ て実行しています ( リスト 4.7 ) 。 リスト 4.7 : srcnn/train_bn. py train_dir) : def __train(file_list, patches—count, # 省略 72 第 4 章 さまざまなモデル
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 章 さまざまなモデル
表 4.4 画質指標の比較 モデノレ BICUBIC mode1955—sigmoid-color Batch NormaIization の導入 ( 5 ー PSNR 26. 27.57 SSIM 0.9434 0.9481 PSNR 、 SSIM のどちらも、 BICUBIC よりも高い値となりました て出力します。収束性能が向上し、小さなバッチサイズ、高い学習率で学習を進めることがで Batch Normalization は、前層からの入力をミニバッチ単位で正規化 ( 平均を 0 、分散を 1) し 図 4.11 BatchNorm を加えたモデル きると言われています。 33X33X1 convl 9X9X64 BN conv2 5X5X32 conv3 17X17X1 ReLU BN ReLU 5X5X1 BN Sigmoid 図 4.11 を見てわかるとおり、畳み込み処理と活性化関数の間に Batch Normalization を追加し ます。 リスト 4.5 は、モデル 9 ー 5 ー 5 に Batch NormaIiza ⅱ on を加えたプログラムです。 inference に 2 つの引数、 is-train と extra-ops を追加しています。 これまでの また、 biases-shape に None を設定することで、畳み込み後のバイアスの加算を行わない ように変更します。 リスト 4.5 : srcnn/modeI/modeL955_sigmoid—bn—COlor. PY 'modet955—sigm0id—bn_color' NAME 工 NPUT_SIZE 33 工 NPUT_SIZE OUTPUT SIZE CHANNELS ( 9 ー 1 ) 3 ( 5 ー def inference(lr_images, is_train=FaIse, extra—ops=[]) : conv2d( 'convl' convl input_layer=lr—images, weights—shape= [ 9 , 9 , CHANNELS, 64 ] , weight—stddev=le—l, biases shape=None, biases value=@ .@' st ri des= [ 1 , 1 , 1 , 1 ] , padding='VALID') 第 4 章 さまざまなモデル 69
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
1 . 学習データの読み込み 2 . 誤差関数の定義 3 . 最適化アルゴリズムの設定 4 . 学習の実行 # coding: UTF-8 リスト 2.3 : srcnn/image 」 oader_svs. py 像度の画像 (ground-truths) の組み合わせです。 戻り値は、 batch ー size で指定した数の学習に使う低解像度の画像 (tr-images) と、高解 ズ (input-size) 、モデルが出力する画像サイズ (output-size) を指定します。 引数に読み込む画像ファイルのリスト (jpeg-file-list) と、モデルへ入力する画像サイ リスト 2.3 の関数 load ー image は、画像の読み込み処理です。 学習データの読み込み from from from future future_ future_ import absolute_import import division import print—function import tensorflow as tf def load_image(file—list, input—size' output—size' channets=l' scaIe=2, batch—size=l) : with tf. name_scope( 'image—loader—svs' ) : 26 tf. train. string—input—producer(fite—list, filename_queue shuffte=True) reader = tf. Wh01eFiteReader() reader. read(filename—queue) value tf. image ・ decode—jpeg(value, channets=channets) nmage lr_images ground_truths for i in range(batch—size) : cropped—image = tf. random—crop( image, (input—size, input—size' channets)) tf. image . resize_images( ground—truth 第 2 章 CNN で超解像
ムを検討するようにしてます。 リスト 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
学習の実行・・ 画像処理・ パディングの付加・・ プロックに分割・・ 超解像処理・・ プロックの再構成・ 画像の保存 ( パディングの除去 ) 実行・・ ワワ -4 ・ l.n ^ 0 「 / ー 8 ワ 1 っ 0 っ 0 っ 0 00 00 っ 0 っ 0 評価 第 3 章超解像奮闘記 畳み込み処理とパディング・ 畳み込み層・・ パディングを設定する・・ 画像の読み込み処理 活性化関数 ReLU ・・ Sigmoid 関数・・ -4 -4 盟 / 4 5 浦 第 4 章さまざまなモデル・・ モデル ( 9-5-5 ) 画質の指標 (PSNR, SSIM) ・ カラー画像対応・・・ Batch NormaIization の導入・ 0 0 00 -0 参考・ あとがき・ 謝辞 著者紹介・ ・・ 76 ・・・ 78 ・・・ 78 ・・・ 81 目次 3
表 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