私的AI研究会 > MotionSeg
画像のセグメンテーションを使い静止画から動画パーツを入れ替える技術「Motion Supervised co-part Segmentation」をローカルマシンで検証する
cd /anaconda_win/workspace_2 ← Windows の場合 cd ~/workspace_2 ← Linux の場合 git clone https://github.com/AliaksandrSiarohin/motion-cosegmentation motion-co-seg・「motion-co-seg」フォルダ内にもう一つプロジェクトをダウンロードする
cd motion-co-seg git clone https://github.com/AliaksandrSiarohin/face-makeup.PyTorch face_parsing
update └─workspace_2 └─motion-co-seg ← GitHub からクローンしたプロジェクトに上書きする ├─face_parsing ← GitHub からクローンしたプロジェクトに上書きする │ ├─results │ └─result_save ├─results ├─results_save └─sample ├─images └─videos・解凍してできる「update/」フォルダ以下を次のフォルダの下に上書きコピーする
%matplotlib inline
カテゴリー | --config | --checkpoint | --source_image | --terget_video | --swap_index | 出力例 |
0:10seg | config/ vox-256-sem-10segments.yaml | ./sample/ vox-10segments.pth.tar | ./sample/images/ 16.png | ./sample/videos/ 04.mp4 | [2] | 赤い唇のトランプ |
./sample/images/ 26.png | ./sample/ videos/11.mp4 | {7,3] | 青い目なった女優 | |||
1:5seg | config/ 256-sem-5segments.yaml | ./sample/ vox-5segments.pth.tar | ./sample/images/ 27.png | ./sample/videos/ 02.mp4 | [3,4,5] | 金髪になった女優 |
./sample/images/ 27.png | ./sample/videos/ 04.mp4 | [3,4,5] | トランプ顔の女優 | |||
./sample/images/ 23.png | ./sample/videos/ 07.mp4 | [1] | 髭が生えた男優 | |||
2:super | config/ vox-256-sem-10segments.yaml | ./sample/ vox-first-order.pth.tar | ./sample/images/ anim16.png | ./sample/videos/ 04.mp4 | [1,2,3.. ...14,15] | 女優の顔のトランプ |
(py38_learn) python part_swap2.py --config ./config/vox-256-sem-10segments.yaml --target_video ./sample/videos/04.mp4 --source_image ./sample/images/16.png --checkpoint sample/vox-10segments.pth.tar --swap_index 2 --result_video ./result_lips.mp4 100%|████████████████████████████████████████████████████████████████████████████████| 211/211 [00:03<00:00, 66.93it/s]・GPU動作の場合(「--cpu」オプションなし)
100%|████████████████████████████████████████████████████████████████████████████████| 211/211 [01:25<00:00, 2.46it/s]
(py38_learn) python part_swap2.py --config ./config/vox-256-sem-10segments.yaml --target_video ./sample/videos/11.mp4 --source_image ./sample/images/26.png --checkpoint sample/vox-10segments.pth.tar --swap_index 7,9 --result_video ./result_eye_cor.mp4 100%|████████████████████████████████████████████████████████████████████████████████| 109/109 [00:01<00:00, 67.05it/s]・GPU動作の場合(「--cpu」オプションなし)
100%|████████████████████████████████████████████████████████████████████████████████| 109/109 [00:48<00:00, 2.26it/s]
コマンドオプション | 引数 | 初期値 | 意味 |
-c, --category | str | '0' | カテゴリー指定(必須) |
--config | str | 指定しなければ内部設定※ | 学習済みモデルの設定ファイル(.yaml) |
--checkpoint | str | 学習済みモデル・ファイル | |
--source_image | str | 静止画ファイルパス | |
--driving_video | str | 動画ファイルパス | |
--result_video | str | 出力保存ファイルパス | |
--swap_index" | list | [-1] | index of swaped parts |
--hard | bool | False | use hard segmentation labels for blending |
--use_source_segmentation | bool | False | use source segmentation for swaping |
--first_order_motion_model | bool | False | use first order model for alignment |
--supervised | bool | False | use supervised segmentation labels for blending. Only for faces. |
--cpu | bool | False | cpu mode |
コマンドオプション | -c 0 (10seg) | -c 1 (5seg) | -c 3 (super) |
--config | ./config/vox-256-sem-10segments.yaml | ./config/vox-256-sem-5segments.yaml | ./config/vox-256-sem-10segments.yaml |
--checkpoint | ./sample/vox-10segments.pth.tar | ./sample/vox-5segments.pth.tar | ./sample/vox-first-order.pth.tar |
--source_image | ダイアログによる静止画選択 | ||
--driving_video | ダイアログによる動画選択(swap_index=[-1] の時はなし) | ||
--result_video | ./result/result_10seg.mp4 | ./result/result_5seg.mp4 | ./result/result_super.mp4 |
./result/result_10seg.png 注1 | ./result/result_5seg.png 注1 | ./result/result_super.png 注1 |
(py38_learn) python motion_seg.py -c 0 --swap_index 2 Motion Supervised co-part Segmentation Ver. 0.01: Starting application... - Category : 0: ** 10-segments model ** - config : ./config/vox-256-sem-10segments.yaml - checkpoint : ./sample/vox-10segments.pth.tar - source_image : C:/anaconda_win/workspace_2/motion-co-seg/sample/images/16.png - target_video : C:/anaconda_win/workspace_2/motion-co-seg/sample/videos/04.mp4 - result_video : ./results/result_10seg.mp4 - swap_index : [2] - hard : False - use_source_segmentation : False - first_order_motion_model: False - supervised : False - cpu : False 100%|████████████████████████████████████████████████████████████████████████████████| 211/211 [00:02<00:00, 71.21it/s] Saving... → './results/result_10seg_16_04.mp4' Saving... → './results/result_10seg_16_04_a.mp4' Finished.・CPU動作の場合(「--cpu」オプション指定)
100%|████████████████████████████████████████████████████████████████████████████████| 211/211 [01:26<00:00, 2.44it/s]
(py38_learn) python motion_seg.py -c 0 --swap_index 7,9 Motion Supervised co-part Segmentation Ver. 0.01: Starting application... - Category : 0: ** 10-segments model ** - config : ./config/vox-256-sem-10segments.yaml - checkpoint : ./sample/vox-10segments.pth.tar - source_image : C:/anaconda_win/workspace_2/motion-co-seg/sample/images/26.png - target_video : C:/anaconda_win/workspace_2/motion-co-seg/sample/videos/11.mp4 - result_video : ./results/result_10seg.mp4 - swap_index : [7, 9] - hard : False - use_source_segmentation : False - first_order_motion_model: False - supervised : False - cpu : False 100%|████████████████████████████████████████████████████████████████████████████████| 109/109 [00:01<00:00, 69.68it/s] Saving... → './results/result_10seg_26_11.mp4' Saving... → './results/result_10seg_26_11_a.mp4' Finished.・CPU動作の場合(「--cpu」オプション指定)
100%|████████████████████████████████████████████████████████████████████████████████| 109/109 [00:44<00:00, 2.46it/s]
(py38_learn) python motion_seg.py -c 1 --swap_index 3,4,5② 顔以外の交換 画像:'./sample/image/27.png' 動画:'./sample/videos/04.mp4'
(py38_learn) python motion_seg.py -c 1 --swap_index 3,4,5③ Adding Beard 画像:'./sample/image/23.png' 動画:'./sample/videos/07.mp4'
(py38_learn) python motion_seg.py -c 1 --swap_index 1④ 顔の交換 画像:'./sample/image/16.png' 動画:'./sample/videos/04.mp4'
(py38_learn) python motion_seg.py -c 2 --swap_index 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
(py38_learn) python motion_seg.py -c 0 --swap_index 7,9
(py38_learn) cd face_parsing
(py38_learn) python makeup.py・「model.py」に不具合があるので変更 を加えた
コマンドオプション | 引数 | 初期値 | 意味 |
--source_image | str | '' (ダイアログによる指定) | 静止画ファイルパス |
--result_image | str | './result/result.jpg' | 出力保存ファイルパス |
--checkpoint | str | './cp/79999_iter.pth' | 学習済みモデル・ファイル |
--cpu | bool | False | cpu mode |
(py38_learn) python makeup2.py Motion Supervised co-part Segmentation Ver. 0.01: Starting application... - source_image : C:/anaconda_win/workspace_2/motion-co-seg/face_parsing/imgs/116.jpg - result_image : ./result_116.jpg - checkpoint : ./cp/79999_iter.pth - cpu : False
コマンドオプション | 引数 | 初期値 | 意味 |
--source_image | str | '' (ダイアログによる指定) | 静止画ファイルパス |
--result_image | str | './result/pars.jpg' | 出力保存ファイルパス |
--checkpoint | str | './cp/79999_iter.pth' | 学習済みモデル・ファイル |
--cpu | bool | False | cpu mode |
(py38_learn) python parsing.py Face-makeup demo Ver. 0.01: Starting application... - source_image : C:/anaconda_win/workspace_2/motion-co-seg/face_parsing/imgs/116.jpg - result_image : ./results/result_116.jpg - checkpoint : ./cp/79999_iter.pth - cpu : False
コマンドオプション | 引数 | 初期値 | 意味 |
--source_image | str | '' (ダイアログによる指定) | 静止画ファイルパス |
--result_image | str | './result/make.jpg' | 出力保存ファイルパス |
--checkpoint | str | './cp/79999_iter.pth' | 学習済みモデル・ファイル |
--cpu | bool | False | cpu mode |
--category | str | 'face' | category 'hair'/'lips'/'face' |
--swap_color | list | [210,120,110] | swaped color (R,G,B) |
--log | int | 3 | Log level(-1/0/1/2/3/4/5) |
(py38_learn) python makeup_gui.py Face-makeup GUI Ver. 0.01: Starting application... - source_image : ./imgs/116.jpg - result_image : ./results/make_face_210-120-110_116.jpg - checkpoint : ./cp/79999_iter.pth - cpu : False - category : face - swap_color : [210, 120, 110] - log : 3 Finished.
from skimage.draw import ellipse as cricle
import imageio.v2 as imageio
import imageio.v2 as imageio import warnings warnings.simplefilter('ignore', UserWarning)
# config = yaml.load(f) config = yaml.load(f,Loader=yaml.Loader)
try: from face_parsing.resnet import Resnet18 except ImportError: from resnet import Resnet18
import warnings warnings.simplefilter('ignore')
def evaluate(image_path='./imgs/116.jpg', cp='cp/79999_iter.pth', cpu=False): # 2014.07.16 # if not os.path.exists(respth): # os.makedirs(respth) n_classes = 19 net = BiSeNet(n_classes=n_classes) if cpu: net.cpu() net.load_state_dict(torch.load(cp, torch.device('cpu'))) else: net.cuda() net.load_state_dict(torch.load(cp)) net.eval()