[第11名方案] YOLOv5 + VFNet + EfficientD6
[第11名方案] YOLOv5 + VFNet + EfficientD6
作者: nvnn | 比赛: VinBigData 胸部X光异常检测 | 排名: 第11名
祝贺大家,并感谢 Vingroup 大数据研究院举办了这场有趣的比赛。
以下是我解决方案的一些要点。
1. 总结
- 2类分类器:efficientnetB6
- 目标检测:Yolov5 (yolov5x, yolov5l, yolov5x + ASFF head, yolov5-p6) + EfficientD6 + VFNet
- 预处理边界框:WBF(IOU=0.7)
- 后处理:定制的 WBF(此定制带来了 0.015 mAP 的提升)
- 使用四重均值教师 训练 yolov5。
- 模型集成
2. 分类模型
- 对于2类分类器,我稍微修改了这个笔记本。感谢 @solosquad1999
- 我使用 efficientnetB6,图像大小为 768。
- 我的2类分类器达到了 0.992 的 AUC 和 0.96 的 AP。
3. 检测模型
- Yolov5:
- 我使用了来自 yolov5 仓库 的3个模型 (yolov5x, yolov5l 和 yolov5-p6) 以及来自这个 pull request 的 yolov5_asff。
- 我添加了 mosaic2 和 mosaic3,并将其与 yolov5 仓库中的 mosaic4 一起使用。
- 我在图像大小 640 下对每个模型训练了 60 个 epoch。我没有测试更大的图像尺寸。
- 单模型的 CV 分数约为 0.42,LB 分数约为 0.2-0.25。
- VFNet:
- 我使用了 mmdetection 中的 VFNet (resnet101) 模型,并增加了更多的数据增强(噪声、RandomBrightnessContrast 等)。
- 我的 VFNet 模型效果与 yolov5 一样好,CV 约为 0.42,LB 为 0.24。
- EfficientD6: 我在图像大小 512x512 下训练 EfficientD6,它给了我更好的 CV (0.43) 但 LB 较低 (0.2)。由于 GPU VRAM 有限,我无法使用更大的图像尺寸。
4. 使用均值教师 进行训练
loss = yolov5_loss + alpha*consistency_losses
alpha 使用以下函数计算:
def sigmoid_rampup(current_epoch, rampup_epoch=5):
"""Exponential rampup from https://arxiv.org/abs/1610.02242"""
if rampup_length == 0:
return 0.1
else:
current = np.clip(current, 0.0, rampup_length)
phase = 1.0 - current / rampup_length
return 0.1*float(np.exp(-5.0 * phase * phase))
使用均值教师将 CV 提高了约 0.02 mAP,但是,它在集成时并没有增加太多的多样性。