乃木坂46メンバーを動画から三次元へ復元する

この記事は[eeic （東京大学工学部電気電子・電子情報工学科）Advent Calendar 2017 その２](https://qiita.com/advent-calendar/2017/eeic2)の25日目、最終日の記事として書かれたものです。

# はじめに
はじめまして。
電子情報工学科所属のB4、まさや(@syinari0123)と申します。

自分は画像ベースの三次元復元(SfM,SLAM)に興味があり、未熟ながら三次元復元の知識を日々深めております。最近は卒論締め切りの日も近づき、一日中パソコンとにらめっこする日々。そのような味気ない日々を過ごしている中、心の癒やしとなるのはやはり**「良い音楽」**を聞くことではないでしょうか。さらにそれを歌っているのが**「可愛い女の子」**であればベストです。

さて突然ですが、みなさんはアイドルグループとして今一番勢いに乗っている**「乃木坂46」**をご存知でしょうか？テレビを見ていれば、アイドルグループの中でもトップクラスの可愛さを持つ彼女たちを見かける機会は多いのではないでしょうか。

<div align="center">
<img src="https://pbs.twimg.com/profile_images/879321670640558081/LJqAoLcs.jpg" width=30%>
</div>

先日放送されたFNS歌謡祭2017では、ミュージカル女優として様々な舞台で活躍する生田絵梨花さんを始めとした様々なメンバーが他の豪華なアーティストの方との共演を果たし、その人気ぶりを改めて感じることとなりました。また、年末の一大イベントの紅白歌合戦への参加も決まっており、今から年末が待ち遠しい日々であります。

ただ、**テレビ媒体を通じて度々発信される彼女たちの姿は二次元であり、その姿を実際に三次元で見たいという欲求を当然、皆さんは持ち合わせている**と思われます。

<div align="center">
<img src="http://3.bp.blogspot.com/-Dy6-fyTJs1o/VcMmL_l74JI/AAAAAAAAweM/62T5eUl71a8/s800/idol_akusyu.png" width=50%>
</div>

そこで今回は持ちえる知識を総動員し、**「二次元動画中に写った乃木坂メンバーを、何とかして三次元へ復元できないか？」**ということに取り組みます。これで握手会やライブに行っていないその間にも、好きな時に三次元の彼女たちの姿に癒やされることができます。

# 今回復元する動画データ
三次元復元を行うためのアルゴリズムとして今回はStructure from Motion(SfM)を利用します。詳しくは後で言及するのですが、このアルゴリズムで復元できる対象は動画中で静止していなければなりません。つまり動画中の乃木坂メンバーを三次元復元するには**「動画中の乃木坂メンバーがマネキンのように静止している」**必要があります。

ここで乃木坂に詳しい皆さんならハッとくるかもしれません。そうです。今年の5月にセブンイレブン×乃木坂のキャンペーン企画があり、その時に彼女たちは**「マネキンチャンレンジ」**というものに挑戦しています。以下はキャンペーンに関するWebニュースの記事になります。

>　セブン‐イレブン×乃木坂46のキャンペーン企画が5月19日（金）よりスタートした。
>
>　5月19日（金）～5月28日（日）までの期間限定で、乃木坂46のメンバー20名が5月24日（水）に発売される新曲「スカイダイビング」に合わせてマネキンチャレンジを披露する動画が公開中。
>
>　動画では、メンバーがセブン‐イレブンのさまざまな商品を楽しむ様子を表現している。秋元真夏がラーメンをこぼして驚いているシーンや、樋口日奈と星野みなみがサンドイッチを食べながら2ショットを自撮りしているシーンなど、マネキンのように固まりながらもメンバーの個性が伝わる見どころ満載の映像に仕上がっている。
>
>　また、5月19日（金）～5月31日（水）まで、セブン＆アイ・グループが提供している無料Wi-Fiサービス「セブンスポット」設置店舗限定で、乃木坂46のマネキンチャレンジ撮影時の様子を収めた特典動画が公開される。店内のセブンスポットに接続して視聴することができる特典動画には、本編では見ることのできない乃木坂46メンバーの特別未公開トークが収録されているほか、白石麻衣がマネキンチャレンジに挑戦する前の意気込みを語るシーンや、新内真衣が瞬きをしてしまい反省しているシーンなど、チャレンジ成功に至るまでの様子を見ることができる。
> 
> [![乃木坂マネキン動画](http://img.youtube.com/vi/y2xOKfuXUxo/0.jpg)](http://www.youtube.com/watch?v=y2xOKfuXUxo)
> 
> ([エンタメニュース「乃木坂46がマネキンチャレンジ！10日間限定動画公開中【動画】」(2017年05月19日)](http://www.tvlife.jp/entame/120518)より引用)

とても良いですね。**可愛い子が美味しそうにご飯食べる姿はいつ見ても最高**です。人類の宝にすべき映像でしょう。

このキャンペーンの動画がYoutubeの公式ページでまだ公開されていたので、今回はこの動画を使って乃木坂メンバーの三次元復元を行うことにします。

# 手法の概要
動画（複数の二次元画像）から三次元の形状を復元する手法としてStructure from Motion(SfM)というものがあります。これは**複数の視点からのカメラ画像群のみ**を利用し, 以下の要素を同時に推定します。

- 画像に写った物体の三次元的な構造
- それぞれの画像を撮影したカメラ位置
- カメラが持つ内部パラメータ(焦点距離やレンズの歪みの度合いなど)

SfMではまず、複数の画像の間で上の推定に使えそうな点を探し、画像間で**「実際の三次元構造的に、どの点とどの点が同じ点なのか？」**という問題を解くことから始めます。

この時に、正確に対応する点のペアを取らなくてはうまく三次元構造が推定できません。カメラの位置も当然わかりません。そこで**「画像の中でも個性的な、見分けが付きやすい、特徴的な点」**を選び、バッチリ似ている特徴を持つ点同士を対応付けるという方法が取られます。（CV界隈では画像中の「特徴点の選び方、点の持つ特徴の表現方法」は長い間議論されてきています。詳しくは[中部大学の藤吉先生のこのスライド](https://www.slideshare.net/hironobufujiyoshi/miru2013sift)が分かりやすいです。）

以下の図がそのイメージ図です。画像の中でも特徴的な点(コップや模様の輪郭)を探し出し、同じ点としてきちんと結びつけている様子を表しています。

<img src="https://jp.mathworks.com/help/vision/ug/structure_from_motion_tracks_ja_JP.png" width=70%>
([MATLABのdocument](https://jp.mathworks.com/help/vision/ug/structure-from-motion.html)より引用)

このようにして複数の画像間での正確な対応点が得られたら、**画像間での見え方の辻褄を合わせるような、「点の三次元位置」と、「画像を撮影したカメラの位置」、「カメラの内部パラメータ」の３要素を同時に推定**します。正確にはこれらの求めたいパラメータを変数とし、見え方のズレ（対応点として検出した特徴点との位置のズレ）を誤差として出力する関数を最適化することで求めます。

以下がその最適化のイメージです。点とカメラの三次元位置(とカメラの内部パラメータ)によって、画像上にその時に「見えるはずの位置」を投影することができます。**これらが正しければ、この位置は先ほど対応付けを行った画像上の「特徴的な点」とピッタリ重なるはずです。**位置関係が正しくない時に生じてしまう、これらの「位置のズレ」を最小化するように、点の三次元位置とカメラの位置(とカメラの内部パラメータ)を調節して求めます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/129223/33d6b116-db4c-761f-57d1-84eef0d4955a.jpeg" width=70%>

これで、SfMを用いることで**三次元復元を行うことはできました**。一見落着のように見えますが、SfMで推定した結果のままでは「特徴的な点」の三次元位置しか分からないため、スッカスカな結果しか得られません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/129223/82bca6d5-9fe9-8b3a-29bb-2d9dc7fe9dea.png" width=70%>

これは動画中の白石麻衣さんをSfMで復元した時の様子なのですが、このままでは三次元復元できた感が全然味わえません。というかこの画像から白石麻衣さんのオーラを全く感じられません。

そこで、**SfMの推定結果を密にする**という手順が必要になります。

今回は、「画像と照らし合わせることで画像毎に疎な点群から密な奥行き構造を推定する**MVS(Multi View Stereo)**」と、「それらの推定結果をうまく綺麗に繋ぎ合わせ、綺麗な表面を推定する**FSSR(Floating Scale Surface Reconstruction)**」を用います。ただ、この説明は難しくなるので省略させていただきます。詳しくは論文を読んでみてください。

# 実験環境の準備
SfMのライブラリとしては多くのライブラリが存在しますが, 今回は[MVE(Multi-View Environment)](https://github.com/simonfuhrmann/mve)を利用することにします。OpenCVなどといった闇のライブラリに頼っておらず、比較的簡単に導入することができると思われるためです。MVEには三次元復元を行うためのライブラリが様々含まれており、可視化ツールとしてUMVEというインターフェイスが使えます。なお、今回の環境としてはUbuntu16.04を用いています。

まず依存ライブラリを導入します。

```shell
$ sudo apt-get install libjpeg-dev # libjpeg
$ sudo apt-get install libpng-dev  # libpng
$ sudo apt-get install libfftw3-dev libtiff5-dev # libtiff
$ sudo apt-get install freeglut3-dev libglew1.5-dev # opengl
$ sudo apt-get install qt5-default # qt5
```

MVEをコンパイルする方法としては以下のようになります。

```shell
$ git clone https://github.com/simonfuhrmann/mve.git
$ cd mve
$ make -j8
```

UMVEをコンパイルし, 実行するためには以下のようになります。以下の結果UMVEの画面が開くようなら導入成功です。

```shell
$ cd apps/umve/
$ qmake && make -j8
$ ./umve
```

ここからは実際にMVEを使うことで、三次元復元を行います。前章の「手法の概要」をまとめると以下のような手順が必要になると思います。

1. SfMで複数の画像から疎な点群三次元復元
2. MVSで疎な点群を画像と照らし合わせることで、画像毎に密な奥行き構造を推定
3. FSSRで画像毎に求めた奥行き結果を統合し、滑らかな表面を推定

かなり複雑なように聞こえるかもしれませんが、MVEではこれらを簡単に実行することができます。今回は手順をまとめて、以下のようなshellファイルを```mve/apps/```内に作成し、実行すれば復元結果が```scenedir```に作成されます。

```shell:exec_sfm.sh
#!/bin/sh
imagedir=~/Desktop/sfm_data/sfm_imgs/
scenedir=~/Desktop/sfm_data/sfm_imgs/scene/

./makescene/makescene -i ${imagedir} ${scenedir}
./sfmrecon/sfmrecon --undistorted="undistorted" --fixed-intrinsics --video-matching=10 ${scenedir}
./dmrecon/dmrecon -s2 ${scenedir} 
./scene2pset/scene2pset -F2 ${scenedir} ${scenedir}/pset-L2.ply
./fssrecon/fssrecon ${scenedir}/pset-L2.ply ${scenedir}/surface-L2.ply
./meshclean/meshclean -t10 ${scenedir}/surface-L2.ply ${scenedir}/surface-L2-clean.ply
```
なお、今回はSfMを行うための実行ファイルである、```./sfmrecon/sfmrecon```の引数として以下のように指定してやってみました。

- ```--undistorted="undistorted"```：見たところ画像の歪みは少ないと思われるので、歪み度合いの推定・歪み補正を行わない
- ```--fixed-intrinsics```：局所解に陥ないように内部パラメータは画像全体で固定
- ```--video-matching=10```：推定対象の画像群が時刻的に連続した動画なので、前後10フレームとのマッチングを行うように指定

結構仮定を置いて決めたので、もしかしたらもっと良い引数の指定方法があるかもです。

ここで作成した```scenedir```に保存された復元結果は

```shell
$ ./umve
```
によって起動されたUMVEの画面から、「sceneの読み込み」を選択することで確認することができます。

# 実験結果
動画に対して部分的に画像群を切り出し、上で紹介した```exec_sfm.sh```によってSfMを行うことで結果が得られます。ただ今回は画像がメンバーの一部分しか写してない場合が多い上、撮影された建物の構造もシンプルで対応点を見つけるのが難しく、**全体的な復元結果にノイズが多分に含まれているため、最終的な表面をmeshで推定する結果(FSSRの結果)はあまり綺麗に出力できません**でした。そこで以下ではMVS(```./dmrecon```)によって各画像に対して密に推定された深さマップをUMVE上で適宜表示することで復元結果の可視化を行っています。

以下に結果を示します。それぞれの結果の見方としては、

- **元画像群と奥行きの推定結果**：推定に用いた元画像（左）とそれに対応する密な奥行きの推定結果（右）です。上で説明した手順の2番目(MVSによる画像毎に密な奥行き構造の推定)の結果に相当します。
 - 奥行き画像では、**奥行きが深いほど色が白く、奥行きが浅いほど色が黒く**可視化されています。
- **三次元復元結果**：MVSの結果を適宜三次元座標上に出力した三次元構造の復元結果です。図の中に「乃木坂メンバーを囲うように描画された四角い図形が連続した軌跡」がありますが、これが各画像を撮影した**カメラの位置**の推定結果です。

となっています。なお各乃木坂メンバーに関して結果をまとめていますが、表記上敬称は略させていただいています。

## 成功した例
### 1. 西野七瀬（と白石麻衣）
#### 元画像群と奥行きの推定結果
![1nanase_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/d5050263-56c8-fc11-c4ad-6d0e9264f1b5.gif)
#### 三次元復元結果
![1nanase_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/dd9c213f-8a94-0c95-b562-cd420bf4780a.gif)

### 2. 桜井玲香と若月佑美
#### 元画像群と奥行きの推定結果
![3reika_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/bf93e375-60a4-d188-35b9-84774357648e.gif)
#### 三次元復元結果
![3reika_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/311e7345-d18c-2293-2a5b-3304b9dc7a74.gif)

### 3. 齋藤飛鳥（と堀未央奈）
#### 元画像群と奥行きの推定結果
![7asuka_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/cb991b0f-e16b-281e-0968-09774ce7759c.gif)
#### 三次元復元結果
![7asuka_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/a1cf46bc-c82e-af9c-f990-fcad05d6839f.gif)

### 4. 伊藤万理華と井上小百合
#### 元画像群と奥行きの推定結果
![7marika_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/14dce8b4-3f62-b2b3-b00e-72931e196b46.gif)
#### 三次元復元結果
![7marika_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/978540cd-dae4-04c6-b028-4f77c5687c38.gif)

### 4. 白石麻衣
#### 元画像群と奥行きの推定結果
![11maiyan_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/bab389ff-b7ab-5c30-01ae-37356b49d6d7.gif)
#### 三次元復元結果
![11maiyan_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/0f5d4fe0-aba6-edcd-c182-4ed260798abb.gif)

## あまりうまく復元できなかった例
### 5. 星野みなみと樋口日奈
#### 元画像群と奥行きの推定結果
![5minami_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/929e2948-c901-c176-3e47-32ece39f38b0.gif)
#### 三次元復元結果
![5minami_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/c1ebbb81-0cc3-f2d3-3383-193bcdc5a458.gif)

### 6. 松村沙友理
#### 元画像群と奥行きの推定結果
![9sayuri_img_depth.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/6979fa69-113c-ee74-0124-bf440e90e294.gif)
#### 三次元復元結果
![9sayuri_sfm.gif](https://qiita-image-store.s3.amazonaws.com/0/129223/b21e1473-c079-ecbd-e903-72e31173d4c1.gif)

# 考察
**成功した例に関しては想像以上に綺麗に三次元復元できて感動しています。**
ただ全部が全部うまくいくわけでなく、推定結果がめちゃくちゃになっているものもありました。結果を見た感じ、この原因は以下だと考えられます。

- **全体的に映像の中の建物がシンプルな構造をしているため、背景が画面の大部分を占める場合には特徴点として扱える箇所が少なくなり、対応点を取るのにうまくいかない**

失敗例として挙げた2つの復元結果を見る限りこれはかなり重大な問題となっており、背景となる白い壁の存在のせいでかなり困っている様子が伺えます。そのため、星野みなみさんと樋口日奈さんの復元結果に関しては背景含めてかなり無残な結果になってしまっています。また、成功した例として挙げたものですら、乃木坂メンバーの輪郭付近には白い壁の推定結果である「白い点群」がところどころ散乱しており、ノイズが確認できます。

やはり、特徴点の対応付けによって三次元復元を行う既存の手法は**「特徴点が取りにくい領域が画面全体を占める場合」にかなり弱く**、今回は状況によってはそれが露骨に出る結果になりました。


# おわりに
コンピュータビジョンの数多くの分野を複合することでようやく達成される三次元復元という分野はかなり奥が深いと同時に、このように実際に結果を見ると「できている感」をひしひしと感じられるため、個人的にとても面白いと思っています。この記事で三次元復元の面白そう感が伝わったとしたらとても嬉しいです。

# 参考文献
## 今回の手法関連
- [MVE – A Multi-View Reconstruction Environmen](https://www.gcc.tu-darmstadt.de/media/gcc/papers/Fuhrmann-2014-MVE.pdf)
 - 今回用いたMVEの元論文です。
- [Multi-View Stereo for Community Photo Collections](https://www.gcc.tu-darmstadt.de/media/gcc/papers/Goesele-2007-MVS.pdf)
 - MVS(Multi View Stereo)が知りたい方のための元論文です。
- [Floating Scale Surface Reconstruction](https://www.gcc.tu-darmstadt.de/media/gcc/papers/Fuhrmann-2014-FSS.pdf)
 - 同じくFSSR(Floating Scale Surface Reconstruction)が知りたい方のための元論文です。

## もっと三次元復元が知りたい方へ
上から大体取っ掛かりやすい順に並んでると思います。

- [ディジタル画像処理[改訂新版]](https://www.cgarts.or.jp/book/img_engineer/)
 - B3の冬学期の講義「映像メディア工学」での教科書ですが、普通に情報量が多く良書です。とりあえずここから読んでみると良いと思います。（これは緑本ですが、CG分野にフォーカスした青本も存在して、そっちにも三次元系のことはまとまっています。）
- [コンピュータビジョン特論](http://www.wakayama-u.ac.jp/%7Ewuhy/ACV)
 - 和歌山大学の呉海元教授の講義資料です。CVの基礎から説明されてるので取っ掛かりにはとても良いと思います。
- [3次元コンピュータビジョン計算ハンドブック](http://www.morikita.co.jp/books/book/3016)
 - 三次元復元は最適化計算を外しては語れないのですが、一般的に三次元復元のアルゴリズムの説明ではその具体的な最適化の手法はかなり数学的色合いが強く、省略されることがしばしばです。本書では、そのような「三次元復元の最適化手法」の部分にフォーカスしてきちんと説明されているのでハンドブックとして一冊手元に置いておくと困らないと思います。
- [Computer Vision: Algorithms and Applications](http://szeliski.org/Book/drafts/SzeliskiBook_20100903_draft.pdf)
 - CVの古典的な手法はほぼ網羅されてる有名なSzeliski本。日本語訳があります。
- [Multiple View Geometry in computer vision](http://cvrs.whu.edu.cn/downloads/ebooks/Multiple%20View%20Geometry%20in%20Computer%20Vision%20(Second%20Edition).pdf)
 - 多視点幾何について基礎から書いてあります。日本語訳はないっぽいです。僕はまだ最初の方しか読んでないです。
- [Vision Algorithms for Mobile Robotics](http://rpg.ifi.uzh.ch/teaching.html) 
 - ETHのVisual SLAMの講義ページ。資料が充実しててとても良いです。
- [Multiple View Geomtry](https://www.youtube.com/watch?v=RDkwklFGMfo&index=1&list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4)
 - TUMのMultiple View Geometryの講義資料。僕は見てないですが、内容がしっかりしてるらしく、ただ量が多いらしいです。
- [SLAM, Visual Odometry, Structure from Motion, Multiple View Stereo](https://www.slideshare.net/yuhuang/visual-slam-structure-from-motion-multiple-view-stereo)
 - 最近の代表的なSLAM,VO,SfMの手法が大体まとまっててとても良いスライドだと思います。
- [The Future of Real-Time SLAM and Deep Learning vs SLAM](http://www.computervisionblog.com/2016/01/why-slam-matters-future-of-real-time.html?m=1)
 - 近年流行りのDeep Learningは三次元界隈にも入ってきていますが、そこら辺の状況も含めて流れを解説したブログです。現在の流れが大体把握できると思います。
- [Awesome 3D reconstruction list](https://github.com/openMVG/awesome_3DReconstruction_list)
 - 他にSfMやSLAMなど三次元復元の有名な手法が列挙されたページです。最新の界隈の状況が把握できるのでとても良いです。