PointNet++ の理解

1. PointNet++ は PointNet の問題を解決します

  1. PointNet の点単位の MLP は各点を表すだけであり、局所的な構造情報を統合するには弱すぎます --> PointNet++ の改善: サンプリングとグループ化により局所近傍を統合します
  2. PointNet のグローバル特徴は、最大プーリングによって直接取得されますが、分類タスクであってもセグメンテーション タスクであっても、膨大な情報損失が発生します --> PointNet++ の改善: 複数のセットの抽象化を段階的に行うダウンサンプリングを通じて、階層的な特徴学習フレームワークを使用して、異なるデータを取得しますスケール ローカルおよびグローバル特徴のさまざまなレベル (最後のセットの抽象化出力はグローバル特徴とみなすことができます)、この方法で取得されたグローバル特徴はより高度で、より強力な表現機能を備えています
  3. セグメンテーションタスクのグローバル特徴量は直接コピーされ、ローカル特徴量と接合されますが、直接接合すると利用可能なグローバル特徴量が少なすぎて、識別特徴量を生成する能力が制限されます --> 改善PointNet++: エンコーダ/デコーダ構造はセグメンテーション タスク用に設計されています。最初にダウンサンプリングし、次にアップサンプリングし、スキップ接続を使用して、対応する層のローカルとグローバルの特徴をつなぎ合わせます。このような特徴は、より高度で、より識別力があります
  4. もちろん、PointNet++ は、点群が不均一な場合、密集領域で学習された特徴が疎領域には適さない可能性があるという問題も解決します。解決策は、異なる半径を持つサブ領域から特徴を抽出し、特徴をスタックすることです。異なる半径を持つ領域。特徴抽出の次元変換も半径に応じて変化します。

2. PointNet++ の SA モジュールには非誘導 FPS サンプリング操作がありますが、勾配を逆伝播するにはどうすればよいですか?

3D 検出にはこのような操作があり、俗に言うと「ルーティング」、つまり特徴をどこに取り出すか、どこに特徴を集めるかに分類されます。「ルート」自体の確立過程をガイドすることはできません(FPSやボールクエリなど)。ただし、「ルーティング」が確立されると、一般に、フィーチャの転送およびマッピングのプロセスを導き出すことができます。したがって、バックプロパゲーションにおける FPS 演算の具体的な実装は、torch.scatter の勾配バックプロパゲーションと同様に、0 テンソルを初期化して、それを散乱に従って割り当てると考えられます。

pointnet++ の例では (C++ で書かれたカスタム cuda 演算子をデバッグできないため、デバッグでは C++ コードを入力できず、呼び出しステップにのみ進むことができるため、グローバル検索を直接使用することをお勧めします)、for forward の操作については、伝播中にガイドすることはできず、逆方向関数を書き直す必要があり、書き換え時にそれ自体で実装された cuda コードが呼び出される可能性があります。書き換えられた逆方向関数は、勾配のある最初の関数のみを返し、2 番目の関数は勾配なしの関数を返すことがわかります。逆方向パラメーター入力は順方向出力の勾配から取得され、逆方向戻り値は順方向入力の勾配に対応します。したがって、これは idx に勾配がなく切り捨てられることを意味します。つまり、idx パスは無効ですが、フィーチャ パスにはまだグラデーションがあります。 :

ケース:
ここに画像の説明を挿入します
ここに画像の説明を挿入します
外部呼び出しロジック:
ここに画像の説明を挿入します

参照

  1. [コード リーディング] PointNet++ コード レビュー
  2. 【コードリーディング】Pytorchで自作したCUDAプログラミング関数の定義方法を詳しく解説
  3. 【コードリーディング】PointNet++の詳細実装
  4. Python はセットアップを使用してカスタム パッケージを作成 - パッケージ化 - インストール
  5. pytorch は torch.utils.cpp_extension を通じて CUDA/C++ 拡張機能をビルドします
  6. torch.autograd.Function を使用してレイヤーの前後をカスタマイズします
  7. PyTorchソースコード解釈のtorch.autograd:勾配計算の詳細説明

おすすめ

転載: blog.csdn.net/Rolandxxx/article/details/128408625