YOLOv1:损失函数及预测过程的理解

“”"
不考虑批处理,只对一张图片为例,分析损失函数
“”"

YOLOv1:损失函数及预测过程的理解

  • target_tensor的编码过程
  • pre_tensor的编码过程
  • 训练
  • 预测
  • 关于位置坐标的细节

  • 损失函数
    YOLOv1:损失函数及预测过程的理解_第1张图片

target_tensor的编码过程

目标检测中一张图片,官方给出的标签中包含了关于ground truth box的位置信息与框中物体的类别信息,位置信息为4位(框的左上角位置坐标与左下角位置坐标),类别共有20种,用一个编号给出,假设这张图片里面有两个标注框。要把这些信息编码为一个target_tensor,用于损失函数的计算。
target_tensor的形状为(7,7,30),7*7表示把图像等分为7*7个方格(ceil),共49个ceil,这些ceil中有2个会与2个标注框对应(计算标注框的中心落在那个ceil里面,这个ceil与这个标注框对应),即有2个ceil与标注框对应,其余47个ceil是认为是无效的。于是target_tensor中47个长度为30的向量为零向量,因为这47个ceil无效,只有2个长度为30的向量不是零向量。这2个有效的向量将记录对应标注框的位置(前10位负责),以及对应标注框中物体的类别(后20位负责,因为有20个类别,所以后20位实际上是一个onehot编码)

标注框的位置信息 confidence 标注框的位置信息 confidence 类别编码
4 1 4 1 20

这里0-4位与5-9位内容是一样的只是为了与pre_tensor的形状相同,confidence的值为1。

pre_tensor的编码过程

pre_tensor即网络输出的结果(输入即为待检测图片)
pre_tensor的形状也为(7,7,30)
target_tensor中有47个零向量,这将告诉网络,这47个ceil不对待检测物体负责,对应pre_tensor中的47个向量,我们希望这47个向量的第4位和第9位输出0,即confidence=0,表示这47个ceil不负责待检测物体,其次pre_tensor中剩下的2个长为30的向量我们希望他们给出正确的预测结果,此时一个长为30的向量中0-4位与5-9位是两个预测框,我们选择其中与标注框iou值最大的那个框。因此2个长为30的向量包含四个预测框,从中根据iou值选出两个,剩下两个抛弃,即期望被抛弃的两个的confidence值为0。

  • 损失函数的第4行
    pre_tensor中47个无效ceil中有472个confidence值期望为0,2个有效ceil提供的4个预测框中,有两个被抛弃,这两个confidence值期望为0,即总共有492个预测框,只有2个被选出,其余的均期望confidence为0,这就是损失函数中的第4行,将49*2-2个confidence值置为0
  • 损失函数的第3行
    两个被选中的预测框,我们期望它的confidence值为1 * iou,iou指这个预测框与真实框之间的iou值,原文中的话就是Pr(object) * iou
  • 损失函数的第1,2行
    我们期望两个被选中的预测框的4位位置信息与标注框的4位位置信息相同,这被用于计算损失函数的第1,2行
  • 损失函数的第5行
    用pre_tensor这2个向量的后20位与target_tensor这2个向量的后20位计算mse损失即可

训练

训练过程中生成98个预测框,根据ceil及iou值选择2个,余下97个,通过将confidence值归0,来告诉网络这97个被放弃了,剩下2个与标注信息中的位置信息及类别信息进行对比来教会网络生成合适的预测框及预测类别,同时confidence值为iou值,也反映了预测框的质量。

预测

首先选出confidence值大于给定阈值的预测框,为了避免这一步将所有预测框都抛弃掉,因此至少保留confidence值最大的预测框,这些预测框的cofidence值乘以对应的最大类别的概率值,即为此预测框的置信度,同时也得到了框中物体的类别。至此得到了N个被选中预测框的置信度及类别。最后使用置信度进行极大值抑制nms再进行一轮筛选即得到最终的预测结果。

关于位置坐标的细节

target_tensor中关于标注框位置信息的四位表示

  • 首先原始坐标为(x1,y1,x2,y2),其中图片宽为w,高为h,则归一化为(x1/w,y1/h,x2/w,y2/h),此时四个坐标均在0–1之间。此后忍为w=1,h=1,所有坐标均为归一化表示
  • ceil_size = 1 / 7 (图片分成7*7所以每个ceil的边长为ceil_size)
  • 计算标注框的中心点例如cxcy_sample = [0.3,0.4]
  • 计算中心点落入那个ceil里(ij = (cxcy_sample / cell_size).ceil() - 1)此时ij = [2,2]即第三行第三列那个ceil
  • 计算这个ceil左上角这个点的坐标 xy = ij * cell_size (xy=[0.2857, 0.2857])
  • 计算框的中心点cxcy_sample相对于ceil左上角xy的offset (delta_xy = (cxcy_sample - xy) / cell_size)
  • 框的宽和高是相对于整个图片归一化后的宽高

pre_tensor得到后

  • 宽高乘以整个图片的宽高就得到预测框的实际宽高
  • 中心点坐标 * cell_size + xy即得到实际的中心点坐标,从而得到预测框的实际坐标
  • 这里网络输出的预测值中,中心点是相对于ceil的offset值,而宽高值是相当于整个图片的归一化值

你可能感兴趣的:(目标检测,深度学习,计算机视觉,目标检测)