人工智能竞赛提高mAP的方法
提高mAP (mean Average Precision) 是一个系统工程,不仅仅是“调参”,它涉及数据、模型、训练技巧和后处理等多个层面。
以下是从基础到高级的调优策略,可以按照这个顺序进行排查和实验:
一、 基础保障:确保代码和基准无误
在追求高mAP之前,必须先排除低级错误。
- 复现基准:使用经典配置(如Faster R-CNN + ResNet-50-FPN + 2x schedule)在标准数据集(如COCO)上运行代码,确保你的代码库能复现出与官方或知名开源实现(如MMDetection, Detectron2)相近的mAP(例如~38%)。这是所有调参的基石。
- 数据质量检查:
- 标注错误:检查训练数据中是否存在错误的标注(如漏标、错标、边界框不准)。这些噪声会严重误导模型。
- 数据一致性:验证集/测试集的标注标准必须与训练集完全一致。
- 正确实现评估代码:确保你的mAP评估代码是正确的(例如,COCO API的调用方式),特别是IoU阈值和是否包含crowd等参数。
二、 数据层面:高质量数据是上限的保证
数据永远是提升性能最有效的手段,其性价比往往高于模型调参。
- 更多数据:如果条件允许,收集更多、更高质量的标注数据。
- 数据增强 (Data Augmentation):
- 基础增强:随机翻转、裁剪、缩放、色彩抖动(亮度、对比度、饱和度)永远是有效的。
- 高级增强:使用像 Albumentations 或
torchvision.transforms
库中的高级增强技术:- Mosaic:YOLO系列使用的增强,将四张图片拼成一张,极大地提升了模型对小目标和上下文信息的理解。
- MixUp:将两张图像线性混合,标签也相应混合,有正则化效果。
- CutOut, RandomErasing:随机擦除部分图像块,迫使模型不依赖于局部的少数特征。
- 注意:增强不是越多越好,需要根据任务场景选择。例如,对几何形态敏感的任务(如文字检测)要慎用仿射变换。
三、 模型层面:选择与优化
- Backbone (主干网络):
- 更大的Backbone意味着更高的性能,但也更慢。根据你的速度与精度权衡进行选择。
- 常用选择:ResNet-50/101/152 -> ResNeXt-101 -> EfficientNet-B5/B7 -> ConvNeXt -> Swin Transformer (ViT)。越往后通常性能越好,但计算成本也越高。
- Neck (颈部网络):
- FPN (Feature Pyramid Network) 几乎是现代检测器的标配,它对多尺度目标检测至关重要。
- PANet, BiFPN:是FPN的增强版,能更好地进行特征融合,通常会带来~1-2个点的提升。
- Head (检测头):
- 确保其结构与你的任务匹配(如分类+回归的并行结构或串行结构)。
- 有时候增加Head的卷积层数(如从2层增加到4层)能提升容量,带来小幅增益。
四、 训练技巧与超参数调优
这是调参的核心环节,需要系统地进行实验(建议使用网格搜索或随机搜索)。
- 学习率 (Learning Rate):
- 最重要的超参数。使用学习率预热 (Warmup) 和余弦退火 (Cosine Annealing) 调度器几乎是标准做法。Warmup防止训练初期梯度爆炸,Cosine Annealing有助于模型收敛到更优的局部最优点。
- 从一个基础LR(如0.01 for SGD, 0.001 for Adam)开始,根据验证集性能按比例(如10倍)增大或减小。
- 优化器 (Optimizer):
- SGD with Momentum (例如
lr=0.01
,momentum=0.9
,weight_decay=0.0001
) 在检测任务上历史悠久,表现稳定。 - AdamW 在Transformer架构的模型中更常见,收敛可能更快,但最终性能不一定优于精调过的SGD。
- SGD with Momentum (例如
- 批量大小 (Batch Size):
- 更大的Batch Size可以使训练更稳定,允许使用更大的学习率(线性缩放规则:
LR_new = LR_default * (BS_new / BS_default)
)。 - 但非常大的Batch Size可能会降低泛化能力。通常使用硬件能承受的最大Batch Size(如8, 16, 32)。
- 更大的Batch Size可以使训练更稳定,允许使用更大的学习率(线性缩放规则:
- 正负样本分配策略:
- 这是近年的研究热点,对性能影响巨大。它决定了哪些Anchor/Point被定义为正样本参与训练。
- 抛弃传统的Max-IoU分配,尝试:
- ATSS (Adaptive Training Sample Selection):自动根据IoU的统计特性为每个GT选择正样本,非常有效。
- PAA (Probabilistic Anchor Assignment):基于概率模型选择正样本。
- SimOTA (简化版OTA):最优传输分配,是YOLOX等模型成功的关键。
- 使用这些现代分配策略,通常能带来~1-3%的显著提升,且收敛更快。
- 损失函数 (Loss Function):
- 分类损失:标准交叉熵 (CE) -> Focal Loss (缓解正负样本不平衡问题)。
- 回归损失:Smooth L1 -> GIoU Loss -> DIoU Loss -> CIoU Loss。使用IoU系列的损失函数能让边界框回归得更准。
五、 测试阶段优化 (Test Time Augmentation, TTA)
- 对测试图像进行多种变换(如多尺度缩放、翻转),然后将所有预测结果合并再做NMS。
- 这是最直接的“刷点”技巧,几乎一定能提升mAP(例如0.5~1%),但会显著增加推理时间,在实际应用中需谨慎考虑。
六、 模型集成
- 训练多个不同模型(不同结构、不同初始化、不同数据增强),然后将它们的预测结果进行加权融合。
- 这是竞赛中冲击最高分数的“大招”,能稳定提升2~4个点,但代价是计算和部署成本极高。
总结与建议的工作流
- 打好基础:确保代码、数据、评估流程正确。
- 数据优先:花时间分析并提升数据质量,应用合适的数据增强。
- 选择现代模型:使用带有FPN/BiFPN和现代分配策略(如ATSS)的检测器(如FCOS, ATSS, YOLOX)。
- 精调超参数:系统调整学习率及其调度策略、优化器、Batch Size。一次只改变一个变量,并详细记录实验结果。
- 更换损失函数:尝试GIoU/CIoU Loss和Focal Loss。
- (最后) 使用TTA或模型集成:如果对推理速度不敏感,用TTA;如果追求极致精度,用模型集成。