溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于Pointnet++的疑問有哪幾點

發(fā)布時間:2021-12-17 17:09:16 來源:億速云 閱讀:307 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關關于Pointnet++的疑問有哪幾點,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。


1


首先是分類任務的準確率


論文中的ssg版本能夠達到90.7%。但是筆者以及問過的同學,都只能達到90.2%左右。于是筆者仔細思考了原因,參考文章告訴我們的信息,覺得問題有可能出在以下幾點:


1、數(shù)據(jù)集的選擇。用的官方數(shù)據(jù)集(2048點)對應90.7%,換成作者自備數(shù)據(jù)里(10000點)的話,準確率達到91.9%。筆者測試的是前者。所以這里沒問題。

關于Pointnet++的疑問有哪幾點


2、領域選取方法。兩種方法KNN/ball query ,也會對準確率帶來影響。代碼里默認的是后者。所以問題也不是出在這。

關于Pointnet++的疑問有哪幾點


3、運行evaluate.py的時候,要有votes = 12,這個也會對結(jié)果有影響。

其余的參數(shù)設置,比如學習率、batch_size都是默認的,與論文中所提的沒差別,所以不會出什么問題。

但是最終結(jié)果還是達不到論文里的90.7%。

與作者溝通也未能獲得很好的回饋。


2


另一個困擾的問題,是參數(shù)量的計算。從PointNet到PointNet++,這個參數(shù)量筆者始終沒搞明白,這里把計算過程放上來,希望有同學一起看看。


1、PointNet++中分類任務ssg版本的計算。

筆者把特征提取部分和分類任務部分分開算。特征提取部分主要是1*1卷積,需要注意weight+bias,公式里的綠色的‘+1’表示bias的數(shù)量。

特征提取部分:

conv_num= (3+1)*64+(64+1)*64+(64+1)*128+ (128+3+1)*128+(128+1)*128+(128+1)*256+ (256+3+1)*256+(256+1)*512+(512+1)*1024=802624

分類部分:

fc_num = (1024+1)*512+(512+1)*256+(256+1)*40= 666408

總參數(shù)內(nèi)存:

bytes_num = (conv_num+fc_num)*4=5,876,128bytes(即5.8MB,不到論文說的8.7MB)

關于Pointnet++的疑問有哪幾點

這里需要注意一點,計算conv_num的公式里,用紅字標出來的‘+3’,這是代碼里提到的,pointnet_sa_module首先進行sample_and_group運算,來看代碼做了什么:


sample_and_group(npoint, radius, nsample, xyz, points, knn=False, use_xyz=True):    '''
    Input:
        npoint: int32
        radius: float32
        nsample: int32
        xyz: (batch_size, ndataset, 3) TF tensor
        points: (batch_size, ndataset, channel) TF tensor, if None will just use xyz as points
        knn: bool, if True use kNN instead of radius search
        use_xyz: bool, if True concat XYZ with local point features, otherwise just use point features
    Output:
        new_xyz: (batch_size, npoint, 3) TF tensor
        new_points: (batch_size, npoint, nsample, 3+channel) TF tensor
        idx: (batch_size, npoint, nsample) TF tensor, indices of local points as in ndataset points
        grouped_xyz: (batch_size, npoint, nsample, 3) TF tensor, normalized point XYZs
            (subtracted by seed point XYZ) in local regions
    '''

    new_xyz = gather_point(xyz, farthest_point_sample(npoint, xyz)) # (batch_size, npoint, 3)
    if knn:
        _,idx = knn_point(nsample, xyz, new_xyz)    else:
        idx, pts_cnt = query_ball_point(radius, nsample, xyz, new_xyz)
    grouped_xyz = group_point(xyz, idx) # (batch_size, npoint, nsample, 3)
    grouped_xyz -= tf.tile(tf.expand_dims(new_xyz, 2), [1,1,nsample,1]) # translation normalization
    if points is not None:
        grouped_points = group_point(points, idx) # (batch_size, npoint, nsample, channel)
        if use_xyz:
            new_points = tf.concat([grouped_xyz, grouped_points], axis=-1) # (batch_size, npoint, nample, 3+channel)
        else:
            new_points = grouped_points    else:
        new_points = grouped_xyz    return new_xyz, new_points, idx, grouped_xyz
 


有一個concate的操作,把特征和坐標進行了拼接,所以最終輸出的channel層個數(shù)是channel+3。注釋部分也提了。

所以計算conv_num的公式里有紅色的‘+3’,所以這部分需要注意。

但是即便注意到了這點,最終結(jié)果也與論文提的8.7MB不符。


2.這里還想提一點,上一張圖中,我們注意到作者說pointnet的Model size是40MB,但是pointnet論文里是這么寫的:

關于Pointnet++的疑問有哪幾點

3.5MB。

不知道兩個數(shù)字為什么不一致。這個我沒有去計算,因為T-net確實太繁瑣了,暫時挖個坑吧。

關于關于Pointnet++的疑問有哪幾點就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI