BEVfusion解读(三)
模型提供的 model.yaml
配置文件的详细解释,并附上不同模型配置的说明。这个配置文件定义了一个多模态 BEVFusion 模型,结合了相机图像和激光雷达(LiDAR)数据,以进行 3D 目标检测。将逐步分析每个模块的作用以及不同模型选择的含义。
1. 顶层配置 (model
)
model:type: BEVFusion # 模型类型:BEVFusion,表示多模态BEV(鸟瞰图)融合检测模型
- type: BEVFusion
这里定义了主模型的类型是BEVFusion
。这是一个基于多模态数据(相机与激光雷达)融合的模型,用于 3D 目标检测。BEV(Bird’s Eye View,鸟瞰图)是常见的处理视角,能更好地将相机和激光雷达的特征融合进行空间推理。
2. 编码器 (encoders
)
相机分支 (camera
)
encoders:camera:backbone:type: SwinTransformer # 使用的相机骨干网络类型:Swin Transformerembed_dims: 96 # 初始嵌入维度,通常指图像分块后的特征维度depths: [2, 2, 6, 2] # 每个阶段的层数(Swin-Tiny的默认设置)num_heads: [3, 6, 12, 24] # 每个阶段多头注意力的头数window_size: 7 # 局部窗口的大小(影响局部注意力范围)mlp_ratio: 4 # MLP的扩展比例,影响网络的容量qkv_bias: true # QKV(查询、键、值)是否使用偏置drop_rate: 0. # Dropout 比例attn_drop_rate: 0. # 注意力层的 Dropout 比例drop_path_rate: 0.2 # 随机深度(drop path)比例patch_norm: true # 是否对 Patch 嵌入后做归一化out_indices: [1, 2, 3] # 从哪些阶段输出特征with_cp: false # 是否使用 checkpoint 来减少显存消耗convert_weights: true # 是否将权重转换为预训练模型的格式init_cfg:type: Pretrained # 使用预训练模型权重进行初始化checkpoint: https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth # 预训练模型链接
-
Swin Transformer:是一种基于变换器(Transformer)架构的骨干网络,特别适用于高分辨率图像的特征提取。它采用了局部窗口(Shifted Window)注意力机制,能够捕捉到图像的全局上下文和局部细节。
-
参数说明:
-
embed_dims
:Swin Transformer的初始特征维度,影响模型的复杂性和输出通道。 -
depths
、num_heads
:控制网络的深度(每层的块数)和注意力头数,深度较大的网络能够提取更复杂的特征。 -
mlp_ratio
:影响每个 Transformer 层的 MLP(多层感知机)结构,越大表示更强的表达能力。
-
neck:type: GeneralizedLSSFPN # 颈部网络类型:GeneralizedLSSFPNin_channels: [192, 384, 768] # 输入通道数out_channels: 256 # 输出通道数start_level: 0 # 从哪个特征层开始做FPNnum_outs: 3 # 输出层数norm_cfg:type: BN2d # 使用的归一化层类型requires_grad: true # 是否需要训练归一化层的参数act_cfg:type: ReLU # 使用的激活函数inplace: true # 是否使用原地计算upsample_cfg:mode: bilinear # 上采样模式align_corners: false # 是否对齐角点
- GeneralizedLSSFPN:这是一种用于多尺度特征融合的FPN(Feature Pyramid Network)。它能够将相机图像从不同尺度的特征提取并进行融合,生成多尺度的输出特征图。这个网络有助于从不同分辨率的图像中提取有用信息,特别是处理小物体检测时。
激光雷达分支 (lidar
)
lidar:voxelize:max_num_points: 10 # 每个体素最多包含的点数point_cloud_range: [-54.0, -54.0] # 点云的范围voxel_size: [0.1, 0.1, 0.2] # 体素化时的体素大小max_voxels: [120000, 160000] # 最大体素数(训练/推理)backbone:type: SparseEncoder # 使用的稀疏编码器类型in_channels: 5 # 输入通道数sparse_shape: [1440, 1440, 41] # 稀疏体的形状output_channels: 128 # 输出通道数order:- conv- norm- actencoder_channels: # 各阶段的编码器通道数- [16, 16, 32]- [32, 32, 64]- [64, 64, 128]- [128, 128]encoder_paddings: # 每层的填充策略- [0, 0, 1]- [0, 0, 1]- [0, 0, [1, 1, 0]]- [0, 0]block_type: basicblock # 使用的基本块类型
-
SparseEncoder:用于处理稀疏激光雷达数据的编码器。激光雷达数据通常非常稀疏,SparseEncoder专门设计来处理这些稀疏数据,以便更高效地提取特征。
-
Voxelization:这是对激光雷达点云进行体素化的过程,将连续的3D点云数据转化为固定尺寸的体素,便于后续的神经网络处理。
3. 融合模块 (fuser
)
fuser:type: ConvFuser # 融合模块类型in_channels: [80, 256] # 输入通道数out_channels: 256 # 输出通道数
- ConvFuser:用于融合来自相机和激光雷达的特征。这里使用卷积操作将不同模态的特征融合到一起。
4. 解码器 (decoder
)
decoder:backbone:type: SECOND # 使用的解码骨干网络类型:SECONDin_channels: 256 # 输入通道数out_channels: [128, 256] # 输出通道数layer_nums: [5, 5] # 每个阶段的层数layer_strides: [1, 2] # 每个阶段的步幅norm_cfg:type: BN # 使用的归一化类型eps: 1.0e-3 # 数值稳定因子momentum: 0.01 # 动量conv_cfg:type: Conv2d # 使用的卷积类型bias: false # 是否使用偏置
- SECOND:这个解码器网络是用于处理 LiDAR 的结构,设计为2D卷积网络,适合处理稀疏的激光雷达数据,并生成 BEV(鸟瞰图)特征图。
5. 目标检测头 (heads
)
heads:object:type: TransFusionHead # 使用的检测头类型num_proposals: 200 # 提议的数量auxiliary: true # 是否使用辅助检测分支in_channels: 512 # 输入通道数hidden_channel: 128 # 隐藏层通道数num_classes: 10 # 类别数num_decoder_layers: 1 # 解码器层数num_heads: 8 # 注意力头数nms_kernel_size: 3 # NMS的卷积核大小ffn_channel: 256 # FFN网络宽度dropout: 0.1 # Dropout比例bn_momentum: 0.1 # BN动量activation: relu # 激活函数类型
- TransFusionHead:这是一个用于 3D 目标检测的检测头,采用变压器(Transformer)结构,用于处理多模态数据的融合和目标检测任务。
6. 损失函数 (loss_cls
, loss_heatmap
, loss_bbox
)
loss_cls: # 分类损失配置type: FocalLoss # 分类损失类型:FocalLossuse_sigmoid: true # 是否使用Sigmoidgamma: 2.0 # FocalLoss的gammaalpha: 0.25 # FocalLoss的alphareduction: mean # 损失聚合方式loss_weight: 1.0 # 分类损失权重loss_heatmap: # 热力图损失(GaussianFocalLoss)type: GaussianFocalLoss # 损失类型:GaussianFocalLossreduction: mean # 损失聚合方式loss_weight: 1.0 # 热力图损失权重loss_bbox: # 边框回归损失(L1Loss)type: L1Loss # 损失类型:L1损失reduction: mean # 损失聚合方式loss_weight: 0.25 # 边框回归损失权重
-
FocalLoss:用于处理类别不平衡的问题,通过调节正负样本的权重,使模型更关注困难样本。
-
GaussianFocalLoss:用于处理热力图回归,确保目标中心的回归更加准确。
-
L1Loss:用于边框回归,计算预测框与真实框之间的差距。
模型选择说明
-
相机分支:可以选择不同的骨干网络(如
ResNet
、SwinTransformer
等)来提取特征。SwinTransformer
比ResNet
更强大,尤其在高分辨率图像特征提取方面,但也更耗时和占用显存。 -
激光雷达分支:可以选择不同的稀疏编码器,如
SparseEncoder
和SECOND
。SparseEncoder
适用于处理稀疏点云数据,SECOND
在 3D 目标检测任务中非常有效,特别是在处理稀疏激光雷达数据时。 -
检测头:
TransFusionHead
是基于 Transformer 的检测头,适合处理复杂的多模态数据融合问题。
每个模块的配置项和选择将直接影响模型的性能和效率。根据任务需求(如精度、推理速度和资源消耗)可以选择不同的网络和参数。