はじめに
先日、母から実家近辺に住み着いている野良猫の画像が送られました。
動物好きの自分は母の思惑通りキュンキュンしてしまったのですが、画像が少し荒いため高画素化したいと思いました。
しかしながら高画素化アプリはどれも課金制だったり、広告が超絶長かったりで、量産的作業においては簡単に実行ができない状況です。
そのため今回は勉強も兼ねて、オープンソースである超解像モデルを使って高画質化をトライしてみました。
\ネコチャン!/\カワイイ!/
超解像について(以下Geminiによって監修済)
「超解像(Super-Resolution)」とは、機械学習を活用した補完によって高品質な拡大画像を生成する技術です。
近年は深層学習を使ったモデル開発が主流となっており、畳み込みや損失関数の手法を見直すことでより精度の高い高画素化処理ができるよう改良されています。
超解像が無かった頃はいくつかの手法によって画像を拡大(アップスケーリング)していました。
主な手法として最近傍法、バイリニア補間、バイキュービック補間などがあり、これらは拡大に必要なピクセルを周囲の画素から補完する技術として使われていました。
処理は比較的簡便でありますが、細かな部分やテクスチャの再現には限界がありました。
以下、超解像モデルを歴史順に記載していきます。
■ スパースコーディング
1990年代に提案された超解像手法の一つ。
辞書学習アルゴリズムを用いて、画像のパッチをスパース(疎な)表現で表すことにより、高解像度画像を復元する。
このとき、係数の推定にはLasso回帰が使われていた。
■ SRCNN
Super-Resolution Convolutional Neural Network
2014年に提案されたCNN(畳み込みニューラルネットワーク)を用いた超解像モデル。
3層の畳み込み層+ReLU活性化関数からなるシンプルな構造で、従来の手法より鮮明な画像を生成する。
ただし、ややぼやけた部分も残ることがあり。
■ GAN
Generative Adversarial Network。(敵対的生成ネットワーク)
画像生成や変換に使われる深層学習モデルの一つ。
二つのネットワーク(Generator:生成器とDiscriminator:識別器)が対抗しながら学習し、最終的に本物と見分けがつかない高品質な画像を生成します。
「敵対的」とは、本物と偽物の対立構造から由来しています。
こちらのブログが参考になります。
https://www.skillupai.com/blog/tech/mldl-tips-1/
■ SRGAN
Super-Resolution GAN
GANを用いた超解像モデル。
高品質な画像を生成するために、Perceptual Loss(知覚的損失)やAdversarial Loss(敵対的損失)を併用し、より自然で鮮明な高解像画像を実現する。
■ ESRGAN
Enhanced Super-Resolution GAN
SRGANの改良版で、より高品質な超解像を可能。
Residual-in-Residual Dense Block(RRDB)と呼ばれる深層残差構造を採用し、学習の安定性と性能を向上させる。
■ Real-ESRGAN
実画像(Real)の自然画像や現実の画像に対しても高品質な超解像や復元を行えるように設計されたモデル。(2021年に展開)
実環境で撮影された画像のノイズやアーティファクトにも対応でき、より実用的な性能を持つ。
今回の使用
今回はオープンソースしてリリースされているRealESRGAN_x4plus_anime_6Bを使って高画素化を試してみました。
RealESRGAN_x4plus_anime_6B
https://github.com/xinntao/Real-ESRGAN
アニメ画像やイラストの超解像や画質向上を目的としたReal-ESRGANモデル。画像を縦横4倍に拡大する。
実行手順
環境作成
git hubの手順通りに進めれば問題なし。バージョン指定に少しハマったので注意が必要。
・Python 3.13は非対応でエラーが出た。
→ Python 3.10.0にバージョンを下げたら実行できた。
実行コマンド
$ realesrgan-ncnn-vulkan.exe -i input.jpg -o output.png -n realesrgan-x4plus
実行結果
まずは元画像の大きさはこのくらいあります。(960×1706)

【パターン1】元画像を10%スケールダウンして超解像
変換前:元画像を10%スケールダウン(96×170)

変換後:(384×680)
元画像がスケールダウンしすぎて細かいところは再現できていない
【パターン2】元画像を20%にスケールダウンして超解像
変換前:元画像を20%スケールダウン(192×341)

変換後:(768×1364)
元の画像よりきれいかも?いい感じの出来具合。
【パターン3】元画像をそのまま超解像
変換前:元画像そのままの状態

変換後:(3840×6824)
余計なノイズが乗ったように見える。
使ってみた感想
元々の画質がそこまで悪くない場合に超解像をすると余計なノイズが生まれてしまう。
あくまで低画質の画像向けソフトという個人的な感触。低画質画像の超解像処理のクオリティは非常に高い。(すごい)
参考にさせていただいたWebページ
画素の補間(Nearest neighbor,Bilinear,Bicubic)の計算方法
https://imagingsolution.net/imaging/interpolation/
超解像について (その1・SRCNN まで)
https://note.com/te_ftef/n/ncbb63a7f522f
超解像について (その2・SRGAN と ESRGAN)
https://note.com/te_ftef/n/n6d77d7717677
超解像について (その3・Real-ESRGAN)
https://note.com/te_ftef/n/n23f152803b9a
Real-ESRGAN: 純粋な合成データを用いた実世界ブラインド超解像のトレーニング
https://arxiv.org/abs/2107.10833