ComputeLoss
标准化坐标的增益张量
标准化坐标的增益张量(gain tensor)用于将归一化的目标转换为特定特征层的网格尺度,以便进行匹配和计算。
在目标检测模型中,输入图像被划分为多个网格,每个网格负责预测多个锚框。锚框的尺寸在不同特征层上有所不同,以便检测不同尺度的目标。
1、增益张量将归一化的目标坐标转换为特征图的网格尺度
gain = torch.ones(7, device=tragets.device).long() #创建增益张量
增强张量的初始值是一个全1的张量,长度为 7,目标信息包括图像索引、类别、x、y,w,h和锚框索引
2、更新增益张量以匹配当前特征图的尺度
gain[2:6] = torch.tensor(p[i].shape)[[3,2,3,2]]
3、将归一化的目标乘以增益张量,以转换为特征图的尺度
t = targets * gain
偏移量
偏移量通过在不同的网格位置上尝试匹配,可以更好地捕捉目标,尤其是当目标位于网格边界时
g = 0.5
off = torch.tensor([[0, 0],[1, 0], [0, 1], [-1, 0], [0, -1], # j,k,l,m], device=targets.device).float() * g # 偏移量
具体的偏移量解释如下:
[[0, 0]]
:不偏移,即使用当前网格的中心位置。[[1, 0]]
:向右偏移一个网格单位。[[0, 1]]
:向下偏移一个网格单位。[[-1, 0]]
:向左偏移一个网格单位。[[0, -1]]
:向上偏移一个网格单位。
通过将偏移量乘以 g
,得到的偏移量为网格单位的 0.5
倍,这样每个偏移的距离为半个网格单位。
使用偏移量的好处
- 增加匹配灵活性:当目标位于网格边界时,可以通过偏移量在多个位置尝试匹配,从而增加匹配成功的可能性。
- 提高检测精度:通过在不同位置进行匹配,可以更准确地定位目标,尤其是对于小目标和边界目标。
为什么要计算目标和锚框的宽高比
在目标检测模型(如 YOLO)中,计算目标和锚框的宽高比是为了确定哪些锚框与目标最匹配。宽高比的匹配是判断锚框与目标是否合适的重要指标,因为目标的大小和形状在不同锚框上的匹配程度会直接影响检测的准确性。
主要原因
- 匹配适当的锚框: 锚框是预定义的一组矩形框,其形状和大小用于捕捉图像中的对象。目标和锚框的宽高比计算有助于确定哪个锚框最适合特定目标。通过选择宽高比接近的锚框,可以更准确地定位和分类目标。
- 减少计算复杂度: 通过提前计算宽高比并进行筛选,可以减少后续计算的复杂度。例如,只对那些宽高比接近的锚框进行详细的IoU(交并比)计算,从而提高计算效率。
- 提高检测精度: 如果锚框的宽高比与目标的宽高比相差较大,即使IoU较高,最终的检测效果也可能不理想。通过宽高比匹配可以确保选出的锚框在形状上更接近目标,从而提高检测精度。
r = t[:, :, 4:6] / anchors[:, None] # wh ratio
j = torch.max(r, 1. / r).max(2)[0] < self.hyp['anchor_t'] # compare
t = t[j]
在pytorch中,tensor[true],意味着选择tensor中所有为true的元素
import torch# 创建一个示例张量
tensor = torch.tensor([1, 2, 3, 4, 5])# 创建一个布尔张量,指示哪些元素应被选择
mask = torch.tensor([True, False, True, False, True])# 使用布尔索引
selected_elements = tensor[mask]print(selected_elements)