画像系のディープラーニングをやっていると、画質を上げたくなることがあります。その理由は低解像度な教師データを用いて学習するケースが多いため出力も低解像度になってしまうからです。高解像度な画像をつかって学習できればいいのですが、ディープラーニングは基本的に大量なデータが必要となるため、データの取り扱いだったり、メモリの関係でどうしても低解像度の画像で学習せざるをえないことがあります。
これを回避するためにはいくつかのテクニックがあると思います。
- 高画質画像を一旦切り出して、小さなサイズの画像を処理し、処理した画像をつないで高解像度な画像を取得する
- 低解像度で出力された画像に対し、超解像AI技術で高解像度化する
今回は2の方法を、TecoGANをつかってやってみようと思います。TecoGANは前の記事で使い方を説明しているので併せてご覧ください👍↓
Inpainting画像/動画については↓で紹介しています。併せてご覧ください👍
高解像度な動画もつくってみました!よかったら見てってください👍
高解像度化のロードマップ
前に記事で画像の不要な部分を消す「Inpainting」というAIアルゴリズムを紹介しました。Inpainting(DeepFillv2)はGANをつかったアルゴリズムで、学習や推論で多くのメモリを必要とします。私の環境では640×360 pixel辺りが限界でした。オリジナル画像と比較すると画質は劣ってしまっています↓
Inpainting画像を超解像で高解像度化するんですが、折角オリジナル画像があるので消した部分だけを抽出して高解像度化していこうと思います。手順は↓
- 1920×1080 pixelのオリジナル画像の準備
- Inpainting画像の生成:640×360 pixel
- Inpaintingで消去した部分のマスク画像の準備:1920×1080 pixel
- Inpainting画像の超解像(TecoGAN):640×360 → 1920×1080 pixel
- Inpaintingで消した部分のみ切り出してオリジナル画像へ貼り付け:1920×1080 pixel
それではやっていきましょう!
Inpainting画像の高解像度化
2.Inpainting画像の生成 :640×360 pixel
まずは画像の中の物体を消したInpainting画像を用意します。今回はYOLOv5で物体検出した部分を消去する処理を実施しています。
この処理のやり方はここを参照ください。
3.Inpaintingで消去した部分のマスク画像の準備:1920×1080 pixel
↑でYOLOv5物体検出のバウンディングボックスをマスク画像として出力しましたが、これを1920×1080 pixelサイズで取得します。これはそんなに難しいことは無いと思います。
4.Inpainting画像の超解像(TecoGAN):640×360 → 1920×1080 pixel
超解像モデルであるTecoGANをつかってInpainting画像を高解像度化します。TecoGANは過去の記事でつかい方を紹介していますので詳細はそちらをご参照いただき、ざっくりとしたやり方を説明していきます。
- ソニーの ニューラルネットワークライブラリ”NNabla”を用いてTecoGANを実装していきます。↓をダウンロードして必要なライブラリをインストールしてください。
- tecogan説明ページの中段ちょい下にある“TecoGAN pre-trained weights”をダウンロードし、nnabla-examples/GANs/tecoganディレクトリ下へ保存してください。
- 「Inpainting画像の生成」で生成した画像をnnabla-examples/GANs/tecogan/imageディレクトリ下へ保存してください。
- AnacondaPromptなどで↓のコードを実行するとResultsディレクトリへ高解像度化画像が出力されます。
python generate.py --model ./tecogan_model.h5 --input-dir-lr ./image --output-dir ./results
拡大するとTecoGANで自然に高解像度化できていることが分かります👍
5.Inpaintingで消した部分のみ切り出してオリジナル画像へ貼り付け:1920×1080 pixel
Pythonの画像処理ライブラリPillowのcomposite()をつかっていきます。詳しい説明はこの辺りを参照してください。
オリジナル画像へ、マスク画像部分だけをTecoGAN画像より貼り付けます。この処理によりオリジナルの高解像度を活かしたまま、Inpaintingで消去した部分のみTecoGANで高解像度化した画像を生成することができます。ややこしくてすみません😅
Jupyter Notebookなどで下記コードを実行すると、うまいこと合成された 超解像Inpainting画像が出力されます。
im1 = Image.open("./file_tecogan.png") #ご自身の画像パスを指定してください
im2 = Image.open("./file_orig.png")
mask = Image.open("./file_mask.png")
im = Image.composite(im1, im2, mask)
im.save("./SuperResolution_Inpainting.png")
Inpainting高解像度化画像の比較
出力された画像を比較してみます。下図の左はTecoGANなし(Inpainting画像)、右はTecoGANありの画像です。
TecoGANを組み合わせることで自然な感じで高解像度化できたと思います。上図の下段は同じ部位を拡大しています。オリジナル画像では鳥がいたのですが、Inpainting処理で消去した場所になります。InpaintingのGANで鳥がいた場所へ雲が生成されていますが、これを高解像度化するときにTecoGANのGANでさらに雲が生成されるという訳の分からない状態になっています😅なので雲の形は左右で異なっていますが結構いい感じにまとまったんじゃないでしょうか👍
犬を消去してみると影だけGANで生成されています。拡大してみるとInpainting+TecoGANで犬を消去した部分の違和感あるものの、影はくっきり生成されています。こちらもいい感じで高解像度化できたかなと思います👍
といった感じで、いつにも増して訳の分からない内容になってしまってすみません😅個人的には面白い試みだったので、機会があれば野菜でも試してみようかなと思います。野菜を消して何の役に立つかは何も考えていませんが・・・
今日も良いディープラーニングライフを👍
コメント