[DeepLearning]GFPGANで昔の写真を鮮明にする

2021年10月26日火曜日

Artificial Intelligence

本記事では、GFPGANと呼ばれる機械学習手法を使って昔の写真を鮮明にしてみたいと思います。

アイキャッチ

GFPGANとは

GFPGANは、GenerativeFacial Prior GANの略称です。
Blind faceの復元を実現するGANであり、従来技術と比較し優れたパフォーマンスと、復元能力を誇ります。

従来技術との復元能力の比較
出典: https://arxiv.org/pdf/2101.04061.pdf

1列目の入力画像に対して、従来技術の復元結果と、GFPGANの復元結果(赤枠)が比較されています。GFPGANの結果が最も自然で鮮明に復元されていることが見て取れます。

GFPGANの導入手順

セットアップ

それでは早速、開発環境にGFPGANをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、GFPGANをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

# python version 3.7のconda環境を作成
$ conda create -n gfpgan python=3.7

# 作成した環境をアクティベート
$ conda activate gfpgan
$ cd gfpgan

# gitからコードをclone
$ git clone https://github.com/TencentARC/GFPGAN.git
$ cd GFPGAN

# Proxy配下の場合は下記
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# 必要なライブラリをインストール
$ pip3 install basicsr
$ pip3 install facexlib
$ pip3 install -r requirements.txt
$ python setup.py develop
$ pip3 install realesrgan

# Proxy配下の場合は下記
$ pip3 install "モジュール名" --proxy=http://"username":"password"@proxy:port

以上で、セットアップは完了です。

ブラインドフェイスの復元

ブラインドフェイスの復元では、昔の不鮮明な画像から鮮明な画像を生成します。
本記事では、下記の坂本龍馬の写真を使用します。

坂本龍馬肖像画
$ cd GFPGAN

# 学習済みモデルをダウンロード
$ wget https://github.com/TencentARC/GFPGAN/releases/download/v0.2.0/GFPGANCleanv1-NoCE-C2.pth -P experiments/pretrained_models

# 入力画像用ディレクトリ作成
$ mkdir inputs/target_imgs
# 上記ディレクトリに画像を格納

# 画像復元実行
python inference_gfpgan.py --upscale 2 --test_path inputs/target_imgs --save_root results

画像復元が完了するとresultsに復元画像が出力されます。
resultsには以下4種の画像が出力されます。

  1. cmp: cropped_facesとrestored_facesの画像を結合した比較画像
  2. cropped_faces: 復元前の画像から顔部分を切り出した画像
  3. restored_faces: cropped_facesの復元後画像
  4. restored_imgs: 復元後の全体画像

先ほどの坂本龍馬の出力結果は以下です。

cmp画像
cmp画像
restored_imgs
restored_imgs画像

ブラインドフェイスの復元(カラー化)

続いて、高精細化かつ、カラー化を行います。

$ cd GFPGAN

# カラー化用学習済みモデルのダウンロード
wget https://github.com/TencentARC/GFPGAN/releases/download/v0.1.0/GFPGANv1.pth -P experiments/pretrained_models

# 画像復元実行
python inference_gfpgan.py --model_path experiments/pretrained_models/GFPGANv1.pth --test_path inputs/target_imgs --save_root results --arch original --channel 1

カラー化の実行結果は以下です。

カラー化cmp画像

いかがでしょうか。なかなか良好な結果ではないでしょうか?
余談までに、岩倉具視でも試してみました。

入力画像

岩倉使節団

画像復元の実行結果は以下です。

はっきり二重に復元されているところや、毛髪の一本一本がはっきり視認できるよう復元されていることが確認できます。

トラブルシューティング

NameError: name 'fused_act_ext' is not defined

export BASICSR_JIT='True'を環境変数に設定することで解決

RuntimeError: Ninja is required to load C++ extensions

ninjaをインストールすることで解決

conda install -c anaconda ninja

IndexError: list index out of range

エラー全文は以下
/gfpgan/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1606, in _get_cuda_arch_flags arch_list[-1] += '+PTX' IndexError: list index out of range
cudatoolkitが正しくインストールされていないことが原因のため、cudatoolkitをインストールし直す。

# https://pytorch.org/get-started/previous-versions/ でバージョン確認
$ conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1 -c pytorch

まとめ

本記事では、GFPGANで、不鮮明な昔の写真を鮮明な写真に復元する方法をご紹介しました。
本手法のように学習データの確保が難しい場合にどのように精度を確保するか。
このアプローチは非常に勉強になります。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1. Towards Real-World Blind Face Restoration with Generative Facial Prior

2. TencentARC/GFPGAN

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology