LoginSignup
16
14

More than 1 year has passed since last update.

LaMa で物体を"無かったことにする" (画像内の物体をAIで自然に消す)

Last updated at Posted at 2022-11-15

はじめに

写真を撮ったら、余計なモノまで写っていた、なんてことありますよね?

sofa.png

  • 「机の上のお菓子を消さなきゃ!」
  • 「足元のコードが汚いなぁ」

そんなときに役立つのが、この LaMa です

何はともあれ動かしてみましょう

今回は Docker で動かします

実行環境

  • macOS Monterey 12.6.1
  • Rancher Desktop 1.6.2
  • Python 3.10.6

CUDA 対応の GPU がないので CPU で実行しています

準備

公式リポジトリーをクローンしてきます

git clone https://github.com/saic-mdal/lama.git

ディレクトリーを移動します

cd lama

コンテナのビルド

Docker ディレクトリーでコンテナをビルドします

cd docker
./build.sh
cd ..

モデルのダウンロード

ファイルをダウンロードするために必要なライブラリをインストールします

pip install wldhx.yadisk-direct

最良のモデルファイルをダウンロードし、展開します

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

展開すると、下画像のように xxx.png と xxx_mask.png がペアになったファイルが入っています

スクリーンショット 2022-11-14 15.06.48.png

xxx.png が元画像で、 xxx_mask.png が元画像から消したいところを示すマスク画像です

xxx_mask.png の黒い部分が残すところ、白い部分が消すところになります

テスト画像の例

000068.png

000068.png

000068_mask.png

000068_mask.png

マスク画像を透過して元画像に重ねてみたのが下の画像になります

看板内の似顔絵や観覧車のいくつかの柱、パラソルや何人かの人間が削除対象として選択されています

000068_masked.png

テスト画像での削除処理実行

私の macOS で実行したとき、 Permission Denied エラーが発生したので、以下のファイルを編集しました

docker/2_predict.sh

 docker run \
     -v "$SRCDIR":/home/user/project \
     -v "$MODEL_LOCAL_DIR":/data/checkpoint \
     -v "$INPUT_LOCAL_DIR":/data/input \
     -v "$OUTPUT_LOCAL_DIR":/data/output \
-    -u $(id -u):$(id -g) \ # ここを削除
     --name="lama-predict" \
     --rm \
     windj007/lama \
     /home/user/project/bin/predict.py \
         model.path=/data/checkpoint \
         indir=/data/input \
         outdir=/data/output \
         dataset.img_suffix=.png \
         $@

この状態で以下のコマンドを実行します

bash docker/2_predict.sh $(pwd)/big-lama $(pwd)/LaMa_test_images $(pwd)/output device=cpu

output ディレクトリーに各画像の処理結果が出力されます

output/000068_mask.png

000068_mask.png

見事に対象物が消えました!

画像を交互に切り替えてみると、このようになります

000068.gif

元あったものが消えて、違和感ないように背景が補完されているのが分かりますね

目的の画像を処理する

それでは、自分の用意した画像を処理してみましょう

まずマスク画像を作らないといけないので、元画像を画像編集ソフト(レイヤーが使えるもの)で開きます

※以降の画像は FireAlpaca で編集した例です

スクリーンショット 2022-11-14 15.29.22.png

レイヤーを追加して、不透明度を50%などの透ける数値にしておきます

スクリーンショット 2022-11-14 14.47.15.png

追加した方のレイヤーで画像全体を黒に塗りつぶした後、消したい部分だけを白に塗ります

スクリーンショット 2022-11-14 14.50.54.png

いい感じに塗れたら追加したレイヤーの不透明度を100%にして、 xxx_mask.png として出力します

スクリーンショット 2022-11-14 14.51.03.png

元画像 xxx.png と xxx_mask.png を targets などの適当なフォルダに配置します

以下のコマンドを実行します

bash docker/2_predict.sh $(pwd)/big-lama $(pwd)/targets $(pwd)/output device=cpu 

output ディレクトリーに処理結果が出力されました

sofa_mask.png

お菓子とコードが完全に消えて、あたかも最初から存在していなかったかのようです

画像を交互に切り替えてみると、いかに自然かが分かりますね

sofa.gif

まとめ

GPU があれば refine=True を指定してもっと高精度にできるようなので、 Google Colab で試してみよう

16
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14