
こんにちは、大阪府立大学で情報通信系の専攻をしている高です。
今回は、私が研究している「ディープラーニングによる赤外線画像のノイズ除去」をテーマに執筆します。
赤外線カメラは、対象が放射している赤外線を検知して画像化する技術で、暗所での撮影が可能などの理由で様々なところで活用されています。
しかし、赤外線画像は赤外線カメラの内部構造において技術的な問題があるため、以下の画像のように縦縞模様の特徴的なノイズが出ます。
今回やっていくのは、これをディープラーニングによって除去しようという試みです。
概要
入力データ(ノイズののったデータ)と教師データ(ノイズのないデータ)を用意し、これらをすりあわせることで教師あり学習を行いたいのですが、赤外線画像にはすでにノイズが乗っているため次のようなことを考えます。
まず、普通の(ノイズのない)画像を用意し、そこに赤外線のノイズをシミュレーションしたものを足し合わせて、これを疑似的に赤外線画像として入力データとし、元々のノイズのないデータを教師データとします。
これにより教師あり学習が可能になり、学習させたアルゴリズムで実際の赤外線画像のノイズを除去していきます。
データセットの準備
今回はcifar10と呼ばれる画像のデータセットを使います。
これは、画像認識のためのデータセットとしてよく使われており、ラベル付けされた5万枚の学習データと1万枚のテストデータが含まれています。
それぞれの画像は32×32 pixelのサイズを持ち、動物や乗り物の画像です。それぞれに10種類のラベル情報(電車だとか飛行機だとか)を併せ持っています。
画像出典:http://aidiary.hatenablog.com/entry/20151014/1444827123
今回は、そのラベルを無視して単純に5万個の画像として使います。
用意できるなら自前で画像を用意してもよいです。
ノイズ付きの教師データを作成
これに対してシミュレーションノイズを付加します。
ノイズの近似式は、S(i,j)=a^3*I(i,j)+ a^2*I(i,j)+ a*I(i,j) としてみます。
aは-0.1〜0.1を一様分布する係数で、I(i,j)は座標(i,j)におけるピクセル値です。
a等は各々調整の余地があるので色々と変えて試すことができます。
cifar10の画像と、ノイズをのせた画像の例を以下に載せます。
左が元のデータ、右が上記の式に基づいてノイズを加えたものです。
学習
教師データが完成しましたので、pythonのkerasを使って学習を行なっていきます。
kerasはテンプレートであるレイヤーを組み込んでいくだけなので、非常に簡単なコーディングによりディープラーニングが行えます。
ノイズありデータを入力データとし、畳み込みニューラルネットワークによる学習を行います。
層構造は、以下の通りに設定します。
{Convolution(32,3,3)+ReLU}×9層 {Deconvolution(64,3,3)+ReLU}×1層 {Convolution(32,3,3)+ReLU}×1層
また、出力層の活性化関数はtanh、損失関数は平均二乗誤差、最適化手法はAdamを使いました。
筆者のパソコンは、CPU:core i5-8400、GPU:GTX1060を使用し、1epochにつき1分半程度で、20epoch程回しておよそ30分かかります。GPU無しなら数日かかります。
このようなディープラーニングにより、ノイズ除去アルゴリズムが完成しました!
テスト
テストデータに対して、ノイズ画像に適用していきます。
左から、cifar10画像、ノイズあり画像、ノイズ除去画像の順です。
いかがでしょうか?
かなりきれいにノイズが除去できていることが分かります。
赤外線画像のノイズ除去に挑戦!
最後に、本物の赤外線画像のノイズ除去を試してみましょう。
左が実際の赤外線画像、右が今回作成したモデルによるノイズ除去画像です。
縦縞の線が消えて、ある程度シームレスになっていることがわかります。
これにより赤外線のノイズ除去ができました!
まとめ
今回は、赤外線画像特有の、縦方向に縞々の模様があるという特徴がありましたので、ディープラーニングにより、その特徴を抽出して除去してみました。
簡単な近似式で作ったノイズで疑似的な赤外線画像を作り学習させましたが、案外うまくできました。
みなさんも、是非いろいろな画像処理にチャレンジしてみてください!
ディープラーニングのやり方や、畳込みニューラルネットワークの仕組み、活性化関数や最適化手法など、詳しく知りたい方にはAIスペシャリスト育成コースがおすすめです!
ディープラーニングを使いこなす側になってください!