【保存版】Pythonで始める3次元点群処理(3D Point Cloud)の基礎とおすすめライブラリ
はじめに
この記事では、近年自動運転やメタバース、デジタルツインの発展に伴い注目を集めている「3次元点群(3D Point Cloud)処理」の技術概要と、Pythonで扱える便利なライブラリについて紹介します。
(※本記事はもともとQiitaに投稿していた記事を加筆・移行したものです)
3次元点群とは?
3次元点群データ(3D Point Cloud)とは、LiDAR(Light Detection and Ranging)や3Dカメラなどの3次元測量センサによって取得された、3D空間上の無数の点の集合のことを指します。現実空間をデジタルデータとして精緻に再現できるため、多様な産業で不可欠な技術となっています。
3次元点群データの構成要素
各点は、単なる座標だけでなく様々な属性情報を持っています。
| データ項目 | 説明 |
|---|---|
| X, Y, Z | 各点の3次元座標(位置情報)。点群の最も基本的なデータ。 |
| RGB | 各点の色情報(カメラ付きLiDARやフォトグラムメトリで取得)。 |
| 強度(Intensity) | LiDARの反射強度。地表面の白線や物体の材質の推測に利用される。 |
| 時間(Timestamp) | 取得された時刻。移動体(車両やドローン)のLiDARの場合に重要。 |
| 分類(Label) | 機械学習などで付与された地物の種類(地面・建物・樹木・車両など)。 |
主な取得方法
| 手法 | 概要 | 主な用途 |
|---|---|---|
| LiDAR | レーザー光を発射し、反射して戻ってくるまでの時間で距離を測定。 | 自動運転、高精度地図作成、建築・土木測量 |
| ステレオカメラ | 2台のカメラで人間の目のように視差を利用し、3D情報を取得。 | ロボットの障害物検知、VR、AR |
| フォトグラムメトリ | 複数視点の画像解析によって3D形状を精密に復元。 | 建築、ゲームアセット作成、文化財保存 |
| ToFカメラ | 光の飛行時間を測定し深度情報を取得(小型化が容易)。 | スマートフォン(LiDARスキャナ)、顔認証 |
代表的なファイルフォーマット
| フォーマット | 特徴 |
|---|---|
| .pcd | PCL(Point Cloud Library)で標準的に使用されるフォーマット。 |
| .las / .laz | LiDARデータの標準規格(.laz はその圧縮版で容量を大幅削減可能)。 |
| .ply | 3DグラフィックスやCGツールとの連携でよく利用される。 |
| .csv / .txt | X, Y, Z などの数値をテキストで保存(簡易的な可視化や検証用)。 |
主な活用分野
| 分野 | 活用例 |
|---|---|
| 自動運転 | LiDARで周囲の車両・歩行者・道路形状を瞬時に検知し、自律走行を支援。 |
| 都市計画 | 3D都市モデルの作成、スマートシティ構築、日照や災害シミュレーション。 |
| 建築・土木 | BIM(Building Information Modeling)連携や、工事進捗の3Dスキャン確認。 |
| ロボティクス | ロボットの3D環境認識、自己位置推定(SLAM)とナビゲーション。 |
| 文化財保護 | 歴史的建造物や遺跡の3Dスキャンによるデジタル保存・復元研究。 |
3Dデータに関する、センサの仕組みや表現方法の詳細については以下の記事をご参照ください。
3次元点群の処理と要素技術
2Dの画像処理にフィルタリングやAIを用いた物体検出があるように、3Dの点群処理にも特有のタスクが存在します。
ここでは、代表的な点群処理タスクと、それを実現する技術(従来手法と機械学習/ディープラーニング手法)を紹介します。(※無数のモデルが存在するため、筆者の独断と偏見で代表的なものをピックアップしています)
| タスク | 従来手法(幾何学的アプローチ) | ディープラーニング・機械学習 |
|---|---|---|
| フィルタリング ノイズ除去 |
・Radius based outlier filter [Code] ・Statics based outlier filter [Code] |
・PointCleanNet [Paper] ・DMR Denoise [Paper] |
| ダウンサンプリング | ・Farthest Point Sampling [Code] ・Voxel grid Sampling [Code] |
・Learning to Sample [Paper] ・Sample Net [Paper] |
| アップサンプリング | ・Edge Aware resampling [Paper] ・Upsampling using Voronoi [Paper] |
・EC-Net [Paper] ・PU-GAN [Paper] |
| 特徴点抽出 | ・ISS [Code] ・Harris-3D [Paper] |
・3DFeatNet [Paper] ・USIP [Paper] |
| レジストレーション | ・ICP [Code] ・CPD [Paper] |
・PointNet LK [Paper] ・DCP [Paper] |
| 分類 / セグメンテーション | – | ・PointNet [Paper] ・Point Transformer [Paper] ・RandLA-Net [Paper] ・KPconv [Paper] |
| 物体検出 | – | ・PointPillars [Paper] ・VoteNet [Paper] |
フィルタリング / ノイズ除去
目的: センサーの測定エラーや環境要因による不要な点(ノイズ)を除去し、後段の解析精度を向上させます。
重要パラメータ(従来手法): Open3Dの radius_outlier_removal などでは、特定の点から探索する半径(radius)と、その半径内に最低限必要な点の数(min_nb_points)を指定して、孤立したノイズを判定します。
ノイズ除去の例↓[参考文献]
ダウンサンプリング
目的: 数百万〜数千万という膨大な点群データから、対象物の形状特徴を維持したまま点の数を減らし、メモリ消費と計算コストを抑えます。
重要パラメータ(従来手法): Voxel grid Sampling(ボクセルグリッドサンプリング)では、空間を区切る立方体のサイズ(voxel_size)を指定します。サイズが大きいほどデータは軽くなりますが、形状のディテールは失われます。
ダウンサンプリングの例↓[参考文献]
アップサンプリング
目的: 遠距離の計測やオクルージョン(遮蔽)によって欠けてしまったスッカスカな(スパースな)点群を補完し、高密度な点群を生成します。
PU-GANによるアップサンプリングの例↓[参考文献]
特徴点抽出
目的: 点群の中から、物体の角(コーナー)や特徴的なエッジなど、形状を決定づける重要な点を抽出します。これは後述のレジストレーション(位置合わせ)の基準点として利用されます。
USIPによる特徴点検出の例↓[参考文献]
レジストレーション(位置合わせ)
目的: 異なる視点や時間で取得された複数の点群データを結合し、1つの大きな空間・物体データとして統合します。
重要パラメータ(従来手法): 定番のICPアルゴリズムでは、対応点を探す際の最大距離(max_correspondence_distance)が重要です。初期位置がずれている場合は、大まかに合わせるGlobal Registrationを事前に行うのが一般的です。
LiDARデータのレジストレーション例↓[参考文献]
分類 / セグメンテーション
目的: 「この点は地面」「この点は車」といったように、点群を意味のあるカテゴリごとに分割・分類します。画像処理と同様、PointNetの登場以降は深層学習モデルが主流となっています。
PointNetによる分類とセグメンテーション↓[参考文献]
物体検出(Object Detection)
目的: 点群データ内から特定の物体(歩行者や自動車など)を検出し、その位置や向きを3Dバウンディングボックスで囲んで特定します。自動運転システムの中核技術の1つです。
PointPillarsによる物体検出↓[参考文献]
Pythonの点群処理用おすすめライブラリ
Pythonでこれらの点群処理を実装するためのライブラリを、用途別に厳選して紹介します。
点群処理全般(迷ったらコレ)
・Open3D
[github]
Intelの研究機関が主導するモダンなライブラリ。ノイズ除去からレジストレーション、美しい可視化まで、点群処理に必要な基本機能が網羅されており、初学者に最もおすすめです。
・Python-PCL
[github]
C++の有名ライブラリである Point Cloud Library (PCL) のPythonバインディング版。歴史がありますが環境構築がやや難しい場合があります。
・Pyntcloud
[github]
Open3Dの点群処理機能とPyvistaの可視化モジュールを組み合わせたようなライブラリで、Pandasとの親和性が高いのが特徴です。
機械学習・ディープラーニング特化
・Open3D-ML [github]
Open3Dの機械学習拡張版。PyTorchやTensorFlowと連携し、Open3Dの強力な前処理機能と組み合わせてシームレスにAIモデルを開発できます。
・torch-points3d [github]
PyTorchベースのライブラリ。PointNet, RandLA-Net, VoteNetなど多くの有名モデルが実装されており、分類から物体検出まで幅広く対応可能です。
・MMDetection3D [github]
物体検出に特化した強力なフレームワーク。自動運転向けのデータセット評価や、VoteNet、PointPillarsといったモデルをすぐに試すことができます。
可視化(ビジュアライゼーション)系
・Pyvista [github]
PythonでVTK(The Visualization Toolkit)を直感的に扱うためのライブラリ。点群だけでなく、VTK, STL, OBJへのメッシュ出力にも優れています。
・Plotly [github]
ブラウザベースでインタラクティブに操作できるグラフ描画ライブラリ。Webアプリ(Dashなど)との連携が得意です。
・K3D [github]
Jupyter Notebook 上での動作に特化した3Dデータ可視化ライブラリ。分析しながらその場でグリグリ動かして確認する用途に最適です。
可視化の実装具体例については、下記の記事で詳しく紹介しています。
まとめ
3次元点群(3D Point Cloud)処理は、LiDARの低価格化や自動運転分野の盛り上がりにより、今後ますます需要が高まる技術です。
物体検出やセグメンテーションといった複雑なタスクではディープラーニングが主流になりつつありますが、ノイズ除去やダウンサンプリングといった「前処理」の段階では、計算負荷が低く制御しやすい従来手法(Open3Dなどの幾何学的アルゴリズム)が依然として不可欠です。
まずは「Open3D」などの扱いやすいライブラリをインストールし、手元のデータを可視化・ダウンサンプリングしてみるところから始めてみてはいかがでしょうか。
おすすめ参考書













ディスカッション
コメント一覧
まだ、コメントがありません