已经2019年了,我们回顾一下AI Challenger 2018全球AI挑战赛,在经历了TestA和TestB的海选,以及TestC的激烈角逐和最终的答辩阶段,我们团队oneplusone最终获得了第4名的成绩,虽然在比赛成绩上有很多的遗憾,但是比赛的过程中,我们收获颇多,希望在这里与读者们分享我们的收获。以下我们把答辩内容加以提炼,形成了本篇文章。
0.大纲
1. 回顾比赛;
2. 分析数据;
3. 技术收获;
4. 赛后总结;
1. 回顾比赛
这次比赛一共分为四个阶段:
1. Test A阶段,结束时我们排在12名。
这里不截图了……
2. Test B阶段,我们经过一系列升级优化,结束时,我们排在第3名。
3. Test C阶段,此阶段需考虑模型的速度,我们的模型在速度上处于劣势,因此TestC排在了第4名的位置。
4. 答辩阶段,最终获得第四名的成绩。
2. 分析数据
回归问题本质,这个比赛主要想解决什么问题呢?这个比赛考察两个领域的知识:1)物体检测;2)语义分割。我们这里简单抽取一张图片看看:
物体检测:需要把所有的车辆,交通灯,交通指示牌,行人等都检测出来,具体来说包括:1)person;2)bike;3)car;4)motor;5)rider;6)bus;7)train;8)truck;9)traffic sign;10)traffic light,我们可以发现里面的物体都很“小”,而且非常密集,这对物体检测来说是个难点。
语义分割:需要把以第一人称视角,“优先级高”可走的路,和“优先级低”可走的路分割出来,并且表示为两类(包括背景就是三类)。
总体来说,给我们的直觉,这次比赛,“物体检测”的部分难度更大一些,而“道路分割”仅有两类,相对简单一些。
数据分布:
我们再看一下数据分布,统计了物体检测中,训练集上各个物体的数据(instances)分布情况:
其中我们发现数据分布不均,而且有些类别数量特别少,比如“火车”类,仅有136个实例(instances)。同时还有一些标注错误,比如如下图所示:
如上图所示,“卡车”被错误标注成“火车”,大家注意,原本仅有136个实例的“火车”类,里面还有很多错误的标注(大约30多个)。
数据尺度变化:
下面,我们看看物体的尺度变化,我们拿一张图作为示例:
这张图着重标注了“火车”类,我们发现它非常的“长”,经过我们统计,训练集中有1:14的比例,通常的基于anchor的物体检测方法,很难去处理这么“长”的物体。(如果设计很长的anchor可行么?那估计需要更改网络结构,单独训练一个“专门”处理“长”物体的分支)
总的来说,数据上有3个难点:
1. 小物体多,而且彼此重叠严重;
2. 数据分布不均,一些类别数据量很少;
3. 数据尺度各异,有一些很“长”的物体;
3. 技术收获
由于比赛最后要考虑模型的运行速度,我们选择兼顾速度和精度的YOLO V3以及我们修改的Deeplab V3+。
YOLOV3的测试结果mAP(测试集):
Step1: Original YOLO V3:12%(30ms)
Step2: YOLO V3 + HR + FinerFeature + Weighted Loss:29.3%(50ms)
Step3: YOLO V3 + HR + Deformable Conv + WL:28.2%(50ms)
Step4: YOLO V3 + HR + Self-Attention + WL:31.0%(50ms)
Note:HR指的High Resolution;FinerFeature指使用更大的特征图去预测;Weighted Loss(WL)指的不同类别的权重,缓解样本不均匀问题;Deformable Conv指MSRA推出“可变形卷积”,类似动态Dilation操作,用以处理不同物体不同感受野的问题,比如本赛题中的”火车“类;Self-Attention指利用Attention的思想,令每个像素感知更大的区域,无形增大感受野。
我们看看检测结果:
我们发现检测结果还是比较理想的,小物体和重叠的物体也能很好的检测。
Deeplab V3+的测试结果mIOU(测试集):
Step1: Original Deeplab V3+:77.6%(80ms)
Step2: Multi-scal Testing + Deeplab V3+:79.1%
Step3: Darknet + UNet + Deeplab V3+:76.2%(30ms)
Step4: Darknet + UNet + DPC + Deeplab V3+:76.4%(28ms)
Note:Darknet指的是YOLO V3的Backbone结构;UNet指的是语义分割的一种方法,类似U形的网络;DPC(Dense Prediction Cell)是指Google提出的一种用于语义分割的模块,用来替代ASPP模块(
Atrous Spatial Pyramid Pooling)。
我们看看分割结果:
总的来说,有如下几点发现:
1. Self-Attention对于提高YOLO V3的mAP很有帮助, mAP:29.3 —> 31.0;
2. Deformable Conv对于YOLO V3效果不明显,结果降低了(可能是我们把Deformable Conv加入到YOLO的Head里而不是Backbone的原因);
3. 使用Deformable Conv,火车类的mAP从1.2%提升到8.5%,提升显著,可见Deformable在处理这种“奇形怪状”的物体时优势明显;
4. 使用大图训练,mAP会有显著提升;
5. 对于道路分割,使用小的Backbone,整体的mIOU也不会下降太多,为了速度着想,可以尝试ResNet34或者ResNet18;
6. 对于本赛题的语义分割,使用DPC去替代ASPP,加速的同时准确率也会上升,但并没有在Pascal VOC等数据集上做过其他实验;
4. 赛后总结
曾经一度认为,模型越大,准确率越高越好,然而在实际生产中,并非如此。我们需要考虑很多因素,比如模型的运行速度,运行占用的内存,模型本身的大小等等,所以对于优化模型,如果仅考虑准确率,那么我们一味增大模型的复杂度即可,那么最后深度学习将会沦为比拼“金钱”的工具,有钱,就可以买更好的显卡,训练更复杂的模型,那么需要汝等科学家的意义是?
所以,模型加速,即在不损失精度的条件下,加速模型,将会成为我们未来重点考虑的问题。
最后,模型若准快,落地岂远哉。
这里推荐一些文章:
1.《DeformableConvolutionalNetworks》
Link: https://arxiv.org/abs/1703.06211
2. 《Attention Is All You Need》
Link: https://arxiv.org/abs/1706.03762
3.《Searching for EfficientMulti-Scale Architectures for Dense Image Prediction》
Link:https://arxiv.org/abs/1809.04184
请大家多多关注哦~
领取专属 10元无门槛券
私享最新 技术干货