BEVFusion
相关的其它文章链接:
encoder
部分分为LiDAR
和camera
两部分。这一篇文章主要介绍lidar
的encoder
部分,lidar
的encoder
主要有两部分,分别是voxelize
和backbone
,其中backbone
部分使用的是SparseEncoder
方式。
1. Voxelization
在train.py
部分中,使用build_model
构建模型,其中使用注册器register
根据type
类型创建BEVFusion
实例。这部分我们主要关注lidar
的enconder
部分。
lidar
的voxelization
分为hard
和dynamic voxelization
,我们这里使用的是hard voxelization
。创建voxel
后再根据voxlize
和backbone
创建lidar
的encoders
。
if encoders.get("lidar") is not None:
if encoders["lidar"]["voxelize"].get("max_num_points", -1) > 0:
# hard voxelization
voxelize_module = Voxelization(**encoders["lidar"]["voxelize"])
else:
# dynamic voxelization
voxelize_module = DynamicScatter(**encoders["lidar"]["voxelize"])
# 根据voxlize和backbone创建lidar的encoders
self.encoders["lidar"] = nn.ModuleDict(
{
"voxelize": voxelize_module,
"backbone": build_backbone(encoders["lidar"]["backbone"]),
}
)
self.voxelize_reduce = encoders["lidar"].get("voxelize_reduce", True)
先来看一下voxelization
部分的参数。如果对激光的体素化有所了解,这部分参数应该很好理解。
# 单个voxel最大点云个数
max_num_points: 10
# voxel的大小[x, y, z]
voxel_size: [0.075, 0.075, 0.2]
# 点云范围[x_min, y_min, z_min, x_max, y_max, z_max]
point_cloud_range: [-54.0, -54.0, -5.0, 54.0, 54.0, 3.0]
# (training, testing)的最大点云个数
max_voxels: [120000, 160000]
激光的voxelization
部分使用的是hard_voxelize
代码,它是用c++
实现,具体也不介绍了,这里只介绍一下它的调用部分。
这里输入points
的某一帧的大小为[236137, 5]
,第一位为点的个数,第二位为每个点的属性,分别表示[x, y, z, intensity, timestamp_diff]
,其中最后一个timestamp_diff
是指时间戳差异。
class _Voxelization(Function):
@staticmethod
def forward(
ctx, points, voxel_size, coors_range, max_points=35, max_voxels=20000, deterministic=True
):
# 判断使用哪一种voxelization方法
if max_points == -1 or max_voxels == -1:
coors = points.new_zero