はじめに
この記事はAMBL株式会社 Advent Calendar 2022の5日目の記事です。
この記事では、3次元点群処理の技術とPythonのライブラリについて紹介をします。
3次元点群とは?
3次元点群データとは、LiDARなどの3次元測量センサによって得られた 3 次元位置情報(X,Y,Z)を持った点の集合です。
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] → 物体の中心をハフ変換の投票メカニズムの応用で予測し、物体を検出 |
フィルタリング/ノイズ除去
点群データの前処理としてノイズの検出や除去をします。
ノイズ除去を行うことで後段の点群解析の精度向上が期待されます。
ノイズ除去の例↓[参考文献]
ダウンサンプリング
元の点群の表現を維持したまま点の数を減らすことで冗長性を排除してメモリや計算コストの効率化を図ります。
ダウンサンプリングの例↓[参考文献]
アップサンプリング
欠けている情報やスパースな点群を補完するように点の数を増やします。
PU-GANによるアップサンプリングの例↓[参考文献]
特徴点抽出
点群の中で物体を表現する重要な点をエッジや周囲との点から検出します。
レジストレーションや学習用の教師データとして使用されます。
USIPによる特徴点検出の例↓[参考文献]
レジストレーション
複数の点群をひとつの点群として扱うために、レジストレーション(位置合わせ)を行います。
LiDARなど広範囲のデータを取得した際に全体を再現する際に使用されます。
LiDARデータのレジストレーション例↓[参考文献]
分類/セグメンテーション
画像処理のクラス分類やセグメンテーションと同様に、点群処理においてもPointNetの発表以降、多くの深層学習モデルが発表されてきました。
PointNetによる分類とセグメンテーション↓[参考文献]
物体検出
点群データから、人や自動車などのクラスと位置(3Dバウンディングボックス)を検出します。
PointPillarsによる物体検出↓[参考文献]
Pythonの点群処理用ライブラリ
Pythonの点群処理用ライブラリを種類ごとにいくつかまとめてみました。
点群処理全般
・Open3D [github]
ノイズ除去やレジストレーション、可視化まで点群処理で必要なことは大体カバーしている
・Python-PCL [github]
pointcloud library(pcl)のPythonバージョン
・Pyntcloud [github]
Open3Dの点群処理とPyvistaの可視化モジュールが一緒になっている
機械学習、ディープラーニング系
・Open3D-ML [github]
Open3Dの機械学習応用版
Open3Dの前処理なども合わせて使用可能
・torch-points3d [github]
分類、セグメンテーション、レジストレーション、物体検出が実行可能
PointNet,RandLA-Net,VoteNetなど多くのモデル有
・MMDetection3D [github]
物体検出に特化したライブラリ
VoteNet, PointPillarsなどのモデル有
可視化系
・Pyvista [github]
pythonでVTKを扱うためのライブラリ
VTK, STL, OBJ, PLYへメッシュとして出力可能
・Plotly [github]
ブラウザベースの Python 用グラフ描画ライブラリ
・K3D [github]
Jupyter notebook を拡張した3Dデータ可視化ライブラリ
可視化の具体例は下記記事で紹介されています。