1. HOME
  2. ブログ
  3. IT技術
  4. pix2pixで白黒画像をカラー変換する

pix2pixで白黒画像をカラー変換する

pix2pix とは?

pix2pix は、画像から画像への変換に用いられます。

例えば、「白黒画像からカラー画像への変換」であったり、「ラベル画像から元画像への変換」であったりなどです。

pix2pix のメリット

では、画像 to 画像の変換ができるようになると、どんなメリットがあるのでしょうか?

例えば、デジタルイラストは線画を書いた後、ペイントツールなどで色を塗ります。

その際、細かい調整が効かなかったりするため、色塗りが大変であることは言うまでもありません。

しかし、pix2pix では画像のセットさえあれば何でも変換できるため、「線画から色のついた画像を生成する」ことができるようになります。

これが実現すれば、デジタルイラストレーターの時間効率が飛躍的に上がるようになります。

こちらの記事もオススメ!

pix2pix の学習法

Generator の学習

通常の GAN に比べ、pix2pix では直接、生成画像と正解画像を近づける項を設けます。

画像を直接近づける際の誤差関数は、「L1Loss」をとります。

pix2pix の論文でも、「L1Loss」を取っています。

【Image-to-Image Translation with Conditional Adversarial Networks】
https://arxiv.org/pdf/1611.07004.pdf

Discriminator の学習

一方、「Discriminator」は、通常の GAN と変わりません。

正解画像は「1」に近づけ、不正解画像を「0」に近づけさせ、「偽物」か「本物」かを、Discriminator が見極められるようにします。

Generatorの構造

Generator は、「U-net 構造」をとります。

U-net 構造とは?

U-net は、以下のような構造をしています。

「画像 to 画像」の変換をする際、画像がボケることがあります。

オートエンコーダのようなボトルネックがある場合、その分の次元が圧縮されてしまうため、復元が難しくなるからです。

U-net もオートエンコーダ同様、「画像to画像」の変換です。

画像の大局的な部分と局所的な部分の両方を加味することで、高解像度な画像を生成することができます。

そのため、Generator には 「U-net」を採用します。

実装時の学習

まずは、Generator を学習します。

損失関数には、「L1Loss」を加えています。

Discriminator の学習

次に、Discriminator の学習を行います。

学習時の工夫

学習が全く上手く行きませんでした。

原因の一つとして挙げられるのが、「バッチサイズ」です。

今までバッチサイズは大きければ良いと考えていましたが、どうやらバッチサイズが大きいほど過学習してしまうみたいです。

【バッチサイズは小さい方が良い】
http://marugari2.hatenablog.jp/entry/2017/12/04/174535

バッチサイズが大きいと、平均的に誤差を下げます。

そのため、二乗誤差を使った時と同様に、データセットに最も多い肌色を塗りやすくなり、他の色を使わなくなってしまいます。

そのため、学習時のバッチサイズは「1」にすることで、ようやく上手く行きました。

実験結果

さて今回は、「単純CNN で学習したモデル」と、「pix2pix で学習したモデル」それぞれで白黒画像のカラー化を行いました。

単純な CNN は、以下のリンクからコードを参照しています。

単純な CNN と pix2pix との比較

結果から見ると、「単純な CNNで 学習した場合」は人の肌色ばかり塗り、他の背景部分などは色がついていません。

二乗誤差を用いることで、平均的にピクセルレベルの誤差が小さくなれば良いため、データセットの中で最も多い「肌色」を塗っているからです。

しかし、pix2pix ではピクセル単位での誤差に加えて、画像全体としての評価も行っているため、より色合いが「鮮やか」になっていることがわかります。

損失に MSE を使った時との比較

現在、pix2pix の損失関数には「L1Loss」を使っています。

今度は、MSE つまり「L2Loss」を使ってみると結果がどうなるのか、比較してみたいと思います。

以下は、その実験結果です。

この画像から見てわかるように、色は確かに「GAN」により多様性が出てきました。

L1Loss を使った時より、L2 を使った時の方がボヤッとした色合いになっていることがわかります。

これも、損失に二乗誤差を用いていることによる弊害ですね。

GAN を用いても色のボヤッとした感じは残るようです。

というわけで、pix2pix の損失には「L1Loss」を使った方がいいという結論に至りました!

さいごに

「pix2pix」で、よりリアルな色合いのカラー画像の生成が可能になりました。

L1 と L2 で生成結果の差が出ることも確認できました。

「画像 to 画像」の変換に対して何らかのタスクを抱えている場合、pix2pix の実装は一考の価値ありです。

次回は、pix2pix の発展版である「cycleGAN」での画像変換を行いたいと思います。

(株)ライトコードは、WEB・アプリ・ゲーム開発に強い、「好きを仕事にするエンジニア集団」です。
機械学習でのシステム開発依頼・お見積もりはこちらまでお願いします。
また、機械学習系エンジニアを積極採用中です!詳しくはこちらをご覧ください。

※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

次回の記事はこちら

こちらの記事もオススメ!

実験に用いたソースコード

最後に、実験に用いたソースコードを紹介します。

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事