EIoU Loss + Focal Loss python
时间: 2025-06-30 13:33:11 浏览: 8
### 实现EIoU Loss 和 Focal Loss
#### EIoU Loss 的实现
EIoU (Extended Intersection over Union) 是一种改进版的距离损失函数,用于目标检测中的边界框回归。其主要目的是通过考虑中心点距离和纵横比差异来提高定位精度。
下面是基于PyTorch框架的一个简单版本的EIoU Loss实现:
```python
import torch
def eiou_loss(pred_boxes, target_boxes, eps=1e-7):
"""
计算两个矩形框之间的EIoU损失
参数:
pred_boxes: 预测框张量,形状为[N, 4],其中每一行表示[xmin,ymin,xmax,ymax]
target_boxes: 目标框张量,形状同上
eps: 小数防止除零错误
返回:
平均EIoU损失值
"""
# 获取预测框和真实框的位置参数
x1p, y1p, x2p, y2p = pred_boxes[:,0], pred_boxes[:,1], pred_boxes[:,2], pred_boxes[:,3]
x1t, y1t, x2t, y2t = target_boxes[:,0], target_boxes[:,1], target_boxes[:,2], target_boxes[:,3]
# 计算交集区域坐标
inter_x1 = torch.max(x1p, x1t)
inter_y1 = torch.max(y1p, y1t)
inter_x2 = torch.min(x2p, x2t)
inter_y2 = torch.min(y2p, y2t)
# 计算面积并求IOU
intersection_area = torch.clamp(inter_x2 - inter_x1,min=0.) * torch.clamp(inter_y2 - inter_y1,min=0.)
pred_area = (x2p-x1p)*(y2p-y1p)
target_area = (x2t-x1t)*(y2t-y1t)
union_area = pred_area + target_area - intersection_area
iou = intersection_area / (union_area + eps)
# 中心点距离平方差
center_dist_sq = ((pred_boxes[:,:2]+pred_boxes[:,2:])*.5-(target_boxes[:,:2]+target_boxes[:,2:])*.5).pow(2).sum(dim=-1)
# 边界包围盒对角线长度平方
enclose_left_top = torch.minimum(pred_boxes[:,:2], target_boxes[:,:2])
enclose_right_bottom = torch.maximum(pred_boxes[:,2:], target_boxes[:,2:])
c_diag_sq = (((enclose_right_bottom-enclose_left_top)**2).sum(-1)+eps)
# 宽高比例误差
w_pred,h_pred=pred_boxes[:,2]-pred_boxes[:,0],pred_boxes[:,3]-pred_boxes[:,1]
w_gt,h_gt=target_boxes[:,2]-target_boxes[:,0],target_boxes[:,3]-target_boxes[:,1]
v=(4/((torch.atan(w_gt/h_gt)-torch.atan(w_pred/h_pred)).pow(2)+eps))
alpha=v/(1-iou+v+eps)
e_iou=iou-(center_dist_sq/c_diag_sq-alpha*v)
return 1-e_iou.mean()
```
此部分代码实现了EIoU损失计算方法[^1]。
#### Focal Loss 的实现
Focal Loss 主要应用于处理类别不平衡问题,在密集物体检测任务中有很好的效果。以下是TensorFlow环境下Focal Loss的具体实现方式:
```python
import tensorflow as tf
def focal_loss(gamma=2., alpha=.25):
def focal_crossentropy(y_true, y_pred):
pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))
epsilon = K.epsilon()
clip_value_min = epsilon
clip_value_max = 1.-epsilon
pt_1 = tf.clip_by_value(pt_1,clip_value_min ,clip_value_max )
pt_0 = tf.clip_by_value(pt_0,clip_value_min ,clip_value_max )
fl_pos = -alpha*tf.pow(1-pt_1,gamma)*tf.math.log(pt_1)
fl_neg = -(1-alpha)*tf.pow(pt_0,gamma)*tf.math.log(1-pt_0)
return fl_pos + fl_neg
return focal_crossentropy
```
上述代码定义了一个返回focal crossentropy loss function的方法`focal_loss()`,该loss function可以根据输入数据自动调整权重分配给不同类别的样本。
对于多标签分类情况下的Focal Loss应用,可以参照GitHub上的开源项目[Focal-Loss-implement-on-Tensorflow][^1]来进行扩展支持。
阅读全文
相关推荐

















