[令和版]モナリザに「表情」をつける（なんなら表情以外もつけちゃう）

# さいしょに
この記事は[顔学2020アドベントカレンダー](https://qiita.com/advent-calendar/2020/facial_study)の10日目の記事です．
原島先生の昔のネタを見つけて，令和にやろうとしたらどうなるのかを検証したくてウズウズしてしまったので実装してみました．こういった文化的に価値のあることをしてみたかったんですよ！！

[モナリザに表情をつける（1997年）](https://www.athome-academy.jp/archive/culture/0000000124_all.html)
[顔の表情の人口現実感，原島1991年](https://www.jstage.jst.go.jp/article/jjspe1986/57/8/57_8_1335/_pdf)


今回は令和の最新技術を用いて，モナリザをアレコレいじった結果をお見せします．

![smile (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/acfa5ccd-efde-19ef-c16e-bd1a1d2024a2.gif)![eyeglasses (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/90b7eee8-b5e8-d9a3-80dd-274085214d21.gif)![bald (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/bbedae48-1124-9920-ce1d-2b43fc75abab.gif)


# 使った技術・研究
過去にも記事で紹介したことのあるものはコピペです．

## SytleGAN2
[StyleGAN2](https://arxiv.org/abs/1912.04958)は高解像度の顔画像生成モデルのSOTAです．NVIDIAが開発をしたモデルで，表現力が非常に高く潜在変数空間も滑らかなことで知られています．

![stylegan2-teaser-1024x256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/381c57e6-872d-b52b-e9e3-7abcfe6dbcfa.png)

## Image2StyleGAN
[Image2StyleGAN](https://arxiv.org/abs/1904.03189)と呼ばれる技術も研究がなされており，データセットに存在しないような現実の顔画像でも再構成可能であることが分かっています．

近年の深層生成モデルは，基本的には潜在変数と生成画像が1:1対応をしています．なので，生成画像が所望の画像と同じになるように潜在変数に最適化処理をかけてあげれば実在する人の顔画像を再現することができます．

StyleGAN2で再実装して僕の顔でやってみた結果が以下です．そこそこの精度が出ていると思います．
右が本物で左が再構成画像です．
![スクリーンショット 2020-11-26 17.53.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/06b2c43f-811e-9838-334c-60ba5836d7ac.png)
![スクリーンショット 2020-11-26 17.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/a3a9b14b-495c-2f02-0aee-350b2db3caf4.png)

## InterFaceGAN
[InterFaceGAN](https://github.com/genforce/interfacegan)では十分に訓練された深層生成モデルの潜在変数空間には，意味的境界（Semantic Boundary）が生成されることがわかっています．論文ではPGGANとStyleGANについて検証が行われていますが，今回はそれをStyleGAN2で追実装したものになります．

意味的境界の推定方法はシンプルで，適当な潜在変数から画像を生成しまくって生成したサンプルに対して属性ラベルを付与します．属性ラベルさえつけられれば，あとは属性値を効率よく分離できるような境界を線形SVMで推定します．推定された境界超平面に対して，法線ベクトル方向が属性ベクトルとして採用されます．このベクトル方向に潜在変数を移動させることで属性を変化させます. 


今回の記事では，10000件の顔画像サンプルをランダムに生成して，属性ラベルの付与には学習済み顔属性推定モデルを用いました．

## Deep Learning Face Attributes in the Wild
サンプルの属性ラベリングには，[Deep Learning Face Attributes in the Wild](https://github.com/Luca96/face-clustering)の学習済みモデルをお借りしました．

以下の属性スコアをサンプル画像に付与することができます．これらはCelebaの属性にあるものみたいですね．

- 5_o_Clock_Shadow: 髭の剃り残し
- Arched_Eyebrows: 三日月眉
- Bags_Under_Eyes: 涙袋
- Bald: 薄毛
- Bangs: 前髪
- Big_Lips: 大きな唇
- Big Nose: 大きな鼻
- Black Hair: 黒髪
- Blond Hair: 金髪
- Brown Hair: 茶髪
- Bushy Eyebrows: ゲジ眉
- Chubby: ぽっちゃり
- Double Chin: 二重顎
- Eyeglasses: 眼鏡
- Goatee: あごひげ
- Gray Hair: 灰髪
- Heavy Makeup: 厚化粧
- High Cheekbones: 高い頬骨
- Male: 男性（ようは性別）
- Mouth Slightly: 小さな口？
- Mustache: 口ひげ
- Narrow Eyes: 細い目
- No Beard: あごひげがない
- Oval Face: 丸い顔
- Pointy Nose: とがった鼻・鼻の高さ
- Receding: のけぞり？
- Rosy Cheeks: バラ色の頬
- Sideburns: もみあげ
- Smiling: 笑顔
- Straight Hair：ストレートヘアー
- Wavy Hair: くせっけ・パーマ
- Wearing Earrings: イヤリングの有無
- Wearing Hat: 帽子の有無
- Wearing Lipstick: 口紅の有無
- Wearing Necklace: ネックレスの有無
- Wearing Necktie: ネクタイの有無
- Young: 若さ（年齢）

# 結果

## Image2StyleGANで顔ベクトル取得
モナリザの絵もしっかり表現可能でした．実は画像を生成している間に気づいていたのですが，ちょっと潜在変数の外側に行くと肖像画のように変化してしまったりする特性があります．なのでうまくいくかなと思っていました．

StyleGAN2にはシワ・そばかすなどを再現するためのノイズをスタイル変換処理前に入れているのですが，今回はそのノイズが絵画のテクスチャ情報を再現できている気がします．

左: 本物　右: 偽物
<img width=320 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/f02cfb6c-3bb5-c640-f7bf-9dcea15f1f27.png"><img width=320 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/09ce9487-08e6-5e2e-55eb-c0004aca9d4a.png">

## InterFaceGANで属性変換
さっきの属性の中でもうまくいったものとダメだったものがあるので，今回はうまくいったものだけ見せています．

この辺が上手にできました．

笑顔
![smile (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/31bab4a0-98aa-265a-e601-3a2a2ea5f4ba.gif)
眼鏡
![eyeglasses (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/39711737-cbae-2cce-bc25-34a45479d014.gif)
薄毛
![bald (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/57974398-15bb-1493-1b91-b52d33222273.gif)
ぽっちゃり
![chubby (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/f192838d-dd57-620e-7026-1179a275e9ef.gif)
年齢
![age (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/0882ed22-167a-d379-a97a-15b15ccbba2f.gif)
化粧
![heavy_makeup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/0f7235d2-508e-1a96-7931-5bd65c9bd00f.gif)

# さいごに
今回は原島先生の昔のテーマにインスパイアされて思わず実装してしまいました．
なんだか文化的に価値のあることができた気がして非常に自己満足しています．コードは急いで書いたので汚いですし，あまり公開する気はありません．もしかしたら研究になるかもしれないし．

いないかもしれないけど，どうしてもっていう人は個人的に連絡ください．

追記: 動画の変化が見づらかったので速度を二倍に変更しました．