見出し画像

Google Colab で CartoonSegmentation を試す

「Google Colab」で「CartoonSegmentation」を試したので、まとめました。


1. CartoonSegmentation

CartoonSegmentation」は、漫画・アニメのキャラクターのインスタンスセグメンテーションとそれを中心に構築されたいくつかの視覚テクニックを含む、論文「 Instance-guided Cartoon Editing with a Large-scale Dataset」の実装です。

2. Colabでの実行

Colabでの実行手順は、次のとおりです。

(1) Colabのノートブックを開き、メニュー「編集 → ノートブックの設定」で「GPU」を選択。

(2) パッケージのインストール。

# パッケージのインストール
!git clone https://github.com/CartoonSegmentation/CartoonSegmentation
%cd CartoonSegmentation
!pip install -U openmim
!mim install mmcv mmdet mmengine
!pip install -r requirements.txt

(3) モデルのダウンロード。

# モデルのダウンロード
!mkdir models
!git clone https://huggingface.co/dreMaz/AnimeInstanceSegmentation models/AnimeInstanceSegmentation

(4) 左端のフォルダアイコンから「CartoonSegumentation/examples」に画像をアップロード。

・girl.png

(4) 画像とAnimeInsSegの準備と推論の実行。
instances.bboxesにバウンディングボックス、instances.masksにマスクが出力されます。 これらはオブジェクトが検出されないNoneになります。

import cv2
from PIL import Image
import numpy as np
from animeinsseg import AnimeInsSeg, AnimeInstances
from animeinsseg.anime_instances import get_color

# パラメータ
mask_thres = 0.3
instance_thres = 0.3
refine_kwargs = {'refine_method': 'refinenet_isnet'} # 使用しない場合はNoneを指定
# refine_kwargs = None

# 画像の準備
imgp = 'examples/girl.png'
img = cv2.imread(imgp)

# AnimeInsSegの準備
ckpt = r'models/AnimeInstanceSegmentation/rtmdetl_e60.ckpt'
net = AnimeInsSeg(ckpt, mask_thr=mask_thres, refine_kwargs=refine_kwargs)

# 推論の実行
instances: AnimeInstances = net.infer(
    img,
    output_type='numpy',
    pred_score_thr=instance_thres
)

(5) 結果の確認。

drawed = img.copy()
im_h, im_w = img.shape[:2]

# 結果の確認
for ii, (xywh, mask) in enumerate(zip(instances.bboxes, instances.masks)):
    color = get_color(ii)
    mask_alpha = 0.5
    linewidth = max(round(sum(img.shape) / 2 * 0.003), 2)

    # バウンディングボックスの描画
    p1, p2 = (int(xywh[0]), int(xywh[1])), (int(xywh[2] + xywh[0]), int(xywh[3] + xywh[1]))
    cv2.rectangle(drawed, p1, p2, color, thickness=linewidth, lineType=cv2.LINE_AA)
    
    # マスクの描画
    p = mask.astype(np.float32)
    blend_mask = np.full((im_h, im_w, 3), color, dtype=np.float32)
    alpha_msk = (mask_alpha * p)[..., None]
    alpha_ori = 1 - alpha_msk
    drawed = drawed * alpha_ori + alpha_msk * blend_mask

# 表示
drawed = drawed.astype(np.uint8)
Image.fromarray(drawed[..., ::-1])

複数のキャラクターも判定できます。

関連



この記事が気に入ったらサポートをしてみませんか?