深層学習で画像認識する際に、元画像が低解像度で精度が出ないときがあり、高解像度の画像が欲しいと思うときがある。超解像は、低解像度の画像から高解像度の画像を作成する技術。最近の超解像のアルゴリズムでどの程度改善できるものなのか実験してみた。
超解像の技術
低解像度の画像はピクセル数が少なく、それだけ情報量が少ない。そこから高解像度化しようとすると、ピクセル間の情報を補間しないといけない。以前はそれを点と点の間を線形補間などで補間して作成していたが、アーティファクト(人為的に発生するノイズ)が発生していた。
最近は深層学習をベースにしたものが出てきている。そもそも超解像は、画像を取り扱うこと、そして、データのアノテーションとかも不要で高解像度と低解像度の画像を用意すればいいので、深層学習に適した課題とも言える。
深層学習ではCNNを使用したSRCNN、GANを活用したSRGANなどをベースに発展してきている。一方で今深層学習では、Stable-DiffusionやDall-E2、Midjourneyなどの拡散モデルを使った画像生成が話題となっている。拡散モデルは画像にノイズを加えて、ノイズを除去して元画像を復元するプロセスを学習する。超解像でも使われ、Google AIがSR3というモデルを2021年に発表している。SR3の学習済みモデルを使用して、画像の画質改善がどれぐらいできるかをテストしてみた。
SR3での試行結果
SR3(Super-Resolution via Repeated Refinemnet)のソースコードと実行環境は、Githubにて公開されている。Google colaboratoryで学習済みモデルでの推論環境が公開されているのでそのまま実行してみた。以下はサンプルで入っていた画像だが、実行すると以下の画像のようにノイズを除去して画像を復元する様子が確認できる。

次にいくつかデータを追加してみたところ以下のような結果になった。(左から64×64の入力画像、元の512×512での画像、512×512で生成した高解像度画像)
予想はしてとおり、細かい部分を繊細に表現することは難しいようだ。文字とか背景の細かい部分を実際の高解像度の画像に近づけるのは難しいと思っていたが、女性の画像(Lena)がうまく再現されていない。面白いことに、鳥の画像では、高解像度にすると目の部分が人の目のような形で再現されている。
GithubのQAを確認すると、学習済みモデルはnVIDIA 1080Tiの環境のモデルパラメータに限定していて、ステップ数を増やす必要があるとのこと。また元々の論文を読んでみても、データセットは人の顔と自然画像を使っているため、建物の画像とかは追加学習なしだと元々厳しかったのかもしれない。









あと今回のGoogle colaboratoryでGPUも使用したが、意外と推論だけでも時間が掛かった。汎用的に使えるところまで落としこむにはまだまだ道のりがありそうだと感じた。