Anime Segmentationの導入


WebUI拡張機能化したABG_extensionがリリースされている。多分今はこっち導入した方が楽。


0. 前提条件

  • Git(+LFS) 最新版
  • Python 3.10.X
  • CUDA 11.3

Stable Diffusion web UIを既に導入しており、教師画像作成の補助として使用することを想定しているのでこんな感じ。

1. スクリプトとモデルデータのダウンロード

git clone https://github.com/SkyTNT/anime-segmentation.git
git clone https://huggingface.co/skytnt/anime-seg
clone後、isnetis.ckpt(学習済モデル)をスクリプトのフォルダ(anime-segmentationの方)に移動させておくと実行時のモデル指定が楽。

cd anime-segmentation
カレントディレクトリをスクリプトのフォルダに移動。以降はこのフォルダ上で作業しているものとする。

2. 仮想環境の作成とアクティベート

python -m venv venv
.\venv\scripts\activate.bat
仮想環境を作成する。別に作成しなくてもいいが、作成しておくと後々役に立つ…はず。
以降は仮想環境がアクティベートされた状態で作業しているものとする。

3. 依存ライブラリのインストール

requirements.txt

1
2
3
4
5
6
7
numpy
scipy
torch==1.12.1+cu113
torchvision==0.13.1+cu113
...
...
--extra-index-url https://download.pytorch.org/whl/cu113

requirements.txtを開き、torch、torchvisionの項目にそれぞれバージョン指定を追加。
加えて、新しい行に--extra-index-url https://download.pytorch.org/whl/cu113を追加(追記場所はどこでもいい)。
これをしておかないと違うバージョンのCUDA向けのPyTorchを落としてきてCUDAが認識されない。

pip install -r requirements.txt
ライブラリのインストール。しばらく待つ。

4. 実行

python inference.py --net isnet_is --ckpt isnetis.ckpt --data <画像ディレクトリ> --out <出力先ディレクトリ> --img-size 1024 --only-matted
使うのはinference.py。モデルデータを移動させてない場合は--ckpt isnetis.ckptの部分を正しいパスに書き換える。
しばらく待つと出力先として指定したディレクトリに切り抜かれた画像が生成されているはず。
(1660系のGPUで出力が真っ黒になる場合は--fp32を追加するといいらしい。)

(5.) 再度実行する時

cd anime-segmentation
.\venv\scripts\activate.bat
python inference.py --net isnet_is --ckpt isnetis.ckpt --data <画像ディレクトリ> --out <出力先ディレクトリ> --img-size 1024 --only-matted
カレントディレクトリの移動、仮想環境のアクティベートのみでOK。


おまけ. アルファマスク画像を出力できるようにする

(スクリプトの改造が必要なので自己責任で行なうこと)
なんらかの理由で、アルファ値のみのグレースケール画像が欲しくなったときの対処法。
inference.pyの76行目以降に以下の2行を付け足すと通常の切り抜き画像の他にアルファマスク画像も出力されるようになる。

...
        if opt.only_matted:
            img = np.concatenate((mask * img + 1 - mask, mask * 255), axis=2).astype(np.uint8)
            img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGRA)
            cv2.imwrite(f'{opt.out}/{i:06d}.png', img)
            # ↓これを追加
            img = cv2.cvtColor(mask*255, cv2.COLOR_RGB2BGR)
            cv2.imwrite(f'{opt.out}/{i:06d}_mask.png', img)
            # ↑これを追加
        else:
            img = np.concatenate((img, mask * img, mask.repeat(3, 2) * 255), axis=1).astype(np.uint8)
            img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
            cv2.imwrite(f'{opt.out}/{i:06d}.jpg', img)

...

転載は自由にしていい

Edit
Pub: 12 Nov 2022 11:35 UTC
Edit: 03 Jan 2023 17:20 UTC
Views: 2134