※当サイトはPRを含みます

3次元点群処理の技術とPythonライブラリまとめ

はじめに

この記事では、3次元点群処理の技術とPythonのライブラリについて紹介をします。

(もともとQiitaに投稿していた記事を移行しました)

3次元点群とは?

3次元点群データ(3D Point Cloud)とは、3次元測量センサ(LiDAR(Light Detection and Ranging)や3Dカメラなど)によって取得された 3D空間上の点の集合 のことを指します。

3次元点群データの構成

データ項目説明
X, Y, Z各点の3次元座標(位置情報)
RGB各点の色情報(カメラ付きLiDARやフォトグラムメトリで取得)
強度(Intensity)LiDARの反射強度(地表面や物体の材質を推測できる)
時間(Timestamp)取得された時刻(移動するLiDARの場合、時間情報が重要)
分類(Label)地物の種類(地面・建物・樹木・車両などのカテゴリ)

取得方法

手法概要用途
LiDARレーザー光を発射し、反射光の時間を測定して距離を計算自動運転、地図作成、建築・土木
ステレオカメラ2台のカメラで視差を利用し3D情報を取得ロボット、VR、AR
フォトグラムメトリ画像解析によって3D形状を復元建築、文化財保存
ToFカメラ光の飛行時間を測定し深度情報を取得スマートフォン、顔認識

ファイルフォーマット

フォーマット特徴
.pcdPCL(Point Cloud Library)で標準的に使用される
.las / .lazLiDARデータの標準フォーマット(.laz は圧縮版)
.ply3DグラフィックスやCGで利用される
.csv / .txtX, Y, Z をテキストで保存(簡易的な用途)

活用分野

分野活用例
自動運転LiDARで周囲の車両・歩行者・道路を検知し、自律走行を支援
都市計画3D地図の作成、スマートシティ構築、災害対策
建築・土木BIM(Building Information Modeling)や建物スキャン
ロボティクスロボットの3D環境認識やナビゲーション
文化財保護歴史的建造物の3Dスキャンによる保存・復元

3Dデータに関して、センサや表現方法などの概要は以下の記事をご参照ください。

3次元点群の処理と要素技術

画像処理にはハイパス/ローパスなどを用いたフィルタリングや、AIを使用した物体検出がありますが、
点群処理にも様々な処理があります。
代表的な点群処理のタスクと、その技術を各2個程度紹介します。(※大量のモデルや技術があるので筆者の独断と偏見で選んでいます)

従来手法ディープラーニング, 機械学習
フィルタリング
ノイズ除去
・Radius based outlier filter [Code]
→球の半径内にある点の個数で判断 

・Statics based outlier filter [Code]
→k近傍点との距離の平均から判断
・PointCleanNet [Paper]
→PCPNetを応用した深層学習によるノイズ除去モデル

・DMR Denoise [Paper]
→サブサンプル点およびその近傍特徴から、ノイズの多い点群特徴を学習。教師なし教師ありのどちらにも対応
ダウンサンプリング・Farthest Point Sampling [Code]
→遠い点からサンプリング

・Voxel grid Sampling [Code]
→グリッド内の点の重心点をサンプリング
・Learning to Sample [Paper]
→PointNetを基本構造としたサンプリングする点を生成するネットワーク

・Sample Net [Paper]
→Learning to Sampleの応用
アップサンプリング・Edge Aware resampling [Paper]
→エッジと法線を利用したアップサンプリング

・Upsampling using Voronoi diagram[Paper]
→ ボロノイ図を利用したアップサンプリング
・EC-Net [Paper]
→ Edge Aware resamplingをネットワークの学習に応用

・PU-GAN [Paper]
→ GAN(敵対的生成ネットワーク)を応用
特徴点・ISS [Code]
→ 距離によって重み付けして計算

・Harris-3D [Paper]
→ Harrisコーナー検出の3次元点群への応用
・3DFeatNet[Paper]
→ キーポイント検出器と特徴量を弱教師あり学習で求める

・USIP [Paper]
→ 教師なしのキーポイント検出
レジストレーション・ICP [Code]
→ 点群の剛体変換を求めて繰り返すことで一致させる

・CPD [Paper]
→ 確率モデルを使用したアプローチ
・PointNet LK [Paper]
→ LK法にPointNetを適用したネットワーク

・DCP [Paper]
→ DGCNNなどでエンコードし,transformerで対応付けする
分類 / セグメンテーション・PointNet [Paper]
→ 後発の研究にも大きな影響を与えた点群処理における代表的なモデル 

・Point Transformer [Paper]
→ Transformerのアイデアを応用したモデル

・RandLA-Net [Paper]
→ 効率的に演算するためのランダムサンプリングと局所的な特徴を抽出するLocal Feature Aggregationからなるモデル

・KPconv [Paper]
→ 点群の効果的な畳み込みを用いたモデル
物体検出・PointPillars [Paper]
→ 点群をPillarという特徴に変換することで高速な物体検出が可能

・VoteNet [Paper]
→ 物体の中心をハフ変換の投票メカニズムの応用で予測し、物体を検出

フィルタリング/ノイズ除去

点群データの前処理としてノイズの検出や除去をします。
ノイズ除去を行うことで後段の点群解析の精度向上が期待されます。

ノイズ除去の例↓[参考文献]
image.png

ダウンサンプリング

元の点群の表現を維持したまま点の数を減らすことで冗長性を排除してメモリや計算コストの効率化を図ります。

ダウンサンプリングの例↓[参考文献]
image.png

アップサンプリング

欠けている情報やスパースな点群を補完するように点の数を増やします。

PU-GANによるアップサンプリングの例↓[参考文献]
image.png

特徴点抽出

点群の中で物体を表現する重要な点をエッジや周囲との点から検出します。
レジストレーションや学習用の教師データとして使用されます。

USIPによる特徴点検出の例↓[参考文献]
image.png

レジストレーション

複数の点群をひとつの点群として扱うために、レジストレーション(位置合わせ)を行います。
LiDARなど広範囲のデータを取得した際に全体を再現する際に使用されます。

LiDARデータのレジストレーション例↓[参考文献]
image.png

分類/セグメンテーション

画像処理のクラス分類やセグメンテーションと同様に、点群処理においてもPointNetの発表以降、多くの深層学習モデルが発表されてきました。

PointNetによる分類とセグメンテーション↓[参考文献]
image.png

物体検出

点群データから、人や自動車などのクラスと位置(3Dバウンディングボックス)を検出します。

PointPillarsによる物体検出↓[参考文献]
image.png

Pythonの点群処理用ライブラリ

Pythonの点群処理用ライブラリを種類ごとにいくつかまとめてみました。

点群処理全般

Open3D [github]
ノイズ除去やレジストレーション、可視化まで点群処理で必要なことは大体カバーしている
image.png

Python-PCL [github]
pointcloud library(pcl)のPythonバージョン

Pyntcloud [github]
Open3Dの点群処理とPyvistaの可視化モジュールが一緒になっている

機械学習、ディープラーニング系

Open3D-ML [github]
Open3Dの機械学習応用版
Open3Dの前処理なども合わせて使用可能
image.png

torch-points3d [github]
分類、セグメンテーション、レジストレーション、物体検出が実行可能
PointNet,RandLA-Net,VoteNetなど多くのモデル有

MMDetection3D [github]
物体検出に特化したライブラリ
VoteNet, PointPillarsなどのモデル有

可視化系

Pyvista [github]
pythonでVTKを扱うためのライブラリ
VTK, STL, OBJ, PLYへメッシュとして出力可能
image.png

Plotly [github]
ブラウザベースの Python 用グラフ描画ライブラリ
image.png

K3D [github]
Jupyter notebook を拡張した3Dデータ可視化ライブラリ
image.png

可視化の具体例は下記記事で紹介されています。

おすすめ参考書