TL;DR
- そこそこな線画を目指す OpenCVの追加実験
- 元記事+学習済み深層学習モデルを使って線画を抽出した
- イラストは良い感じになる場合も。リアルは全くダメ
- 自前で画像to線画のデータセットを用意して、モデルを学習できるのであればそれで良いと思う
- 学習済みモデルおよびコードは商用不可なので注意
使用データ
線画抽出は主にイラストで行われているタスクだと思っていますが、リアル画像についても実験してみました。
イラストデータ
danbooru2018という、アニメマンガのファンアートを集めた画像データセットを使いました。
画像サイズは512x512ピクセルで、一時期話題を集めていたstyle2paintsのv3の論文にはこのdanbooruデータセットの画像を60万枚使って学習を行ったと書いていました。
style2paintsの自動着色例↓
https://twitter.com/jaguring1/status/1055103639323197441
リアル画像
リアル画像として以下のディープニコラス - Gizmodeでおなじみのニコラスケイジ氏の画像を使いました
映画『魔法使いの弟子』予告編 - Youtubeの16秒くらいの場面をキャプチャしています。
画像to線画のコード
線画抽出のコードは元記事とほとんど変わらないです。
変更点は
- 関数にまとめた
- 近傍の数を8or24で選ぶことができるようにした
あたりです。
import numpy as np
import cv2
def get_line_drawing(fpath, neighbor=8):
n_neighbor_rows = 3 if neighbor == 8 else 5 # 8近傍か24近傍か
neighbor_matrix = np.ones((n_neighbor_rows, n_neighbor_rows), dtype=np.uint8)
gray = cv2.imread(fpath, 0)
dilate = cv2.dilate(gray, neighbor_matrix, iterations=1)
diff = cv2.absdiff(gray, dilate)
line = cv2.bitwise_not(diff)
return line
なおこの関数の実行により得られる線画はこんな感じ
深層学習で線画を得る
bobbens/sketch_simplification
このリポジトリを動かしていきます。
なぜこのモデルか
- このモデルは
ラフスケッチto線画
を学習させたモデル - OpenCVによって獲得できた粗い線画をラフスケッチと見立てて、それに対して適用すれば良いのではと思った。
インストール
pyTorchの0.4系でないと動かず、少し苦戦したので書いておく
INSTALLING PREVIOUS VERSIONS OF PYTORCHを参考にしました
また、torchvision
も現行の最新バージョンだと動かないので0.2.2
をインストールするようにします
pipの場合
$ pip install torchvision=0.2.2
$ pip install torch==0.4.1 -f https://download.pytorch.org/whl/cu80/stable # CUDA 8.0 build
使っているcudaのバージョン(nvcc -V
で確認)によって2行目は書き換えてください
例えば9.0であれば
$ pip install torch==0.4.1 -f https://download.pytorch.org/whl/cu90/stable # CUDA 9.0 build
condaの場合
$ conda install pytorch=0.4.1 cuda80 -c pytorch
実行
--img
引数に画像のパスを入れるとout.png
に結果が出てきます
python simplify.py --img /path/to/input_image
結果
イラスト
リアル写真
所感
イラストの一枚目はスカートの部分が途切れてしまっているが、他の部分に関しては割と上手く行っている。
リアルの方で全く上手く行っていないのもおそらく、濃淡がある一定以上強いと綺麗に抽出できるのではないかと思う。
参考
- 画像から線画をDeepLearningで抽出してみた: 画像to線画のモデルを構築、学習している。結果も綺麗
- そこそこな線画を目指す OpenCV: OpenCVのみで行っている記事