Introduction
線画着色については以前にも記事を書いたことがあるのですが、この記事内では色のヒントを与えずに線画だけを与えて着色しようとしていました。私の学習方法の所為もあると思いますが、この方式では着色結果の色のバリエーションが少なく、単一色に陥ってしまうイラストが多くなっていました。そこで、下図のように線画に色のヒントを与えて単一色にならないようにしました。方式自体はPaintsChainerやStyle2Paintsでも用いられているので目新しいものではないですが、備忘録も兼ねて紹介いたします。
Network Architecture
今回はこの論文を参考にしました。論文で使用しているネットワーク構造を以下に示します。着色の役割を担うGeneratorとその着色の真偽を見分ける役割を担うDiscriminatorを用意します、従ってベースとしてはpix2pixです。ネットワークには外部から以下の三つを与えます。
- Line Art。学習時には、着色画像に対してXDoGを適用する。
- Color Hint. 線画に色のヒントを与えたもの。学習時の作り方としては、正解着色画像に対してマスクをかける。マスクの作り方としては、(0,1)の一様分布U、平均1標準偏差0.005の正規分布Nを用意し、U > Nの部分で値を持つようなマスクを作る。そのマスクをかけたものを線画に与える。
- 線画特徴量。線画をIllustration2Vec(6th ConvolutionのReLU出力)に通したもの。Generatorだけでなく、Discriminatorにも与えます。
GeneratorのベースはUNetです。ダウンサンプリングの過程でLine ArtとColor Hintを与え、中間状態に線画特徴量を与えます。その後アップサンプリングという過程を経ます。アップサンプリングでは、ResNeXt Blockを通してPixel Shufflerを行なっています。
以上の論文を元に用いるネットワーク構造を以下に示します。まず、Generatorは下図です。
参考にした論文との違いとしては
- アップサンプリングにはResNeXt +Pixel Shufflerではなく、Nearest Neighbor Upsampling +Convolution
- ダウンサンプリング後にResidual構造を挟んでいる
- 線画特徴量の抽出方法としてIllustration2Vecではなく、VGG16を用いている
- Color Hintの与え方としては、上記のマスクを作る方法ではヒントが点状に与えられるため、下図のように線状に与えるようにした。縦、横、斜めの線を考慮している。
上記論文では線画をダウンサンプリングしたものからヒントを作っているが、今回は線画からそのままヒントを作り入力に与えている。また、作ったヒントをダウンサンプリングしたものも同様に与えている。
次にDiscriminatorの構造を下図に示します。あまり目立った特徴はありませんが、注意としてはGeneratorとは異なりBN等のNormalizationを一回も入れていないです。元々上記論文では、GeneratorにもNormalizationを入れなかったのですが同じことをすると重みが発散してしまったためGeneratorにはBNを入れています。
Dataset
今回データセットとしては、KaggleのTagged Anime Illustrationsを使いました。このデータセットは512✕512サイズの画像が30万枚ほどあります。学習時には、512✕512からランダムに224✕224をクラップしました。
Experiment
上記で構成したデータセットを用いて学習を行います。損失関数としては、上記論文では、Perceptual lossやGradient Penaltyを用いていましたが今回はシンプルにContent lossとAdversarial lossを用いました。Content lossとしては平均絶対値誤差を用いています。以下実験の詳細を示します。
- バッチサイズは16
- Adversarial lossとContent lossの重みはそれぞれ0.01と1.0
- 最適化手法はAdam(α=0.0002、β1=0.5、β2=0.99)
Result
それでは着色結果を見ていきます。まず、テスト用画像に対して、学習時と同様にヒントを与えた時の結果を下図に示します。ちゃんと与えた色通りに着色が出来ていますね。
次に、こちらで適当なヒントを与えた時の着色結果を下図に示します。
一気に三枚ほど示しました。大局的に見ればうまく塗れています。しかし、上から一枚目の画像のように、単色での着色領域が広い部分ではうまくいってるのですが、二枚目のキャラクターの髪のように細かい部分は塗れていないです。また、三枚目の画像のようにリボンの部分がはみ出して色の漏れがあるものもありました。
以上のように大まかに見れば、こちらが与えたヒント通りに塗れていますが、細かい領域がちゃんと塗れていなかったり、色がはみ出してしまったり等粗が目立つ結果になりました。
Future Works
上記結果から細かい部分はうまく着色が出来なかったり、色がはみ出してしまうということが分かりました。次からはこの問題に対処して綺麗な着色を目指していきます。そこで、Style2Paintsを参考にします。
下図にStyle2Paints論文にある、Style2Paintsのフローを示します。このTraining Phaseの(b)のRefinement Stageを行っていきます。即ち、まず大雑把に着色した結果に対してそれを補正するようなネットワークを加えます。
では、Refinement Stageで具体的に何をするか説明します。Refinement Stageでは特異なネットワークを用いてる訳ではなく、特異な損失関数を計算している訳でもありません。特筆すべきは、大雑把な着色結果を入力にし、綺麗な着色結果を生成するときの、大雑把な着色結果をどのように大量に作るかという事です。即ちData Augmentation手法です。論文中では5章で詳細に説明していますが、主に3つの手法を用いています。それぞれについて説明します。
- Random region proposal and pasting
以下の図のように、学習対象の画像とは別の画像からランダムに領域を切り出したりセグメンテーションしたものを集めて、学習対象の画像に貼り付けます。これにより本来あるべきの色の間違いを助長していると述べられています。
- Random transform
Spatial Transformer Networkを用いて学習対象の画像を変形します。これにより、ぼかしや色の歪みを助長していると述べられています。
- Random color spray
スプレーのようにある色を学習対象の画像に対して吹き付ける手法です。これにより、色がはみ出るのを助長していると述べられています。
以上のようなData Augmentationを行なったものをRefinement Stageの入力に与え、補正をしていきます。従って、Style2Paintsのこの機構を参考に次は補正を行なっていきたいです。勿論、一つのネットワークで補正も含めた着色が出来るのが理想ですが….
Summary
今回はヒントを与えた線画着色を行いました。PaintsChainerやStyle2Paintsには遠く及ばないですがそれに類するものが出来て取り敢えずは一安心です。次は補正を行うようなネットワークを追加して、より綺麗な着色を目指していきたいです。
というか初めから、ヒントを与える方式にすれば良かったですね….