yolo的总损失函数
时间: 2024-12-30 21:29:34 浏览: 8
### YOLO 模型总损失函数的构成
#### 正样本与负样本的区别
在YOLO系列模型中,对于正样本而言,存在三种类型的损失函数:坐标损失函数、置信度损失函数以及类别损失函数;而对于负样本,则仅涉及置信度损失函数[^1]。
#### 坐标损失函数
针对每个负责预测物体中心点位置的网格单元(即正样本),如果该网格内确实含有目标对象,则会计算边界框坐标的误差。通常采用均方根误差来衡量真实值\(t_x, t_y\)同预测值\(\hat{p}_x,\hat{p}_y\)之间的差异:
\[ \text{Loss}_{coord} = (t_x-\hat{p}_x)^2+(t_y-\hat{p}_y)^2 \]
此外还包括宽度和高度上的偏差平方和:
\[ \text{Loss}_{size}=(\sqrt{\hat{p}_w}-\sqrt{t_w})^2+(\sqrt{\hat{p}_h}-\sqrt{t_h})^2 \]
这里引入开方操作是为了让不同尺度的目标具有相似的重要性权重[^3]。
#### 置信度损失函数
无论是正样本还是负样本都会涉及到置信度得分的学习过程。具体来说就是通过二元交叉熵损失评估预测的概率分布P与实际标签T间的差距:
\[ C_{i}=IOU_i^{truth}\cdot P(C_i=object)+(1-IOU_i^{truth})\cdot P(C_i=no\_object)\]
其中 \( IOU_i^{truth} \) 表示第 i 个 anchor box 的 IoU (Intersection over Union)分数,当其对应的真实边框时取最大IoU值作为真值,反之则设为零[^2]。
#### 类别损失函数
对于每一个被分配到特定类别的候选区域,利用多分类交叉熵损失去优化最终输出向量C相对于ground truth label L的距离:
\[ S=\sum_kL(k)\log(P(C=k)) \]
此处 k 遍历所有可能存在的种类编号集合K,并且只会在那些真正包含某类实例的位置处累加该项贡献。
#### 总体结构概述
综上所述,在整个训练过程中所追求的就是最小化上述各项分项之和形成的综合成本J :
\[ J=\lambda _{coord}( Loss_{coord}+Loss_{size})+\lambda _{noobj}*C_{neg}+\lambda _{class}*S+C_{pos} \]
这里的超参数λ用于调整各部分相对重要性的比例关系。
```python
def yolo_loss(y_true, y_pred):
"""
Calculate the total loss of a single prediction.
Args:
y_true: Ground-truth labels including bounding boxes and class probabilities.
y_pred: Predicted values from model output layer.
Returns:
Total loss value as scalar tensor.
"""
# Extract components from predictions and ground truths
coord_mask = ...
conf_mask = ...
prob_mask = ...
pred_box_xy = ... # predicted bbox center coordinates relative to grid cell
true_box_xy = ... # actual bbox centers
pred_box_wh = ... # width & height w.r.t original image size
true_box_wh = ...
pred_confidence = ... # confidence score per each anchor
true_confidence = ...
pred_class_probabilities = ...
true_classes_one_hot_encoded = ...
# Compute individual losses using masks
xy_loss = tf.reduce_sum(tf.square(true_box_xy - pred_box_xy), axis=[1, 2, 3])
wh_loss = tf.reduce_sum(tf.square(tf.sqrt(true_box_wh) - tf.sqrt(pred_box_wh)), axis=[1, 2, 3])
confidence_loss_positives = ...
confidence_loss_negatives = ...
classification_loss = ...
# Combine all parts into final objective function with appropriate weighting factors
lambda_coord = 5.0
lambda_no_obj = .5
total_loss = (
lambda_coord * (xy_loss + wh_loss)
+ lambda_no_obj * confidence_loss_negatives
+ confidence_loss_positives
+ classification_loss
)
return total_loss
```
阅读全文