はじめに
写真を撮ったら、余計なモノまで写っていた、なんてことありますよね?
- 「机の上のお菓子を消さなきゃ!」
- 「足元のコードが汚いなぁ」
そんなときに役立つのが、この 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 がペアになったファイルが入っています
xxx.png が元画像で、 xxx_mask.png が元画像から消したいところを示すマスク画像です
xxx_mask.png の黒い部分が残すところ、白い部分が消すところになります
テスト画像の例
000068.png
000068_mask.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
見事に対象物が消えました!
画像を交互に切り替えてみると、このようになります
元あったものが消えて、違和感ないように背景が補完されているのが分かりますね
目的の画像を処理する
それでは、自分の用意した画像を処理してみましょう
まずマスク画像を作らないといけないので、元画像を画像編集ソフト(レイヤーが使えるもの)で開きます
※以降の画像は FireAlpaca で編集した例です
レイヤーを追加して、不透明度を50%などの透ける数値にしておきます
追加した方のレイヤーで画像全体を黒に塗りつぶした後、消したい部分だけを白に塗ります
いい感じに塗れたら追加したレイヤーの不透明度を100%にして、 xxx_mask.png として出力します
元画像 xxx.png と xxx_mask.png を targets などの適当なフォルダに配置します
以下のコマンドを実行します
bash docker/2_predict.sh $(pwd)/big-lama $(pwd)/targets $(pwd)/output device=cpu
output ディレクトリーに処理結果が出力されました
お菓子とコードが完全に消えて、あたかも最初から存在していなかったかのようです
画像を交互に切り替えてみると、いかに自然かが分かりますね
まとめ
GPU があれば refine=True を指定してもっと高精度にできるようなので、 Google Colab で試してみよう