本記事では、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))の不一致を克服しています。
詳細はこちらの論文をご参照ください。
本記事では上記手法を用いて、任意の画像をSaliency Objection Detectionし、背景をグリーンバックに変換していきます。
デモ(Colaboratory)
それでは、実際に動かしながら背景をグリーンバックに変換にしていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo
また、下記から直接Google Colaboratoryで開くこともできます。
なお、このデモは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
以下の画像をモデルに入力します。
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
0 件のコメント :
コメントを投稿