focal loss dice loss源码_SSD中Multibox_loss源码解读,Pytorch版

论文链接:SSD: Single Shot MultiBox Detector

文中所用代码(仅multibox_loss.py)链接:multibox_loss.py

Loss in SSD

数学公式部分

来自SSD论文第五页training objective段落。指示器

指: 第
- th 默认框(default box)对应
类物体的第
-th 目标框(Ground truth box)的匹配度,匹配度取值区间为0~1。根据这个匹配策略,可得所有的默认框对应
类物体的第
-th 目标框(Ground truth box)的匹配度的总和大于等于1,即
。整体的目标损失函数(overall objective loss function)是定位损失(localization loss,简称loc)和置信损失(confidence loss,简称conf)的加权求和。

316abb2adc2fe3700ec206f337bb0645.png

是能匹配的默认框数量,如果
,Loss为0。loc为预测框
(predicted box)和真实框
(ground truth box)之间的Smooth L1 loss。

对于loc, 根据公式一步步来

  1. 首先,公式(2)中第一行:先对每个可匹配的默认框求这个框的置信度器
    的乘积,loc即为所有能匹配框的该值的总和。其中
    分别如figure 1 中红绿箭头
  2. 拆开看
    ,
    为该框的中心点的x和y值,
    为框宽,
    为框长。公式(2)中第二行说明:
    ,公式(2)中第三行说明:
    ,如果
    ,则
    ;如果
    ,则
    。附:论文中未说明,但
    应也为对默认框的比例值。

9ad9f451ac58a701af6b76c2f4748be5.png

468aafa94d4bfce8af1c5c90482f0b0e.png
Figure 1. 预测框和真实框的图例,图中以center point举例说明,w和h信息未包含

对于conf,

先上公式(3),

d8166568f99837314942181c07d17e6c.png

拆分成两部分(Pos和Neg)看,即,在该次iteration计算里,一共有N(即

时的i的总数为N个)个可匹配默认框:得出预测框
中为
类(category)的相对置信度
,再乘以框匹配度,在计算loss时,希望
,
,即
,即
。如果第
-th个默认框属于背景(Negative),则Neg部分:
(指背景类),
, 即
, 即
。公式三要使
.

conf公式也拆分成两部分来看(conf loss 是指所有类别的loss):默认框为4个(如figure 1), 举例数据集有三类(0:背景,1:交通标志,2:信号灯)。

  1. 首先是
    (即
    时),2个默认框(Default BBox0,1,2)为可匹配默认框,因为
    ,根据公式
    = [0.8log(0.9) + 0.8log(0.01)] + [0.6log(0.1)+0.6log(0.7)] = [(-0.037)+(-1.6)]+[(-0.6)+(-0.093)]=
    -2.33 这里(-1.6,-0.6)这两个值太大,即错误的框[(框0,类别2),(框1,类别1) ]loss大。正确的框/之后的预测框[(框0,类别1),(框1,类别2)]的loss小。
  2. (未完,代码hard negative mining部分说明)然后i 是
    (即
    ),从figure 2中可看到Default BBox 3未能和任何Groundtruth BBox重合,即IOU太小(IOU<0.5),归类为未能

4345ef73bea101c75e6a9b22e2cec344.png

代码解读部分

一些相关参数(parameter):

  • batch_size = 32
def 

predictions是一个元组(tuple),其中包含三个值

  1. loc_data:预测框位置点矩阵 size: (batch_size,num_priors,4) -> (32,8732,4)
  2. conf_data:预测框置信度矩阵 size:(batch_size,num_priors,num_classes) -> (32,8732,3)
  3. priors:先验框矩阵 size:(num_priors,4) -> (8732,4)
# match priors (default boxes) and ground truth boxes
    

举例idx的循环:

idx: 0
targets: tensor([[ 0.2781, 0.8527, 0.3834, 1.0000, 8.0000],
[ 0.5586, 0.8045, 0.6864, 1.0000, 17.0000],
[ 0.3089, 0.7861, 0.4178, 0.9122, 17.0000],
[ 0.4544, 0.7564, 0.5278, 0.8286, 19.0000],
[ 0.2012, 0.7861, 0.2343, 0.8768, 19.0000]])
truths: torch.Size([5, 4])
labels: torch.Size([5])
idx: 1
targets: tensor([[ 0.8637, 0.7126, 0.9310, 0.9073, 14.0000]])
truths: torch.Size([1, 4])
labels: torch.Size([1])
...

match() function:

  • 返还新的loc_t (32, 8732, 4)和conf_t (32, 8732)值。loc_t: endcoded location targets。表示:32张图中,每张图里有8732个默认框:每个框对应该图中目标框的定位度loc_t( 4)和置信度conf_t(1)。每张图得出的维度分别为loc_t (8732, 4)和conf_t(8732, 1),一起处理32张图即维度分别为loc_t (32, 8732, 4)和loc_t (32, 8732)。
  • 其中,overlap_threshold: 0.5, 默认框和真实框的IOU小于0.5的,设定为背景,该位置返还的conf[i] = 0.

conf, pos, num_pos的输入和size:

con_f: tensor([[0, 0, 0, ..., 3, 3, 3],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 8, 8, 0],
[0, 0, 0, ..., 0, 0, 0]]) torch.Size([32, 8732])
pos: tensor([[0, 0, 0, ..., 1, 1, 1],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 1, 1, 0],
[0, 0, 0, ..., 0, 0, 0]], dtype=torch.uint8) torch.Size([32, 8732])
num_pos: tensor([[ 7], [64],[21],[53],[ 8],[ 2],[28],[ 8],[20],[66],[ 2], [14],[10],[11],[45],[12], [11],[ 8], [17],[ 9],[37],[24], [17], [43],[26], [11],[22], [10], [35],[14],[23],[33]]) torch.Size([32, 1])
# Localization Loss (Smooth L1)
    

Confidence Loss Including Positive and Negative Examples: 也就是equation(3).

pos_idx 

hard negative mining: 这里暂时先不讲,后期补充

# Compute max conf across batch for hard negative mining
    
  • 以下解释代码段“loss_c = log_sum_exp(batch_conf)- batch_conf.gather(1, conf_t.view(-1,1))”

其中, log_sum_exp(x):

: 为何使用log_sum_exp(x)可参考Tricks of the Trade: LogSumExp. 这里简要说明。首先,Figure 3为代码“batch_conf.gather(1, conf_t.view(-1,1))”,输出shape为(279424,1)。下面是公式变形,其实 log_sum_exp(x)为计算Softmax的过程:

(以下公式来自链接Tricks of the Trade: LogSumExp)

  1. softmax:
    (1),如何计算softmax如公式(1)
  2. log(softmax)即为
  3. 把(3)套入(2)即
  4. 即代码“loss_c = log_sum_exp(batch_conf)- batch_conf.gather(1, conf_t.view(-1,1))”

037993111faf3d44d09583344a9008d1.png
Figure 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值