共计 2326 个字符,预计需要花费 6 分钟才能阅读完成。
背景:为什么选择 CMT 模型
自动驾驶感知系统面临的核心挑战是如何高效融合多模态数据(如摄像头和激光雷达)。传统 CNN 在处理这类问题时存在明显局限:
- 单模态依赖:多数 CNN 仅处理图像数据,难以利用激光雷达提供的精确距离信息
- 特征对齐困难:不同传感器的数据存在时空偏差,简单拼接会导致性能下降
- 计算冗余:对全图进行卷积运算会浪费资源在不重要的背景区域
CMT(Cross-Modal Transformer)模型通过引入跨模态注意力机制解决了这些问题。根据 CVPR 2022 的研究,CMT 在 KITTI 基准上相比传统 CNN 实现了:
- 目标检测 mAP 提升 34%
- 推理速度加快 2.1 倍
- 内存占用减少 28%
数据准备:KITTI 预处理全流程
- 数据下载与结构
- 从官网获取
left color images、velodyne points和calibration数据 -
目录结构应保持如下标准格式:
kitti/ ├── training/ │ ├── image_2/<000000.png,...> │ ├── velodyne/<000000.bin,...> │ └── label_2/<000000.txt,...> └── testing/ ├── image_2/ └── velodyne/ -
点云到图像的投影
-
使用校准文件将激光雷达点云投影到图像平面:
def project_velo_to_cam(pts_3d, calib): pts_3d_homo = np.hstack((pts_3d, np.ones((pts_3d.shape[0],1)))) pts_cam = np.dot(pts_3d_homo, calib.V2C.T) pts_img = np.dot(pts_cam, calib.P2.T) pts_img[:, 0] /= pts_img[:, 2] pts_img[:, 1] /= pts_img[:, 2] return pts_img[:, :2] -
数据增强策略
- 空间增强:随机水平翻转(需同步处理图像和点云)
- 颜色增强:对 RGB 图像应用光度畸变(亮度、对比度随机调整)
- 点云增强:随机丢弃 20% 地面点以提高模型鲁棒性
CMT 模型架构详解
跨模态注意力机制

- 特征提取层
- 图像分支:ResNet-18+FPN 输出多尺度特征
-
点云分支:PointPillar 生成 BEV 特征图
-
交叉注意力模块
class CrossModalAttention(nn.Module): def __init__(self, dim=256): super().__init__() self.q = nn.Linear(dim, dim) self.kv = nn.Linear(dim*2, dim*2) def forward(self, img_feat, pc_feat): # img_feat: [B, H*W, C] # pc_feat: [B, N, C] q = self.q(img_feat) kv = torch.cat([img_feat, pc_feat], dim=-1) k, v = self.kv(kv).chunk(2, dim=-1) attn = (q @ k.transpose(-2,-1)) * (dim**-0.5) attn = attn.softmax(dim=-1) return attn @ v -
多任务头设计
- 检测头:基于 CenterNet 的 anchor-free 设计
- 分割头:轻量级 FPN 结构
训练技巧与代码实现
学习率调度策略
采用余弦退火 + 热启动(Warmup):
scheduler = torch.optim.lr_scheduler.OneCycleLR(
optimizer,
max_lr=1e-3,
steps_per_epoch=len(train_loader),
epochs=100,
pct_start=0.3
)
复合损失函数
def loss_fn(pred, target):
# 检测损失
cls_loss = FocalLoss(pred['cls'], target['cls'])
reg_loss = GIoULoss(pred['bbox'], target['bbox'])
# 分割损失
seg_loss = DiceLoss(pred['seg'], target['seg'])
return cls_loss + 0.5*reg_loss + 0.2*seg_loss
嵌入式部署优化
模型量化方案
-
训练后量化(PTQ)
model = torch.quantization.quantize_dynamic( model, {nn.Linear, nn.Conv2d}, dtype=torch.qint8 ) -
TensorRT 加速
- 转换 ONNX 时设置 opset_version=13
- 使用
trtexec构建引擎时开启 FP16 模式
常见问题解决方案
数据不平衡处理
-
类别重加权:根据类别频率调整损失权重
weights = 1 / class_counts criterion = nn.CrossEntropyLoss(weight=weights) -
困难样本挖掘:对 top- k 高 loss 样本进行二次训练
实时性优化
- 输入分辨率调整:将图像从 1248×384 降采样到 624×192
- 点云体素化:将体素大小从 0.1m 增大到 0.2m
- 注意力头剪枝:将 8 头注意力减少到 4 头
延伸实验建议
在 CARLA 仿真环境中测试时:
- 创建自定义天气条件(雨天、雾天)测试模型鲁棒性
- 使用动态障碍物(突然出现的行人)验证实时检测能力
- 对比 CMT 与基线模型在不同光照条件下的性能差异
总结
通过本指南,我们系统性地实现了基于 CMT 模型的自动驾驶感知系统。关键收获包括:
- 跨模态注意力能有效融合视觉和点云特征
- 复合损失函数设计提升多任务学习效果
- 量化部署使模型满足嵌入式设备要求
建议下一步尝试将模型集成到完整的感知 - 规划 - 控制闭环中,并探索时序信息融合的可能性。
正文完
