4
4

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 5 years have passed since last update.

OpenCV+学習済みモデルで、まぁまぁな線画抽出を目指す

Posted at

TL;DR

  • そこそこな線画を目指す OpenCVの追加実験
  • 元記事+学習済み深層学習モデルを使って線画を抽出した
  • イラストは良い感じになる場合も。リアルは全くダメ
  • 自前で画像to線画のデータセットを用意して、モデルを学習できるのであればそれで良いと思う
  • 学習済みモデルおよびコードは商用不可なので注意

使用データ

線画抽出は主にイラストで行われているタスクだと思っていますが、リアル画像についても実験してみました。

イラストデータ

danbooru2018という、アニメマンガのファンアートを集めた画像データセットを使いました。
画像サイズは512x512ピクセルで、一時期話題を集めていたstyle2paintsのv3の論文にはこのdanbooruデータセットの画像を60万枚使って学習を行ったと書いていました。

style2paintsの自動着色例↓
https://twitter.com/jaguring1/status/1055103639323197441

リアル画像

リアル画像として以下のディープニコラス - Gizmodeでおなじみのニコラスケイジ氏の画像を使いました
映画『魔法使いの弟子』予告編 - Youtubeの16秒くらいの場面をキャプチャしています。
nikolas.png

画像to線画のコード

線画抽出のコードは元記事とほとんど変わらないです。
変更点は

  • 関数にまとめた
  • 近傍の数を8or24で選ぶことができるようにした

あたりです。

線画抽出.py
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

なおこの関数の実行により得られる線画はこんな感じ

スクリーンショット 2019-06-07 23.13.04.png
スクリーンショット 2019-06-07 23.17.52.png
スクリーンショット 2019-06-07 23.37.06.png

深層学習で線画を得る

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

結果

イラスト

スクリーンショット 2019-06-08 1.14.47.png
スクリーンショット 2019-06-08 1.15.23.png

リアル写真

スクリーンショット 2019-06-08 1.17.05.png

所感

イラストの一枚目はスカートの部分が途切れてしまっているが、他の部分に関しては割と上手く行っている。
リアルの方で全く上手く行っていないのもおそらく、濃淡がある一定以上強いと綺麗に抽出できるのではないかと思う。

参考

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?