【ノイズ除去】kerasでノイズ除去を試してみた1【DNCNN】
はじめに
こんにちは、がんがんです。
前回、ノイズ除去を目的としたDAE(Denoising AE)に関する備忘録を書きました。
前回の記事はこちらからどうぞ。
gangannikki.hatenadiary.jp
ノイズ関連をよく扱っていた前期、ノイズ除去に関するモデルを探しているときに、こちらの記事と出会いました。
qiita.com
これを初めてみた当時は、人の目で見て分かる線もきちんと消えていることにかなり衝撃でした。
このモデルをノイズ除去に当てはめてみたらどうなるのかと思い、すぐに実験しました。
今回はそのときの実験の備忘録になります。
DNCNN
DNCNN(Denoising Convolutional Neural Network)はノイズ除去用のCNNモデルです。
中間層が15層とDeepになっているのが特徴です。
今回はCifer10にて実験を行いました。まずは実験結果から示します。
実験結果
コード
#------------------------------------------------------------ # # DNCNN(Denoising CNN)を作成 # DNCNN_cifer10_keras.py # #------------------------------------------------------------ import numpy as np import matplotlib.pyplot as plt from keras.datasets import cifar10 from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, BatchNormalization, Activation from keras.models import Model, load_model from keras.utils import plot_model from keras.callbacks import CSVLogger, EarlyStopping, TensorBoard, ModelCheckpoint import tools """ モデル """ def DNN( x_train_noisy, x_train, x_test_noisy, x_test, x_validation_noisy, x_validation, epochs, batch_size ): """ モデルの構築 """ # 入力層 input_img = Input( shape=( 32, 32, 3) ) # 32×32、RGB # 中間層 x = Conv2D( 64, (3, 3), padding='same' )(input_img) x = Activation('relu')(x) for i in range(15): x = Conv2D( 64, (3, 3), padding='same' )(x) X = BatchNormalization()(x) x = Activation('relu')(x) # 出力層 x = Conv2D( 3, (3, 3), padding='same' )(x) output_img = Activation('tanh')(x) """ モデルのコンパイル """ model = Model( input_img, output_img ) model.compile( optimizer='adam', loss='mean_squared_error', metrics=["accuracy"] ) # アーキテクチャの可視化 model.summary() # ディスプレイ上に表示 plot_model( model, to_file="architecture.png" ) """ モデルの学習 """ csv_logger = CSVLogger("./training.log") early_stop = EarlyStopping( monitor="val_loss", mode="auto" ) tensor_board = TensorBoard( "./logs", histogram_freq=0, write_graph=True, write_images=True ) check_point = ModelCheckpoint( filepath="./model/model.{epoch:02d}-{val_loss:.4f}.hdf5", monitor="val_loss", save_best_only=True, mode="auto" ) cb = [ csv_logger, check_point ] # 学習 hist = model.fit( x_train_noisy, x_train, epochs=epochs, batch_size=batch_size, shuffle=True, validation_data=(x_validation_noisy, x_validation), callbacks=cb ) """ モデルの評価 """ score = model.evaluate( x_test_noisy, x_test ) print(score) # グラフの表示 tools.plot_history( hist, epochs ) # 画像の表示 c10test = model.predict( x_test_noisy ) tools.graph( x_test, x_test_noisy, c10test ) """ データの成形、グラフ化 """ if __name__ == '__main__': # Cifer10のLoad, データの分割 num_classes = 10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() # 学習:50000, テスト:10000 x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255. x_test /= 255. x_validation = x_test[:7000] # validation_data : ( 7000, 32, 32, 3) x_test = x_test[7000:] # test_data : ( 3000, 32, 32, 3) # ノイズ付与 noise_factor = 0.1 x_train_noisy, x_test_noisy, x_validation_noisy = \ tools.add_noise( noise_factor, x_train, x_test, x_validation ) epochs = 100 batch_size = 32 # モデル関数 DNN( x_train_noisy, x_train, x_test_noisy, x_test, x_validation_noisy, x_validation, epochs, batch_size )
まとめ
今回はノイズ除去のモデルであるDNCNNについての備忘録を書きました。
卒検の関係で勉強する時間が取れずGitHubが上手く使えてません。
そのため、載せるコードが自然と長くなってしまいます…。
この実験を行った時にWin5-RBについても実験しました。
コードが長くなってしまうため、以下の記事に分けて書きました。
次の記事
Win5-RBについてはこちらからどうぞ。
(記事は後ほど)