目标检测的损失函数
匹配策略
- 从ground truth boxes出发,寻找与每个ground truth boxes有最大的jaccard overlap(IOU)的proior bbox,这样就能保证每一个ground box一定与一个prior bbox对应起来。反之,若一个prior bbox没有与任何ground truth进行匹配,那么该prior bbox只能与背景匹配,就是负样本。
一个图片中ground truth是非常少的,而prior bbox却很多,如果仅按第一个原则匹配,很多prior bbox会是负样本,正负样本极其不平衡,所以需要第二个原则。 - 从prior bbox出发,对剩余的还没有配对的prior bbox与任意一个ground truth box尝试配对,只要两者之间的jaccard overlap大于阈值(一般是0.5),那么该prior bbox也与这个ground truth进行匹配。这意味着某个ground truth可能与多个Prior box匹配,这是可以的。但是反过来却不可以,因为一个prior bbox只能匹配一个ground truth,如果多个ground truth与某个prior bbox的 IOU 大于阈值,那么prior bbox只与IOU最大的那个ground truth进行匹配。
损失函数
将总体的目标损失函数定义为定位损失(loc)和置信度损失(conf)的加权和:
损失函数的整体理解可以见下图:
这里说一下smooth L1 loss(本处参考Brook_icv大佬的文章:https://www.cnblogs.com/wangguchangqing/p/12021638.html):
其中,x = f(xi) - yi为真实值和预测值的差值。
Smooth L1能从两个方面限制梯度:
1.当预测框与ground truth差别过大时,梯度值不至于过大;
2.当预测框与ground truth差别很小时,梯度值足够小。
从L1,L2,和Smooth L1损失函数图像中可以看出,Smooth L1 loss实际上是一个分段函数,在[-1,1]之间实际上就是L2损失,这样解决了L1的不光滑问题,在[-1,1]区间外,实际上就是L1损失,这样就解决了离群点梯度爆炸的问题。
Smooth L1的优点:
- 相比于L1损失函数,可以收敛的更快。
- 相比于L2损失函数,对离群点、异常值不敏感,梯度变化相对更小,训练时不容易跑飞。