目标检测比赛提高mAP的方法

数据预处理

分析数据集中标注框的性质

主要是分析bbox的area和高宽比的分布,根据area和aspect_ratio来设置anchor generator的参数。
另外,当aspect ratio分布比较分散时,可以考虑使用Deform conv

分析类别均衡问题

统计数据集中各类别实例的比例,如果类别分布不均衡(最多和最少差别几倍以上),可以考虑使用detectron2中的RepeatFactorTrainingSampler。

训练集和验证集的分割

在一般的比赛中,都会限制每天结果的提交次数,因此使用网站上的测评来验证参数性能并不可取,同时也容易过拟合。因此需要从训练集中分割出来一部分作为测试集。
通常可以采用0.2的比例进行分割。当训练集中类别极度不平衡时,还要考虑到不平衡类别的分割,也可以在将不平衡类别扩充之后再分割。

数据增强

数据增强极为重要,网络结构训练方法基本都是确定了的,好的数据并不是人人都能获得,而且从原始数据中分析并提取高质量的数据也不是人人都能办到的。
数据增强的内容很多,具体可以分为像素变换和几何变换,前者不会影响bbox坐标,后者会涉及bbox的变换。
具体的数据增强方法还是要根据数据集的特性来看,例如图像有无旋转,有无运动模糊,flip操作是否合理等。
在数据增强方面,mmdetection 做的比detectron2要好一些,可以使用albu库,具体可以到github上看。下面推荐一些数据增强方法:

  • flip,分为左右和上下,具体哪种看数据情况,常用的是左右;
  • resize, 多尺度,很有必要,无论是one-stage还是two-stage,无论是anchor-free还是anchor-based
  • distort, 像素级变换,一般都要加,主要调整图像颜色,色调,饱和度等
  • blur,blur有很多种,高斯,中值,运动等,这里推荐使用mmdetection+ablu,可以以一定概率施加blur,很方便。具体使用结合数据集;
  • Expand, SSD中采用的数据增强方法,将图像缩小后其余地方补0,增加对小目标的适应性
  • MinIoURandomCrop, SSD中采用的随机裁剪方法,可以参考知乎文章
    另外还有albu中一些数据增强方法。
    有两种数据增强方法不得不提,就是mix-up和填鸭式。
    所谓mix-up就是两张图按照一定的比例混合在一起,图中所含目标标签也以比例重新赋值,mixup的实现我还没有找到,以后再补充吧。
    所谓填鸭式,就是将一些目标扣出来,放到没有目标的图上去,增加图像的鲁棒性,抠出来的目标可以使误检的(FN)或者漏检的,具体可以参考实现

模型结构

目标检测bbox的表现中,cascade rcnn应该是表现最好的,可以以r50+fpn作为backbone为baseline,如果对速度有格外的要求,可以考虑使用ssd+fpn
也可以考虑使用yolov3+GIoU

backbone

一个强的backbone一般都会带来mAP的提升,但是在考虑速度的情况下,还是要谨慎使用过大的backbone。。

fpn

目前我只是使用过fpn,是不是其他的fpn会带来提升我也没试过。

bn,gn, syncbn

batchnorm的方式,推荐都试一下,一般来说syncbn会比较好,但是如果模型太大,batch_size比较小,最好还是frozen_bn,即从预训练模型中加载,并不更新bn参数。

模型训练

预训练模型

预训练模型十分重要,可以使训练迅速收敛,减少训练时间,给调参留下更多机会。
最好的方法是使用整个网络在一个大数据集上训练得到的模型,如果条件不允许,也要尽量使用backbone的预训练模型,或者backbone+FPN的模型。

迭代次数

采用在pascal voc和coco上论文中通用设置,可以先跑一个1x_schedule看看效果,一个1x表示12个epoch,在选择模型baseline时,可以每个epoch完在分割的val上看下效果。
进一步可以使用3x_schedule,在每两个epoch看下val上的表现。

学习率

关于学习率,一般论文中都拆用StepLrSchedule,可以考虑使用CosineLrSchedule或者CosineAnnelingLrSchedule。
注意在目标检测的训练过程中,一般都是要加上warming up的。

损失函数

损失函数方面也有很多技巧了,但是有些可能并不work,还是要看实验调参。

分类

对于不均衡问题,常用的损失函数有Focal loss,CHM。这里的类别不均衡是指的是在训练网络时,由于anchor密集采样造成的正负样本不均衡,而不是数据预处理中的类别不均衡。Focal loss是一个调参的过程,使用在两步法的检测器中正负样本不均衡问题由RPN网络解决,所以Focal loss在两步法的检测器中的性能还要看实验,CHM也是同理。

对于OHEM,在两步法中或许有效,但也是要看实验,个人感觉要比Focal loss要强一点。

回归

bbox的回归,最基础的就是编码+smooth_l1了,虽然有提出一些IoULoss,GIoUloss,对yolo提升很大,但是对于基于密集采样的fastx rcnn方法不一定work,所以并不推荐在cascade rcnn中使用。

推理

TTA

多尺度测试还是最有效的。。。

soft_nms

soft_nms一般都能涨分。。。

confidence_th

采用coco和pascal voc的评测方法,一般都会将confidence_th设的比较低,0.001左右,相当于把pr曲线往后拉长了,mAP自然会长

posted @ 2020-03-23 09:20  骏腾  阅读(8758)  评论(0编辑  收藏  举报