昔撮ったゲームのスクショやスマホなどで撮った写真をPCの壁紙に使おうと思って拡大してみると画質が悪くてガッカリすることがよくある・・・
そこで、画像鮮明化的なことができないかなと思い、検索してみた。
すると、pythonで画像鮮明化(超解像度化)ができるらしいと判明。
pythonはほとんど触ったことないものの、チャレンジしてみることにした。
ESRGAN、CUGAN、waifu2xなど、様々あるようだが、一番新しく高性能そうな?SwinIRを選択してみた。(素人すぎて全然わからないw)
ここで、SwinIRで処理した結果を先に示してみる。
【鴨川シーワールド シャチパフォーマンス】
左が元画像、右が高解像度化処理後の画像だ。
拡大しないと分かりづらいが(加えてwebにアップロードしたことで画質が落ちてる・・・w)、鮮明な画像が生成された。
完璧とまでは言えないが、かなり使えると感じた。
さて、SwinIRを使う方法をネットで調べてみると、Google Colaboratoryを使って実行している例が多かった。
google colabを使えば、無料でもかなり性能の良いGPUを使えることや、SwinIRに必要なライブラリも最初からほとんどインストールされているというのが魅力のようだ。
初めはgoogle colabを使って実行していたものの、処理する画像のアップロードなどでいちいちGoogle Driveの操作が必要になるという点などが微妙だったので、自分のマシンで実行することにした。
ESRGANなどと比べてまだ導入している人が少ないのか、インストール手順などを詳しく説明しているサイトが多くはないが何とかなると思うw
超解像度化のような画像処理をCPUで行うとめちゃくちゃに時間がかかってしまう。
(Xeonとかなら早いのかな?)
そこで、GPUの出番である。
ゲーム以外にもGPUは様々使い道がある。
GPUを使って処理を行うためにはCUDA環境を整える必要がある。
CUDA ToolkitやcuDNNはPyTorch側に合わせて適切なバージョンをインストールする必要があった。
ライブラリ関係では、PyTorchのインストールでガッツリつまずいたが、何とか動作するようになった。
使用するマシンのGPUはGTX 1060で、メモリが3GBしかないので、解像度の大きい画像を処理する場合にはtileオプションを付けないといけなかった。
(--tile付けないと、CUDA out of memoryとエラーが出て処理できない)
tileは画像を指定した大きさで分割して処理してくれるオプションのようだ。
メモリ3GBだと、--tile 200 くらいで容量ギリギリだった。(200px?)
以下、高画質化比較
(左:元画像、右:高解像度化処理後)
【DiRT Rally 2.0 GC8】
【鳥羽水族館 ラッコ メイちゃん】
【道路標識】
全体的に良い結果が得られており満足しているが、あまりにも画像が荒いものは、処理しても思ったような結果は得られないようだ。
2022年の時点でこれだけの性能が出ていることを考えると、10年後くらいには驚くべきものが使えるようになっているかもしれないと期待しているw