【點雲識別】Point-Voxel CNN for Efficient 3D Deep Learning (NIPS 2019)

Point-Voxel CNN for Efficient 3D Deep Learning

本文介紹一篇NIPS 2019裏面關於點雲識別的文章。
論文
代碼

1. 問題

目前的點雲處理框架主要分爲兩大類

  • Voxel-based
  • Point-based
    PointNet的問世,極大地促進了Point-based類方法的發展。
    因爲voxel類方法的缺陷很難解決,內存需求太大。
    64x64x64, batch_size=16的3D-UNet 需要10 GB GPU memory 。
    本文又找到了Point-based類方法的缺點,見下圖。因爲點雲是不規則存儲的,所以隨機的內存訪問導致效率很低。
    在這裏插入圖片描述
    在這裏插入圖片描述
    所以本文爲了解決上述問題,使用點來表示點雲,但是在voxel中完成卷積。這樣就避免了voxel的巨大內存需求,又解決了對不規則數據格式卷積時的時間花費。

2. 思想

在這裏插入圖片描述
思想很清晰,也沒有對網絡的架構做出巨大的調整。

        features, coords = inputs
        voxel_features, voxel_coords = self.voxelization(features, coords)
        voxel_features = self.voxel_layers(voxel_features)
        voxel_features = F.trilinear_devoxelize(voxel_features, voxel_coords, self.resolution, self.training)
        fused_features = voxel_features + self.point_features(features)

3. 算法

本文沒有理論或者架構上的創新,更偏工程一點。
使用了三線插值的方法。

from torch.autograd import Function

from modules.functional.backend import _backend

__all__ = ['nearest_neighbor_interpolate']


class NeighborInterpolation(Function):
    @staticmethod
    def forward(ctx, points_coords, centers_coords, centers_features):
        """
        :param ctx:
        :param points_coords: coordinates of points, FloatTensor[B, 3, N]
        :param centers_coords: coordinates of centers, FloatTensor[B, 3, M]
        :param centers_features: features of centers, FloatTensor[B, C, M]
        :return:
            points_features: features of points, FloatTensor[B, C, N]
        """
        centers_coords = centers_coords.contiguous()
        points_coords = points_coords.contiguous()
        centers_features = centers_features.contiguous()
        points_features, indices, weights = _backend.three_nearest_neighbors_interpolate_forward(
            points_coords, centers_coords, centers_features
        )
        ctx.save_for_backward(indices, weights)
        ctx.num_centers = centers_coords.size(-1)
        return points_features

    @staticmethod
    def backward(ctx, grad_output):
        indices, weights = ctx.saved_tensors
        grad_centers_features = _backend.three_nearest_neighbors_interpolate_backward(
            grad_output.contiguous(), indices, weights, ctx.num_centers
        )
        return None, None, grad_centers_features


nearest_neighbor_interpolate = NeighborInterpolation.apply

爲了加速,很多utility使用了C++實現,詳見代碼。

4 實驗結果

在這裏插入圖片描述
快!小!啓發了後續的一系列文章

總結

文章做的很清晰,解決問題的思想簡單明瞭,論文寫作也是行雲流水。
MIT着實不凡!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章