印刷物撮影時の影と映り込みの除去をCNN(畳み込みニューラルネットワーク)で学習し、WEBに実装しました。
さらっと概要だけ紹介したいと思います。
#なぜ作ったか
ある時、預金通帳のコピーが必要になりました。
預金通帳は実家置いてきていたので、母親に写真を撮って送ってもらいました。
ああ、影と映り込みが…
この場合は特に映り込みで名前が見にくい…(モザイクで皆さんにはわからないけど)
あと、
Twitterとかでも、紙に描いたイラストに影が生じちゃってる投稿、見たことありませんか。
(大好きなごきげんパンダを描きました)
自分は写真が趣味なので、光源の位置を考えて撮ろうと思いますが、
そうじゃない人は多いのでは、と思いました。
印刷物の撮影時に生じた影と映り込み除去したいな〜
研究した。
せっかくの成果物なのに、HDDに封印するのもったいない…
…webに実装しよう!
#除去手法の概要
こんな感じのCNN構造を提案しました。
除去復元ネットワークと言います。
除去ネットワークは、入力画像から、影または映り込みを除去します。
復元ネットワークは、除去ネットワークの出力画像から、影または映り込みを復元します。
そして、GANのように除去ネットワークは復元ネットワークに復元されないように敵対して学習します。
今回は除去ネットワークと復元ネットワークをそれぞれU-Netで構築しました。
この除去復元ネットワークには、強力な除去効果がありましたが、出力画像がぼやけると言う問題点を抱えていたので、通常のGANのようにディスクリミネータを追加しときました。
これで強力な除去はそのままに、少しはぼやけが改善しました。
また、領域情報の考慮(印刷物のマスク画像も入力すること)で除去精度を向上させました。
#web実装の概要
みんなが使えるようにwebで動かしたい!サーバが必要!
CNNはTensorFlowで実装しました。pythonなので、python動く無料レンタルサーバ検索したら、PythonAnywhereというサイトを見つけました。
TensorFlowも標準で使えて良さそう。
こちらのサイトで使い方がとても分かりやすく紹介されています。
このサイトを参考にpythonのウェブフレームワークのFlaskで構築しました。
フロントとのやり取りはjinja2で行います。
##TensorFlow実装時の問題点
一方、PythonAnywhereにTensorFlowで構築したCNNのコードをアップしたはいいものの、問題がありました。
今までTensorFlowのバージョンは1.10.0を使っていたのですが、
PythonAnywhereの標準で入っているバージョンは2.0.0でした。
コードを変えるのはめんどうなので、
PythonAnywhereのコンソールからpipでダウングレードを試みました。
しかし、
無料版で与えられた容量512MBでは、インストール中にギリギリ容量が足らなくなり、
Disk quota exceeded
と表示され、失敗に終わりました。
TensorFlowはインストール時にnumpy等の必要ライブラリも同時インストールするみたいなので、必要ライブラリを全部インストールしてから、最後にTensorFlowをインストールしてみましたが、容量不足。
Virtualenvで仮想環境を新しく作ってインストールしてもやっぱり容量不足。
無課金者には厳しいPythonAnywhere。
もう諦めて、2.0.0仕様にコードを書き換える事にしました。
幸い、だいたいは
「tf.xxx」
↓
「tf.compat.v1.xxx」
と書き換えるだけで動きました。
という流れで作りました。
「マスク画像作成画面」では、
・canvasで画像の描画とクリック位置を取得
↓
・除去開始ボタンでクリック位置の配列をpythonに渡す
↓
・配列からopencvでマスク画像の作成
↓
・入力画像とマスク画像を(サイズは最大800pixにして)CNNへ入力
を行っています。
CNNの実行が終了次第、「除去の結果画面」に遷移します。
「除去の結果画面」では、
さらに影or映り込みを除去したいという場合の為に、
画面上部の除去ボタンから、さらに除去出来ます。
(1度で除去できなくても、何度かやると除去できることがあります。)
#実装した後の感想(言い訳)
除去開始ボタンを押してから、表示までは10~20[s]くらい。
CPUで動いてるから遅いのはしょうがない。
学習時は224×224pixの小さい画像サイズで学習していたためか、
大きなサイズの画像を入力すると、不自然なモヤがでてきたり、除去精度が悪くなったりした。
もっといいGPUがあれば、大きな画像サイズで学習し直したい。
このweb実装を見て、CNN応用の一例としてこんなのがあるんだ、と知ってもらえたらいいです。
除去結果が気に入らなければgoogleのPhotoScanという素晴らしい、スマートフォンアプリがあるのでそっちを使ってください。