引用:
[1] https://www.jianshu.com/p/204d9ad9507f
[2] https://cloud.tencent.com/developer/article/1392341
计算loss的bbox可分为positive和nagetive。Bbox与GT之间得到IOU:
if IOU >= th:
bbox is positive example
else :
bbox is nagetive example
若一张图片上的目标相对于负样本(非label目标和背景)所占的像素点比例过小,则该图会以负样本(nagetive example为主),这会造成以下问题:
这里要注意的是前一点我们说了negative的loss很大,是因为negative的绝对数量多,所以总loss大;后一点说easy negative的loss小,是针对单个example而言。
针对以上问题,Faster Rcnn规避了以上两个问题:
OHEM是近年兴起的另一种筛选example的方法,它通过对loss排序,选出loss最大的example来进行训练,这样就能保证训练的区域都是hard example。这个方法有个缺陷,它把所有的easy example都去除掉了,造成easy positive example无法进一步提升训练的精度。
图1 hard positvie、hard negative、easy positive、easy negative四种example的示意图
Focal loss 是以cross entropy loss为基础,增加一个权重参数,根据样本比例调整这个权重,以达到正负样本计算loss的占比相同的目的,这也间接解决了class imbalance的问题。
CEL(cross entropy loss) = −ylog(p) - (1−y)log(1−p)
If y == 1:
CEL = -log(p)
Else :
CEL = -log(1-p)
再:
在CEL的基础上增加权重参数,最后的FL为:
FL中,Pt是不同类别的分类概率,在[0 , 5],当为0时FL=CEL,at是[0 , 1]之间的小数,
和at是固定值。从表达式可以看出:
2.FL的公式不是一成不变的,论文最后给出了变形式,性能差异不大。变形式如下:
测试结果:
从表中看出,FL的AP最大,改进后的FL*的AP还有一些下降?总体性能看上去没有多大提升,反而比原始的FL效果有些差。
图2 RetinaNet
上面为分类的FCN,下面为回归的FCN;其中分类结构中,K为类别数,bias的特殊初始化方式在分类的最后一层。c d结构中conv的其他bias初始化全为0,权重w初始化符合高斯分布,。
图3 实验结果
def focal_loss(predictions , labels , alpha , gamma):
zeros = tf.zeros_like(predictions , dtype=predictions.dtype)
pos_corr = tf.where(labels > zeros , labels - predictions , zeros)
neg_corr = tf.where(labels > zeros , zeros , predictions)
# FL
fl_loss = -alpha * (pos_corr**gamma)*tf.log(predictions) - (1-alpha)*(neg_error**gamma)*tf.log(1.0 - predictions)
return tf.reduce_sum(fl_loss)