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