本記事では、Inpaint Anythingと呼ばれる機械学習手法を用いて画像中の任意のオブジェクトを自然に消去する方法をご紹介します。
Inpaint Anything
概要
Inpaint Anythingは、マスクフリーの画像修復技術です。
最新の画像修復システムは、マスクの選択と、除去エリアの修復が課題でした。
Inpaint Anythingでは、Segment-Anything Model(SAM)に基づいて、マスクフリーの画像修復を実現し、オブジェクトをクリックして塗りつぶしという新しいパラダイムを構築しています。
Inpaint Anythingでは、この構成により主に3つの主な機能をサポートしています。
-
Remove Anything
ユーザーがクリックしたオブジェクトを削除し、削除部分を適切に修復
-
Fill Anything
特定のオブジェクトを削除した後テキストベースのプロンプトを入力に、Stable Diffusionなどを使用し、生成コンテンツで画像を修復
-
Replace Anything
クリックしたオブジェクトを保持し、オブジェクト以外の背景をテキストプロンプトで指定した背景に置換
詳細はこちらの論文をご参照ください。
本記事では上記手法を用いて、Remove Anythingを動かしていきます。
デモ(Colaboratory)
それでは、実際に動かしながらRemove Anythingを試していきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo
また、下記から直接Google Colaboratoryで開くこともできます。
なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。
環境セットアップ
それではセットアップしていきます。
Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
初めにGithubからソースコードを取得します。
%cd /content
!git clone https://github.com/geekyutao/Inpaint-Anything.git
%cd /content/Inpaint-Anything
# Commits on Apr 24, 2023
!git checkout 6bf630535c9e3f06e01c0af63f2e206f38483c7c
次にライブラリをインストールします。
%cd /content/Inpaint-Anything
# change pytorch version
!pip uninstall torch torchvision torchaudio torchtext torchdata -y
!pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html --quiet
!pip uninstall yellowbrick imbalanced-learn -y
!python -m pip install -e segment_anything
!python -m pip install -r lama/requirements.txt
!python -m pip install yellowbrick imbalanced-learn
!pip install huggingface-hub
最後にライブラリをインポートします。
import cv2
from google.colab.patches import cv2_imshow
from PIL import Image
import matplotlib.pyplot as plt
以上で環境セットアップは完了です。
学習済みモデルのセットアップ
続いて論文発表元が公開する学習済みモデルをダウンロードします。
%cd /content/Inpaint-Anything
!mkdir -p pretrained_models
!wget -c https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth \
-O ./pretrained_models/sam_vit_h_4b8939.pth
# ダウンロード不安定なためHuggingFace使用
# !curl -L $(yadisk-direct https://disk.yandex.ru/d/ouP6l8VJ0HpMZg) -o big-lama.zip
# !unzip big-lama.zip
# !mv big-lama ./pretrained_models
!mkdir -p pretrained_models/big-lama/models
!wget -c https://huggingface.co/camenduru/big-lama/resolve/main/big-lama/models/best.ckpt \
-O pretrained_models/big-lama/models/best.ckpt
!wget -c https://huggingface.co/camenduru/big-lama/raw/main/big-lama/config.yaml \
-O pretrained_models/big-lama/config.yaml
Remove Anything
それでは、任意の画像のオブジェクトを削除していきます。
まず画像をダウンロードします。
!wget -c https://www.pakutaso.com/shared/img/thumb/JK92_udekumu20150208091355_TP_V4.jpg \
-O ./test01.jpg
続いて、削除するオブジェクトを座標で指定します。
point_x = 375 #@param {type:"slider", min:0, max:800, step:1}
point_y = 120 #@param {type:"slider", min:0, max:462, step:1}
img = cv2.imread('./test01.jpg')
cv2.circle(
img,
(point_x, point_y), # 座標
5, # 円の半径
(0,0,255), # カラー
-1 # 太さ
)
cv2_imshow(img)
赤丸地点が指定座標位置です。
こちらのオブジェクトを削除していきます。
remove anythingを実行します。
%cd /content/Inpaint-Anything
!python remove_anything.py \
--input_img ./test01.jpg \
--point_coords {point_x} {point_y} \
--point_labels 1 \
--dilate_kernel_size 15 \
--output_dir ./results \
--sam_model_type "vit_h" \
--sam_ckpt ./pretrained_models/sam_vit_h_4b8939.pth \
--lama_config ./lama/configs/prediction/default.yaml \
--lama_ckpt ./pretrained_models/big-lama/
削除結果を確認します。
# show inference result
fig = plt.figure(figsize=(15, 10))
# input image
ax1 = fig.add_subplot(1, 3, 1)
plt.title('original', fontsize=16)
ax1.axis('off')
ax1.imshow( Image.open("./test01.jpg") )
ax1 = fig.add_subplot(1, 3, 2)
plt.title('mask', fontsize=16)
ax1.axis('off')
ax1.imshow( Image.open("./results/test01/with_mask_2.png") )
ax2 = fig.add_subplot(1, 3, 3)
plt.title('inpainted', fontsize=16)
ax2.axis('off')
ax2.imshow( Image.open("./results/test01/inpainted_with_mask_2.png") )
plt.show()
女性が削除され、画像が修復されていることが確認できます。
まとめ
本記事では、Inpaint Anythingを用いて任意の画像のオブジェクトを削除する方法をご紹介しました。
マスクが不要になり、アプリケーションへの適用が容易になっています。
また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。
リンク
リンク
また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。
参考文献
1.
論文 - Inpaint Anything: Segment Anything Meets Image Inpainting
2. GitHub - geekyutao/Inpaint-Anything
0 件のコメント :
コメントを投稿