最近用YOLO训练过程中遇到的问题和猜测。
YOLO的训练比较明显的一个现象就是收敛比较慢,YOLO训练可以看作是是三个任务的联合训练,分别是:Objectness[O],一个BinaryCrossEntropy训练或者Logistic regression;Boundbox[B],一个数值回归的训练;Classification[C]任务,多类的分类任务,其实也是BCE。起码目前我观察的现象:
O的收敛
其中1的问题,还是FocalLoss期望解决的问题,那就是正反案例的极度不平衡的问题。造成初期大量的负样例将整个O的输出推到了接近0的位置上。后续的训练才会慢慢的调整,让正样例能够准确预测。
这一过程,会浪费了不少算力。怎样让网络更加有效的训练?我能想到的是:
BC任务
BC任务需要等待O的训练问题,第一直觉应该是加大BC在整体loss上的比重,让他们可以早点快速学习。同时,带来的问题是,可能会对O的训练有负面影响。不过这样的方法也只是在训练中多了个人肉调参的手段,是否有更加根本的解决方法?
由于XY在YOLO用通过Sigmoid函数做了限制,然而WH的预测没有。这样的情况是,这两者的尺度不是一个量级的,那么在Loss中的比例,也就不可避免的有了倾向性。当然,随着训练的继续,两者的Loss会慢慢的接近。但是,这个问题和前一点中BC需要等待O训练是一个性质。直觉上看,应该也会拖慢收敛速度,或者起码,两个任务的收敛不是在一个步调上。
这样尺度不一致的问题,可以通过选择更加合理的anchors来缓解。让训练集的目标框的大小更加和anchors贴近,会缩小WH的尺度,整体上XYWH的预测范围会更加接近。
同时WH的预测在目标框小于和大于对应anchor的两个区间的尺度的变化速度是不一致的,这是ln函数的特性造成的。我的怀疑是,这个特性,会不会给网络的训练带来负面影响?
由于Sigmoid的特性,在极值附近和中间值附近的训练难度是完全不一样的,那么我们可以想象,对目标中心位置的预测的难度是越靠近边缘越大的。
这样的一个先验的限制,是不符合数据集合分布的,目标出现的位置应该是比较平均的。
Anchor的数量选择会带来一个平衡问题。需要根据具体的数据集来确定:
YOLO的O任务是针对目标中心点的,这也是因为B任务中XY只负责预测对应grid里的中心位置。
不过这样的限制显得过于严格了,网络未必可以确认feature map中哪个位置对应目标的正中,在feature map尺寸比较大的情况下,这个问题会更加明显一些。
另外一种情况是,目标框的中心点并不是图中目标的中心点:比如单手展开的行人,标注的目标框的中心点往往都已经不在目标主体上了。这个也会在训练的过程中给网络带来一些混淆。