DeepScanner
はじめに
こんにちは。結局何も書いてないので1年ぶりのはてぶです。
今回も身内向けのアドベントカレンダー用の投稿になりますが、前回は当たり障りない話しかしなかったので、今回はひとつモノを作ってみました。タイトルにある通り、Deepでスキャナーみたいなものを作ろうという内容です。
Deep詳しい方には物足りないかと思いますので、中身は少しDeepや画像編集に興味があるよって程度の人向けです。研究と冬コミ原稿の合間にちょこちょこやったものなので結果も少ないですがご了承ませ。
概要
目的としては、写真で撮った絵やドキュメントをそのままスキャンしたかのような状態の画像にしようというものです。私は未だにラフは紙に書いてからスキャンして取り込むか、写真で撮影してDropboxに突っ込んでPCから取り出して何らかの前処理をしてからペン入れをしています。スキャナ使うの面倒だし、写真で撮ったラフ(影とか裏写りとかがあるもの)を綺麗にスキャンしたようにしてくれるのがあったらいいな、できれば透過pngで出力してほしいな、と思ったのがモチベーションです。
最近だとCamScannerとか、Dropboxのアプリにも似たような機能がついてるので二番煎じ感はあるのですが、webサービスとかにしたいなあみたいな願望もあってひとまずやってみることにしました。
手法
みなさん大好き、「よっ、ディープラーニング。」ってやつです。最近のDeepによる画像変換の波はすごいですね。色付け、ラフ線画、超解像、etc. エンコーダ・デコーダタイプのネットワークの登場によって画像対画像をそのまま学習できるようになったのは素晴らしいです。今回もそれでいきます。
ネットワーク
ネットワーク構造は、当初小さめのエンコーダ・デコーダタイプのネットワークにしていたのですが、途中で解像度を落とすとどうも出力が薄くなってしまうので、超解像に使われるネットワークのように入力サイズを変えないまま畳み込んでいくネットワーク構造にしました。構造は以下の図の通りです。
- 6層の畳み込みネットワーク
- 入出力は1チャンネルのグレースケール画像で解像度は入出力で同じ
- 最終層以外はフィルタは全て32、最終層は1
- 最初の層のみフィルタカーネル11×11としてサポートを広めに確保、他は3×3
- 活性化関数は中間層ではすべてReLU、最終層のみSigmoid
データセット
「ラフや線画」を正解データ、その正解データに「影や映り込みの画像」を合成したものを入力として学習させます。解く問題としてはデノイズに近いので、Deepの問題としては比較的簡単だと思います。
データセットと呼ぶほどのものではないですが、そこそこの解像度があるラフや線画と「合成用の映り込み画像」を20枚ずつ程度用意。回転反転スケーリングしてランダムクロップして乗算して合成したものを学習させます。
学習
ロスはMSEロス、更新はADADELTAで行いました。データも少ないしネットワークも大きくないので学習は数時間程度で終わります。
結果
パッと見いい感じにスキャンした感のある出力になっていると思います。
上段の画像はめるとん様( @BlackoolongteA )よりご提供いただいております。
まとめ
ちょっと遊んでみた程度ですがわりとちゃんとできたので良かったです。もう少しデータ増やして、ドキュメントとかにも対応させてwebサービスとかにしたいなとか勝手に思ってます。とりあえず冬コミの原稿がやばいので今回はこの辺で。読んでいただきたいた方ありがとうございました。
参考文献
[1] C. Li, X. Liu, and T.-T. Wong. Deep extraction of manga structural lines. ACM
Trans. Graph., 36(4):117:1–117:12, July 2017.
[2] J. Kim, J. Kwon Lee, and K. Mu Lee. Accurate image super-resolution using very
deep convolutional networks. In The IEEE Conference on Computer Vision and
Pattern Recognition (CVPR), June 2016.