28
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NTTドコモ サービスイノベーション部Advent Calendar 2019

Day 14

できる!マネキンチャレンジデータセット(SfM・MVS編)

Last updated at Posted at 2019-12-13

こんにちは、@ohashi_zaemon@dosadaです。
今日は、マネキンチャレンジデータセットをつくってみようと思います。
なお、本記事はコンテンツが多いので前後編に分けて連載いたします。1

前編の担当は@ohashi_zaemonです。

記事の概要

  • YouTubeのマネキンチャレンジ動画からデプスマップを作成します。
  • 関連するコンピュータビジョンの要素技術を広く浅く解説します。
  • 対象とする人:コンピュータビジョン初級者~中級者2

そもそもマネキンチャレンジデータセットとは?

今年の6月、一つの論文が話題になりました。
[論文] Learning the Depth of Moving People by Watching Frozen People [1]

こちらは、CVPR 2019というコンピュータビジョンの分野における世界最大の国際会議で発表されたGoogle Researchの研究で、その傑出した功績からBest Paper Honorable Mention Awardにも選ばれました。(上図は文献[2]より引用)
どういった研究かというと、単眼カメラの映像から、カメラと映像中の人物の両方が動くような環境でも、デプスの推定を行うという研究です。そしてそのタスクで、世界最高の精度を達成しました。
では、この研究の何がすごいのでしょうか。その前に長い背景を説明いたします。

背景

一般的にカメラからデプス推定( ≒三次元位置推定)を行う場合、

  • 複数の固定カメラ × 動く物体
  • 単一の動くカメラ × 固定物体

の2種類の方法があります。3
前者は三角測量(triangulation)を用いた方法で、下図(文献[2]より引用)のように複数のカメラで視認された同一の箇所を三次元上で結ぶことで、その点の三次元上での位置を取得します。そしてこの三次元再構成を様々な視認点に対して行うことで、点群(≒ 物体)の三次元上での位置を取得します。

ゲームや映画製作などでよく用いられている光学式モーションキャプチャも基本的に、こちらの技術を応用しています。

後者はVisual SLAMなどと言われる手法で、イメージとしては三角測量を単一の動くカメラで行います。下図(文献[3]より引用)のようにカメラの自己位置推定と物体の三次元位置の取得を同時に行うことで、各画像におけるデプスを取得することができます。

さて、ここで今回の論文が扱う問題設定について振り返ってみると、

  • 単一の動くカメラ × 動く物体

です。Visual SLAMに似た要領でカメラの自己位置推定を行いつつ、物体の三次元位置を取得しようとしても、下図(文献[2]より引用)のように物体も動いているため、正しい三次元位置を取得することができません。そもそも、この問題自体が不良設定問題なので、解析的に解くことは困難です。

そこで人々は思います。

そうです。みんな大好きDeep Learningです。
ただ、ここで一つ大きな問題があります。それはDeep Leaningで教師あり学習を行うために必要な"良い"教師データ(人物が含まれる画像とデプス情報が紐づいたデータセット)が存在しないことです。
まったく存在しないかというとそうではなく、いくつか用いることが出来そうなデータ[4, 5]も存在するのですが、年齢や性別、背景、人数、服装、ポーズなどの観点でバリエーションに富んだ"良い"データではありません。またこういったデータは基本的にカメラが固定されているため、カメラと人物の両方が動くデータセットは存在しません。

「KinectなどのRGBDカメラで、自分で計測しては?」という意見もあると思いますが、どうしても計測するという行為には限界があり、バリエーションに富んだデータを作成することは困難です。そもそも面倒です。

自分で計測はしたくない、でも"良い"教師データは欲しい。
そこでGoogleの研究者達は天才的な閃きにより、あるYouTubeの動画に着目しました。
それがマネキンチャレンジ(Mannequin Challenge)です。

マネキンチャレンジ

マネキンチャレンジとは、2016年頃からYouTubeやInstagramなどで流行したインターネット動画です。その場にいる全員が一斉にマネキン人形のように静止し、その様子を手持ちのカメラで撮影します。そうすることで、あたかも時間が止まったかのような、面白い動画体験を味わうことができます。
言葉で説明するよりも実際に見ていただく方が早いと思うので是非こちらで再生してみてください

ここで重要なことは、本来動くはずの人物が静止しているため、先ほどのVisual SLAMの要領で人物を含む映像のデプスを取得することが出来るようになることです。
また、マネキンチャレンジの大事な特徴として

  • 世界的に流行したため、YouTubeだけでも2,000本以上の動画が存在する。
  • 高クオリティーな映像製作のために、年齢や性別、背景、人数、服装、ポーズなどのバリエーションに富んだ映像が多い。
  • 動画を投稿する際必ず、タイトルにMannequin Challengeという単語が含まれていたり、タグに#mannequinchallengeが含まれているため、容易に探索することが出来る。

といったことが挙げられます。すなわち、デプスの推定をうまく行うことが出来れば、"良い"教師データを作ることが可能なのです。

マネキンチャレンジデータセット

この教師データこそが、今回の記事のテーマであるマネキンチャレンジデータセットです。
論文ではこの後、
データセットの作成 → 学習 → 精度評価 → 考察
といった流れで記述が行われていきます・・・が、今回は、このデータセットの作成のみに焦点を絞り、マネキンチャレンジの動画から実際にどうデータセットを作ればいいのかを、試してみたいと思います。
単純に面白そうなので。
※ 学習以降の詳しい解説については、すでにまとめて下さっている方がいらっしゃるので、こちらをご覧下さい。
[SlideShare] 20190706_cvpr2019_frozen_people

論文で記載をされているデータセットの作成に必要なプロセスは以下の通りです。

  1. 解析用動画の用意
  2. 動画内の各時刻におけるカメラの位置・姿勢の推定
  3. 位置・姿勢情報をもとに、Multi-View Stereo (MVS)を用いてデプスを推定
  4. 推定されたデプスのノイズ除去
  5. 動画内における隣接画像から、オプティカルフローを計算
  6. オプティカルフローから視差を用いてデプスを計算
  7. 2種類の方法で求めたデプスを比較し、疑わしい値を除外
  8. 一定の判別値や目視でのチェックをもとに、"良い"デプスが推定出来たかチェック
  9. 上記処理を様々な動画に対して適応し、巨大なデータセットを作成

それでは早速いってみましょう!

解析用動画の用意

まず、解析に用いるマネキンチャレンジの動画について用意をします。
注意点としてYouTubeの動画にはそれぞれ著作権が存在するため、基本的には勝手にダウンロードし、編集してはいけません。
そこで今回はライセンスがクリエイティブ・コモンズと登録されている動画を用いることとします。YouTubeで mannequin challenge,creativecommons と打ち、検索してみましょう。

この検索結果から解析映像を選定するのですが、後の解析工程を容易にするためには、解析を行いやすい動画を選定する必要があります。そして、これが意外と大変です。解析が行いやすい動画の条件としては以下のようなことが挙げられます。

  • 高画質で標準的なアスペクト比の動画である(論文[1]にはアスペクト比16:9、幅1600ピクセル以上の動画を用いたとあります。)
  • 映像内の人物がマネキンのようにきちんと静止している
  • 編集による映像効果が施されていない
  • 自動車やTVモニターなど、映像内で動く物体が存在しない
  • 特徴点となり得ない、白い壁や空があまりうつっていない
  • モーションブラーがあまり発生していない
  • ノイズの影響となりやすい、鏡や激しい照明が存在しない

もちろん、これら全てを満たす必要はないのですが、満たしていない場合、専用の解析工程が生じたり、ノイズの多いデプスが出力されることとなります。

今回はこれらの条件を満たす動画として、以下の動画を活用したいと思います。
[動画] mannequin challenge escola comércio do porto

動画をダウンロードし、下記のようなプログラムでmp4を連番png画像に変換します。
※ ダウンロードは各自でお願いいたします。

mp4_to_pngs.sh
#!/bin/bash

MOVIE_FILE_PATH=/mnt/mannequin-challenge-EscolaComercioDoPorto/EscolaComercioDoPorto.mp4
OUTPUT_PATH=/mnt/mannequin-challenge-EscolaComercioDoPorto/radial_model_SfM/images

ffmpeg -i $MOVIE_FILE_PATH -vcodec png $OUTPUT_PATH/image_%4d.png

なお、今回は計算時間の都合上全ての画像を使用せず、先頭の1,300枚(約43秒目まで)を解析の対象としました。

カメラの位置・姿勢の推定

続いて取得した各画像におけるカメラの位置・姿勢を推定します。
論文[1]内ではこちらの推定に関して

we use ORB-SLAM2 [24] to identify trackable sequences in each video and to estimate an initial camera pose for each frame. At this stage, we process a lower-resolution version of the video for efficiency, and set the field of view to 60 degrees (typical value for modern cell-phone cameras).

と記述されているため、これに習いORB-SLAM2 [6]というオープンソースライブラリを用いてカメラの位置・姿勢の推定を行います。
※ ORB-SLAM2の詳しい解説は、すでにまとめて下さっている方々がいらっしゃるのでこちらをご覧下さい。
[SlideShare] ORB-SLAMを動かしてみた
[SlideShare] ORB-SLAMの手法解説

ざっくりと内容について説明をすると、以下のようなことを行います。

  1. 各画像からORBという特徴量を検出し、隣接画像におけるマッチングから各カメラの位置・姿勢を推定。
  2. 推定した位置・姿勢と検出した特徴点位置から、3次元空間上における点群マップを生成。
  3. 上記1.2を繰り返し行いつつ、Local Bundle Adjustmentで各カメラの位置・姿勢と点群マップを更新。キーフレームにおける点群マップを作成。
  4. 異なるキーフレームで1~3の処理を行い、ループを検出した場合、Global Bundle Adjustmentで全体の点群マップの作成・更新と各カメラの位置・姿勢を更新を行う。
  5. 上記をリアルタイムに精度良く、自動で行う。

Bundle Adjustmentとは、各カメラで観測した特徴点位置情報をもとに、各カメラの位置・姿勢(+内部・歪みパラメタ)と特徴点群の三次元位置を最適化することです。
また、これによって各カメラの位置・姿勢と物体の疎な三次元形状(特徴点群)を取得することをStructure from Motion (SfM)といいます。

公式のインストール手順に習ってORB-SLAM2をインストールし、縮小した画像セットに対してカメラの位置・姿勢の取得を試みましょう。



ただ、ここで一つ問題があります。
それは、ORB-SLAM2で事前に位置・姿勢を求めずとも、後述のCOLMAP [7, 8]を使用するとカメラの位置・姿勢とデプスの推定をどちらも行えてしまうことです。
事前に位置・姿勢を推定することのメリットとしては、COLMAPにおける計算時間の短縮といったことが考えられるのですが、筆者らはこの有用性が分かりませんでした。

そこで、本記事ではORB-SLAM2を使用した位置・姿勢の推定については行わず、COLMAPで位置・姿勢とデプスの両方を推定したいと思います。
※ もしORB-SLAM2でカメラの位置・姿勢の推定を事前に行うべき理由について分かる方がいらっしゃれば、是非コメントお願いいたします。

COLMAPを用いたデプスの推定

オープンソースライブラリCOLMAP[7, 8]を用いて、画像セットにおけるカメラの位置・姿勢とデプス推定の両方を行います。
COLMAPとはStructure from Motion (SfM)とMulti-View Stereo (MVS)の機能を併せ持つライブラリで、それぞれが文献[7],[8]に対応しています。
インストール手順については公式のドキュメントをご覧下さい。

SfMを用いたカメラの位置・姿勢と疎な三次元形状の推定

それでは、まずSfM (Structure from Motion)を用いて対象物体(今回の場合はマネキン化した人々)の疎な三次元形状を求めていきます。
※ 毎度のことで恐縮ですが、詳しい解説については他の方のまとめをご覧下さい。
[SlideShare] 20160724_cv_sfm_revisited

ざっくりと内容について説明をすると、既存のSfMの手法に

  • フレーム間でカメラの位置が変化せず、姿勢のみが変化するような場合、点群の三次元位置については計算を行わない
  • 画像内に字幕や撮影時刻、フチなどが含まれている場合、その部分の点群位置については計算を行わない
  • SfMに用いるペア画像の選択方法について改良をする
  • 十分にコンセンサスのとれた点群位置を計算から除外する

などの工夫を施し、高速に高精度なSfMを自動で行えるようにしたといった内容です。

実用上でのORB-SLAM2との大きな違いとして、ORB-SLAM2は内部・歪みパラメタ等を事前に与える必要があったのに対し、COLMAPは内部・歪みパラメタも自動で計算することが出来ます。
ただ、既知の問題としてCOLMAPで内部・歪みパラメタを推定し、歪み補正を施すと入力画像のサイズが少し小さくなってしまいます。
この問題に対して対策もあるようですが、今回の記事のゴールは歪み補正後画像とデプスマップの対応(教師データ)をとることなので、上記のように画像サイズが変化したとしてもあまり問題はありません。
そこで本記事では入力画像のサイズが変化してしまうことを許容し、下記のようなプログラムで物体の疎な三次元形状とカメラの位置・姿勢を推定します。

radial_model_SfM.sh
#!/bin/bash

DATASET_PATH=/mnt/mannequin-challenge-EscolaComercioDoPorto/radial_model_SfM

colmap database_creator \
    --database_path $DATASET_PATH/database.db

colmap feature_extractor \
    --database_path $DATASET_PATH/database.db \
    --image_path $DATASET_PATH/images \
    --ImageReader.camera_model RADIAL \
    --ImageReader.single_camera 1

colmap sequential_matcher \
    --database_path $DATASET_PATH/database.db

mkdir $DATASET_PATH/sparse

colmap mapper \
    --database_path $DATASET_PATH/database.db \
    --image_path $DATASET_PATH/images \
    --output_path $DATASET_PATH/sparse

計算が終わると下図のようにマネキン化した人々の疎な三次元形状を得ることが出来ます。
(潰れてしまっていますが、赤いウネウネが各画像から推定されたカメラの位置・姿勢です。)

なお、論文[1]内では、

Finally, sequences with non-smooth camera motion are removed using the technique of Zhou et al. [53].

とあるように、推定されたカメラの位置・姿勢の外れ値を除去する工夫がとられているようですが、今回はそういった外れ値はなかったためこの処理を行いませんでした。

MVSを用いたデプスの推定

続いてMVS (Multi-View Stereo)によってマネキン化した人々の密な三次元形状を復元し、各画像に対応するデプスを推定します。

MVSとは、多視点画像から物体の密な三次元データを取得する方法です。
疎な三次元再構成(点群)→密な三次元再構成(点群)→形状のメッシュ(or ボクセル)作成→テクスチャマッピング
といった流れで物体の三次元形状を復元します。
英語でかつ、OpenMVSという異なるライブラリに関する資料ですが、こちらが視覚的にわかりやすかったので、一読をおすすめします。

技術の詳細については知らないため、間違っているかもしれませんが、
今年ラグビーワールドカップで話題になった、Canonの自由視点映像もこういったMVSの技術が使われているのだと思います。

それでは、前節で求めた疎な三次元形状と各カメラの位置・姿勢をもとに、下記のようなプログラムでデプスマップの計算を行っていきましょう。
なお注意点として、MVSの処理についてはCUDA環境が必須で、かつ、最新のCUDAでは上手く動作しないことがありました。(筆者らはCUDA10.0では動作せず、9.0で動作することを確認)
また、MVSの処理は非常に重い計算を行うため筆者らのGPU(GTX1060)では約1分間のデプスを計算するのに約1日の計算時間を要しました。
なので、プログラムを走らせた後は他の記事などを読みながらゆっくり結果を待ちましょう。

radial_model_MVS.sh
#!/bin/bash

DATASET_PATH=/mnt/mannequin-challenge-EscolaComercioDoPorto/radial_model_SfM

mkdir $DATASET_PATH/dense

colmap image_undistorter \
    --image_path $DATASET_PATH/images \
    --input_path $DATASET_PATH/sparse/1 \
    --output_path $DATASET_PATH/dense \
    --output_type COLMAP \
    --max_image_size 1920

colmap patch_match_stereo \
    --workspace_path $DATASET_PATH/dense \
    --workspace_format COLMAP \
    --PatchMatchStereo.geom_consistency true \
    --PatchMatchStereo.cache_size 8

無事計算が終わると下図のようにマネキン化した人々のデプスを得ることが出来ます。

推定したデプスのノイズ除去

上述のCOLMAPによる計算で、画像とそれに対応したデプスのペアを作成することが出来たのですが、一つ大きな問題があります。
それはノイズです。
先のデプスマップの取得工程では、解析が行いやすいような動画を厳選していたため、比較的綺麗なデプスマップを取得することが出来たのですが、実際にはこのように解析がしやすい動画ばかりではありません。
モーションブラーや影、反射、動いてしまっている人物が紛れている等々、インターネットに上がっている映像には、ノイズとなり得る要因が多数含まれています。
そして、"良い"教師データを作成するためには、このノイズの除去はなくてはならない作業です。4

論文[1]ではノイズの除去について、下記のような2つの工程を行うと記述がされています。

  1. リファインメント(refinement)によるデプスのフィルタ処理
  2. 異なる手法で求めたデプスマップとダブルチェックを行うことで、疑わしい値を除外

それではまず、1.のリファインメントを行っていきましょう。
論文[1]内ではこちらの処理について下記のようにさらりと記述がされています。

We first filter outlier depths using the depth refinement method of [19].

参照されている論文はこちら。
[論文] MegaDepth: Learning Single-View Depth Prediction from Internet Photos [9]

論文ではリファインメントに関する方法が記述されており、これを用いると下図(文献[9]より引用)(b)のように取得された不連続なデプスを、(c)のようにリファインすることが出来るようです。

具体的な方法については、下記のような二つの工程を行うと記述がされています。

  1. 図(b)上段のように物体の背後にあるデプスが、物体のデプスを"食べて"しまう問題を解決するため、COLMAPにおけるデプス推論のアルゴリズムを修正し、メジアンフィルタを施す。
  2. Semantic segmentationによって画像を領域分割し、フィルタを施す。

※ Semantic segmentationとは下図(文献[10]より引用)のように画像領域をクラスカテゴリごとに区分分けするタスクのこと

ふむふむ。なるほどなるほど。
それでは、こちらについて早速・・・・・・・・・・・・あれ・・・?
この処理、論文でさらりと書かれている割に実装するの結構ヘビーじゃない?



中締め

はい。なんとも中途半端な終わり方ですが、ここでタイムアップになってしまい前半パートは終了です。
1行でさらりと書かれていたので簡単に実装できると勘違いしていました。
リファインメントによるデプスの除去は実装が出来なかったので今後の課題としたいと思います。5

お気づきの方もたくさんいらっしゃると思いますが、この記事、長々と書いてきたのですが、行ったことはYouTubeの動画をダウンロードしてライブラリに突っ込んだというだけです。笑
ただ、それでもYouTubeの動画だけからある程度のデプスマップを作成出来たということは、非常に好奇心をくすぐる取り組みでした。
筆者らはSLAMやMVSといったものを今回初めて触ってみましたが、実際に取り組む中で「中身がこうなっていたんだ」という発見や、「こういうことにも応用出来そう」と気づけた部分がいくつかあり、コンピュータビジョンという奥の深い分野の深淵を、少し覗くことが出来た気がしています。
もし、コンピュータビジョンに興味はあるけれど何をすればいいのか分からない・・・という方がいらっしゃれば、チュートリアルとしてマネキンチャレンジ × COLMAPは面白いと思うので、試してみてはいかがでしょうか。

ただ、並行して思うのが、ライブラリはあくまでライブラリで、それを活かしつつ、いかに課題に向き合い、チューンし、改良していくのかが腕の見せ所ということです。6
その最たる例がノイズ除去で、より"良い"ものを作りたい、こうすればもっと"良く"なりそう、というこだわりが最終的なアウトプットの質を高め、素晴らしい研究成果を生み出しているのだと改めて思います。

後半パートでは、より"良い"教師データを作成するために、この"こだわり"の部分を行っていきます。ホモグラフィーやP+Pなど、あまり馴染みのない技術の解説も行っていくのでお楽しみに。
暗雲が立ち込めてきた『できる!マネキンチャレンジデータセット』
果たして、マネキンチャレンジデータセットは作れるのでしょうか。

後編へ

参考文献

[1] Z. Li, T. Dekel, F. Cole, and R. Tucker. Learning the Depths of Moving People by Watching Frozen People. IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2019.
https://mannequin-depth.github.io/
[2] Tali Dekel. Moving Camera, Moving People: A Deep Learning Approach to Depth Prediction. Google AI Blog, 2019.
https://ai.googleblog.com/2019/05/moving-camera-moving-people-deep.html
[3] J. Engel, T. Schöps, and D. Cremers. LSD-SLAM: Large-Scale Direct Monocular SLAM. European Conference on Computer Vision (ECCV), 2014.
https://vision.in.tum.de/research/vslam/lsdslam
[4] C. Ionescu, D. Papava, V. Olaru and C. Sminchisescu. Human3.6M: Large Scale Datasets and Predictive Methods for 3D Human Sensing in Natural Environments. IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 36, No. 7, July 2014.
http://vision.imar.ro/human3.6m/description.php
[5] D. Mehta, H. Rhodin, D. Casas, P. Fua, O. Sotnychenko, W. Xu,and C. Theobalt. Monocular 3D Human Pose Estimation In The Wild Using Improved CNN Supervision. International Conference on 3D Vision (3DV), 2017.
http://gvv.mpi-inf.mpg.de/3dhp-dataset/
[6] R. Mur-Artal and J. D. Tardos. ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras. IEEE Transactions on Robotics, 33(5):1255–1262, 2017.
https://github.com/raulmur/ORB_SLAM2
[7] J. L. Schönberger and J.-M. Frahm. Structure-from-Motion Revisited. IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2016.
https://paperswithcode.com/paper/structure-from-motion-revisited
[8] J. L. Schönberger, E. Zheng, J.-M. Frahm, and M. Pollefeys. Pixelwise View Selection for Unstructured Multi-View Stereo. European Conference on Computer Vision (ECCV), 2016.
https://github.com/colmap/colmap
[9] Z. Li and N. Snavely. MegaDepth: Learning Single-View Depth Prediction from Internet Photos. IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2018.
http://www.cs.cornell.edu/projects/megadepth/
[10] A. Kirillov, K. He, R. Girshick, C. Rother, P. Dollár. Panoptic Segmentation. IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2019.
https://arxiv.org/abs/1801.00868

  1. まさかのトップバッターから大長編の力作でした。。https://qiita.com/dcm_chida/items/0b687fe42b932e090a36

  2. 初級者(筆者ら)が自分たちの勉強もかねて書いた記事です。誤っている箇所があればご指摘お願いします!

  3. 複数のカメラ(写真) × 固定物体といった取り組みも存在します。例としては観光客の撮影した首里城の写真から、焼失してしまった首里城をデジタル復元しようというプロジェクトです。是非みなさんも参加しましょう。https://www.our-shurijo.org/

  4. 実際に論文[1]ではノイズ除去によってDeep Learningの推定精度が約15%向上したと記述があります。

  5. 言い訳ですが、文献[1]と文献[9]は同一の筆頭著者による論文で、同一の著者だからこそ、リファインメントの処理についてさらりと行えるのです。

  6. ブーメラン。論文[1]はCOLMAPだけで終わらずに、細かいノイズ除去や手法の追究まで行ったからこそ、Honorable Mention Awardに輝いたのだと思います。

28
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?