【実験】正面の顔写真一枚からアバタ画像を作る＆逆変換してリアルにしてみる

# はじめに

近年は生成AIの他にメタバースの技術も盛り上がっていますが、そこで欠かせないのが自分の「アバタ」です。
アバタ作成ソフトを使って好きなアバタを作ったり、 **「自分に似たアバタを作る」** サービスも出てきています。


本記事では、画像生成・変換に特化した生成AI「Stable Diffusion」やその周辺の拡張技術を組み合わせることにより、**単一の顔写真から特定のテイストに沿ったアバタをどれくらいうまく生成できるのか実験してみました**。

以下の環境で検証を行っています。

| 項目 | |
|:-- |:--|
| OS | Windows 11  |
| CPU  | AMD Ryzen 7 5700X  |
| メインメモリ  | 64GB  |
| GPU  | NVIDIA GeForce RTX 3090 |


# 目的

単にアバタを作るのではなく、**実在の人間の顔写真に似た顔のアバタを作ること**を想定しています。

今回は、「VRoid Studio」で作れるアバタと同じような見た目・テイスト、かつ**実在の人間に近い**アバタを作ることを仮定し実験します。

:::note warn
注意
あくまで個人的な実験として行ったものを記載しています。VRoid Studioの利用規約を事前にご確認ください。
:::

https://vroid.com/studio

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/d7674008-0f03-db8e-21e7-6e39e18cb2c9.png)
（出典：[公式YouTube動画](https://www.youtube.com/watch?v=2gfEpSW-pvw)より）


アバタ化するターゲットとして、以下の４人を用意しました。「ぱくたそ」さんから、背景が白く使いやすい写真をお借りしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/11367c7f-b5ac-aeac-e6ae-4fbe691c3d03.png)

https://www.pakutaso.com/




# 実験1. まずは用意したアバタのテイストを学習してみる

Stable Diffusionを使い、VRoidのテイストを学習させてみます。簡単にLoRAを学習することができる「sd-scripts」を利用しました。

https://github.com/kohya-ss/sd-scripts

学習にあたり、実際にVRoid Studioを使って数十体のモデルを作り（なるべく街にいそうな顔、現実的な顔）、正面のキャプチャを用意しました。簡易化のため、服は青のTシャツで統一しています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/0a52bd89-4038-6a0b-2719-2bfcf571a24f.png)

共通事項として以下のプロンプトを利用しました。`vroidstudio`が新しく学習される単語になります。
```
vroidstudio, looking at viewer, blue shirt, facing front, white background
```

用意した画像を使ってLoRAを学習し、`vroidstudio`をプロンプトに入れてランダムなシード値で画像生成した結果がこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/95bb0c39-3804-334e-2c1d-a3d545f9fcad.png)

データセットには使っていない髪型やポーズも出現しており、かなり用意したアバタのテイストを学習できているようです。

# 実験2. Image-To-Image(i2i)機能を使って直接顔写真からアバタを作ってみる

Stable DiffusionはImage-To-Image(i2i)も行うことができます。直接顔写真を入力し、プロンプトに`vroidstudio`と指定してみた結果、以下のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/01375439-a91f-27bc-f290-a611904a6b4e.png)

用意したデータセットのテイストにはなっていますが、シードを変えるとかなり見た目が変わってしまっているほか、データセットにない髪型を表現するのは難しいようです。。

# 実験3. ControlNetを使ってアバタ化してみる

ポーズ推定、線画からの画像生成など多彩な入力画像のコントロールができる「ControlNet」を使って実験2と同じことを試してみました。

入力画像を線画に変換してからStable Diffusionで生成を行う「Canny」のモデルを使ったところ、以下のような画像が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/9ba7c29f-e6c1-e31a-6cd1-1be2e14d2d28.png)


実験2よりは安定した生成ができているものの、入力が線画のため髪色肌の色が変化してしまっています。
また、**実在の顔写真からの線画抽出はパラメータ（閾値）の調整が難しく**、設定によっては特に髪型を完全には捉えられていないことがわかります。
いろいろな顔写真を入力としてアバタの生成を自動化することをゴールと考えると、線画の抽出はボトルネックになりそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/14e16d20-369d-ffd4-1aab-98dcbe15f745.png)


# 実験4. 実験3で得られた画像を調整する

実験3では、口・鼻の周りが変だったり、髪型が一部崩れていたりしました。
そこで、実験3で得られた画像をさらにImage-To-Imageで変換することで、よりデータセットに近い綺麗なアバタにできるのか試してみました。

ノイズ除去強度0.60で変換した結果がこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/7232d366-362b-3e61-65c0-1e37b39d68cf.png)

若干崩れている場所はあるものの、さらにデータセットのアバタに近くなりました。


ノイズ除去強度を上げるとよりデータセットに近いアバタにはなりますが、入力画像とは似ていない画像になってしまうためこちらもパラメータの調整が難しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/17be2e89-6562-6075-073c-417db75706c3.png)


# 実験5. 逆にアバタをリアルにしてみる

今回は、実験1～4で得られたアバタ画像を逆にリアルにできるのか試してみました。
公開されているStable Diffusionのリアル系モデルを使ってImage-To-Image変換を行ったところ、以下のようになりました。

## 5-1. そのままLoRAを適用した場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/d94025d2-c424-1252-a8d6-7436ce3657f4.png)

LoRAの学習には使っていないリアル系モデルにLoRAを適用してみると、データセットのVRoidの雰囲気は出しつつも昔のゲームのような3DCGの質感で出力されました。


## 5.2. 素のリアル系モデル場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/9517d609-70b8-4cba-8614-2b9c5df032c3.png)

輪郭や顔の形状を保ったまま、5.1と比べてよりリアルよりな画像が生成されました。リアル系なアバタとしてこれはこれでありかもしれません。

ここまで何度も変換を重ねてみましたが、イラスト寄り／リアル寄りそれぞれの結果と元の顔写真と比較するとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/ba32f720-9450-ad88-fa1d-9e00da2d6e70.png)


どことなく本人の特徴を反映したアバタを作ることはできましたが、細かい点を工夫すればさらにクオリティーの高いアバタが作れそうですね！

# おわりに

本記事では、顔写真一枚から特定のテイストのアバタを作る実験を行いました。
主にStable DiffusionのImage-To-ImageやLoRAを組み合わせて生成してみましたが、別のアプローチを使えばさらに質が高くかつ本人に似た良いアバタが作れるかもしれません。

最後までお読みいただきありがとうございました！