1. HOME
  2. ブログ
  3. IT技術
  4. CNNで低解像度な画像を高解像度に変換してみる

CNNで低解像度な画像を高解像度に変換してみる

CNNで低解像度な画像を高解像度に変換してみたい!

前回は、「畳み込みニューラルネットワーク(Convolutional Neural Network:CNN)」を用いて、顔画像のカラー復元を行いました。

小さな画像サイズで実験を行いましたが、実際の場面では限られたリソース(計算資源)の中で、大きな画像サイズを取り扱う場面も多くあります。

そこで今回は、CNNを用いて、前回行ったカラー化と画像の高解像度化を組み合わせた実験をしてみたいと思います。

前回の記事はこちら

低解像度画像と高解像度画像

一般的にボケている画像のことを「低解像度な画像」と呼びます。

それに対し「高解像度な画像」とは、ボケの少ない画像のことをいいます。

そもそもボケというのは、画像のピクセル数が減少することで起こります。

低解像度化のイメージ

例えば、左下の画像のように適当なブロック分けを行い、その一ブロック内の全画素値の平均値を新たな画素値とすることを、画像全体に行うことでピクセル数を減少させることができます。

低解像度化は簡単

右の画像は、元画像に対してピクセル数が減少しているため「低解像度な画像」と言えます。

このように、「高解像度の画像」から「低解像度な画像」を作ることは比較的容易にできます。

低解像度画像から高解像度画像への変換

では逆のパターンで、「低解像度な画像」から「高解像度な画像」を生成することを考えてみましょう。

先ほどのブロックに分けた例で言うと、「低解像度な画像」の高解像度化は、一つのピクセルから複数のピクセルの値を決定するということが必要になります。

高解像度化のイメージ

「高解像度化」の作業は、下図のように解が一意に決まらず、様々なパターンが存在することが容易に想像できます。

高解像度化は難しい

言うなれば、先ほどの「高解像度な画像」もその解の一つであるものの、正解かどうかは分かりません。

そのため、「高解像度化」を人間が手探りで行うのは途方もなく難しい作業なのです。

そこで、あり得る様々なパターンから最も自然な画像になるパターンをニューラルネットワークに出力してもらうと言うのが、CNN で「高解像度化」をするモチベーションです。

高解像度化を用いるメリット

では、「高解像度化」をすることでどんなメリットがあるのでしょう。

機械学習のボトルネック

これは前回も話したとおり、機械学習の研究が進んだ現在、ボトルネックとなるのは計算資源です。

「高解像度な画像」を使って機械学習を行うことができればそれでいいのですが、そうはいきません。

ただでさえ制限があるメモリに、ニューラルネットワークのパラメータを多くメモリに保存しなければなりません。

そのため、画像サイズでその足りないメモリの帳尻合わせをする必要があるのです。

ボトルネック解消のために

そのため病理画像など、「高解像度な画像」に対しては、かなり小さい画像でしか学習ができません

そんな中で低解像度で学習したものを「高解像度化」できれば、メモリの節約にもなり、学習結果もより向上するのではないかと言うのが私の考えるメリットです。

高解像度化のための学習モデル

では実際に、「学習モデル」について話していきます。

U-net のような構造にしました。

また、白黒画像のカラー化のときと同じように、深い層で浅い層の情報を渡し、細部の画像情報と全体的な情報を両方とも加味できるようにしました。

私の中でこれが一番損失関数が小さくなったので、このモデルを選びました。

カラー化と高解像度化の併用実験

検証用データに対する精度

「低解像度画像」に比べて生成画像はボケが小さい、つまりは「高解像度」になっていることがわかります。

低解像度画像

生成画像

私自身、かなり精度が良くてびっくりしています。

SRGAN を使わなくてもある程度は精度が出るようです。

白黒画像のカラー化との併用実験

次に、白黒画像の「カラー化」と画像の「高解像度化」を併用して実験してみました。

併用実験の方法

併用実験の方法としては、以下のように行いました。

  1. 64×64の白黒画像をカラー化する
  2. 変換した64×64のカラー画像を128×128に高解像度化

こうすることで、実際の実験環境ではメモリの影響で学習できなかった画像サイズでも、カラー画像の変換ができるようになります。

実験!

実際に、以下の変換画像の比較を行ってみましょう!

  1. 「64×64のサイズ」で学習したモデルで「128×128の画像」をカラー化した場合
  2. 「64×64の画像」をカラー化した後で「128×128に高解像度化」した場合

カラー化のみ

カラー化+高解像度化

実験結果

見てわかるように、「カラー化のみ」の結果では、色が正しく塗れていない部分があり、ムラがあります。

しかし、「カラー化+高解像度化」の結果は、前者と比較してムラが少なく、「64×64のサイズ」で学習したモデルが「128×128の画像サイズ」にも適用できていることがわかります。

このように、高解像度化は他の実験に併用することも有効であると言えます。

様々なタスクへの応用

それは白黒画像のカラー化だけでなく、画像のセグメンテーションなど様々なタスクに応用することができます。

学習時の画像サイズに限界を感じている機械学習エンジニアの方は、ぜひ参考にしてみてくださ!

さいごに ~次回予告~

さて、画像の「カラー化」と「高解像度化」と行ってきました。

しかし、白黒画像を「カラー化」したモデルでは、よく見ると肌色を顔の近くに塗っているだけで、背景も肌色に塗られていることがわかります。

正直言って、自然な画像であるとは言えません

さらに、「カラー化」との併用実験では、画像の「高解像度化」も、実際の画像の解像度に比べてボケていることがわかります。

これは、「損失関数による問題」です。

ピクセル単位での二乗誤差をとることで、画像が自然なパターンにならずに全体的にボヤッとした見た目になるからです。

そこで次回からは、ピクセル単位での誤差に加えて、「GAN」による「Adversarial Loss」を加えることで、画像のボケ除去や色の多様性の追加を行っていきたいと思います!

ソースコード

関連記事

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

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

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

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

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

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

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

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

採用情報はこちら

関連記事