1. HOME
  2. ブログ
  3. IT技術
  4. 白黒画像を 畳み込みニューラルネットワーク(CNN)を用いてカラー化する

白黒画像を 畳み込みニューラルネットワーク(CNN)を用いてカラー化する

畳み込みニューラルネットワーク(CNN)で白黒画像をカラー化しよう

カメラができた当初、撮影された画像は、今のようなカラー画像ではなく、明度のみを考慮した白黒画像でした。

しかし、当時でも、今と変わらず現実世界に色は付いていたはずです。

その色を白黒画像から復元する技術が、白黒画像のカラー化です。

この技術は、何も思い出をありのままの姿で見るという目的だけにとどまりません。

医療における白黒画像のカラー化

普段、医療で使われている CT 画像やレントゲン写真は、もちろん白黒画像です。

それらは、どちらも放射線を照射し、その吸収率から画像を作成します。

そのため、どの部分がどの構成要素か、といったことが視認しずらくなっています。

例えば、骨と筋肉部分をカラー化できるようになれば、それだけで医師の負担も下がりますし、患者側も理解しやすくなるでしょう。

色付けを行った動画

以下は、脂肪、水、カルシウムなどの放射線吸収量を比較し、色付けを行う研究の動画です。

しかし、この動画の方法でも、ある程度は人為的な閾値が必要となります。

そのような数値なしに、与えられた画像のみから色を塗ることができれば、大幅に研究が進歩することでしょう。

以上の点から、白黒画像のカラー化の有用性がわかっていただけたのではないでしょうか。

今回の記事では、畳み込みニューラルネットワーク(Convolutional neural network: CNN)を用いて、顔画像のカラー復元を実験してみたいと思います。

実験の流れ

実験は、以下の流れに従って実施します。

  1. カラー画像を用意する。
  2. カラー画像を白黒画像に変換する。
  3. 白黒画像を入力として、カラー画像を生成するような CNN を構成する。
  4. CNN の出力と元のカラー画像との二乗誤差が最小になるようにモデルの学習を行う。

このようにして、白黒画像のカラー化を機械に学習させます。

畳み込みニューラルネットワークのネットワーク構成

正直、ネットワークは何でもいいのですが、表現力を失わないようオートエンコーダのような形はやめました。

オートエンコーダは、次元圧縮して分類などをするときのものです。

そのため、画像そのものの変換を学習したいときは逆効果になります。(と私は理解しています)

今回提案するネットワーク

私が提案したのは、以下のネットワークです

U-net などを参考にしました。

この構造にしたのは、ResNet のように、恒等写像を追加し、浅い層の特徴を深層でも使用することで、学習を早めたり、勾配消失を抑えられると考えたからです。

もっと良いモデルが有るとは思います。

ですが今回は、どんなネットワークでも出来るということを伝えたいため、構造については深く考えていません。

例えば、敵対的生成ネットワーク(GAN) を用いれば、より綺麗なカラー画像が得られると思います。

敵対的生成ネットワーク(GAN)の関連記事はこちら

畳み込みニューラルネットワークで実験

早速、実験を始めましょう!

実験環境

顔画像を約「50,000枚」、画像サイズは「32×32」で学習しました。

バッチサイズは「100」、学習率は「1000分の1」、「左右反転画像」を使い、データの水増しを行っています。

Google Colab 上で実行

Google Colab 上で実行しました。

データセットは、以下にあります。

【Google Drive】
https://drive.google.com/drive/folders/1JBjwANEpvZJUPTcfOJzs29mz-rYSJsld?usp=sharing

Drive をマウントして、Drive 上のデータを Google Colab で読み取れるようにします。

次に、ランタイムを GPU に変えれば、環境設定は終わりです。

ソースコード全体

実験結果

訓練用誤差

検証用誤差

「epoch144」あたりで検証用誤差が大きくなってきているため、この付近のモデルを学習後のモデルとします。

歴史上の人物の白黒画像をカラー復元

学習したモデルを使って、歴史上の人物に対してカラー復元を試してみました。

 
  1. 左:入力
  2. 右:今回学習したモデルを用いて出力した結果

あえてアインシュタインの画像を3枚使っていますが、顔の向きと色の塗り方に関係があるかみたかったからです。

しかし、この結果を見ると、顔の向きで得意不得意が決まることはなさそうです。

復元結果は、ヒゲの有無や帽子の有無などに影響を受けているように見えます。

ヒゲが少なく帽子無しの白黒画像をカラー復元

次は、これらの要素がない偉人で、カラー復元をしてみましょう。

 

やはり、ヒゲが長すぎず、帽子をかぶっていない場合のカラー化は、うまくできているように見えます。

使用したColab関連の記事はこちら

まとめ

今回の実験から、顔画像のカラー復元では、思ったよりも装飾品が邪魔をするという結果になりました。

そのため、もし顔の色付けを本気でしたいなら、顔画像かそうでないかで分類しておく以外の分類も必要だと思います。

例えば…「メガネはあるか」「ヒゲはあるか」「帽子はあるか」などの分類を、あらかじめ行っていたほうがいいでしょう。

その上で、入力となる白黒画像を分類器にかけ、それぞれの特徴に応じて色の塗り分けを行うべきです。

次回予告

今回は、「32×32」のサイズの画像のみでカラー化を行いました。

では、今回学習した解像度より大きい「64×64」でカラー化を試してみるとどうなるでしょうか?

 

ぱっと見、できているように見えますが、だいぶ色塗りが荒く「まだら」になっています。

ですが、実際の場面においては、「32×32」では圧倒的にサイズが足りません。

しかし、現状、どこの研究室でも計算資源に限界があり、学習する際には小さな画像サイズで実験せざるを得ません。

そんな限られたリソースの中で、大きな画像サイズでも、同じような結果を得られたら嬉しいですよね。

というわけで、次回は、画像の高解像度化と今回学習したカラー化を組み合わせた実験をしたいと思います。

ではお楽しみに!

関連記事

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

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

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

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

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

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

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

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

採用情報はこちら

書いた人はこんな人

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

関連記事