Talking Head Anime from a Single Imageを使ってバ美肉しようとしたらハマった点とその解決

## はじめに
1枚の画像からVTuberになれるスーパーツール`Talking Head Anime from a Single Image`を使って、VTuberになろうとした時にハマった点と、その解決をしたやり方を書いていきます。


（↓実際に遊んでいる様子）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">強力なチカラを手に入れた <a href="https://t.co/AXeYTR3lCz">pic.twitter.com/AXeYTR3lCz</a></p>&mdash; meihei☁ (@app1e_s) <a href="https://twitter.com/app1e_s/status/1269253172477874177?ref_src=twsrc%5Etfw">June 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 目次
- 環境
- `conda env create -f environment.yml`が動かない
- OpenCVが動かない
- 入力用の画像が読み込まれない
- カメラが動作しない
- 背景をグリーンバックにする
- その他

## 環境
- OS: Windows 10
- Python: 3.8.1
- conda: 4.5.11
- opencv-python: 4.2.0.34
- GPU: Geforce GTX 1060 (6GB)
- NVIDIAドライバー: 442.92
- CUDA: 10.2

その他は`conda env create -f environment.yml`でインストールされた通りです。

## `conda env create -f environment.yml`が動かない
### 症状
`conda env create -f environment.yml`を実行しても環境が作られない

### 原因
Anacondaのバージョンが低い

### 解決
管理者で`conda update -n base conda`を実行する
（この時、Anaconda本体の名前が`base`ではない場合は書き換える必要があるので注意）

### 参考
- https://qiita.com/kerobot/items/917dc7027e15f5ff75ac

## OpenCVが動かない
### 症状
`python app/puppeteer.py`を実行するとOpenCVが見つからないと言われる

### 原因
OpenCVが`environment.yml`でインストールされてないっぽい（？）

### 解決
`pip install opencv-python`でインストール

## 入力用の画像が読み込まれない
### 症状
`load Image ...`から画像を選択して以下のエラーが表示される

- `The loaded image has size 400x400, but we required 256x256`

### 原因
入力画像の要件に従っていないから

### 解決
READMEに書いてある通りにやりましょう
> - It must be in PNG format.
> - It must be of size 256 x 256.
> - The head of the character must be contained in the center 128 x 128 box.
> - It must have 4 channels (RGBA).
> - Pixels that do not belong to the character's body must have value (0,0,0,0). In other words, the background must be transparent.

[にじさんじのメンバーリスト](https://nijisanji.ichikara.co.jp/member/)からとってくると400x400なので、`画像　リサイズ　オンライン`とかで検索するとよいです。

また、顔が真ん中になかったり、背景が透明ではない画像の場合は、Gimpなどを使って加工するほうが早いです。

## カメラが動作しない
### 症状
`OnReadSample() is called with error status: -1072875772`と出てきてWebカメラを認識しない

### 原因
(詳しいことはわからなかったです)

### 解決
app/puppeteer.pyで
`video_capture = cv2.VideoCapture(0)`
を
`video_capture = cv2.VideoCapture(cv2.CAP_DSHOW)`
に書き換える。

また、複数カメラを使っている場合はここの数値を変えることで変更可能
（上のサンプルではOBSからバーチャルカメラをつないで動かしてます）

### 参考
- https://stackoverflow.com/questions/51851198/opencv-set-camera-resolution-windows-vrs-linux

## 背景をグリーンバックにする
ハマった点ではないですが、この技術を配信で使おうと考えると、やはり背景はグリーンバックが望ましいです。

### 解決
app/manual_poser.py、app/pupeteer.pyともに
`self.posed_image_label = Label(posed_image_frame, text="Nothing yet!")`
と書かれている部分を
`self.posed_image_label = Label(posed_image_frame, text="Nothing yet!", bg="#00FF00")`
に書き換えます。

(補足: [manual_poser.py中の場所](https://github.com/pkhungurn/talking-head-anime-demo/blob/master/app/manual_poser.py#L62) [pupeteer.py中の場所](https://github.com/pkhungurn/talking-head-anime-demo/blob/master/app/puppeteer.py#L69))

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">例の１枚の画像からVTuberになるやつ、背景色を緑にしたらいよいよそれっぽくなった <a href="https://t.co/O2kFwCXs0p">pic.twitter.com/O2kFwCXs0p</a></p>&mdash; meihei☔ (@app1e_s) <a href="https://twitter.com/app1e_s/status/1271068637084827648?ref_src=twsrc%5Etfw">June 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## その他
この記事では取り扱っていないですが、CUDAの設定などはディバイスに依存してたりするので、よく調べてやらないとハマるかもしれません。

あと、WSL＋Dockerでやろうとしたらうまくできませんでした。これは解決できず諦めたので記事には書いていないです。

## 参考

### 公式情報
- [Talking Head Anime from a Single Image](https://pkhungurn.github.io/talking-head-anime/)
- [GitHub](https://github.com/pkhungurn/talking-head-anime-demo)

### 公式サイトを日本語訳されたサイト
- [画像1枚からVTuverになる方法](https://note.com/npaka/n/n408c14e78ad2)

### 環境構築など
- [Talking Head Anime from a Single Image でバ美肉してみる [python 準備編]](https://qiita.com/tomato_/items/1443f83da6eb10ba502e)
- [Talking Head Anime from a Single Image でバ美肉してみる](https://qiita.com/tomato_/items/8176fa11f2751f2e992c)
- [Talking Head Anime from a Single Imageを使ってVtuberになる方法！](https://harkerhack.com/how-to-use-talking-head-anime-demo/)