PointNet論文綜述

一、點雲數據

點雲數據是由大量的離散點組成的三維空間中的數據形式,例如激光雷達掃描的地形、建築物或者是攝像機捕捉的物體等三維場景都可以轉換為點雲數據。點雲數據的稀疏性、不規則性、本質上是無序的,這樣的特點造成傳統的圖像處理和計算機視覺演算法難以直接運用於點雲數據的處理分析。

二、PointNet網路結構

為了克服點雲數據的這些缺陷,作者設計了一種新型的網路結構——PointNet。PointNet網路結構可以接收任意數量的點雲數據,輸出對象的分類或者對點雲進行分割等處理。PointNet主要分為三個模塊,分別為輸入層、特徵提取層以及輸出層。

輸入層:PointNet網路的輸入層直接接收點雲數據,不需要將點雲數據轉換成體素或者多視角圖像這樣的預處理形式。輸入層將點雲數據映射到高維空間,並且為每個點生成唯一的坐標,同時把每個點看成了輸入向量。

特徵提取層:輸入層映射到高維空間後,PointNet網路首先通過一系列變換網路,對每個點進行空間上的局部特徵提取,然後通過最大池化的方式將局部特徵壓縮成全局特徵。通過這樣的處理方式,PointNet可以識別不同姿態、物體大小的點雲數據,並能夠對旋轉、平移、縮放不變。

輸出層:輸出層採用多層感知器(Multi-Layer Perceptron, MLP)來對全局特徵進行分類或分割。也就是說,PointNet不僅可以進行對象的分類,還可以實現點雲的分割,可以識別不同部位相互作用的目標。

三、代碼示例

def input_transform_net(point_cloud, is_training, reuse=None):
    with tf.variable_scope('input_transform_net', reuse=reuse):
        input_image = tf.expand_dims(point_cloud, -1)
        net = tf_util.conv2d(input_image, 64, [1, 3], padding='VALID', stride=[1, 1],
                             bn=True, is_training=is_training, scope='conv1', bn_decay=bn_decay)
        net = tf_util.conv2d(net, 128, [1, 1], padding='VALID', stride=[1, 1],
                             bn=True, is_training=is_training, scope='conv2', bn_decay=bn_decay)
        net = tf_util.conv2d(net, 1024, [1, 1], padding='VALID', stride=[1, 1],
                             bn=True, is_training=is_training, scope='conv3', bn_decay=bn_decay)
        net = tf_util.max_pool2d(net, [num_point, 1], padding='VALID', scope='maxpool')
        net = tf.reshape(net, [batch_size, -1])
        net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training,
                                      scope='fc1', bn_decay=bn_decay)
        net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training,
                                      scope='fc2', bn_decay=bn_decay)
        with tf.variable_scope('transform_XYZ'):
            assert xyz_shape[1:] == [num_points, 3]
            input_transform = tf_util.fully_connected(net, 3 * 3, weights_regularizer=tf.compat.v1.layers.l2_regularizer(0.0), activation_fn=None, scope='fc3')
            # 上述第2維應該是3*num_points而不是3,參見這個Tensorflow issue:https://github.com/tensorflow/tensorflow/issues/17947
            input_transform = tf.reshape(input_transform, [batch_size, 3, 3])
        # 把三個維度的下標混淆為[1, 0, 2],作用參見paper Figure 2右下方。
        with tf.variable_scope('transform_XYZ'):
            spatial_transformed_input = tf.matmul(xyz, tf.transpose(input_transform, [0, 2, 1]))
        # 下面輸出的兩個變數可以作為中間結果查看。
        # return spatial_transformed_input, input_transform
        return spatial_transformed_input

def feature_transform_net(inputs, is_training, reuse=None):
    with tf.variable_scope('feature_transform_net', reuse=reuse):
        # 上述point_cloud_shape的形狀為[batch_size, num_points, 3]
        # 計算出PointNet的local feature的channels數目
        # 看這個issue:https://github.com/charlesq34/pointnet/issues/19
        batch_size, num_points, num_dims = inputs.get_shape().as_list()
        net = tf.expand_dims(inputs, 2)
        net = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1],
                             bn=True, is_training=is_training, scope='conv1', bn_decay=bn_decay)
        net = tf_util.conv2d(net, 128, [1, 1], padding='VALID', stride=[1, 1],
                             bn=True, is_training=is_training, scope='conv2', bn_decay=bn_decay)
        net = tf_util.conv2d(net, 1024, [1, 1], padding='VALID', stride=[1, 1],
                             bn=True, is_training=is_training, scope='conv3', bn_decay=bn_decay)
        net = tf_util.max_pool2d(net, [num_point, 1], padding='VALID', scope='maxpool')
        net = tf.reshape(net, [batch_size, -1])
        net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training,
                                      scope='fc1', bn_decay=bn_decay)
        net = tf_util.fully_connected(net, 256, bn=True, is_training=is_training,
                                      scope='fc2', bn_decay=bn_decay)
        with tf.variable_scope('transform_feat'): # debug時,把這個命名空間改為'transform_XYZ',主要是為了便於trace。
            net = tf_util.fully_connected(net, num_dims * num_dims, weights_regularizer=tf.compat.v1.layers.l2_regularizer(0.0), activation_fn=None, scope='fc3')
            # 把一維的向量轉換為num_dims*num_dims矩陣,(想像一個特徵是num_dims維,現在16個特徵,那麼就是一個16x16的矩陣)
            # 維度是(batch_size, num_dims*num_dims)
            net = tf.reshape(net, [batch_size, num_dims, num_dims])
        return net

四、PointNet的應用領域

PointNet網路不僅在目標檢測、語義分割以及網格分割等傳統計算領域有著重要的應用,還在自動駕駛、無人飛行器和虛擬現實等領域有著廣泛的應用前景。例如在自動駕駛中,PointNet網路可以通過點雲數據對車道標線、行人、車輛等進行檢測,並進行追蹤。同樣,在無人飛行器的管理與控制中,使用PointNet網路可以對三維環境以及物體進行實時的檢測和跟蹤。

原創文章,作者:AADKE,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/351552.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AADKE的頭像AADKE
上一篇 2025-02-17 17:02
下一篇 2025-02-17 17:02

相關推薦

  • Python論文參考文獻舉例用法介紹

    Python作為一種強大的編程語言,被廣泛應用於數據分析、機器學習、人工智慧等領域。在科學研究和學術論文中,參考文獻舉例是非常重要的一部分,本文將圍繞著Python論文參考文獻舉例…

    編程 2025-04-27
  • C語言程序設計論文2000字

    本文旨在探討C語言程序設計的核心內容,包括語法基礎、函數、指針、文件操作等方面。通過具體的代碼實例,幫助初學者理解和掌握C語言的核心概念,進而提高編程水平和技能。 一、語法基礎 C…

    編程 2025-04-27
  • 論文參考文獻必須在文中有引用嗎

    一、什麼是參考文獻 參考文獻是指作者在寫作過程中所參考的其他文獻,可以是書籍、期刊、論文、網頁等,它記錄了作者在研究過程中所查閱的文獻資料,是證明文章研究背景、來源可靠性的重要依據…

    編程 2025-04-25
  • 國外論文網站

    國外論文網站是為全球範圍內的學術研究人員提供了一個交流與分享的平台,對於廣大的學者來說,這些網站提供了海量的研究資源和信息。本文將從多個方面對國外論文網站進行詳細的闡述,包括網站的…

    編程 2025-04-25
  • VGG16論文詳解

    一、VGG16的介紹 VGG16是由Visual Geometry Group(牛津大學視覺幾何組)的Karen Simonyan和Andrew Zisserman於2014年提出…

    編程 2025-04-23
  • 論文表格分析

    一、表格樣式 1、論文中的表格樣式大多為簡潔明了的線框表格,沒有花哨的色彩和邊框。這種樣式方便讀者快速獲取信息,避免了無關信息的干擾。 代碼示例: 姓名 年齡 性別 小明 18 男…

    編程 2025-04-12
  • 論文引用:詳細闡述多個方面

    一、引言 在學術論文中,引用是非常重要的部分。正確的引用可以有效提升論文的質量和可信度。在本文中,我們將會從多個方面詳細闡述論文如何進行引用。 二、正確的引用格式 正確的引用格式是…

    編程 2025-02-05
  • 深度學習在目標跟蹤中的應用:DeepSort論文分析

    一、DeepSort 論文概述 DeepSort是一篇由NVIDIA證實的目標跟蹤方法,旨在提高人流量計數和運動行為分析的準確性。DeepSort具有基於卷積神經網路的特徵提取,使…

    編程 2025-01-27
  • 關於c語言的論文舉例,關於c語言的論文舉例說明

    本文目錄一覽: 1、C語言論文,跪求!! 2、求一篇編程範式對c語言學習的影響的論文 3、C語言普通論文 4、C語言的用途,定位及特點(論文) 5、c語言課程設計論文 C語言論文,…

    編程 2025-01-14
  • 論文寫c語言還是彙編語言,c語言是彙編嗎

    本文目錄一覽: 1、彙編語言和C語言哪個更重要 2、彙編語言和c語言哪個更好? 3、彙編語言和C語言的比較 4、請問彙編語言和C語言哪一種更好用,簡單 彙編語言和C語言哪個更重要 …

    編程 2025-01-05

發表回復

登錄後才能評論