在深度学习领域,谷歌AI团队最近发布了TensorFlow 3D库,这是一个基于TensorFlow 2和Keras构建的开源框架,它极大地简化了3D对象检测、3D语义分割和3D实例分割模型的构建、训练和部署过程。这个新工具的发布,为3D场景理解领域带来了新的突破,使得社区能够更容易地处理3D数据。
随着3D传感器技术的兴起,从激光雷达到iPhone的深度感应摄像头,再到机器人和自动驾驶汽车的3D对象检测应用,看到了3D数据的广泛应用。然而,能够应用于这些3D数据的工具和资源相对有限。谷歌AI推出的TF 3D是一个高度模块化且高效的库,它旨在将3D场景理解能力引入TensorFlow。TF 3D提供了一套流行的操作、损失函数、数据处理工具、模型和指标,使得训练和部署最先进的3D场景理解模型成为可能。
TF 3D的核心架构是3D稀疏体素U-Net。在数据稀疏的情况下,直接应用密集卷积会浪费大量计算资源,因为在空白空间中进行无效计算。此外,传统卷积后提取的特征不再是稀疏的。因此,TF 3D采用了子流形稀疏卷积,这种设计旨在更高效地处理3D稀疏数据,因为3D数据本质上是稀疏的。
U-Net网络由编码器、瓶颈和解码器三个模块组成,每个模块都包含一定数量的稀疏卷积块,可能包含池化或非池化操作,用于为每个体素提取特征。体素代表了三维空间中规则网格上的一个值。U-Net模型可以描述为:水平箭头接收体素特征并对其应用子流形稀疏卷积;向下的箭头执行子流形稀疏池化;向上的箭头将池化后的特征收集回来,与来自水平箭头的特征进行连接,并对连接后的特征执行子流形稀疏卷积。
TF 3D允许通过改变编码器-解码器层的数量、每层的卷积数量以及根据用例修改卷积滤波器大小来配置U-Net网络。以下是从官方文档中创建上述图表中U-Net模型的代码示例:
from tf3d.layers import sparse_voxel_unet
task_names_to_num_output_channels = {
'semantics': 5,
'embedding': 64
}
task_names_to_use_relu_last_conv = {
'semantics': False,
'embedding': False
}
task_names_to_use_batch_norm_in_last_layer = {
'semantics': False,
'embedding': False
}
unet = sparse_voxel_unet.SparseConvUNet(
task_names_to_num_output_channels,
task_names_to_use_relu_last_conv,
task_names_to_use_batch_norm_in_last_layer,
encoder_dimensions=(
(32, 48), (64, 80)),
bottleneck_dimensions=(96, 96),
decoder_dimensions=(
(80, 80), (64, 64)),
network_pooling_segment_func=tf.math.unsorted_segment_max)
outputs = unet(
voxel_features,
voxel_xyz_indices,
num_valid_voxels)
semantics = outputs['semantics']
embedding = outputs['embedding']
在深入了解不同的3D场景理解领域之前,首先需要了解数据集。目前,TF 3D支持Waymo Open、ScanNet和Rio数据集。所有三个数据集都定义如下:帧:每个条目包含彩色和深度相机图像、点云、相机内参、地面真实语义和实例分割注释等数据。场景:每个条目包含整个场景的点云数据以及场景中所有帧的基本信息。
3D语义分割涉及将表示为点云的3D对象或场景分割成它们的组成部分,其中输入空间中的每个点都必须被分配一个部分标签。TF 3D架构仅使用一个输出头来预测每个体素的语义分数,然后将这些分数映射回点以预测每个点的语义标签。U-Net使用子流形稀疏卷积网络,因为它们可以处理低维数据存在于更高维度空间中。