MMEditingで超解像、画像修復、前景抽出、画像生成する [Python]

2022年3月12日土曜日

Artificial Intelligence

本記事では、MMEditingを使用して、超解像、画像修復、前景抽出、画像生成を行う方法をご紹介します。

本記事で紹介するMMEditingは、2023年にMMagicに統合されたため現在は使用できません。以下は参考情報としてご覧ください。

アイキャッチ
出典: open-mmlab/mmediting

MMEditing

概要

MMEditingは、Pytorchで実装されたオープンソースの画像、動画の編集ツールボックスです。

MMeditingは画像・動画編集に関係する様々なアルゴリズムをサポートしており、超解像ではBasicVSR, ESRGAN, TDANなど様々なアルゴリズムから選択することができます。
Configファイルを変更するだけでこれらのアルゴリズムを簡単に切り替えることができるツールボックスです。

このツールボックスはOpenMMLabによって開発されています。OpenMMLabはMMEditingの他にもOCRのツールセットであるMMOCRや、姿勢推定のツールセットMMPoseなど多数のツールセットを開発しています。

OpenMMLabツールセット一覧

本記事では、MMEditingを用いた超解像(Super Resolution)、画像修復(Inpainting)、前景抽出(Matting)、画像生成(Generation)の基本的な使い方をご紹介します。

デモ(Colaboratory)

それでは、実際に動かしながらMMEditingを用いた超解像(Super Resolution)、画像修復(Inpainting)、前景抽出(Matting)、画像生成(Generation)を行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

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

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

INSTALLATIONを参考にGoogle ColaboratoryにMMEditingをインストールします。
まず、Pytorchをインストールします。MMEditingはPytorch 1.5以上をサポートしています。

!pip install torch==1.10.2+cu102 torchvision==0.11.3+cu102 -f https://download.pytorch.org/whl/cu102/torch_stable.html

次に、MMCV、MMEditingをインストールします。

# mmcvインストール
!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.10/index.html

# mmlabインストール
%cd /content

!git clone https://github.com/open-mmlab/mmediting.git
%cd mmediting
!pip install -v -e .

画像表示関連のライブラリをインポートします。

import matplotlib.pyplot as plt
from PIL import Image, ImageDraw

以上で必要なライブラリはすべてインストールされました。
環境セットアップの最後にMMEditingのバージョンを確認しておきます。

!python -c "import mmedit; print(mmedit.__version__)"

# 以下出力結果
0.13.0

前景抽出(Matting)

まずMattingから行います。
初めに学習済みモデルをダウンロードします。なおModel Zooはこちらです。

# Matting
%cd /content/mmediting
!mkdir -p models/mattors/gca
%cd models/mattors/gca
!wget https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-34.77_20200604_213848-4369bea0.pth

Mattingを行います。

%cd /content/mmediting
CONFIG_FILE = "/content/mmediting/configs/mattors/gca/gca_r34_4x10_200k_comp1k.py"
CHECKPOINT_FILE = "/content/mmediting/models/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-34.77_20200604_213848-4369bea0.pth"
IMAGE_FILE = "/content/mmediting/tests/data/merged/GT05.jpg"
TRIMAP_FILE = "/content/mmediting/tests/data/trimap/GT05.png"
SAVE_FILE = "/content/mmediting/outputs/mattors/gca/result.png"

!python demo/matting_demo.py {CONFIG_FILE} {CHECKPOINT_FILE} {IMAGE_FILE} {TRIMAP_FILE} {SAVE_FILE}

出力結果を見てみましょう。

fig = plt.figure(num=None, figsize=(18, 6), dpi=128, )

ax = fig.add_subplot(1, 3, 1, xticks=[], yticks=[])
plt.imshow(Image.open(IMAGE_FILE).convert("RGB"))
ax.set_title("IMAGE_FILE")

ax = fig.add_subplot(1, 3, 2, xticks=[], yticks=[])
plt.imshow(Image.open(TRIMAP_FILE).convert("RGB"))
ax.set_title("TRIMAP_FILE")

ax = fig.add_subplot(1, 3, 3, xticks=[], yticks=[])
plt.imshow(Image.open(SAVE_FILE).convert("RGB"))
ax.set_title("SAVE_FILE")
Matting結果

画像修復(Inpainting)

つづいてInpaintingを行います。同様に学習済みモデルをダウンロードします。

# Inpainting
%cd /content/mmediting
!mkdir -p models/inpainting/deepfillv2
%cd models/inpainting/deepfillv2
!wget https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.pth

Inpaintingを行います。

%cd /content/mmediting
CONFIG_FILE = "/content/mmediting/configs/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba.py"
CHECKPOINT_FILE = "/content/mmediting/models/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.pth"
MASKED_IMAGE_FILE = "/content/mmediting/tests/data/image/celeba_test.png"
MASK_FILE = "/content/mmediting/tests/data/image/bbox_mask.png"
SAVE_FILE = "/content/mmediting/outputs/inpainting/deepfillv2/result.png"

!python demo/inpainting_demo.py {CONFIG_FILE} {CHECKPOINT_FILE} {MASKED_IMAGE_FILE} {MASK_FILE} {SAVE_FILE}

出力結果を表示します。

fig = plt.figure(num=None, figsize=(18, 6), dpi=128, )

ax = fig.add_subplot(1, 3, 1, xticks=[], yticks=[])
plt.imshow(Image.open(MASKED_IMAGE_FILE).convert("RGB"))
ax.set_title("MASKED_IMAGE_FILE")

ax = fig.add_subplot(1, 3, 2, xticks=[], yticks=[])
plt.imshow(Image.open(MASK_FILE).convert("RGB"))
ax.set_title("MASK_FILE")

ax = fig.add_subplot(1, 3, 3, xticks=[], yticks=[])
plt.imshow(Image.open(SAVE_FILE).convert("RGB"))
ax.set_title("SAVE_FILE")
Inpainting結果

グレーの矩形部分が修復されています。

超解像(Super Resolution)

続いてSuper Resolutionを行います。同じく学習済みモデルをダウンロードします。

# Image Super Resolution(restoration)
%cd /content/mmediting
!mkdir -p models/restorers/esrgan
%cd models/restorers/esrgan
!wget https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth

Super Resolutionを行います。

%cd /content/mmediting
CONFIG_FILE = "/content/mmediting/configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py"
CHECKPOINT_FILE = "/content/mmediting/models/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth"
IMAGE_FILE = "/content/mmediting/tests/data/lq/baboon_x4.png"
SAVE_FILE = "/content/mmediting/outputs/restorers/esrgan/result.png"

!python demo/restoration_demo.py {CONFIG_FILE} {CHECKPOINT_FILE} {IMAGE_FILE} {SAVE_FILE}

出力結果を見てみます。

fig = plt.figure(num=None, figsize=(18, 6), dpi=128, )

ax = fig.add_subplot(1, 2, 1, xticks=[], yticks=[])
plt.imshow(Image.open(IMAGE_FILE).convert("RGB"))
ax.set_title("IMAGE_FILE")

ax = fig.add_subplot(1, 2, 2, xticks=[], yticks=[])
plt.imshow(Image.open(SAVE_FILE).convert("RGB"))
ax.set_title("SAVE_FILE")
SuperResolution結果

右の画像が高解像度化されています。

画像生成(Generation)

最後に、Generationを行います。同様に学習済みモデルをダウンロードします。

# Generation(synthesizers)
%cd /content/mmediting
!mkdir -p models/synthesizers/cyclegan
%cd models/synthesizers/cyclegan
!wget https://download.openmmlab.com/mmediting/synthesizers/cyclegan/cyclegan_horse2zebra_id0/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_20200524-470fb8da.pth

Generationを行います。

%cd /content/mmediting
CONFIG_FILE = "/content/mmediting/configs/synthesizers/cyclegan/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra.py"
CHECKPOINT_FILE = "/content/mmediting/models/synthesizers/cyclegan/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_20200524-470fb8da.pth"
IMAGE_FILE = "/content/mmediting/tests/data/unpaired/trainA/2.jpg"
SAVE_FILE = "/content/mmediting/outputs/synthesizers/cyclegan/result.png"
UNPAIRED_IMAGE_FILE = "/content/mmediting/tests/data/unpaired/testB/6.jpg"


!python demo/generation_demo.py {CONFIG_FILE} {CHECKPOINT_FILE} {IMAGE_FILE} {SAVE_FILE} --unpaired_path {UNPAIRED_IMAGE_FILE}

出力結果を見てみます。

fig = plt.figure(num=None, figsize=(12, 6), dpi=128, )

ax = fig.add_subplot(1, 2, 1, xticks=[], yticks=[])
plt.imshow(Image.open(IMAGE_FILE).convert("RGB"))
ax.set_title("IMAGE_FILE")

ax = fig.add_subplot(1, 2, 2, xticks=[], yticks=[])
plt.imshow(Image.open(UNPAIRED_IMAGE_FILE).convert("RGB"))
ax.set_title("UNPAIRED_IMAGE_FILE")

fig = plt.figure(num=None, figsize=(12, 6), dpi=128, )

ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[])
plt.imshow(Image.open(SAVE_FILE).convert("RGB"))
ax.set_title("SAVE_FILE")
Generation入力画像
Generation出力画像

馬がシマウマに、シマウマが馬に変換されました。

まとめ

本記事では、MMEditingを用いた超解像(Super Resolution)、画像修復(Inpainting)、前景抽出(Matting)、画像生成(Generation)の基本的な使い方をご紹介しました。

ツールセットとしてまとめられていると、様々なアルゴリズムを一挙に確認できるためアルゴリズム選定などに便利ですね。

これを機に機械学習に興味を持つ方が一人でもいらっしゃいましたら幸いです。

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


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

参考文献

1.  MMEDITING’S DOCUMENTATION

2. GitHub - open-mmlab/mmediting

AIで副業ならココから!

まずは無料会員登録

プロフィール

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

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


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology