稀疏3d卷積網絡
輸入
稀疏卷積的輸入包括兩部分,一個是坐標,另一個是特征。
self.scn_input = scn.InputLayer(3, sparse_shape.tolist()) # [h,w,l]
coors = coors.int()[:, [1, 2, 3, 0]] # [h, w, l, batch] 將 batch_size調換到最后一個位置
ret = self.scn_input((coors.cpu(), voxel_features, batch_size)) #[45287, 4] [45287, 1] 2
稀疏卷積的spatial_size確定:
self.spatial_size = self.sparseModel.input_spatial_size(torch.LongTensor([1,1]))
3d稀疏卷積
m = None
m = scn.Sequential()
m.add(scn.SubmanifoldConvolution(3, i, o, 3, False))
m.add(scn.BatchNormLeakyReLU(i ,leakiness=leakiness)).add(
scn.Convolution(dimension, i, o, 3, 2, False))
def block(self, m, a, b, dimension=3, residual_blocks=False, leakiness=0): # default using residual_block
if residual_blocks: #ResNet style blocks
m.add(scn.ConcatTable()
.add(scn.Identity() if a == b else scn.NetworkInNetwork(a, b, False))
.add(scn.Sequential()
.add(scn.BatchNormLeakyReLU(a,leakiness=leakiness))
.add(scn.SubmanifoldConvolution(dimension, a, b, 3, False))
.add(scn.BatchNormLeakyReLU(b,leakiness=leakiness))
.add(scn.SubmanifoldConvolution(dimension, b, b, 3, False)))
).add(scn.AddTable())
else: #VGG style blocks
m.add(scn.Sequential()
.add(scn.BatchNormLeakyReLU(a,leakiness=leakiness))
.add(scn.SubmanifoldConvolution(dimension, a, b, 3, False)))
稀疏3d卷積
子流形卷積scn.SubmanifoldConvolution(2, 1, 8, 3, False): # batch_size, channel_in, channel_out, filter_size
稀疏卷積 scn.Convolution(2, 32, 32, 3, 2, False): # batch_size, channel_in, channel_out, filter_size, strides
批歸一化scn.BatchNormalization(32): # channel_in
稀疏到稠密轉化scn.SparseToDense(2, 32): # batch_size, channel_in
輸入scn.InputBatch(2, sparse_shape): # batch_size, sparse_shape
設置輸入input.set_locations(locations, features,0) # locations [N, 2] features [N, 1] 保存N個特征的位置,N個特征
輸入scn.InputLayer(2, spatial_size, 2) # dimension, spatial_size, mode=3
mode == 0 if the input is guaranteed to have no duplicates
mode == 1 to use the last item at each spatial location
mode == 2 to keep the first item at each spatial location
mode == 3 to sum feature vectors sharing one spatial location
mode == 4 to average feature vectors at each spatial location
self.scn_input((coors.cpu(), voxel_features, batch_size)): 將坐標及相應的feature轉換成可以處理用稀疏3d卷積處理的數據類型