まんぼう日記

takataka's diary

CNN で colorization

久しぶりの更新です.3月後半頃からめっちゃ忙しなってまいまして...

まあそれはそれとして.畳み込みニューラルネットでグレイスケール画像に色を付ける実験をやってみました.

f:id:takatakamanbou:20170815200101p:plain f:id:takatakamanbou:20170815200105p:plain

上記左の画像を入力したら,右の画像を出力するようにしたい,っちうわけです.TensorFlow で CNN 作って試してみたら,単純なネットワークでもそれなりにできました.

 

方法

カラー画像を YCbCr 色空間( YUV - Wikipedia )で表現して,Y(輝度)から Cb と Cr(二つの色差) を推定することにします.上記左の画像は,右のカラー画像の Y 成分をグレイスケールで表したもの.Cb と Cr も同様に可視化すると,こんなん.

f:id:takatakamanbou:20170815200151p:plain f:id:takatakamanbou:20170815200155p:plain

学習用のカラー画像を複数用意し,YCbCr に変換してから適当な大きさのパッチを切り出して, Y を入力,Cb と Cr を出力の教師として CNN を学習させます.

 

学習とテスト用の画像には,上記のように満開の桜の木が写ったものを 20 枚用意しました(上記はテスト画像の1つ).後で普通の木の画像も入力してみたら面白いかな〜と.

 

CNNの構成はこんなんにしました

  • 入力:  64 x 64 x 1
  • conv1:  フィルタサイズ 5x5,出力チャンネル数 16
  • conv2:  フィルタサイズ 3x3,出力チャンネル数 32
  • conv3:  フィルタサイズ 3x3,出力チャンネル数 64
  • conv4:  フィルタサイズ 1x1,出力チャンネル数 2
  • 出力:  56 x 56 x 2

convX は全て畳み込み層,全て stride は 1 で,conv4 以外は活性化関数に ReLU を用いています.conv4 のみ出力は線形(しきい値あり).畳み込み層は tf.nn.conv2d を用いて作りましたが,padding(畳み込み時に画像の外周を 0 で埋めたりすること)の悪影響(border effect と言ったりする)を受けないように,padding = 'VALID' と設定しました.そのせいで出力が入力より小さくなってます.そのため,教師を作る際も,入力と同じ大きさのパッチの中央の 56x56x2 (x2 は Cb と Cr の2チャンネル)を切り出しました.学習の評価関数は,単純な平均二乗誤差です.

 

プログラムはこちら: https://gist.github.com/takatakamanbou/88b75a2f77bee68c563a975a5b338600

ひとに使ってもらえるように作ってないので,まあ参考程度に.

 

結果

15枚の学習画像から 64x64 のパッチを 500 枚ずつ計7500枚切り出して CNN を学習させました.学習に使ってない5枚の画像から作ったデータで汎化誤差を評価してみましたが,汎化誤差は,学習回数1000回から2000回(バッチサイズ 128 で一つのバッチの学習を1回とカウント)ほどであまり変わらなくなってました.以下では,学習回数1000回の時点のネットワークを用いています.

 

ちなみに,上記の条件で CPU のみで学習した場合,1000回の学習に要した時間は20分ほどでした.Mac Pro (Late 2013),Xeon E5 3.5GHz, メモリ 64GB です.

 

桜の木の写った画像の場合

まずは,学習画像と似たような風景の画像の場合.左から入力画像,着色した画像,元画像の順です.着色画像の外周 4 画素の幅の範囲には正しい画素値が入ってます.

f:id:takatakamanbou:20170815200101p:plain f:id:takatakamanbou:20170815210312p:plain f:id:takatakamanbou:20170815200105p:plain

上の方の花びらや葉がついてない枝のみの部分が無理やり緑色にされてしまいました.学習画像には桜の花びらか緑の葉のどちらかがいっぱいついた木ばかりだったからでしょうか.右下の緑の草は,テクスチャ的に桜の花びらっぽかったのか,ほんのりピンクに.左の建物の屋根と奥の瀬田の唐橋それぞれの黄色は,完全に再現に失敗してます.

 

もう一枚.

f:id:takatakamanbou:20170815200054p:plain f:id:takatakamanbou:20170815211445p:plain f:id:takatakamanbou:20170815200058p:plain

着色画像だけ見るとうまくいってるように思えますが,元と見比べると空や水面,葦や遊歩道の色等々大嘘なのがわかります.

 

桜の木が写ってない場合

さて,今度は桜の木が写ってない画像の場合. 

f:id:takatakamanbou:20170815212126p:plain f:id:takatakamanbou:20170815212037p:plain f:id:takatakamanbou:20170815212257p:plain

予想通りのひどいありさま (^^; ほとんど桜ばっかりの画像で学習してるんやから当然ですが.

 

もう一枚.

f:id:takatakamanbou:20170815212234p:plain f:id:takatakamanbou:20170815212052p:plain f:id:takatakamanbou:20170815212316p:plain

 

とまあこんな感じです.それほど deep でない CNN での小規模な実験ですが,結果が画像で見えると楽しいので,よい練習問題かもですね. 

 

もっと?

最近の研究をいくつか紹介しときます.

 

  1. Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic Image Colorization with Simultaneous Classification, Satoshi Iizuka, Edgar Simo-Serra, Hiroshi Ishikawa, SIGGRAPH2016. 複数のネットワークを組み合わせて画像識別と colorization を合わせて学習.
  2. [1603.08511] Colorful Image Colorization, Richard Zhang, Phillip Isola, Alexei A. Efros, ECCV2016.  CIE Lab 色空間を使い,(a,b) を量子化して識別問題として扱うとかいろいろ工夫.
  3. Image-to-Image Translation with Conditional Adversarial Networks, Phillip Isola, Jun-Yan Zhu, Tinghui Zhou, Alexei A. Efros, CVPR2017. 条件付きの Adversarial Network. 色付けだけじゃなくいろいろやってる.