1.はじめに
皆さん、Ken Burns Effectをご存知ですか?これは、PCやスマホなどで自分で撮影した写真を使ってスライドショーを行うと、写真を自動的にパンしたりズームしたりしてビジュアル効果を高めてくれるものを言います。
なぜ、Ken Burns Effect と呼ぶかと言うと、昔アメリカのドキュメンタリー映画家 Ken Burns 氏が良く使っていた撮影テクニックであったためです。
今回、ご紹介するのはその3D版です。さて、どんなものなのでしょうか。
2.3D Ken Burns Effect とは?
3D Ken Burns Effect とは、ディープラーニングを活用して1枚の風景写真からドローンで空撮した様な動画を作り出す技術です。言葉で説明しても分かり難いので、具体例を1つお見せしましょう。
一番最初のフレームは私がカメラで撮影した静止画(横浜ランドマークタワーの展望台から撮影したものです)ですが、そこから先のフレームは3D Ken Burns Effectが自動的に作成したものです。
単なる「画像の拡大」ではなく、視点の位置を変化させつつ、遠近法を使って前景を背景よりも大きく拡大することで、まるでドローンでカメラを移動させながら撮影している様に見える動画を作り出します。
遠近法を使うには、オブジェクトの深度(視点からどれだけ離れているか)を検出する必要があり、そのために下記の様な深度推定ネットワークを使っています。
まず、入力画像をダウンサプリングし、VGG-19を使用して低解像度の入力画像に基づいた粗い深度を推定します。そして、Mask R-CNNのセグメンテーションに従って深度マップを調整します。 最後に、深度リファインメントで入力画像に基づいてアップサンプリングし、正確な深度境界を得ます。
この深度推定ネットワークは、仮想3D空間を使って、屋内・市街地・郊外・自然の中などの撮影環境13万4041シーン分を撮影したデータを使って「画像内のオブジェクトの深度」に関する学習を行ったものを使用します。
画像内のオブジェクトの深度が検出できれば、その深度の値からカメラを動かしたように見える画像内のオブジェクトの拡大率を個別に計算します。また、拡大の過程でオブジェクトに亀裂が入ったりゆがんだりする場合には修正を行います。
3.コード
今回のコードもGoogle Colabで動かすような形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、必要なライブラリーをインストールします。
1 2 3 4 |
!pip install chainer !pip install moviepy !pip install gevent !pip install imageio==2.4.1 |
Githubからコードをコピーします。
1 |
!git clone https://github.com/cedro3/3d-ken-burns.git |
1 |
cd /content/3d-ken-burns |
1 2 |
# 結果を保存するディレクトリを作ります !mkdir results |
1 2 3 4 |
import chainer import os chainer.print_runtime_info() os.environ['CUDA_HOME'] = "/usr/local/cuda" |
学習済みモデルをダウンロードします。
1 2 3 |
!wget -O ./models/disparity-estimation.pytorch http://content.sniklaus.com/kenburns/network-disparity.pytorch !wget -O ./models/disparity-refinement.pytorch http://content.sniklaus.com/kenburns/network-refinement.pytorch !wget -O ./models/pointcloud-inpainting.pytorch http://content.sniklaus.com/kenburns/network-inpainting.pytorch |
自分で用意した画像を使いたい場合は、下記を実行してimageファイルを追加します。事前に用意したサンプル画像のみで良い場合は、ここはスキップします。
1 2 3 4 |
from google.colab import files uploaded = files.upload() for filename in uploaded.keys(): !mv ./$filename ./images/$filename |
3D Ken Burns Effect を掛けます。
1 |
!for image in ./images/*; do python autozoom.py --in $image --out ./results/$(basename $image | cut -f1 -d '.').mp4; done |
生成した動画をダウンロードします。
1 2 3 4 5 |
from google.colab import files for filename in os.listdir("./results"): extension = os.path.splitext(filename)[-1].lower() if extension == ".mp4": files.download("./results/" + filename) |
これは、台湾北部にある九份老街で、千と千尋の神隠しのモデルにもなったところです。
カメラが、まるで二階の窓を舐めるように動いている様で面白いです。
同じく、九份老街ですが、今度は手前に記念撮影をしている観光客がいる居るバージョンです。
手前の観光客の頭を飛び越してカメラが上昇し、最後は建物に突入して画像が破綻してしまいましたが、中々の迫力です。
なお、カメラ空撮の仕方は、autozoom.py の最後の部分を書き換えることで調整できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
objTo = process_autozoom({ 'fltShift': 1000.0, 'fltZoom': 2.0, 'objFrom': objFrom }) npyResult = process_kenburns({ 'fltSteps': numpy.linspace(0.0, 4.0, 300).tolist(), 'objFrom': objFrom, 'objTo': objTo, 'boolInpaint': True }) |
'fltShift'
: , 'fltZoom'
: , fltSteps' : numpy.linespace()
の数値を色々調整してみて下さい (画像の縦横比も影響するようです)。
1枚の写真から、こんな表現豊な動画が作れるとは本当に驚きです。しかし、AIは猛烈なスピードで進化を続けています。スマホの中に、3D Ken Burns Effectが組み込まれるのも、もう直ぐかもしれませんね。
では、また。
(追伸)私の写真アルバムに 3D Ken Burns Effect を掛けた中で、イイ感じのものをまとめてみました。どうぞ、こちらもご覧ください。
(twitter投稿)
カメラ空撮の仕方についてなのですが、上下左右あるいは直進などの方向を指定するにはどのパラメーターを修正したらよいのかがわかりません。教えていただけると助かります。
i.oさん
ブログにありますように、ズーム方向のパラメータはautozoom.pyに記載されている’fltShift’ですので、ここを書き換えて下さい。
上下は修正できませんが、左右の振り幅を変更できます。左に振るか右に振るかは自動で決まるようです。
さっそくありがとうございました。直進ができました。
曲がり方は細かく指定できないのですね。