您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關關于Pointnet++的疑問有哪幾點,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
首先是分類任務的準確率
論文中的ssg版本能夠達到90.7%。但是筆者以及問過的同學,都只能達到90.2%左右。于是筆者仔細思考了原因,參考文章告訴我們的信息,覺得問題有可能出在以下幾點:
1、數(shù)據(jù)集的選擇。用的官方數(shù)據(jù)集(2048點)對應90.7%,換成作者自備數(shù)據(jù)里(10000點)的話,準確率達到91.9%。筆者測試的是前者。所以這里沒問題。
2、領域選取方法。兩種方法KNN/ball query ,也會對準確率帶來影響。代碼里默認的是后者。所以問題也不是出在這。
3、運行evaluate.py的時候,要有votes = 12,這個也會對結(jié)果有影響。
其余的參數(shù)設置,比如學習率、batch_size都是默認的,與論文中所提的沒差別,所以不會出什么問題。
但是最終結(jié)果還是達不到論文里的90.7%。
與作者溝通也未能獲得很好的回饋。
另一個困擾的問題,是參數(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)
這里需要注意一點,計算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論文里是這么寫的:
3.5MB。
不知道兩個數(shù)字為什么不一致。這個我沒有去計算,因為T-net確實太繁瑣了,暫時挖個坑吧。
關于關于Pointnet++的疑問有哪幾點就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。