共计 1501 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点分析
BDD100K 作为目前最大的自动驾驶场景数据集,包含 10 万张标注图像,覆盖天气变化、昼夜差异等复杂场景。直接使用其预训练权重时,开发者常遇到以下问题:

- 类别不匹配:原始 80 类 COCO 权重与行车场景的交通标志、行人等关键类别不重合
- 分辨率差异:预训练输入多为 640×640,而车载摄像头常需处理 1920×1080 分辨率
- 小目标漏检:远距离车辆 / 行人在高分辨率图像中占比不足 5 ×5 像素
模型微调关键技术
1. 参数初始化策略
def replace_last_layer(model: torch.nn.Module, num_classes: int):
"""替换检测头最后一层卷积,保持其他层预训练权重"""
# NOTE: 保持原有通道数,仅修改输出类别数
in_features = model.head.classifier[-1].in_channels
model.head.classifier[-1] = nn.Conv2d(in_features, num_classes, kernel_size=1)
# 新层使用 xavier 初始化
nn.init.xavier_uniform_(model.head.classifier[-1].weight)
2. 学习率分层设置
- Backbone:1e-5 (冻结部分底层参数)
- Neck 部分:5e-5
- 检测头:1e-4 (重点优化新添加层)
3. 训练监控实现
import wandb
# 初始化监控
wandb.init(project="bdd100k_finetune")
for epoch in range(epochs):
# ... 训练代码...
wandb.log({"train_loss": loss.item(),
"val_mAP": evaluator.compute_map(),
"lr": optimizer.param_groups[0]['lr']
})
部署性能优化
TensorRT 加速实战
- 校准数据集准备
calibration_files = [os.path.join(DATA_DIR, f)
for f in random.sample(os.listdir(DATA_DIR), 500)
]
# 构建校准器
calibrator = EntropyCalibrator2(input_shape=(3, 640, 640),
calibration_files=calibration_files
)
- FP16 量化效果对比
| 指标 | 原始模型 | TensorRT-FP16 | 提升幅度 |
|---|---|---|---|
| 显存占用(MB) | 2143 | 879 | 59%↓ |
| 吞吐量(FPS) | 32 | 118 | 3.7x↑ |
常见问题避坑指南
YOLO 格式转换陷阱
- 错误示例 :直接使用
xywh未归一化坐标 - 正确做法:
def coco_to_yolo(bbox: List[float], img_w: int, img_h: int) -> List[float]:
"""将 COCO 格式 [x,y,w,h] 转为 YOLO 格式[x_center,y_center,w,h]"""
x_center = (bbox[0] + bbox[2]/2) / img_w # NOTE: 必须归一化
y_center = (bbox[1] + bbox[3]/2) / img_h
return [x_center, y_center, bbox[2]/img_w, bbox[3]/img_h]
CUDA OOM 解决方案
- 梯度累计:每 4 个 batch 更新一次参数
- 动态 padding:替代固定尺寸 resize
- 激活检查点:torch.utils.checkpoint
实践思考
当处理远距离小目标检测时,除了调整 anchor 尺寸,您会如何优化特征金字塔结构?欢迎在 Colab 示例 中尝试不同的改进方案。
正文完
