基于bdd100k预训练权重的目标检测实战:从模型微调到部署优化

1次阅读
没有评论

共计 1501 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景痛点分析

BDD100K 作为目前最大的自动驾驶场景数据集,包含 10 万张标注图像,覆盖天气变化、昼夜差异等复杂场景。直接使用其预训练权重时,开发者常遇到以下问题:

基于 bdd100k 预训练权重的目标检测实战:从模型微调到部署优化

  • 类别不匹配:原始 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 加速实战

  1. 校准数据集准备
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
)
  1. 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 解决方案

  1. 梯度累计:每 4 个 batch 更新一次参数
  2. 动态 padding:替代固定尺寸 resize
  3. 激活检查点:torch.utils.checkpoint

实践思考

当处理远距离小目标检测时,除了调整 anchor 尺寸,您会如何优化特征金字塔结构?欢迎在 Colab 示例 中尝试不同的改进方案。

正文完
 0
评论(没有评论)