この記事では2021年9月に登場した、Inpainting(画像修復)のモデルであるLaMaを紹介します。
まずは下の画像をご覧ください。
Inpainting(画像修復)よって、画像の中から映っている人が消えていることがわかります。
画像から指定した範囲の対象を除去した後、LamaのInpainting(画像修復)技術によって削除した範囲を修復しています。
今回はこのLamaの公式チュートリアルに沿って、テスト画像のInpainting(画像修復)を試していきます。
Google colabを使用して簡単に実装することができますので、ぜひ最後までご覧ください。
今回の目標
・LamaのInpainting(画像修復)
・Inpainting(画像修復)のチュートリアル
・オリジナル画像でInpainting(画像修復)
Lamaとは
Lamaとは「Resolution-robust Large Mask Inpainting with Fourier Convolutions」の略称で、モスクワとソウルのサムスンAIのチームが2021年9月に発表した機械学習を用いた画像修復の手法です。
WACV 2022に採択されています。
URL:https://arxiv.org/abs/2109.07161
出典:Suvorov, Roman and Logacheva, Elizaveta and Mashikhin, Anton and Remizova, Anastasia and Ashukha, Arsenii and Silvestrov, Aleksei and Kong, Naejin and Goka, Harshith and Park, Kiwoong and Lempitsky, Victor; arXiv
コード:https://github.com/saic-mdal/lama
プロジェクトページ:https://saic-mdal.github.io/lama-project/
Lamaの導入
それでは早速、Lamaを使用するための準備をしていきましょう。
ここからはGoogle colabを使用して実装していきます。
なお、以下のボタンからコードをコピーして使用していただくことも可能です。
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
!git clone https://github.com/saic-mdal/lama
%cd lama
次に必要なライブラリをインストールします。
!pip install -r requirements.txt --quiet
!pip install wget --quiet
!pip uninstall opencv-python-headless -y --quiet
!pip install opencv-python-headless==4.1.2.30 --quiet
!pip install wldhx.yadisk-direct
これでLamaを使用する準備が完了しました。
次に学習済モデルとテスト画像を用意します。
# 学習済モデル
!curl -L $(yadisk-direct https://disk.yandex.ru/d/ouP6l8VJ0HpMZg) -o big-lama.zip
!unzip big-lama.zip
# テスト画像
!curl -L $(yadisk-direct https://disk.yandex.ru/d/xKQJZeVRk5vLlQ) -o LaMa_test_images.zip
!unzip LaMa_test_images.zip
「lama/LaMa_test_images」にテスト画像、「lama/big-lama/models/」に学習済モデルが保存されています。
以上で準備が完了しました。
チュートリアルの実行
それでは早速チュートリアルを実行してみましょう。
先ほどダウンロードしたモデルと画像を指定しています。
!python3 bin/predict.py model.path=$(pwd)/big-lama indir=$(pwd)/LaMa_test_images outdir=$(pwd)/output
「lama/output」に結果が保存されます。
テスト画像は何回かありますが、いくつか結果を見てみましょう。
処理前画像にInpainting(画像修復)を施すことで、処理後のように人や犬が消えた画像が得られました。
なかなか綺麗に消えていますね。
「lama/output」には他の画像の結果も保存されていますので、興味がある方は確認してみましょう。
オリジナル画像でLamaの実装する
次にLamaを使用してオリジナルの画像でもInpainting(画像修復)を行なっていきましょう。
まずはお好きなオリジナル画像をご用意ください。
ここでは例として某観光地の写真から人を除去してみます。
Googleスライドでマスク画像を作成
Lamaで処理を実行するには「処理前」の画像と「マスク画像」が必要になります。
下の例をご覧ください。
元の写真に対して、人が写っている部分をマスクした画像を作成します。
ここからはGoogleスライドでマスク画像を作成する方法を紹介します。
対象物を囲う
まずはプレゼンテーションを作成して、使用する画像を挿入します。
次にスライドを複製して、「挿入」タブから「線」⇨「多角形」の順番で選択します。
「多角形」でマスクしたい対象を囲っていきます。
対象物を白色に変える
全ての対象物を囲い終わったら、色を白色に変更します。
さらに枠線の色も白に変更しましょう。
以下のようになっていれば問題ありません。
背景色を変える
次に背景画像を選択します。
「書式設定オプション」タブから「調整」を選択しましょう。
ここで明るさを-100%、コントラストを+100%にしましょう。
以下のような画像ができていれば完成です。
上のようなマスク画像が無事に完成しました。
このスライドは「ファイル」タブから画像として保存できます。
なお、今回はGoogleスライドを使用しましたが、PowerPointでも同様にマスク画像を作成することが可能です。
ご自身の環境に合わせて、使いやすものを使ってみてください。
オリジナル画像でInpainting(画像修復)
いよいよオリジナル画像でInpainting(画像修復)を実装します。
マスク画像のファイル名は元画像のファイル名に「_mask」をつける必要があります。
ここでは元画像のファイル名を「kiyotsukyo.png」、マスク画像を「kiyotsukyo_mask.png」とします。
これを「lama/data」にアップします。(dataというフォルダを作成しましょう)
最後に先ほどと同様に実行しましょう。
!python3 bin/predict.py model.path=$(pwd)/big-lama indir=$(pwd)/data outdir=$(pwd)/output
実行すると「lama/output」に結果が出力されます。
なお、複数枚まとめて処理をすることも可能です。
「lama/data」に他の画像もアップしてから実行しましょう。
まとめ
最後までご覧いただきありがとうございました。
今回はLamaのInpainting(画像修復)技術を紹介しました。
観光地での写真から人を消するなど、日常生活においても役に立ちそうな技術ですね。
よかったら動画もご覧ください。
参考
「predict.py」を実行するとエラーが出てしまいます。
これはsaicinpaintingが読み込めていないことが原因です。
以下のように「predict.py」を変更することで解決します。
import logging
import os
import sys
import traceback
# predict.pyに3行を追加
__dir__ = os.path.dirname(os.path.abspath(__file__))
sys.path.append(__dir__)
sys.path.append(os.path.abspath(os.path.join(__dir__, '../')))
from saicinpainting.evaluation.utils import move_to_device