[InSpyReNet] AIで背景をグリーンバックに変換する[Saliency Object Detection]

2022年11月29日火曜日

Artificial Intelligence

本記事では、InSPyReNetと呼ばれる機械学習手法を用いて、ピクセルレベルの物体検出を行い任意の画像の背景をグリーンバックに変換する方法をご紹介します。

InSpyReNet

概要

Inverse Saliency Pyramid Reconstruction Network (InSPyReNet)は、高解像度(HR)データセットを使用せずにHR予測を行う物体検出(Salient Object Detection)手法です。

InSpyReNetは、image pyramidベースのSODフレームワークを構築しており、顕著性マップの画像ピラミッド構造を生成するように設計されています。

このピラミッドベースの画像ブレンディングで複数の結果をアンサンブルすることが可能となり、HR予測では、同じ画像のLR/HRスケールのペアからなる2つの異なる画像ピラミッドを合成して、有効受容野(Effective Receptive Field(ERF))の不一致を克服しています。

Architecture

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

本記事では上記手法を用いて、任意の画像をSaliency Objection Detectionし、背景をグリーンバックに変換していきます。

デモ(Colaboratory)

それでは、実際に動かしながら背景をグリーンバックに変換にしていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

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

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めにGithubからソースコードを取得します。

%cd /content

!git clone https://github.com/plemeri/InSPyReNet.git

# Commits on Nov 24, 2022
%cd /content/InSPyReNet
!git checkout 17d4f695f0691349d03f0359db89de5afcb784cd

次にライブラリをインストールします。

%cd /content/InSPyReNet

!pip install -r requirements.txt

!pip install --upgrade gdown

!pip install moviepy==0.2.3.5 imageio==2.4.1
!pip install yt-dlp

最後にライブラリをインポートします。

from yt_dlp import YoutubeDL
from moviepy.video.fx.resize import resize
from moviepy.editor import VideoFileClip

from PIL import Image
import IPython

以上で環境セットアップは完了です。

学習済みモデルのセットアップ

ここでは、論文発表元が公開する学習済みモデルをダウンロードします。

%cd /content/InSPyReNet

!mkdir -p data/backbone_ckpt/ snapshots/InSPyReNet_SwinB

!gdown --id 1MMhioAsZ-oYa5FpnTi22XBGh5HkjLX3y -O ./data/backbone_ckpt/res2net50_v1b_26w_4s-3cf99910.pth
!gdown --id 1fBJFMupe5pV-Vtou-k8LTvHclWs0y1bI -O ./data/backbone_ckpt/swin_base_patch4_window12_384_22kto1k.pth
!gdown --id 1k5hNJImgEgSmz-ZeJEEb_dVkrOnswVMq -O ./snapshots/InSPyReNet_SwinB/latest.pth

テスト画像・テスト動画のセットアップ

続いて、モデルに入力するテスト画像、テスト動画をセットアップしていきます。

動画をセットアップしていきます。

video_url = 'https://www.youtube.com/watch?v=EzaGEx80dJQ' #@param {type:"string"}

#@markdown 動画の切り抜き範囲(秒)を指定してください。\
#@markdown 30秒以上の場合OOM発生の可能性が高いため注意
start_sec =  33#@param {type:"integer"}
end_sec =  38#@param {type:"integer"}

(start_pt, end_pt) = (start_sec, end_sec)

%cd /content/InSPyReNet

!mkdir test_files

download_resolution = 720
full_video_path = './test_files/full_video.mp4'
input_clip_path = './test_files/clip_video.mp4'

# 動画ダウンロード
ydl_opts = {'format': f'best[height<={download_resolution}]', 'overwrites': True, 'outtmpl': full_video_path}
with YoutubeDL(ydl_opts) as ydl:
    ydl.download([video_url])

# 指定区間切り抜き
with VideoFileClip(full_video_path) as video:
    subclip = video.subclip(start_pt, end_pt)
    subclip.write_videofile(input_clip_path)
    
# 動画の確認
clip = VideoFileClip(input_clip_path)
clip = resize(clip, height=420)
clip.ipython_display()

以下の動画をモデルに入力していきます。

続いてテスト画像をセットアップしていきます。

%cd /content/InSPyReNet


!wget -c https://www.pakutaso.com/shared/img/thumb/SAYAPAKU5460_TP_V4.jpg \
      -O ./test_files/test01.jpg
!wget -c https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFF25Kj3aGN4XmptGMPr5XMajyBNqYRcHIKm7oAsDTIBv6XzKyxbSPCQCIm7vayii-77ifA2FDiE3L58gjCQrGDg6GaJl7GUq8XRhCl03wfmeX67XXWETuj5VMwVSjzZwfrzbw990ZY8z0/s1600/bg_koukasen_color1.png \
      -O ./test_files/background.png

以下の画像をモデルに入力します。

input image

Saliency Object Detection

それでは、Saliency Object Detectionを行いグリーンバックに変換していきます。
実行スクリプトが用意されているので、必要な変数を入力し実行します。

%cd /content/InSPyReNet

!mkdir results

SOURCE = '/content/InSPyReNet/test_files/test01.jpg'
DEST = '/content/InSPyReNet/results'
TYPE = 'map' # map, green, rgba, blur, overlay, another image file path

%cd /content/InSPyReNet

TYPE = 'green' # map, green, rgba, blur, overlay, another image file path
!python run/Inference.py \
  --config configs/InSPyReNet_SwinB.yaml \
  --source {SOURCE} \
  --dest {DEST} \
  --type {TYPE} \
  --gpu --verbose

!mv /content/InSPyReNet/results/test01.png /content/InSPyReNet/results/test01_green.png

im = Image.open('/content/InSPyReNet/results/test01_green.png')
IPython.display.display(im)

出力結果は以下の通りです。

人物を精細に検出し、それ以外(背景)の部分をグリーンバックに変換できています。

グリーンバック以外の変換も確認しておきます。

Blur

Saliency Map

backgroundの差し替え

検出箇所のOverlay

RGBA

非常に精細に検出できていることが見て取れます。

続いて、ビデオを入力します。

%cd /content/InSPyReNet

SOURCE = './test_files/clip_video.mp4'
TYPE = 'green' # map, green, rgba, blur, overlay, another image file path
!python run/Inference.py \
  --config configs/InSPyReNet_SwinB.yaml \
  --source {SOURCE} \
  --dest {DEST} \
  --type {TYPE} \
  --gpu --verbose

# 動画の確認
clip = VideoFileClip('./results/clip_video.mp4')
clip = resize(clip, height=420)
clip.ipython_display()

出力結果は以下の通りです。

動画でも高精度にグリーンバックに変換できています。

まとめ

本記事では、InSpyReNetを用いて任意の画像・動画の背景をグリーンバックに変換する方法をご紹介しました。

背景の差し替えなど身近なシーンで使用できそうです。

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


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

参考文献

1.  論文 - Revisiting Image Pyramid Structure for High Resolution Salient Object Detection

2. GitHub - plemeri/inspyrenet

AIで副業ならココから!

まずは無料会員登録

プロフィール

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

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


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology