Pytorch版 yolov3 (ultralytics) loss计算变换流程

Pytorch版 yolov3 (ultralytics),关于loss(box,obj,class)转换流程已全部理清。
链接: https://github.com/ultralytics/yolov3.

一. 输出各维度含义
已yolov3-tiny(2尺度)举例(以下数组全为尺寸大小,不是数值)
生成 pi [4,3,16,16,7] / pi [4,3,32,32,7] 输出(网络输出),
‘4’: batch_size
‘3’ : 3个anchor
‘16’/’32’: [512,512]图像缩小32/16倍
‘7’ : [x, y, w, h, obj, class1, class2] 两类检测

二. 用于计算loss的重要函数,及函数参数解释
build_target(在utils/utils.py 中, 用于计算loss)
通过build_target 将所有labels(类别+位置)对应到16 * 16 的特征图中。
p [4,3,16,16,7] (size) --> ps [13,7] (size/scale1)/[2,7] (size/scale2)

我设的batch_size = 4 , 假设 当前的batch的4张图片,一共有7个目标,因为有3个anchor,所以会有3*7 = 21个判断,如下图。
target
7个target

每一行对应一个anchor
3个anchor,每一行对应一个anchor

判断:正确与否,一共有13个满足阈值
判断:正确与否,一共有13个满足阈值

上图计算了每个target的宽高组成的矩形大小,和对应anchor的iou>0.2,属于初步筛选
(注:上边 [13, 7] , [2, 7]中的13和2,即为第一个尺度的13个True,第二个尺度的2个True )

tcls, tbox, indices, anchors = build_targets(p, targets, model)

p : 网络输出,
Targets : labels(标签)

tcls:[tensor([1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1]), tensor([1, 1]),]
上面的 0 ,1 代表两个类别,
(PS:tcls长度2,代表两个尺度,第一个尺度13个输出,第二个尺度2个输出(已通过,宽高_iou,晒出>0.2的框))

tbox: shape[[13,4],[2,4]], box坐标

Indices : [b , a, gj, gi]
b : batch
如 b: [2, 2, 3, 1, 2, 2, 2, 2, 3, 0, 1, 2, 2] )
上边的0, 1, 2, 3 代表batch=4 的4张图片

a : anchor
如 b: [0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2] )
上边的0, 1, 2 代表anchor=3 的3个anchor

gi, gj:中心坐标
如 gi: [13, 14, 10, 2, 4, 13, 12, 14, 10, 7, 2, 4, 14] )
如 gj: [15, 12, 6, 8, 6, 15, 3, 12, 6, 6, 8, 6, 3] )
上边是16*16特征图的对应坐标,代码也涉及到了坐标补偿,毕竟416缩小到16,坐标缩小会产生偏差,关于补偿计算以后有机会再描述。

Indices 矩阵是含义是labels的索引,索引到输出 [4,3,16,16,7]的前4个维度,取出对应位置第5个维度的7个输出[x, y, w, h, obj, class1, class2]
(划重点,这是我认为最重要的部分,因涉及梯度下降)

anchors : shape[[13,2],[2,2]], 对应anchor,如两个尺度,每个尺度都有3个anchor(所有anchor都÷16或32)
已[416,416]为例2尺度的anchor [[10,14], [23,27], [37,58], [81,82], [135,169], [344,319]], 前三个为两个尺度中大尺度的anchor,后三个为两个尺度中小尺度的anchor.

三. 计算loss,分为box / object / class
Loss : box / object / class

Loss_box :
没有计算坐标、高宽的位移损失, 而是通过所有框的iou(重叠度)计算,用1- g_iou,代表bbox的损失。
box_loss
由于初步已经晒出13个,所以giou的size=13,求和或均值。

Loss_object :
size: [4,3,16,16],只有对应位置有数值(应该是1),其余位置全是0,和 [4,3,16,16,7] 第5维的index=4 (抽出‘7’中的第5个),计算BCE_loss。
loss_object
第5维 : [x, y, w, h, obj, class1, class2]

Loss_class :
抽出ps [13, 7] (size/scale1) / [2, 7] (size/scale2)的class维度, 即ps [13, 5:7] (size/scale1) / [2, 5:7] (size/scale2),计算BCE_loss

’ 7 ’ : [x, y, w, h, obj, class1, class2]
loss_class

关于BCE_loss = nn.BCEWithLogitsLoss
BCEloss定义
注:所有loss 还要自乘对应增益(gain1是固定的)

Loss_total = loss_box+ loss_obj+ loss_cls

总的loss值就有了

因计算转换流程太多了,怕忘掉,写出来,好回顾,仅供个人参考。

最后:
如果您觉得我的文章对您有所帮助,1毛钱的认可!
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值