一、训练一个模型,提高分数的大体步骤如下:
- 分析数据集
1、可视化数据,检查数据是否有漏标、错标的问题,数据噪声太多,需要做数据清洗;2、统计训练数据的尺寸、目标框尺寸和长宽比,定义大、小目标,分析大、小目标的分布,以及类别的分布,是否存在类别不平衡。 - 使用数据增强
rotation, shear, perspective, horizontal flip, vertical flip,cutmix,mosaic,这些增强方式都可以尝试一下。 - 选择合适的检测模型
yolov5,faster_rcnn,detectors等 - 调整超参,训练目标检测模型
训练目标检测模型,需要修改的超参有:image size, learning rate, momentum, anchor box, and epochs - 在测试集上使用pseudo labeling ,将选择的数据加入原始训练集
- 集成测试,并且使用TTA
二、各种tricks大解析
1、Pseudo Labeling
这个链接解释Pseudo Labeling解释的很清楚,可以看一看
什么是Pseudo Labeling:
Pseudo Labeling就是将测试集中,测试结果中分数很高的测试图片,加入到训练集中,再训练。
Pseudo Labeling的5个步骤:
1、使用原始训练集,训练一个模型,这里最好是比较好的模型;
2、使用该模型去测试你的测试集,这里一般是没有标签的测试集;
3、把测试集中置信度很高的图片,加入到原始的训练集中;
4、使用混合后的数据集再训练一个新的模型。
Pseudo Labeling为什么有用(来自网友的思考,not me):
1、Pseudo Labeling之所以有用,是因为模型训练的目的已经不是找到一个泛化性很好的模型,而是在私有测试集上表现最好的模型, 这就是伪标签之所以如此有效的部分原因;
2、解决了数据集和测试集之间的domain shift
2、TTA(Test Time Augmentation)
在使用拟合模型进行预测时,也可以应用图像数据增强技术,以允许模型对测试数据集中每个图像的多个不同版本进行预测。 可以对增强图像的预测进行平均,从而获得更好的预测性能。
1、使用增强技术从提供的图像创建额外的测试图像。
2、使用训练好的模型跑整个测试集;
3、混合测试结果。
code competitions 是对时间有限制的,因此不能使用很多argmentation,常用的是horizontal and vertical flips。
下图是TTA的简单过程:
3、WBF(weighted-boxes fusion )
论文地址:https://arxiv.org/abs/1910.13302
github地址:https://github.com/ZFTurbo/Weighted-Boxes-Fusion
目标框加权融合,是在实时性要求不强时,多个模型集成的时候,用来将多个模型的预测结果结合起来的方法。NMS 和soft_nms都是在单个模型操作的,WBF适用于多个模型的融合,这个方法一般打比赛的时候使用。
WBF算法流程如下:
1、所有模型的预测结果放到一个列表B中,并且根据预测分数,从高到低排序;
2、生成一个空的列表L和F,用于放置目标框的聚类和融合。L中的每个位置是一群框的聚类,F中的每个位置是一个目标框,是L中对应位置的聚类群中目标框的融合。
3、遍历B中的预测框,找到B中的预测框属于F中的哪一个聚类结果,判定标准是,B中预测框与F中的每个位置(F中每个位置放的是每个聚类族的融合结果)计算IOU ,若IOU大于阈值,论文中该阈值设为0.55,就属于哪个聚类。
4、若是没有匹配上,就在L和F中生成新的聚类。
5、如果匹配上,把该目标框加入到L中的对应聚类中,然后在F中更新相对应的聚类结果。
6、同一个聚类中融合T个box的公式,其中C是预测框的分数,
C
=
∑
i
=
1
T
C
i
T
C = \frac{\sum_{i=1}^TC_i}{T}
C=T∑i=1TCi
X
1
,
2
=
∑
i
=
1
T
C
i
∗
X
1
,
2
∑
i
=
1
T
C
i
X1,2 = \frac{\sum_{i=1}^TC_i * X1,2}{\sum_{i=1}^TC_i}
X1,2=∑i=1TCi∑i=1TCi∗X1,2
Y
1
,
2
=
∑
i
=
1
T
C
i
∗
Y
1
,
2
∑
i
=
1
T
C
i
Y1,2 = \frac{\sum_{i=1}^TC_i * Y1,2}{\sum_{i=1}^TC_i}
Y1,2=∑i=1TCi∑i=1TCi∗Y1,2
7、处理完B中所有的预测框,并且F中的聚类族都计算了融合后的框,我们需要对F中融合后的框的分数re-scale一下,需要把这个分数值,乘以该聚类族中框的个数T,然后除以模型个数N,如何某一个聚类中目标框的个数比较少,也就是模型的少数框预测,因此我们需要把这种情况下融合的框的分数值降低:
C
=
C
∗
m
i
n
(
T
,
N
)
N
C = C * \frac{min(T, N)}{N}
C=C∗Nmin(T,N)