Open3Dは様々な点群処理をPythonで書くためのライブラリであり、幅広く使われています。 最近(2023年3月)、点群から平面検出を行うmethodが新しく実装されました。 今回の発表では、使われているアルゴリズムと、実際に建築・土木業界の業務で使われるような点群に上記のmethodを適用した時の結果を紹介します。
copyright©2023 DataLabs, Inc. all rights reserved. 1佐藤 大輔DataLabs株式会社2023/05/27Open3Dに実装された平面検出機能の紹介
View Slide
copyright©2023 DataLabs, Inc. all rights reserved. 2発表内容● 自己紹介● DataLabsの紹介○ 会社概要○ 当社の3Dサービス: Modely● Open3Dに実装された平面検出機能の紹介○ Open3Dって?○ アルゴリズム紹介○ 実データに適用してみた● まとめ
copyright©2023 DataLabs, Inc. all rights reserved. 3自己紹介● Twitter: @Sato0323D● LinkedIn: https://www.linkedin.com/in/daisukesato0323/● 佐藤大輔○ 37歳○ DataLabsのCTO○ 広島県尾道市出身○ 京都大学で物理の博士号取得
copyright©2023 DataLabs, Inc. all rights reserved. 4自己紹介● 5年間海外でポスドク○ 分野は理論物理● これは食えないなと思い、日本に戻ってAIベンダーに就職、4年間働く○ 受託開発、PoC、R&D■ 分野は画像認識、3Dデータ処理、ロボットアプリ○ 後半2年はCTO● 製品開発とそれを軸にしたR&Dがやってみたくなり、DataLabsにCTOとして転職。今1年ほど働いたところ。○ 3Dを続けたかったので、それを1つの軸にして転職先を探した
copyright©2023 DataLabs, Inc. all rights reserved. 5DataLabsの紹介● DataLabs: 建設・土木業界向けに3Dデータ処理を行うSaaSを提供するスタートアップ○ 創業は2020年○ 社員は20人弱くらい○ 資金調達済● エンジニアは半分以上が外国人(日本語はできない)○ 開発チームのコミュニケーション・ドキュメントは完全英語化済● 点群から3Dモデルを生成する手法について、東大と共同研究中会社概要● iPadのLiDARなどで撮影した点群から鉄筋の3Dモデルを生成する● 円柱のパラメトリックモデルなので、鉄筋間の距離計算が容易にできる● その情報を使い、配筋検査用の帳票を自動で出力する● 維持管理用に、3DCADファイルも出力できるBefore After当社の3Dサービス:
copyright©2023 DataLabs, Inc. all rights reserved. 6Open3Dに実装された平面検出機能の紹介Open3Dって?● 3Dデータ処理用のOSSライブラリ● 実装はC++だが、pythonから呼び出して使える○ パフォーマンスとアプリケーションへの組み込みやすさを両立○ 点群処理の実装工数がとても少なくできる● 公式チュートリアルがすごいわかりやすい● 日本語の解説資料は以下がオススメ○ 秋月先生のSSII2018での講演○ 玉木先生の講演○ 金崎・秋月・千葉先生の書籍「詳解 3次元点群処理 Pythonによる基礎アルゴリズムの実装」最近点群から平面を検出する新しい手法が実装されたHough変換やRANSACなどの従来手法に比べて、● ノイズに対してrobust● パラメータの調整をあまりしなくていい● 計算効率が高い
copyright©2023 DataLabs, Inc. all rights reserved. 7アルゴリズム紹介Open3Dに実装された平面検出機能の紹介Ref: A. Araújo and M. Oliveira, A robust statistics approach for plane detectionin unorganized point clouds, Pattern Recognition, 20201. octreeを使って点群を小領域に分割2. leaf nodeから順に平面かどうか判定3. 平面の間隙を埋めるため、どのplanar patchにも属してない点を各patchに取り込んで行く4. planar patchのうち、同一平面の一部と判定されたものをmergeする計算量は O(n log n)と、効率が良い
copyright©2023 DataLabs, Inc. all rights reserved. 81. octreeを使って点群を小領域に分割● cellが ε = 0.1% * (点の総数: n) 以下の点を含むようになるまでoctreeで領域を分割するOpen3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 92. leaf nodeから順に平面かどうか判定● 領域に含まれる点から平面の候補を作成する:○ C: 平面上の1点は全ての点の座標のmedian○ N: 平面の法線は全ての点の法線のmedian (normalizeはする)● meanではなくmedianを使うのは、outlier (実際の点群にはほぼ必ずnoiseが載っている!)の影響を軽減するためCNOpen3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 10T1: Plane-sample distance testCPidiN● 領域に含まれる点から平面候補への距離 (di)を計算● inlier interval (ID)を計算○ meanではなくmedianを使うのと同様、standarddeviationに対応する量 (Median AbsoluteDeviation)を使う■ 正規分布の時にstdに一致するよう、k=1.4826とする○ 正規分布の時に3σ区間に一致するよう、α=3とする● IDの上限がinlier conditionを決める:Maximum DIstanceto Plane (MDP)Open3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 11● ノイズが激しい場合は、この上限は大きすぎるかもしれないので、以下の処理をする:○ Nに直交する単位ベクトル(U, V)を作る○ U, V方向の幅(w, l)を計算○ それからベクトルFを計算○ FとNの角度(θ)を計算■ 平面でない点群の場合、MDPが大きくなるので、θは小さくなる○ θがthreshold以上だと平面とみなす■ threshold = 75 [deg]が良いらしいUV● 以上の処理では、パラメータチューニングがほぼ不要であった○ データの分布からinlier intervalを求めたため、データ分布に合わせて多数のパラメータを決める必要がないOpen3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 12T2: Plane-sample normal deviation testT3: Outlier percentage testNiN● 各点の法線 (Ni)と、平面候補の法線のなす角(Φi)を求める● MADを使ってinlier intervalを求める○ 上限がMaximum Normal Deviation (MND)● MNDがthreshold以下であれば平面とみなす○ threshold = 60 [deg]が良いらしい● outlierが多すぎる平面候補は破棄する○ サンプルのうち25%以上が2つのinlier intervalの外側にあるものは、平面とはみなさないOpen3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 131.と2.の結果領域分割したため、● planar patchの間に空隙(平面とみなされてない点)ができている○ →3. どのplanar patchにも属してない点を各patchに取り込む● 同一の平面を別のplanar patchとして検出している。○ →4. mergeして、同一の平面にする。Open3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 143. 平面の間隙を埋めるため、どのplanar patchにも属してない点を各patchに取り込んで行く● 点群全体に対して、neighborhood graph Gを作る○ k-nearest neighbor法を使う(k=50)● inlier conditionを満たすものを取り込む○ 平面との距離がMDP以下○ 法線と平面の法線のなす角がMND以下Open3Dに実装された平面検出機能の紹介
copyright©2023 DataLabs, Inc. all rights reserved. 154. planar patchのうち、同一平面の一部と判定されたものをmergeする● 2つのpatchをmergeする条件○ 隣接している(neighborhood graph Gが2つのpatchの要素をつなぐedgeを含む)○ 法線が近い(なす角がMNDのmax以下)○ 片方のpatchの点のうち少なくとも1つがもう片方のpatchのinlierconditionを満たすOpen3Dに実装された平面検出機能の紹介隣接してない法線が違うinlier condition満たさない条件を全て満たすのでmerge可
copyright©2023 DataLabs, Inc. all rights reserved. 16Open3Dに実装された平面検出機能の紹介結果● 以下のデータで検証した○ Computer■ ほとんど平面で構成されている、きれいなデータ○ Plant■ 平面の他に円柱など、曲面で構成されている形状が多い。実世界ででくわす点群に近い
copyright©2023 DataLabs, Inc. all rights reserved. 17● 計算時間 (T): 1点あたり0.0021 [ms]○ Boilar room data (n = 6 * 10^6)だと、12 [s]。● 精度指標:○ Number of detected planes/total number of planes (#)○ Precision (P)○ Recall (R)○ F1-score (F1)○ このあたりは機械学習の論文とかでもおなじみのものだが、点群から平面を検出するタスクに使うために工夫されていて面白いOpen3Dに実装された平面検出機能の紹介他の手法と比べて、● F1-scoreは一番いい(PとRのバランスが取れている)● 速度はそこそこ検出結果を見た感じ、● 全体的に全ての平面を検知できている● gapのmergeには失敗している○ が、これだけ大きいgapだと仕方ない気がする
copyright©2023 DataLabs, Inc. all rights reserved. 18Open3Dに実装された平面検出機能の紹介他の手法と比べて、● Recallは一番良い(検知漏れ:False negativeが少ない)● F1-scoreは他の手法より劣る● 速度はそこそこ検出結果を見た感じ、● 面積の大きい平面は正しく検出できている● 平面でないobjectを誤検知してる(False positive)○ gapを頑張ってmergeしすぎ● 曲面を平面と誤検知してる(False positive)
copyright©2023 DataLabs, Inc. all rights reserved. 19対象点群● 取得に使ったセンサー:地上レーザーか何か(iPadとかの安いものではない)● ノイズ:かなり少ない● 点の数:約130万点● ファイルサイズ:33.9 MBOpen3Dに実装された平面検出機能の紹介● 点群データご提供:株式会社草野測器社様● フィールド:福島ロボットテストフィールド実データに適用してみた
copyright©2023 DataLabs, Inc. all rights reserved. 20デフォルトのパラメータで平面検出を行った結果● 実行時間:1.4 [s]○ 点の数で割ると0.001 [ms]○ 論文の結果とオーダーは一致Open3Dに実装された平面検出機能の紹介入力点群検出された平面● 地面や壁、道路面など、面積が大きい平面は問題なく検出できている● 長方形でない平面も長方形として検出される(当然だけど)● False positive(gapを頑張ってmergeしすぎ)→ inlierの点の数でfilterする、などの後処理すると改善するかも
copyright©2023 DataLabs, Inc. all rights reserved. 21Open3Dに実装された平面検出機能の紹介● 他の角度入力点群 検出された平面● False positive● True positive● False negative (面積の小さい平面が検出されていない)● 長方形でない平面も長方形として検出される(当然だけど)
copyright©2023 DataLabs, Inc. all rights reserved. 22Open3Dに実装された平面検出機能の紹介● 他の角度入力点群 検出された平面● True positive
copyright©2023 DataLabs, Inc. all rights reserved. 23Open3Dに実装された平面検出機能の紹介● 他の角度入力点群● True positive検出された平面
copyright©2023 DataLabs, Inc. all rights reserved. 24Open3Dに実装された平面検出機能の紹介パラメータを振ってみたT2: Plane-sample normal deviation test● threshold: 60 -> 30 [deg]NiN特に変化なしT1: Plane-sample distance test● threshold: 75 -> 85 [deg]斜面の検出精度が悪化False positiveを抑えるため、平面検出の条件を厳しくするT3: Outlier percentage test● threshold: 0.75 -> 0.9特に変化なしT1-3を組み合わせても変化なし。False positiveを抑えるためには、後処理を頑張った方が良さそう
copyright©2023 DataLabs, Inc. all rights reserved. 25Open3Dに実装された平面検出機能の紹介パラメータを振ってみたT2: Plane-sample normal deviation test● threshold: 60 -> 80 [deg]NiNT1: Plane-sample distance test● threshold: 75 -> 50 [deg]False negativeを抑えるため、平面検出の条件をガバガバにするT3: Outlier percentage test● threshold: 0.75 -> 0.5T1-3を組み合わせてもT1のような結果になる。パラメータを変えることでFalse negativeだけを抑えるのは難しそう(T2のような結果になる)何故か逆にpositiveが減った(True/False両方)False negativeは減った(ただし面積を過大に評価)変化なし
copyright©2023 DataLabs, Inc. all rights reserved. 26Open3Dに実装された平面検出機能の紹介所感● パラメータチューニングの労力があまりいらないのはありがたい● 速度も結構良い● 実際のアプリケーションにするには、いい感じの前処理・後処理を開発するのが必要そう
copyright©2023 DataLabs, Inc. all rights reserved. 27Open3Dに実装された平面検出機能の紹介書いたコード公式チュートリアルのまんまですが...前処理(法線を計算)平面検出後処理(可視化のために平面のメッシュを作成)とても簡単!
copyright©2023 DataLabs, Inc. all rights reserved. 28Open3Dに実装された平面検出機能の紹介● Open3Dのweb visualizerで簡易・ウェブブラウザ上で動くinteractive GUIが作れる● デモを作ったり、パラメータチューニングに便利● 公式チュートリアルに情報が少ないのが難点...○ exampleのコードを見て気合で使い方を推測するしかない
copyright©2023 DataLabs, Inc. all rights reserved. 29Open3Dに実装された平面検出機能の紹介● 描画用のmethodを実行● 描画対象に入力点群を追加● callback関数を追加○ 平面検出○ configをGUIで変更○ 検出された平面をCAD出力● 平面検出callback関数○ 検出された平面を描画対象に追加
copyright©2023 DataLabs, Inc. all rights reserved. 30まとめOpen3Dに新しく実装された (ver: 0.17.0) 点群から平面を検出する手法を紹介した● アルゴリズムの紹介○ ノイズに対してrobust○ パラメータの調整をあまりしなくていい○ 計算効率が高い● 実データに適用した結果○ 実際のアプリケーションにするには、いい感じの前処理・後処理を開発するのが必要そう○ パラメータチューニングの労力があまりいらないのはありがたい○ 速度も確かに結構良い● 書いたcode snippet○ 平面検出処理○ Open3D web visualizer
copyright©2023 DataLabs, Inc. all rights reserved. 31DataLabsからのメッセージ● プロダクトが育ったら、さらにエンジニアを採用する予定です。○ フロントエンドエンジニア○ バックエンドエンジニア○ リサーチエンジニア● もし弊社に興味をお持ちいただけたら、ぜひ連絡していただきたいです○ Twitter: @Sato0323D○ LinkedIn: https://www.linkedin.com/in/daisukesato0323/○ HP (DataLabs) : https://www.datalabs.jp/○ LinkedIn (DataLabs) : https://www.linkedin.com/company/datalabs-jp/○ Twitter (DataLabs) : https://twitter.com/DataLabs_PR● 直近(2023年5月時点)ではフルタイムのポジションは募集していませんが、将来の加入の可能性を見据えて副業として参画するのもOKです○ 今回の発表者の佐藤・中野含め、副業→正社員の実績あり● 労働環境○ フルリモート○ コミュニケーション(テキスト・オーラル両方)は英語We are will be hiring !!(2023年5月時点)