关于yolov3、yolov4的loss以及正、负、忽略样本的一些探索

11 篇文章 0 订阅
4 篇文章 0 订阅

本文yolov3的代码是阅读的https://github.com/qqwweee/keras-yolo3
本文yolov4的代码是阅读的https://github.com/bubbliiiing/yolov4-keras
首先声明:yolov3和yolov4的样本划分原则是不同的,只是作者用的这两个代码中划分规则相同。实际具体哪里不同,大家自行搜索吧。
先引用别人的一段话:

正/负/忽略样本的区分

在yolov3中我们把anchor box样本分为正样本,负样本和忽略样本。
anchor box样本标签中置信度为1的anchor box,称为正样本
置信度为0的anchor box,称为负样本
忽略样本则是从负样本中抽取出来的,如何理解呢?

由于yolov3使用了多尺度预测,不同尺度的特征图之间可能会出现重复检测的部分。例如有一个物体狗的gt box在训练时与1313的feature map中的某个anchor box对应。此时在训练模型的预测值中,恰好2626的feature map中的某个anchor box与该gtbox的iou达到0.93。而模型中我们让这个anchor box的置信度标签为0,网络学习结果肯定会不理想。所以我们的处理办法是,将这种与gtbox之间 iou较大(大过设定的阈值,如0.5),但又不负责预测物体的anchor box称之为忽略样本,不纳入损失计算。

在负样本中挖掘出忽略样本的步骤如下:

让所有的预测的缩放比(tx,ty,tw,th)与对应的anchorbox 进行解码,得到对应的预测框,我们称为bbox.
让这些bbox与当前预测的图片上的所有gtbox (假设有v个)计算交并比,就可以让每个bbox有对应的v个分数。对每个预测框取v个分数中的最大值,即可以得到best_score,这个best_score就是与这个anchor box交并比最大的那个gt box,他们之间的交并比。
将anchor box置信度标签为0,但best_score>阈值的部分设置为忽略样本,不参与损失计算。
而anchor box置信度标签为0,但best_score<阈值的部分才是参与损失计算的负样本。


以下内容基于自己理解,如有错误希望不吝指正。
上述两个代码链接中,关于正、负、忽略样本的定义方法一样,代码注释略有不同,以下是作者自己的观点:

代码中的负样本: 从所有负样本中剔除掉忽略样本以后的就是代码中的负样本。该head层某个位置的3个anchor box产生的预测框与true_box比如包含的4个真实目标框计算iou,取出每一个预测框与4个真实框的iou中最大的那个值,3个预测框也就是3个值,3个中的比如其中两个如果比ignore_thresh小,那么该位置的这2个先验框anchor box为负样本,向量ignore_mask只在计算置信度时用到,形状(52,52,3)。

正样本: 真实目标框选择一个最好的anchor box作为正样本,即计算真实框与9个anchor box的iou,最大索引的那个anchor box 即为正样本。

忽略样本: 存在一部分预测框与真实目标框计算出来的iou大于ignore_thresh,但是又不是最大的那个正样本的anchor,也就是说除去正样本,代码中的负样本,剩余的就是忽略样本。
代码中的ignore_mask:负样本的位置信息,希望不要被误导为是忽略样本。

上述两个代码中,关于loss的计算略有不同,以下为详细展示:
v4的loss如下:

ciou_loss = object_mask * box_loss_scale * (1 - ciou)
# 只计算正样本的回归损失ciou
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \
                      (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5],
                                                                from_logits=True) * ignore_mask
# 置信度BCE损失计算两部分:一部分包含目标物体,另一部分不包含目标物体,(1-object_mask) * ignore_mask为不包含目标物体的点位。
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)
# 只计算正样本的分类损失BCE  

目标框回归损失是ciou损失
置信度损失:BCE
分类损失:BCE

v3的loss如下:

# K.binary_crossentropy is helpful to avoid exp overflow.
xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[...,0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh-raw_pred[...,2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \
            (1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[...,5:], from_logits=True)

可以看到和v4的唯一不同就是目标框的回归损失计算方式不同,v3中的具体如下:

目标框回归损失:xy:BCE + wh:MSE(v3论文中都是MSE损失)
置信度损失:BCE
分类损失:BCE

正/负/忽略样本划分的细节讲的比较到位的一篇文章:
https://www.jianshu.com/p/a328a34ab542

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值