画像ノイズ除去のための畳み込みオートエンコーダ

「オートエンコーダで簡単に異常検出」で、オートエンコーダが寸法削減や画像ノイズ除去に広く応用されていると述べました。 それ以来、多くの読者から、オートエンコーダーを使った画像ノイズ除去の話題を取り上げられないかという問い合わせがありました。 7058>

画像データのモデリングは、ニューラルネットワークの世界では特別なアプローチが必要です。 画像データをモデル化するための最もよく知られたニューラルネットワークは、Convolutional Neural Network(CNN、またはConvNet)、あるいはConvolutional Autoencoderと呼ばれるものです。 この記事では、すべての読者が画像データの分野にいるわけではないので、画像データのための穏やかな紹介から始めます(すでに精通している場合は、そのセクションをスキップしてください)。 そして、画像データ用の簡単な標準的なニューラルネットワークを説明します。 これにより、なぜ畳み込みオートエンコーダが画像データを扱うのに好ましい方法であるかを示す機会を得ることができる。 特に、Convolutional Autoencoderがどのように画像のノイズを減らすかを説明する。 この投稿では、KerasモジュールとMNISTデータを使用しています。 ノートブックはこのリンクから入手できます。 Keras は、Python で書かれた高レベルのニューラルネットワーク API で、TensorFlow の上で実行することが可能です。 この投稿は、以前投稿した「画像認識とは何か」の延長線上にあるもので、ぜひご覧ください。

大まかに3つのデータカテゴリーについて触れておくとよいと思います。 3つのデータ分類とは (無相関データ(シリアルデータとの対比)、②シリアルデータ(テキストや音声ストリームデータも含む)、③画像データです。 ディープラーニングは、各データカテゴリーに対応するために、3つの基本的なバリエーションがある。 (1)標準的なフィードフォワードニューラルネットワーク、(2)RNN/LSTM、(3)CNN(Convolutional NN)です。 各タイプのチュートリアルをお探しの読者の方は、(1)は「回帰に強いディープラーニングを解説」、(2)は現在掲載中の「株価予測におけるRNN/LSTM/GRUの技術解説」、(3)は「PyTorchによるディープラーニングは拷問ではない」「画像認識とは」「オートエンコーダーで異常検出を簡単に」「画像ノイズ低減の畳み込みオートエンコーダー」などがオススメです。 まとめ記事「データマンの学習パス~スキルを身につけ、キャリアを磨く~」をブックマークできます!

画像データを理解する

画像は、図(A)のように「ピクセル」で構成されています。 白黒画像では、各画素は0から255までの数字で表現されます。 現在の多くの画像は24ビットカラー以上を使用しています。 RGBカラー画像とは、1画素の色が赤、緑、青の3色の組み合わせで、それぞれ0〜255の色で表現されていることを意味します。 RGBカラーシステムでは、このRGBカラージェネレーターのように、赤、緑、青の色の組み合わせからすべての色を構成しています。 7058>

図(A)

横800ピクセル、縦600ピクセルで800×600=48万ピクセル=48万ピクセル(メガピクセル=100万ピクセル)の画像となります。 解像度1024×768の画像は、1024列と768行のグリッドなので、1024×768=0.78メガピクセルになります。

MNIST

MNISTデータベース(修正国立標準技術研究所データベース)は手書き数字の大規模データベースで、さまざまな画像処理システムのトレーニングによく使用されます。 Kerasのトレーニングデータセットは6万レコードで、テストデータセットは1万レコードである。 各レコードは28×28ピクセルです。

どのように見えるのでしょうか。 matplotlibとその画像機能imshow()を使って、最初の10レコードを表示してみよう。

学習用に画像データを重ねる

モデル学習用のニューラルネットワークのフレームワークに合わせるために、28×28=784個の値すべてを1列で重ねられるようにするのです。 最初のレコードの積み重ねられた列は次のようになります。 (x_train.reshape(1,784)を使用):

図 (B) のようになる。 値の一部

次に、図(B)に示すように、標準的なニューラルネットワークでモデルを学習させることができます。 784個の値のそれぞれが入力層のノードとなる。 しかし待てよ、データを積み重ねるときに多くの情報を失ってはいないだろうか? そうなんです。 画像の空間的・時間的な関係が捨象されてしまったのです。 これは大きな情報損失です。 それでは、畳み込みオートエンコーダがどのように空間的、時間的情報を保持できるのか見てみましょう。

図(B)

Why Are Convolutional Autoencoders Suitable for Image Data?

データの切り出しや積層を行うと大きな情報損失が見られることがわかりますね。 コンボリューションオートエンコーダは、データを積み重ねるのではなく、入力された画像データの空間情報をそのままに、コンボリューション層と呼ばれる部分で情報を緩やかに抽出します。 図(D)は、平坦な2次元画像から太い正方形(Conv1)を抽出し、さらに長い立方体(Conv2)、さらに長い立方体(Conv3)へと続いている様子を示している。 この処理は、データの空間的な関係を保持するためのものである。 これがオートエンコーダーにおける符号化処理である。 中央は、隠れ層が10ニューロンで構成される完全連結型オートエンコーダである。 その後、立方体を平坦化し、2次元の平面画像にするデコード処理がある。 図(D)では、エンコーダーとデコーダーは対称になっている。 対称である必要はありませんが、「オートエンコーダによる異常検出を簡単に」で説明したように、多くの実務家はこのルールをそのまま採用しています。

図(D)

コンボリューションオートエンコーダの仕組み

上記のデータ抽出は魔法のような感じがしますが、どうですか。 実際はどうなのでしょうか? それは、次の3つの層が関係しています。 畳み込み層、リル層、プーリング層です。

図(E): 特徴マップ
  1. コンボリューション層

コンボリューションステップでは、特徴マップと呼ばれる多くの小さな断片、あるいは図(E)の緑、赤、紺の四角のような特徴を作成します。 これらの正方形は入力画像の画素間の関係を保存する。 図(F)のように、各特徴が元画像を走査するようにします。 このようにスコアを生成する処理をフィルタリングと呼ぶ。

図(F): フィルタリング処理

元画像をスキャンした後、各特徴は、図(G)に示すように、高いスコアと低いスコアを持つフィルタリング画像を生成する。 完全に一致するものがあれば、そのマスに高得点が存在する。 一致するものが少ない場合や、一致しない場合は、スコアは低いか0となる。 例えば、赤い四角は、元画像の中から特徴量と完全に一致する部分を4つ見つけたので、その4つの部分のスコアが高い。

Figure (G)

フィルターが多いと、モデルが抽出できる特徴量の数は多くなります。 しかし、特徴量が多ければ多いほど、学習時間が長くなる。

1.1 Padding

特徴はどのように一致を判断するのでしょうか。 ハイパーパラメータの1つにPaddingがあり、2つのオプションがある。 (i)特徴に合うように元画像をゼロでパディングする、(ii)元画像の合わない部分を削除して有効な部分を残す。

1.2 Strides

畳み込み層にはもう一つのパラメータ、ストライドがある。 これは入力マトリックス上を移動するピクセル数である。 ストライドが1の場合、フィルタは一度に1ピクセルずつ移動します。 Kerasのコードではハイパーパラメータとして見ることになります。

2.ReLUs Step

Rectified Linear Unit (ReLU) は、典型的なニューラルネットワークのステップと同じものです。 これは、数学が正しく動作することを保証するために、任意の負の値をゼロに整流する。

3. Max Pooling Layer

プーリングは、画像サイズを縮小するものである。 図(H)では、プールサイズと呼ばれる2×2のウィンドウがフィルタリングされた各画像をスキャンし、その2×2のウィンドウの最大値を新しい画像の1×1の正方形に割り当てています。 図(H)に示すように、最初の2×2ウィンドウの最大値は高得点(赤で表現)であるため、高得点を1×1マスに割り当てる。

Figure (H): 最大値プーリング

最大値を取る以外に、あまり一般的ではないプーリング方法には、平均プーリング(平均値を取る)または合計プーリング(合計を取る)があります。

図 (J)

プール後、小さいフィルタ画像のスタックが新しく生成されました。 ここで、図(J)に示すように、より小さなフィルタリングされた画像を分割し、リストに積み重ねる。

Kerasにおけるモデル

上記の3つの層は、畳み込みニューラルネットワークのビルディングブロックである。 Kerasには以下の2つの機能があります:

コンボリューションオートエンコーダでは、多くのコンボリューションレイヤーを構築することができます。 図(E)では、エンコード部分にConv1、Conv2、Conv3というラベルのついた3つの層があります。

  • 以下のコードでは、入力2次元画像が28×28であることを宣言します。
  • そして、Conv1, Conv2, Conv3の3層を構築します。
  • Conv1がConv2の中にあり、Conv2がConv3の中にあることに注意してください。はフィルターが入力画像とうまく適合しなかったときにどうするか指定されています。 padding='valid'はフィルタが合わないときに画像の一部を落とすこと、padding='same'は画像に合うように0を詰めることです。

そして続けて復号化処理を追加しています。 そのため、以下のdecodeの部分には、すべてのエンコードとデコードがあります。

Keras apiは、モデルと最適化手法の宣言を必要とします:

  • Model(inputs= input_img,outputs= decoded):モデルは、入力データinput_imgを与えられた出力 decodedの計算で必要となるすべてのレイヤーが含まれているでしょう。 compile(optimizer='adadelta',loss='binary_crossentropy'): オプティマイザは、勾配ディセントが行うような最適化を実行します。 代表的なものとして、stochastic gradient decent (SGD), Adapted gradient (Adagrad), Adagradの拡張版であるAdadeltaがあります。 詳しくはKeras optimizerのドキュメントを参照してください。 損失関数はKeras lossesのドキュメントにあります。

以下、入力と出力としてx_trainを使ってモデルを学習しています。 batch_sizeはサンプル数、epochは反復回数です。 各エポックの前に学習データをシャッフルする必要があるのでshuffle=Trueを指定しています。

最初の10枚の元画像と同じ10枚の画像に対する予測値をプリントアウトすることができます。

How to Build an Image Noise Reduction Convolution Autoencoder?

画像ノイズ除去はノイズデータを入力、それぞれのクリアデータを出力としてモデルを学習するという考え方です。 上のモデルとの違いはこれだけです。 まず、データにノイズを加えてみましょう。

最初の10枚のノイズ画像は次のようなものである。

そして、ノイズのあるデータを入力、クリーンなデータを出力としてモデルを学習させる。

最後に、最初の10枚のノイズの多い画像と、それに対応するノイズ除去の画像をプリントアウトします。

このリンクから notebook を入手できます。

Are any pre-trained CNNs Code that I can use?

はい、コードを学ぶことに興味があれば、Keras には Xception、VGG16、VGG19、ResNet50、InceptionV3、InceptionResNetV2、MobileNet、DenseNet、NASNet、および MobileNetV2 などのいくつかの事前学習済みの CNNs が用意されています。 この大規模な画像データベースImageNetは、研究目的で投稿したり、ダウンロードしたりすることができます

コメントを残す

メールアドレスが公開されることはありません。