見出し画像

超解像について (その3・Real-ESRGAN)

 こんにちはこんばんは、teftef です。超解像その 2 の続きです。CNN を使った超解像が主流となる中で、GAN を使った超解像によって画像の高周波成分の復元が高品質にできるようになり、画像がぼやけることがなくなりました。しかし、SRGAN も ESRGAN も学習に使ったデータセットの質の問題が考慮されていませんでした。今回は学習する画像の質にバリエーションを増やし、汎化性能を上げた Real-ESRGAN についてです。
 私もまだ初学者であり、説明が間違っていたり勘違いがある可能性が 0 ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。また、この記事を作成するにあたり、GPT-4 による校正、修正が含まれています。

※この記事は有料となっていますが、最後まで内容が読めます。

今回、扱うのははこちら ↓

軽く復習

 超解像は圧縮された低解像度画像を元の状態に戻したり、画像のサイズを拡大したりする際に使われています。最近傍法やバイリニア、バイキュービック補間のようなアルゴリズム的なシンプルな方法は高解像度の元画像を復元できません。教師あり学習を使った SRCNN などの手法がありますが、十分に高品質な画像  (特に高周波成分) を復元することが難しくなっています。SRGAN や ESRGAN では、目的関数 (損失関数) に MSE (最小二乗誤差)  ではなく GAN  を用いることで、画像の高周波成分 (エッジ) がつぶれてぼやけることを改善することができました。

データセットの作成

 教師あり学習用いた超解像では学習時に、高解像度の元画像 (HR) とダウンスケールされた低解像度画像 (LR) のペアを用います。

 この時、ダウンスケールに用いる方法としてはバイキュービックカーネルを含んだ手法 (バイキュービック補間) となっています。この際に用いるダウンスケールのモデルを「劣化モデル」と呼びます。

従来の「劣化モデル」の問題点

 しかし、現実の画像はカメラの撮影、画像編集、インターネットでの転送など様々な要因によって劣化します。このような単一の「劣化モデル」だけでは、これらの複雑な劣化を正確に模倣することはできません。そのため従来の ESRGAN のように、 古典的なダウンスケーリングを用いて作成された低解像度画像と実画像のペアを用いて GAN を学習しても GAN は学習データセット内の分布しか学習しません。しかし、実際世の中に存在する低解像度画像はもっと複雑な方法で圧縮したものが多いので、そのような画像に対しては再構成ができず、汎用性はなくなってしまうという問題があります。

Real-ESRGAN

「劣化モデル」の改良

 「劣化モデル」は具体的には、元の画像がブラー(ぼかし)カーネルで畳み込まれ、続いてダウンサンプリング操作 (バイリニアやバイキュービック) が行われ、次にノイズが追加され、最終的にJPEG圧縮が適用されます。

 この「劣化モデル」を複数回通すことで現実の世界の様々な劣化を模倣することができます。少し具体的に見てみます。

  1. ブラー : まず、元の画像 y は、カーネル k 使用して畳み込まれます。ブラーは、画像に故意のぼけや不鮮明さを追加するために使用されます。等方性と異方性のガウシアンフィルタがよく使用されます。

  2. ダウンサンプリング : 次に、スケールファクタ r を使用してダウンサンプリング操作が行われます。さまざまなリサイズアルゴリズムがあり、最近傍法、面積リサイズ、バイリニア補間、およびバイキュービック補間を考慮しています。これにより、画像の解像度が低下します。

  3. ノイズの追加 : 低解像度の画像には、ノイズ n が追加されます。このモデルでは、加法的なガウシアンノイズやポアソンノイズなど、様々なノイズタイプが考慮されます。

  4. JPEG 圧縮: 低解像度の画像は、JPEG 圧縮が適用されます。これは、デジタル画像のための一般的なロスあり圧縮技術で、私たちも広く使用されています。

「劣化モデル」の式

提案手法の「劣化モデル」

以上の操作をまとめるとこのような式となり、これが従来の「劣化モデル」であり、「劣化モデル」を複数回通すことで、実世界の画像圧縮を模倣しています。

Sinc フィルター

 ダウンスケールや圧縮を行う時に輪郭の周りにアーティファクトが生成されることが頻繁にあります。

 これらは リングアーティファクトオーバーシュートアーティファクトと呼ばれていて、シャープニングアルゴリズムやJPEG圧縮などによって生成されることが多いことがわかっています。そこで、「劣化モデル」の途中で Sinc フィルターを追加することで、低解像度画像にあえてこのようなアーティファクトを足してあげます。

Sinc 関数

 こうすることで、学習時にアーチファクトを持つ低解像度画像をモデルに提供することができ、超解像モデルはこれらの特定のアーチファクトを含む実際の低解像度の画像を高品質な高解像度に変換する方法を学ぶことができます。

ネットワークアーキテクチャの改良

今回、 GAN の Generator には ESRGAN と同様に、 RRDB を用います。Real-ESRGANは、ESRGANよりもはるかに大きな潜在空間を取り扱うことを目指しているため、ESRGAN の Discriminator では適しません。識別力を向上させるために Discriminator には U-net を用いたものに変更します。U-Net を使うことで学習の不安定性が増加しますが、spectral normalization を使用して学習を安定させるそうです。(なんでかはよくわからん

学習

 学習時には ESRGAN とは違い、Interpolation を用いません。最初に、L1 lossを使用して PSNR 指向のモデルを学習します。次に、学習済みのPSNR指向のモデルを Generator の初期値として使用し、L1 loss、perceptual loss、そしてGAN lossの組み合わせで学習します。

結果

緑色の枠が提案手法

 このように ESRGAN などで発生していたぼやけや BSRGAN で発生しているアーティファクトが RealESRGAN ではなくなっていることがわかります。また、毛や草のような複雑なテクスチャの画像もぼやけることなく再現されています。

うまくいかない例

失敗例

このように規則正しいテクスチャ (直線や方眼など) は苦手なようです。

文字の復元は難しい

 また、文字などを復元しようとするときに、細かい部分がつぶれてしまうという欠点があります。これは RealESRGAN の問題というよりは、一枚の画像から高解像度画像を復元する、単一画像超解像、というこの手法に「入力の情報量が足りない」という問題があり、次に書く、複数枚の画像を用いて超解像する多視点超解像手法では改善することができます。

Real-ESRGAN を使う

今回の Real-ESRGAN はこのページで無料で使うことができます。(アカウント登録が必要)

参考文献

最後に

 単一画像超解像の流れとしてSRCNN ⇒ SRGAN ⇒ ESRGAN ⇒ Real-ESRGAN と書いてきました。ここからは DiffBir のような Diffusion model を用いた手法や多視点超解像についても少し触れていく予定です。

 最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(3,500 字,teftef)

 ↓↓もしよろしければこの記事と開発の支援お願いいたします!

※注意 : 支援してくださる方へ

 ※注意 :ここから先は何も内容がありません。しかし、この記事をお読みいただき、良かったと感じていただけたのであれば、この記事と開発の支援お願いいたします!

ここから先は

48字

¥ 500

この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?