YOLOv5-5.0v-损失函数(第四篇)

YOLOv5-5.0v-损失函数(第四篇)_第1张图片

YOLO Input Backbone Neck Head 置信度Loss 坐标回归Loss 分类Loss
v1 448*448 GoogleNet FC*2 MSE
v2 32x DarkNet-19 Passthrough Conv MSE
v3 32x DarkNet-53 FPN Conv BCE

(x,y) BCE

(w,h) MSE

BCE
v4 32x

CSPDarkNet-53

SPP

PAN

同v3 BCE CIOU BCE
v5-5.0v 32x C3Net

SPP

PAN

同v3

BCE-

WithLogitsLoss

CIOU

BCE-

WithLogitsLoss

损失函数

正负样本分配

yolov5与v3和v4一样都使用了3个 head 预测,一共9种 anchor,每个head被分配到3个。

3个head的分辨率为输入的 8、16和32倍下采样,比如640输入,那么head1 = 80,head2 = 40,head3 = 20:

head1 分配三个最小的 anchor;

head2 分配三个中等的 anchor;

head3 分配三个最大的 anchor。

遍历每个head:

        1. 选择哪种尺度的Anchor: 每个标注框的 w, h 和当前head的3种Anchors的W和H计算比值r,如果两个比值 r 都小于self.hyp['anchor_t'](data/hyp.scratch.yaml:anchor_t: 4.0),那么当前标注框中心(下图红色点)所在的 那个Anchor 就是正样本。

        2. 考虑另外两个cell: 如下图,3个cell中的满足上述条件的Anchor都会被选为正样本。所以对于一个目标,最多有9个正样本

1e5606449ea59ad6712ce41e714f29d4.png

         3. 其他的cell中的全部Anchor 和不满足条件1的都是负样本。

正样本:

当前head中的三个cell中 r<4 的Anchor。

正样本需要计算:置信度损失(标签为CIOU+BCEWithLogitsLoss)、分类损失(标签平滑+BCEWithLogitsLoss)和回归损失(CIOU)。BCEWithLogitsLoss等价于对输出的置信度做sigmoid,然后再使用BCELoss。

L(obj) =\sum_{t=0}^{T}\sum_{cell=0}^{3}\sum_{n=0}^{A}1_{r<4}[-\hat{C}ln(C)-(1-\hat{C})ln(1-C)],其中为下面代码中的 tobj。

self.gr是一个人为加大训练难度的系数,假设该值为1,那么置信度的标签值就是 CIOU

                # 预测信息有置信度 但是真实框信息是没有置信度的 所以需要我们人为的给一个标准置信度
                # self.gr是iou ratio [0, 1]  self.gr越大置信度越接近iou  self.gr越小置信度越接近1(人为加大训练难度)
                tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * score_iou  # iou ratio

分类损失:

L(obj) =\sum_{t=0}^{T}\sum_{cell=0}^{3}\sum_{n=0}^{A}1_{r<4}\sum_{cls=0}^{classes}[-\hat{p}ln(p)-(1-\hat{p})ln(1-p)]

坐标损失:

v=\frac{4}{\pi ^{2}}(\arctan \frac{w^{gt}}{h^{gt}}-\arctan\frac{w}{h})^{2}

\alpha =\frac{v}{(1-IOU)+v}

L(x,y,w,h)=\sum_{t=0}^{T}\sum_{cell=0}^{3}\sum_{n=0}^{A}1_{r<4}L_{CIOU}

负样本:

当前head中的三个cell中 r=>4 的Anchor 或 其他cell 的 所有Anchor。负样本只计算 置信度损失(标签为0)。

L(noobj) = \sum_{i=0}^{w}\sum_{j=0}^{h}\sum_{n=0}^{A}1_{(r=>4\ or\ other\_cell)}[-\hat{C}ln(C)-(1-\hat{C})ln(1-C)] \overset{\hat{C}=0}{\rightarrow} \sum_{i=0}^{w}\sum_{j=0}^{h}\sum_{n=0}^{A}1_{r=>4}[-ln(1-C)]

总损失:

L(all)=L(noobj)+L(obj)+L(x,y,w,h)+L(class) = \sum_{i=0}^{w}\sum_{j=0}^{h}\sum_{n=0}^{A}1_{r=>4}[-ln(1-C)] +\sum_{t=0}^{T}\sum_{cell=0}^{3}\sum_{n=0}^{A}1_{r<4}\left \{[-\hat{C}ln(C)-(1-\hat{C})ln(1-C)]+ L_{CIOU}+\sum_{cls=0}^{classes}[-\hat{p}ln(p)-(1-\hat{p})ln(1-p)]\right \}

参考:

yolov5目标检测神经网络——损失函数计算原理_萌萌哒程序猴的博客-CSDN博客_yolov5损失函数

你可能感兴趣的:(单阶段目标检测,#,YOLO,#,yolov5,YOLOv5)