kaggle自动驾驶竞赛铜牌总结:Peking University/Baidu - Autonomous Driving—(Part 2)

Part 2、我在竞赛中采取的一些方法技巧总结

1、思路分析
  • 参考Notebooks区大神提出的不错的baseline,先弄清楚全部的代码流程,具体哪部分完成什么任务,哪儿可以尝试其他的方法,做到心中有数。
  • 本次竞赛中参考的baseline

有些金牌得主也参考了该baseline,当然仅靠baseline只能保证有一个基本的提交结果,接下来就需要不断寻找创新点和得分点。

2、上分“利器”
  • 想要上分,一定要抓住 NotebooksDiscussion 区,在这里,很多前排队伍都会分享他们在竞赛中采取的一些Tricks,你可以尝试去实现这些方法,并提出你的问题,只要努力去尝试就一定可以上分。
  • 此外,由于竞赛方的限制,每天只有两次提交机会并实时更新排行榜,所以很多人苦于不能及时检验自己的改进点到底有没有奏效,这里可以根据Local CV得分来进行线下的一个评估,感谢第4名大佬的评估脚本metrics evaluation script。

我是划分训练集的10%作为验证集评估,讨论区有前排队伍选取20%作为验证集,这样或许线下map评估更准确一些,但由于我的数据增强部分效果不是很好,划分验证集太大,可能导致训练集较少。

  • 以下是本次竞赛几位金牌队伍的最终方案:
    https://www.kaggle.com/c/pku-autonomous-driving/discussion

当然,如果你觉得大佬们采取的Tricks都“难以企及”,可以看看我的“一顿乱改”,现将我在比赛中采取的一些tricks总结如下:

Tricks Public LB
centernet-baseline提交 0.038
调参:调参的一些技巧可以多了解,因为调参往往都是最简单有效的,如Batch_Size、lr衰减、lr、Optimizier优化器等的一些选取都可以进行尝试 0.042
Center-resnext50 baseline + centernet-baseline,确定自己的检测框架baseline 0.048
数据增强:添加brightness、contrast色彩增强,高斯噪声和翻转,数据增强也是很能提分的一个点,但这里只提升了一个千分点,有点难做 0.049
阈值的选取logits>-0.8,依据检测结果图片中车辆均数小于11,过大的阈值会造成虚警,过小会造成漏检 0.055
数据清洗:移除训练集中报废的图片,移除坐标超出图片边界的汽车标签,根据提供的train_masks.zip、test_masks.zip把训练/测试集中坐标带mask的清除,基于CenterNet关键点估计方法检测车辆,并回归汽车的3D位置、方向。 0.060
采用Focal Loss取代heatmap原来的交叉熵误差,解决正负样本失衡问题。方案一:参考RetinaNet:Focal Loss for Dense Object Detection[3]中Focal Loss的原始定义,对标准交叉熵误差乘上对应权重进行改进;方案二:尝试了CenterNet[1]开源中的focal loss。 0.063
尝试AdamW优化器,更有利于focal loss的收敛,Adam效果一般,选取lr=3e-4,之前看过一篇论文,验证3e-4是最优的学习率,也可以根据损失曲线来不断调整epoch和lr 0.063
先针对resnext50小网络进行调优,最后尝试大网络模型下的检测效果,采用resnet101,input size(1280x512) 0.067
增大input size(1500x678)resnet101 0.073
Ensemble模型融合:resnet101+ resnext50融合 0.077
3、展望

基于关键点估计的CenterNet方法虽然可以很好地针对车辆的检测,但由于数据集大都是相机沿直线道路水平方向拍摄的图像,采用关键点估计在训练时可能会造成图片中不同车辆的GT中心点重叠,当成一个物体来训练,推理阶段同样存在这样问题。

4、未能奏效的一些尝试

1、采用更大的 input size (2800 x 1265)。
2、采用更大的网络模型resnet152,计算量大,参数量大,训练慢,前提你得有好的硬件条件。
3、所有的训练集图片只有下半部分才包含车辆姿态信息,尝试裁剪为原图的一半,送入网络进行训练,结果baseline中已经做了这样的工作。
4、torch.optim.lr_scheduler中大部分调整学习率的方法都是根据epoch训练次数,此外,我还尝试了ReduceLROnPlateau,在给定dev loss停止优化时减小学习率;OneCycleLR对整个训练流程中的lr按照特定的曲线进行调整,目的都是为防止过拟合,不过效果都不是很好。
5、CenterNet网络中的一些方法很有效,Backbone:Hourglass和DLA在论文中也验证了对姿态估计效果不错,不过一直有Bug,程序没调通,如果这个点调通了应该可以轻松提升到0.08。之前用CenterNet做了一个夜间老鼠识别的项目,DLA、Resnet、Hourglass这三个backbone都验证对比过,确实hourglass效果很好,加上该竞赛是车辆的姿态估计,应该可以取得不错的效果。

强烈推荐大家学习一下CenterNet,现已开源。
想了解更多目标检测网络内容,可以参考前面的目标检测系列博客。

5、私榜结果分析

以上tricks是基于Public LB的得分情况,与最终的Private LB分数相近,因为私榜的评估得分来自91%的测试数据集,而Public LB只占9%,说明训练模型的泛化能力还不错。

最后,我会在近期将整理好的源码上传GitHub,感兴趣可以作为参考,如果有金牌得主分享了他们的开源,强烈推荐大家认真学习一下他们的一些方法技巧,另外,我会及时在该系列博客中更新金牌队伍采用的一些实用技巧,欢迎大家一起交流。

6、References

[1] CenterNet开源地址
[2] CenterNet:Objects as Points. CVPR2019
[3] RetinaNet:Focal Loss for Dense Object Detection. ICCV2017

你可能感兴趣的:(Kaggle)