3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

「印刷物撮影時に生じた影と映り込みの除去」のweb実装概要

Last updated at Posted at 2020-02-08

印刷物撮影時の影と映り込みの除去をCNN(畳み込みニューラルネットワーク)で学習し、WEBに実装しました。

印刷物の影・映り込み除去

さらっと概要だけ紹介したいと思います。

#なぜ作ったか
ある時、預金通帳のコピーが必要になりました。

預金通帳は実家置いてきていたので、母親に写真を撮って送ってもらいました。
1581086282241.jpg
ああ、影と映り込みが…
この場合は特に映り込みで名前が見にくい…(モザイクで皆さんにはわからないけど)

あと、
Twitterとかでも、紙に描いたイラストに影が生じちゃってる投稿、見たことありませんか。
P_20200208_010350.jpg
(大好きなごきげんパンダを描きました)

自分は写真が趣味なので、光源の位置を考えて撮ろうと思いますが、
そうじゃない人は多いのでは、と思いました。

印刷物の撮影時に生じた影と映り込み除去したいな〜

研究した。

せっかくの成果物なのに、HDDに封印するのもったいない…

…webに実装しよう!

#除去手法の概要
こんな感じのCNN構造を提案しました。
除去復元ネットワークと言います。

img_network.jpg

除去ネットワークは、入力画像から、影または映り込みを除去します。
復元ネットワークは、除去ネットワークの出力画像から、影または映り込みを復元します。

そして、GANのように除去ネットワークは復元ネットワークに復元されないように敵対して学習します。

今回は除去ネットワークと復元ネットワークをそれぞれU-Netで構築しました。

この除去復元ネットワークには、強力な除去効果がありましたが、出力画像がぼやけると言う問題点を抱えていたので、通常のGANのようにディスクリミネータを追加しときました。

これで強力な除去はそのままに、少しはぼやけが改善しました。

また、領域情報の考慮(印刷物のマスク画像も入力すること)で除去精度を向上させました。

除去復元ネット+GANが本手法です。

18_00_result_remo_restore_shadow_cropped_page-0001.jpg
19_00_result_remo_restore_reflection_cropped_page-0001.jpg

#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」

と書き換えるだけで動きました。

##ページ遷移
ページ遷移は、
遷移画面.png

という流れで作りました。

「マスク画像作成画面」では、
・canvasで画像の描画とクリック位置を取得
         ↓
・除去開始ボタンでクリック位置の配列をpythonに渡す
         ↓
・配列からopencvでマスク画像の作成
         ↓
・入力画像とマスク画像を(サイズは最大800pixにして)CNNへ入力

を行っています。
CNNの実行が終了次第、「除去の結果画面」に遷移します。

「除去の結果画面」では、
さらに影or映り込みを除去したいという場合の為に、
画面上部の除去ボタンから、さらに除去出来ます。

(1度で除去できなくても、何度かやると除去できることがあります。)

#実装した後の感想(言い訳)

除去開始ボタンを押してから、表示までは10~20[s]くらい。
CPUで動いてるから遅いのはしょうがない。

学習時は224×224pixの小さい画像サイズで学習していたためか、
大きなサイズの画像を入力すると、不自然なモヤがでてきたり、除去精度が悪くなったりした。
もっといいGPUがあれば、大きな画像サイズで学習し直したい。

このweb実装を見て、CNN応用の一例としてこんなのがあるんだ、と知ってもらえたらいいです。

除去結果が気に入らなければgoogleのPhotoScanという素晴らしい、スマートフォンアプリがあるのでそっちを使ってください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?