20141004cvsaisentan_pcl_and_why_3d_vision??
DESCRIPTION
第25回コンピュータビジョン勉強会@関東 ( http://connpass.com/event/8082/ ) での私の発表資料です。のちにブログ( https://twitter.com/derivecv ) の方でも、感想、補足を加えた、参加レポートを書く予定です https://www.facebook.com/pages/Point-Cloud-Consortium/299992603489576TRANSCRIPT
!
PCL(Point Cloud Library)の基本と「なぜ点群処理か?」
2014/10/4 @コンピュータビジョン勉強会 関東 慶應義塾大学大学院理工学研究科 博士課程
林昌希 @payashim @derivecv [email protected]
1
発表者について• 専門は機械学習による画像認識(特に人間が対象の技術が専門、画像でもデプスでもできます)。
• 研究は「チームスポーツ映像からの人物姿勢推定とその応用」
• 元計測システム開発者。博士課程中の仕事を通してデプスセンサー、3D点群まわりに強くなる。
• DERiVEコンピュータビジョンブログ・メルマガ(http://derivecv.tumblr.com/ @derivecv)
• Web連載:「コンピュータビジョンのセカイ~今そこにあるミライ~」マイナビニュースにて2011年3月より連載中
DERiVEでの連載記事: 「PCLを触ってみよう!」
• 当時は日本語の情報がほぼ無かったPCL:元技術商社づとめの私「きちんと日本語で情報提供したい!」
• その後のチュートリアル講演などに繋がる
3
Point Cloudコンソーシアム
4
http://www.pointcloud.jp/
• 3D点群処理のビジネス応用を考えていくコンソーシアム
• セミナーや交流会で人をつなぎ、技術を広める
• コンサルティングも受けています
• 先輩「新入生のみんなー、入ゼミではPCLでの課題をやってもらいますよー」
とある研究室に新学期が来たようです
• 新入生「3Dとか難しそうだから、OpenCVでやりましょうよー、先輩」
3D点群処理の方が難しいというイメージがあるもよう(授業が無いから、というのも原因でしょうが)
どうも、B3,B4の方たちには:
6
本日の内容• 1. PCLの基本の紹介「新入生のみんな、入ゼミではPCLでの課題をやってもらいますよー」
• 2. なぜ点群処理か? 「3Dとか難しそうだから、画像でやりましょうよー、先輩」
※本当は2->1の順で説明したいが、先にPCLで具体性を持たせたほうがイメージしやすくなるのでこの順
7
点群(ポイントクラウド)対象の各点pの3次元座標値(x,y,z)と色(RGB,RGBA)が格納されたデータ
画像データとの共通点: 距離画像として撮影できる場合は、RGB画像と解像度を統一できる (例:Kinect、SoftKinetic) 画像データとの相違点: • 連続して対象表面が得られるとは限らない • 穴があったり、ノイジーだったりする(穴埋めや平滑化が必要) • スペックルノイズ(特にToF)がある
8
Before Kinect (~2011)•ステレオカメラ(Passive ステレオ);車載画像認識•マシンビジョンなどで応用
→精巧な3Dデータが得られるわけではなくノイジーなデプスでできることしか実現できない。また、車やロボットから見てやや遠方の場所を認識対象としている
• Multi-View Stereo (Passive ステレオ)によるパッチベース3次元復元:Google Earthなどで応用
計算時間大。リアルタイムアプリケーションには使用できない
9
After Kinect(2011~)
•誰でも3D点群(30fps)が使えるようになったが: • 3D点群/メッシュ処理のノウハウを持っている人が少ない。 • Kinect SDK /OpenNIは点群そのものに対する各種処理は対象外(人物姿勢推定などNatural User Interfaceが主目的)
• OpenCVのようなビジョン向けのライブラリが3D点群向けには存在していない
• 破格的に低価格なKinectの登場により、誰でも「3D点群」が「動画(30fps)」で取得可能に。
「3次元点群処理」のニーズに応えるために 2011年、Point Cloud Libraryが登場
10
3D画像センシングの民主化• ハードウェアの民主化
• コンシューマデプスセンサー(Kinect, Softkinetic)が登場(デスクトップ向け
• iPadのStructure SenstorやAndroidのGoogle Tangoなど、モバイル向けのものも登場中
• ソフトウェアの民主化:
• Point Cloud Libraryの登場で3Dコンピュータビジョン/点群処理のソフトウェア作成の敷居が一気に下がる。
• OpenframeworksなどへのOpenNIの統合やOcculus Riftなどの登場により、可視化、インタラクション、VRなどでの3Dコンピュータビジョンの使用も容易化・活発化
11
コンシューマデプスセンサーにより 3Dコンピュータビジョンが容易に
• 以前は画像で行われていたマシンビジョン分野も3Dへの移行が活発。ロボットの眼としても期待
D. Holz, R. et al. “Towards semantic scene!analysis with Time-of-flight cameras”. RoboCup Intermational Symposium, 2010
M .Fallon et al. “Efficient Scene Simulation for Robust Monte Carlo Localization Using an RGB-D Camera” CVPR 2012 tutorial12
Point Cloud Libraryの登場• Point CloudとMeshの処理のためのC++言語によるオープンソースの大規模ライブラリ
• OpenCVの姉妹プロジェクト • BSDライセンス - 無料で商用使用可能 • Win/Mac/Linux,Android/iOSのクロスプラットフォーム • OpenNIをはじめ、各社デプスセンサーと直接連携可能(点群の簡単なリアルタイム取得)
13
2.5Dデータ• RGB-Dセンサーで1台で1度に撮影したデータは、全周囲データの完全な3Dを達成していないという意味で「2.5Dデータ」と呼ぶことがある。
• 三角測量 + 透視投影のセンシングなので2.5Dデータとなる
16
Kinectで取得した点群 (カメラ視点側から) 左の点群を上方から見たもの
pcl::PointCloud<PointT> 型
17
!基本的な宣言方法:
pcl::PointCloud<PointT>::Ptr cloud( new PointCloud<PointT>() ); !
!Point Cloudに含まれる点の形式を表すPointTの例: pcl::PointXYZ - float x, y z pcl::PointXYZI - float x, y z + 輝度 pcl::PointXYZRGBA - float x, y z + RGBA pcl::PointNormal - float x, y z +normal[3] + curvature pcl::Histogram - float histogram[N] 例):各点がPointXYZRGBAのPoint Cloud型オブジェクトの作成 PointCloud<pcl::PointXYZRGBA>::Ptr data(new PointCloud<pcl::PointXYZRGBA>());!
「色付きの3D点群、法線」などのデータを格納する PCLで一番よく使うオブジェクト
PCDファイル形式• PCL独自定義の点群ファイル形式がPoint Cloud Data(拡張子は.pcd)
• バイナリー形式とテキスト形式の2種類が存在 (下の例はテキスト形式)
• .objや.plyのようにメッシュデータの保存が必要ないので、点群だけを保存するために効率的な独自ファイル形式を定義(※筆者の憶測)
http://pointclouds.org/documentation/tutorials/pcd_file_format.php18
PCL::ioモジュール• PointCloud<PointT>型のデータをPCLの独自ファイル形式
「.pcd形式」へ保存・読み込みができる。
• OpenNIによりデータを取得できる各種デプスセンサ(Kinect,
Xtion)からリアルタイムに同期された「距離画像+RGB画像」をPointCloud型でキャプチャ可能(→ OpenNIでPoint cloud を取り扱いたいなら、OpenNI単体での使用よりPCLからのOpenNIの使用がおすすめ)!
• 各種メッシュデータ形式(.obj 、.ply、vtkファイル)の読み/
書きが可能(読み込みはあまり充実していない)
19
デモ:Webブラウザ上での .pcdファイル表示
http://www.pointcloud.jp/work/work01/Point Cloud コンソーシアムのHPでのデモ
OpenNI Grabberフレームワーク• Kinectから計測されるRGB-Dデータを直接取得するためのモジュール(OpenNIの該当処理のラッパー)
• RGB画像と距離画像が位置合わせ•同期済みの状態で、PointCloud<PointT>型オブジェクトとして取得できる
21
Kinectからpoint cloudの リアルタイム取得(OpenNIGrabber)
#include <pcl/io/openni_grabber.h>! pcl::OpenNIGrabber grabber(argv[2]);! boost::function<void (const CloudConstPtr&) > cloud_cb = boost::bind (&OpenNIViewer::cloud_callback,this, _1);!! boost::signals2::connection cloud_connection = grabber_.registerCallback (cloud_cb); // cloud_cb関数を登録!
!void!cloud_callback (const CloudConstPtr& cloud)!{! boost::mutex::scoped_lock lock (cloud_mutex_);! cloud_ = cloud;!! //毎フレームごとのcloudへの処理をここに記述!
}
22
Grabberにbindしたコールバック関数が毎フレームごとに呼ばれ、その引数でcloudが取得できる
=毎フレームの処理をコールバック関数に記述する
PCL Visualizer• PCLの点群をとても簡単に3D可視化!(openCVでいうhighGUIのようなイメージ). マウスやキーボードの入力も受け付ける
• 3Dモデル(.objファイル等)も同時に表示でき、3Dデータに重要な法線の可視化機能も最初から搭載
このPCLVisualizer による可視化が簡単なので PCLでは点群処理のみに 集中して作業できる
23
PCLの法線推定!
• FLANNを用いたKdtreeによる近似最近傍探索(pcl::NormalEstimation)
• Integral Imageを用いた高速な法線推定(pcl::IntegralImageNormalEstimation)
24
(加えて)高速なOpenMP実装:NormalEstimationOMP
要は、これらのクラスに丸投げで法線が推定可能
3D点群処理での法線の役割• 直感的な説明:3D表面を微分した方向なので、画像で言う「エッジ」に相当。セグメンテーションや物体認識などを行う上で、重要な特徴量となる。
• 3D点群はグラフィックスの処理(メッシュ系)にも連繋できるので、ここでも法線方向は重要な情報。
25
距離画像のグリッド構造の利用
• Organizedな点群(距離画像上の対応する画素(i,j)に各点を逆投影したもの)向けのbetterで高速な処理
pcl::OrganizedMultiPlaneSegmentation.
pcl::OrganizedConnectedComponentSegmentation
http://www.youtube.com/watch?v=LZ8l4w3qw3E
Filtersモジュール• 点群向けのノイズや外れ値除去、平滑化などのフィルタリングを提供 • 主なアルゴリズム:
• 特定の領域だけ抽出(PathThrough) • 平滑化(Bilateral Filter) • ダウンサンプリング(VoxelGrid filter) • 外れ値除去(StatisticalOutlierRemoval)
28
Filteringの必要性
• 穴がある→ 穴埋め処理(Surfaceモジュール) • ノイズが多い
• 連続した表面上での凹凸→Bilateral Filterでエッジ保存したまま平滑化
• 散発的なノイズ(スペックルノイズ)→StatisticalOutlierRemovalで外れ値除去
• データ量が多い→ Voxel Grid Filterでダウンサンプリング
3Dセンサーの生データは閉じた(穴の無い)奇麗な点群ではないので前処理の必要性あり
29
PassThrough Filter
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud!! ! ! ! ! ! ! ! ! ! ! ! ! ! (new pcl::PointCloud<pcl::PointXYZ>);! pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered !! ! ! ! ! ! ! ! ! ! ! ! ! ! (new pcl::PointCloud<pcl::PointXYZ>);! !pcl::PassThrough<pcl::PointXYZ> pass;!pass.setInputCloud (cloud);!pass.setFilterFieldName ("z");!pass.setFilterLimits (0.0, 1.0);!//pass.setFilterLimitsNegative (true); 指定範囲を取り除く場合!
pass.filter (*cloud_filtered);
指定した1次元方向(ここではz)の範囲(setFilterLimits)の点群のみを残す
30
VoxelGrid Filter
// 指定したvoxel gridまでダウンサンプリング!
pcl::VoxelGrid<pcl::PointXYZ> vg; !vg.setInputCloud (cloud); !vg.setLeafSize (0.01f, 0.01f, 0.01f); //0.01m立方のグリッドを設定!
vg. filter (∗cloud filtered );
指定したVoxelGridまでボクセル化。 各グリッドはグリッド内の点の中央値で近似される。
31
Statistical Outlier Removal
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;!sor.setInputCloud (cloud);!sor.setMeanK (50);!sor.setStddevMulThresh (1.0);!sor.filter (*cloud_filtered);
局所ごとの密度に従い、点をフィルタリング。 各領域で平均密度から比べてスパースな点を除去。
32
前半のまとめ• Point Cloud Libraryの基本だけ紹介: • Point CloudとRGB-Dデータの構造について導入 • Kinectを始めとした各社デプスセンサーから簡単にリアルタイムの点群を取得可能
• PCLVisualizerがあるので3D可視化も簡単 !
• 豊富な公式チュートリアルで更に勉強しましょう
Q1. セグメンテーション• A. 画像 • B. デプス
http://www.eecs.berkeley.edu/Research/Projects/CS/vision/
grouping/resources.html
http://cs.nyu.edu/~silberman/projects/indoor_scene_seg_sup.html
Kinectの人物姿勢推定: 色・テクスチャが関係ない典型例デプスのみで計算しているので(画像からの認識と違い)
形だけで識別し、衣服や肌のテクスチャは使用していない。
※人物領域の抽出 も空間の配置だけだけで
行われている
pcl::Recognition
デモ
3D特徴ベースのマッチング(物体を認識
+姿勢を確定)
http://pointclouds.org/documentation/tutorials/correspondence_grouping.php#correspondence-grouping
(直感的には)画像同士 SIFTなどのKeypoint マッチングの3次元版
平面検出-> そのあと更にSegmentation
※DERiVEメルマガ vol.15より PCLのEuclidian Clustering
点群だと平面の上の物の 抽出が簡単!(極端に言えば、 空間範囲で分けるだけ)
抽出結果(一番左の物体)
平面検出入力の点群
PCLのRGB-D人物検出
47
http://www.pointclouds.org/documentation/tutorials/ground_based_rgbd_people_detection.php#ground-based-rgbd-people-detection
画像:IAS2014 PCLチュートリアルより
• 床平面検出 • Euclidian Clustering • HOG検出器
画像でも床平面は出せますよ?
「カメラキャリブレーション +「床の3D座標系」
がわかっていれば、床面の 密な座標系は求まる
しかし 平面的な表面(床や壁)や直線検出できる形状 以外は、画像一枚からだと求まらない
デプスセンサーであれば、シーンの 形状が、リアルタイムにさえ取得できる
VR, AR (デプスセンサー ベース)
対象物や対象人物、周囲の空間の3D形状 + 動きがわかっているなかで、CGを同時表示する
例: • 仮想試着ミラー • Structure SensorやTangoなどでのAR(ゲーム) • Oculus Rift + Natural User Interfaceなど
(デプスセンサー登場以前の)PTAMなどの画像ベースARでは、 画像から予測した平面上にしか重畳できなかった
3Dを撮る(コンシューマ)• 3Dプリンタの流行:主な入力データは「CGソフトで作成した3Dモデル」
モデル プリント結果
実物もスキャンしてプリント
http://www.pointcloud.jp/blog_n06/
モバイルスキャン (Structure Sensor, Tangoなど)• 物や、人、空間は、タブレットやスマホで3Dスキャンする時代へ(来年ブレイク?)
• SLAMが民主化(低価格化)しはじめる、という流れとも言える
Structure Sensor At Ripley's Believe It Or Not http://www.youtube.com/watch?v=JmgRdFQOLPw
3D点群 for デザイン• 「3D点群データ」を入力/処理できる点群解析ツール+CADツールで3Dモデルを設計する:実物の3D形状から製品をモデリング
金具、自動車 エンジンなど
人体の寸法 形状
CADツール (形状設計)
CAEツール (構造解析など)建物、鉄骨など
CADツール (洋服の設計)
旧来は高価な 3Dスキャナーが無いと 実物は3D化できなかった
カジュアルに対象を3D化できるようなりつつあるので、 一般の消費者もこうした デザインへ移行??
後半「なぜ点群処理か?」まとめ
• (色を無視して)3次元の形だけで対象を認識できる
• (人工物だと特に)平面や円柱などプリミティブあてはめが楽(I love RANSAC)
• 対象をフルスキャンすれば3D世界全体をそのまま3Dで把握・可視化できる
• 撮った対象はデザインにも活かせる モバイルRGB-Dセンサーの登場で、3D点群データは来年以降大量に増える?
補足:Windowでの PCLのインストール
• Point Cloud コンソーシアムの以下の記事が初心者向けです。Visual Studioでの設定方法まで詳しく書かれています。
• PCC ブログ:Windows8.1でPCLを動かすまで
• http://www.pointcloud.jp/blog_n01/
• http://www.pointcloud.jp/blog_n02/
• http://www.pointcloud.jp/blog_n03/
• また、@UnaNancyOwenさんがビルドしたPCL1.7.x All in One Installerでの構築 については以下をどうぞ
• Building Point Cloud Library with Visual Studio 2013
• http://unanancyowen.com/?p=712
• Point Cloud Library 1.7.2 × VS2013 な環境構築 & OpenNIGrabber を使わずに点群を表示してみた(独自のKinectの距離画像からの透視投影を独自に書くコードも書いてある良記事)
• http://tips.hecomi.com/entry/2014/05/11/214401
補足(発表後に追加)• PCLは、Kinectなしでも当然使用できます。低価格デプスセンサーだけではなくて、あらゆる点群データ全てを入力として使用できるます。例えばある計測器で撮影した部屋全体の点群が.ply形式で保存されているときに、それをPCLで作成したプログラムで読み込み、平面検出などの処理を行う、といったことが可能です。
• PCL登場以前は、高価格のスキャナーとセットで各社が販売するGUIソフトウェアでそうした点群の加工や編集を行うことが主でした。
• iOSやAndroid上でのPCLの挙動は私もほとんど知らないので、これをきっかけに動かしてみた方は、是非ブログ等で共有をしてくださると皆さんのたまに役に立つと思います(DERiVEのtumblrでも紹介させて頂きたいです)。