3D 点群セマンティック セグメンテーション - PointNet++

PointNet++: 計量空間内の点セットに関する深い階層的な特徴学習
チャールズ・R・チー・リー・イーハオ・スー・レオニダス・J・ギバス
スタンフォード大学
       前回の記事では、S3DIS データ セットのセマンティック セグメンテーション タスクを完了するための PointNet と、対応する pytorch コードの実装を紹介しました。不規則な点群を直接処理するこの方法は、手動で定義された特徴またはボクセルに基づく従来のソリューションに匹敵します。進歩していますが、そのネットワーク構造から、特徴マッピングに多層パーセプトロンを使用した後、最大プーリングを使用してグローバル特徴を抽出することもわかります。2 つの MLP 後の特徴ですが、取得された特徴は依然として単一スケールです。PointNet++ は、 さまざまなスケールでローカル フィーチャを抽出できます
        
全体的なネットワーク構造を直接見てみましょう。

階層的点集合特徴学習 (階層的特徴学習):一連の集合抽象化層 (点集合抽象化層) によって積み重ねられます。各抽象化層には 3 つの部分が含まれます: 1) サンプリング - 最遠点サンプリング (FPS) 中心の選択クラスターとは、クラスターの中心を選択するときに、選択される現在の点が、以前に選択されたすべての点から最も遠い点であることを意味します。これにより、サンプリングが可能な限りすべての点をカバーすることが保証されます。この方法は、CNN ボリュームとは異なります。は変化しないが、データ自体に依存する; 2) 組み合わせ - サンプリングされた中心に従って近傍の点を組み合わせてクラスターを形成する 著者は 2 つの解決策を提案し、1 つは中心に最も近い固定 K 点を組み合わせる KNN です。ポイント、1 つは球状検索である Ball クエリです。指定された半径の球状近傍内の点を選択します。K は固定ではありませんが、上限が設定されています。Ball クエリは各層での特徴抽出のスケールをより適切に保証できるためです。セット抽象化の ため、Ball クエリが選択されました; 3) PointNet は、各クラスターを単位として特徴を抽出し、クラスター内の xyz 座標をローカル座標化して PointNet に入力し、抽出された特徴は背面に連続的に接続されます座標次元の。

設定された抽象化レイヤーの場合、入力は (N,d+C)、つまり N 点であり、各点には d 次元の座標と C 次元の特徴が含まれます。最も遠い点をサンプリングして結合した後、N1 個の中心点が取得されます。各クラスター (近傍) には K 個のポイントが含まれます。クラスターごとに、特徴抽出にポイントネットが使用され、K 点が 1 つの特徴に集約されます。つまり、1 つのクラスターが 1 つの特徴に対応し、N1 個のクラスターが N1 個の特徴を取得し、新しいプロセスで得られた特徴は、d 次元座標情報と以前に取得した特徴に連続的に接続されるため、出力は (N1, d+C1) になります。取得された出力は、次のセット抽象化の入力として使用されます。

分類ネットワークの場合、最終的に得られた特徴を直接平坦化し、分類のために全結合層に入力できます。

セグメンテーション ネットワークの場合、ポイントごとの分類が必要であるため、アップサンプリング プロセスが必要です。著者はこの部分を FP (特徴伝播) と呼んでいます。これは、主に補間とスキップ接続を介して、ダウンサンプリングされた点から元の点への特徴の伝播です。ここでの内挿では、k 個の最近傍点の逆距離の加重平均が使用され、これは次の式になります、p と k は経験的なパラメータで、実験ではそれぞれ 2 と 3 に設定されます、d() は距離関数です。

スキップ接続とは、以前に設定された抽象化レイヤーによって取得された出力フィーチャを、補間されたポイント フィーチャと接続することです。実際、私の理解によれば、この場所を補間と呼ぶのは少し不適切です。実際、アップサンプリング プロセス中、ポイントの xyz 位置情報は直接非サンプリング レイヤーの情報であり、その後、非サンプリング レイヤーの各ポイントに対してサンプリング後のレイヤーでは、点の中から k 個の最近傍点 (k=3) を見つけ、これらの k 点の特徴を使用して、サンプリングされていない層のこの点の特徴として距離に応じて重み付き合計を実行します。アップサンプリング (補間) 後のポイントの次元は、アップサンプリング前の特徴の次元と同じです。たとえば、ネットワーク内のオレンジ色のアップサンプリング層では、アップサンプリング前の特徴の次元は d+C2 ですが、補間された特徴は依然として d+ です。 C2 を結合し、前の C1 は最終的に d+C1+C2 になります。

次に、取得された特徴はユニット ポイントネットに渡されます (CNN の 1*1 畳み込みに似ており、特徴の次元のみが変更され、ポイントの数 (実際には mlp) は変更されません)。このプロセスは、特徴が伝播されるまで繰り返されます。元の点セットに戻ります。

PointNet++: 不均一なサンプリング密度に対する堅牢性

       冒頭で、PointNet++ はさまざまなスケールでローカル フィーチャを抽出できると述べました.この機能は、実際の収集プロセス中に点群が必然的にセンサーに近づくため、点群にとって特に重要です. 点群のさまざまな部分の密度矛盾しています。具体的には、次の 2 つの異なるスケール特徴融合スキームが提案されています - MSG と MRG、つまり、抽出された特徴を結合するために異なるボール クエリ半径を設定するか、異なるセットの抽象化レイヤーから取得された特徴を結合します。著者は、この機能を密度と組み合わせます。適応構造は Pointnet++ と呼ばれます。

これは、著者が異なるデータ密度での分類タスクにおけるいくつかの異なる構造のパフォーマンスを比較したものです。

このうち、DP とは入力のランダムな欠落を指しますが、「バニラ」という言葉は非常に興味深いものです。「バニラ畳み込み」と似たようなことを以前に聞いたことがあります。一般的に、バニラという言葉を形容詞として使用すると、 「一般的な、伝統的な、一般的な」などの意味がありますが、本来の意味は「n. Vanilla; adj. Vanilla風味」です。アイスクリームの最も一般的かつオリジナルのフレーバーがバニラアイスクリームであることから、この意味が派生しました。ここには実際に少しの言語と文化があります。

MSG と MRG を比較すると、前者のパフォーマンスはわずかに優れていますが、異なる半径を持つ近傍を選択してからポイントネットを入力する必要があるため、計算量が非常に多くなりますが、後者は元のネットワークの異なる層の結果を結合するだけで済みます。したがって、計算量ははるかに少なくなります。

セマンティック セグメンテーションの実験:

       PointNet と比較するために、セマンティック セグメンテーションには同じ S3DIS データ セットが引き続き使用されています。データ セットの導入とデータ処理部分については、前の記事を参照してください。コードも同じウェアハウスあります

また、コードは、モデル ファイル、データ処理ファイル、トレーニング ファイル、テスト ファイルの順に読んでください。データ処理、トレーニング、テスト ファイルは基本的に PointNet と同じであるため、ここでは詳細については説明せず、主にモデル ファイルについて説明します。

モデル ファイル: models\pointnet2_utils.py、models\pointnet2_sem_seg_msg.py

ネットワークの主要コンポーネントである PointNetSetAbstractionMsg と PointNetFeaturePropagation、およびこれら 2 つのコンポーネントの構築に必要ないくつかの関数は、pointnet2pointnet2_utils.pyで定義されています

farthest_point_sample: 最遠点サンプリング:点座標とサンプリングする点の数を入力し、入力データ内のサンプリング点のインデックスを返します。各バッチでは、点が最初にサンプリングされる点としてランダムに初期化され、この点からのすべての点の距離 (その点自体からの距離を含む) を計算するためのテーブルが確立され、距離情報を格納するテーブルが継続的に作成されます。更新および維持されます。テーブルを作成し、任意の点が最も遠い点であるかどうか (サンプリングするかどうか) を判断するには、その点と以前にサンプリングされた点の間の距離の最小値を比較するだけです。最大の最小値を持つ点が、最も遠い地点。

たとえば、どの点 1 と 2 が最も遠い点であるかを判断するために、比較される距離値は、それらのそれぞれと、以前にサンプリングされた点の中で最も近い点との間の距離です。

 Index_points はポイントデータとインデックスを入力し、インデックスに対応するデータを取得します。(最遠点サンプリングとボール近傍検索はインデックスを返すため、この関数はインデックスをデータに変換するために必要です)。

query_ball_point ボール近傍検索:半径、各近傍の点の数、すべての点の座標データ、最も遠い点からサンプリングされたボール中心の座標データを入力し、クラスターに結合された点のインデックスを返します。各点から中心点までの距離を計算します。距離が指定された半径より大きい点には、均一に大きなインデックス (N-1 など) が割り当てられ、並べ替えられます。これらの半径の外側にある点のインデックスは、次の順序でランク付けされます。 K 点 (つまり、中心点に最も近い K 点) を選択します。インデックスが N-1 (つまり、半径の外側) に表示される場合は、これらの点を中心点に最も近い点に変更します。 (つまり、半径内に不十分な点があります。K は最も近い点に置き換えられます)。

PointNetSetAbstractionMsg:入力パラメーターは、サンプリング中心点の数、サンプリング半径、各クラスター内の点の数、入力特徴の次元、mlp の各層のニューロンの数です。サンプリングされた点と特徴を出力します。内部的には 3 つのプロセスが含まれています: 1) FPS の最遠点サンプリングによるサンプリング中心点の取得; 2) ボール クエリ ボール近傍検索、指定された半径の中心点近傍で最も近い K 点を検索します (K 点未満の場合は、最も近い点をコピーします); 3) PointNet: 各クラスターが PointNet に入力され、mlp と maxpooling の後、各クラスターの K 点の特徴が最終的に 1 つの特徴に集約されます。

PointNetFeaturePropagation 特徴の伝播:入力パラメーターは次のとおりです: 入力特徴の次元、mlp (ユニット ポイントネット) の各層のニューロンの数。アップサンプリング (特徴伝播) 後にポイントと特徴を出力します。内部的には 3 つの処理が含まれています: 1) 補間: アップサンプリング後の層の中点の位置情報は、SA モジュール内でダウンサンプリングされていないアップサンプリング対象の層の情報であり、各点について中点の位置を求めます。サンプリング後、レイヤー内の最も近い k 点が重み付けされて特徴が見つかります (ここでの特徴には xyz の 3 次元情報が含まれます); 2) 接続をスキップし、計算された特徴はダウンサンプリングされていない層の元の特徴と接合されます。 ; 3) ユニットポイントネット: それは mlp です。

models\pointnet2_sem_seg_msg.py はモデルと損失関数を定義します。

torch.rand(6, 9, 2048) #B C N

入力例として、モデル構造と各層の入力と出力を示します。

モデルのトレーニング

ウェアハウスは、トレーニングに msg (つまり ssg) を使用しない事前トレーニング モデルを提供しており、テストに直接使用できますが、結果は理想的ではありません。論文では msg と mrg の方が効果が高いと述べているため、使用しないのはなぜでしょうかmsg モデルはそれ自体でトレーニングされます

python train_semseg.py --model pointnet2_sem_seg_msg --test_area 5 --log_dir pointnet2_sem_seg

モデルは比較的大きく、トレーニング プロセス中にバッチ サイズを 32 に設定すると、約 11G のビデオ メモリが必要となり、Titan X では 1 エポックに 2 時間かかります。

モデルのテスト

python test_semseg.py --log_dir pointnet2_sem_seg_msg --test_area 5 --visual

自分自身をトレーニングした後、結果がまだあまり満足のいくものではないことがわかりました (mIoU が少なくとも 0.5 以上である必要があるのは当然です)。ウェアハウス作成者のログを確認したところ、ssg ソリューションを使用した場合でも、テストされた mIoU は 50% を超えましたが、テスト中に初めて発見されました。私のエリア 5 には 67 部屋しか含まれていませんが、実際にはデータ セットのエリア 5 には 68 の部屋が含まれているはずです (ウェアハウス内の元の eval.txt ログにも 68 が示されています)部屋)、問題の原因は見つかりませんでした。以下は理想的とは言えない最終テスト結果ですが、PointNet とほぼ同じです。

いくつかの部屋をランダムに選択して視覚化します。

                   生の地上真実の予測 

        

おすすめ

転載: blog.csdn.net/weixin_42371376/article/details/118291592