【ノイズ除去】kerasでノイズ除去を試してみた1【DNCNN】

はじめに

こんにちは、がんがんです。
前回、ノイズ除去を目的としたDAE(Denoising AE)に関する備忘録を書きました。
前回の記事はこちらからどうぞ。
gangannikki.hatenadiary.jp


ノイズ関連をよく扱っていた前期、ノイズ除去に関するモデルを探しているときに、こちらの記事と出会いました。
qiita.com

これを初めてみた当時は、人の目で見て分かる線もきちんと消えていることにかなり衝撃でした。
このモデルをノイズ除去に当てはめてみたらどうなるのかと思い、すぐに実験しました。
今回はそのときの実験の備忘録になります。

参考記事

こちらの記事を中心に実験しました。
qiita.com

また、論文も掲載しておきます。

  • DNCNN

https://arxiv.org/pdf/1608.03981v1.pdf

DNCNN

DNCNN(Denoising Convolutional Neural Network)はノイズ除去用のCNNモデルです。
中間層が15層とDeepになっているのが特徴です。

今回はCifer10にて実験を行いました。まずは実験結果から示します。

実験結果

f:id:gangannikki:20190126201824p:plain
上段:入力画像 中段:ノイズ付与画像 下段:出力画像

コード

#------------------------------------------------------------
#
#  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についてはこちらからどうぞ。
(記事は後ほど)