概要
SimSwap という写真の顔を取り替えるプログラムが公開されていたので、インストールして遊んでみました。
OS が Windows なのと Anaconda を入れていないことで少し手間取ったので、手順を共有したいと思います。
環境
Windows 10
Python 3.8.1
CUDA Toolkit 10.2
NVIDIA GeForce GTX 1080
GeForce Game Ready ドライバ 456.71
手順
1. CUDA Toolkit をインストールする
SimSwap/preparation.md を見ると CUDA をインストールした方が良さそうなので、バージョンを合わせてインストールします。
上でも書いたとおり私は Anaconda を入れていないので、conda
ではなくインストーラをダウンロードして入れました。
こちら → CUDA Toolkit 10.2 Download
2. git clone する
SimSwap の GitHub で URL をコピーして git clone します。
> git clone https://github.com/neuralchen/SimSwap.git
私が clone した時点では以下のコミットでした。
3. 仮想環境を構築する
> python -m venv .venv
> .venv\Scripts\activate
(.venv) >
先程の preparation.md を見て、なるべくパッケージのバージョンを合わせるようにインストールしました。
conda
が使えないことで苦労するのは pytorch のインストールだと思います。
Start Locally | PyTorch というページで pip
コマンドを調べられますが、そのまんまだとインストールできなかったので、以下のように変えてみました。
(.venv) > pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
CUDA が使えるか確認します。
(.venv) > python
>>> import torch
>>> torch.cuda.is_available()
True
>>> exit()
(.venv) >
あとは書いてあるとおりインストールしました。
(.venv) > pip install insightface==0.2.1 onnxruntime moviepy
4. preparation のつづき
insightface のモデルをダウンロードして (解凍して) 配置するようにとあるので、そのとおりにします。
We use the face detection and alignment methods from insightface for image preprocessing. Please download the relative files and unzip them to ./insightface_func/models from this link.
(SimSwap の) 学習済みモデルもダウンロードして (解凍して) 配置します。
There are two archive files in the drive: checkpoints.zip and arcface_checkpoint.tar
- Copy the arcface_checkpoint.tar into ./arcface_model
- Unzip checkpoints.zip, place it in the root dir ./
[Google Drive] [Baidu Drive] Password: jd2v
上記で配置したものだけ抜粋すると、こんなフォルダ構成になると思います。
SimSwap
├ arcface_model
│ └ arcface_checkpoint.tar
├ checkpoints
│ └ people
│ └ ...
├ insightface_func
│ ├ models
│ │ └ antelope
│ │ ├ glintr100.onnx
│ │ └ scrfd_10g_bnkps.onnx
│ └ ...
└ ...
5. EncodeError 対応
SimSwap/usage.md に実行例があるのでそのとおりにすると、以下のエラーが出ました。
Traceback (most recent call last):
File "test_one_image.py", line 35, in <module>
model = create_model(opt)
File "F:\Dev\Python\clone\SimSwap\models\models.py", line 18, in create_model
model.initialize(opt)
File "F:\Dev\Python\clone\SimSwap\models\fs_model.py", line 64, in initialize
netArc_checkpoint = torch.load(netArc_checkpoint)
File "F:\Dev\Python\clone\SimSwap\.venv\lib\site-packages\torch\serialization.py", line 593, in load
return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args)
File "F:\Dev\Python\clone\SimSwap\.venv\lib\site-packages\torch\serialization.py", line 772, in _legacy_load
result = unpickler.load()
File "F:\Dev\Python\clone\SimSwap\.venv\lib\site-packages\torch\serialization.py", line 720, in persistent_load
_check_container_source(*data)
File "F:\Dev\Python\clone\SimSwap\.venv\lib\site-packages\torch\serialization.py", line 639, in _check_container_source
f.write(lines)
UnicodeEncodeError: 'cp932' codec can't encode character '\xe0' in position 1153: illegal multibyte sequence
Windows 特有の問題かと思いますが、以下のファイルを変更して対応しました。
- .venv\Lib\site-packages\torch\serialization.py
635行目
(前) with open(file_name, 'a+') as f:
(後) with open(file_name, 'a+', encoding='utf-8') as f:
実行例
(.venv) > python test_one_image.py --isTrain false --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path crop_224/cage.jpg --pic_b_path crop_224/mouth_open.jpg --output_path output/
pic_a | pic_b | result |
---|---|---|