機械学習によるイラストへの自動影付け(ShadeSketch)を試してみる

少し前にITニュースサイトで手書きの線画に影を付け加えるソフトウェアが取り上げられていました。これは既存の影が塗られているイラストを機械学習させ、その学習結果を任意のイラストに反映させるというものです。

デモンストレーションのサイトでは、その機能を手軽に試せるのですが、いかんせんブラウザで動作させるプログラムなので、そこそこ性能のあるパソコンでも結果の取得に時間がかかってしまいます。

と、いうわけで、オリジナルのプロジェクトをWindowsパソコンで直接動かせる環境を構築して、いろいろと試してみることにしました。

まずはGitHubのプロジェクトページにいって、ソースコードをダウンロードし、そのzipファイルを展開します。
おなじGitHubサイトの説明欄の「Models」の「Google Drive」のリンク先においてある、学習データ(linesmoother.pb,lineshader.pb,linenorm.pb)をダウンロードし、展開したフォルダー内の「models」にコピーします。
続いて開発環境を導入します。インストールするPythonは64bit版(amd64)である必要があります。記事執筆時時点ではTensorflowがPython 3.9に対応していないので、ここでは3.8.6を導入しています。
Windows Power Shellを開いて、機械学習に必要な関連ライブラリーをインストールします。Tensorflowのwhlリンクが切れているときは、対象のファイルリストから取得した新しいリンク先に置き換えてください。
py -m pip install -U pip pip install --upgrade pip pip install opencv-python pip install scipy pip install --upgrade https://files.pythonhosted.org/packages/61/e1/1e713485caee272e7be779ac10bb0cec36ace3d9f981e067a9105a736791/tensorflow-2.3.1-cp38-cp38-win_amd64.whl
これで準備は完了です。それではイラストに影をつけてみましょう。PowerShellのcdコマンドでプロジェクトファイルのフォルダーに移動したら、以下のコマンドを実行すると、「val」フォルダー内にあるすべての画像を取得し、その結果画像を「output」に保存します。「python ./predict.py --use-smooth --use-norm」のように追加の学習データを指定すると、より精細な結果が得られます。
PS C:\shadesketch> python ./predict.py

「python ./predict.py --direction 810」のようにdirectionオプションを指定すると光源の位置を変更できます。数字の1桁目は画像に対する位置(1~8。下の表を参照)で、2桁目は奥行き(1が手前、2が中央、3が奥)になります。

812
703
654


手元にあったイラスト画像(オリジナルのサイズは1156x2570px)を実行してみた結果がこちらです。
一見綺麗に見えますが、拡大してみると、影がギザギザしているのがわかります。
これは、元の画像を縮小したうえで、生成した影の画像を拡大して合成しているためです。通常は320ピクセル四方へと縮小しているのですが、かといって画像サイズを維持したままであれば綺麗な結果を得られるかと言えば、そうはいきません。元のサイズが大きくなるほど、計算量とメモリーの使用量が爆発的に増大してしまいますし、そもそも学習データに使っている画像のサイズも大きくないため、高解像度に対する結果が得られにくいのです。
(高解像度のまま実行した例)

生成結果は荒いものの、服の立体感に対する影が反映されているなど、全体的な見た目はまずまずなので、作画の補助として使ってみるのも良いかもしれません。

ちなみに、predict.pyの142行目あたりを以下のように書き換えると、線画のない、影だけの画像を出力することができます。
comp.py
                #comp = 0.8 * img + 0.2 * shade
                comp = shade
2020/10/07