[InpaintAnything] AIで画像中の指定のオブジェクトを削除する [消しゴムマジック]

2023年4月25日火曜日

Artificial Intelligence

本記事では、Inpaint Anythingと呼ばれる機械学習手法を用いて画像中の任意のオブジェクトを自然に消去する方法をご紹介します。

アイキャッチ

Inpaint Anything

概要

Inpaint Anythingは、マスクフリーの画像修復技術です。

最新の画像修復システムは、マスクの選択と、除去エリアの修復が課題でした。
Inpaint Anythingでは、Segment-Anything Model(SAM)に基づいて、マスクフリーの画像修復を実現し、オブジェクトをクリックして塗りつぶしという新しいパラダイムを構築しています。

Inpaint Anythingでは、この構成により主に3つの主な機能をサポートしています。

  1. Remove Anything
    ユーザーがクリックしたオブジェクトを削除し、削除部分を適切に修復
  2. Fill Anything
    特定のオブジェクトを削除した後テキストベースのプロンプトを入力に、Stable Diffusionなどを使用し、生成コンテンツで画像を修復
  3. Replace Anything
    クリックしたオブジェクトを保持し、オブジェクト以外の背景をテキストプロンプトで指定した背景に置換
Architecture
出典: Inpaint Anything: Segment Anything Meets Image Inpainting

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、Remove Anythingを動かしていきます。

デモ(Colaboratory)

それでは、実際に動かしながらRemove Anythingを試していきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

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

なお、このデモは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()

女性が削除され、画像が修復されていることが確認できます。

削除結果2

まとめ

本記事では、Inpaint Anythingを用いて任意の画像のオブジェクトを削除する方法をご紹介しました。
マスクが不要になり、アプリケーションへの適用が容易になっています。

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


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

参考文献

1.  論文 - Inpaint Anything: Segment Anything Meets Image Inpainting

2. GitHub - geekyutao/Inpaint-Anything

AIで副業ならココから!

まずは無料会員登録

プロフィール

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

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


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology