赞
踩
一,什么是损失函数:
简单的理解就是每一个样本经过模型后会得到一个预测值,然后得到的预测值和真实值的差值就成为损失(当然损失值越小证明模型越是成功),我们知道有许多不同种类的损失函数,这些函数本质上就是计算预测值和真实值的差距的一类型函数,然后经过库(如pytorch,tensorflow等)的封装形成了有具体名字的函数。
二,损失函数的作用:
我们上文说到损失函数是计算预测值和真实值的一类函数,而在机器学习中,我们想让预测值无限接近于真实值,所以需要将差值降到最低(在这个过程中就需要引入损失函数)。而在此过程中损失函数的选择是十分关键的,在具体的项目中,有些损失函数计算的差值梯度下降的快,而有些下降的慢,所以选择合适的损失函数也是十分关键的。
三,yolov7损失函数的修改
在general.py中改成:
- if GIoU or DIoU or CIoU or EIoU or SIoU:
- cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex (smallest enclosing box) width
- ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex height
- if SIoU: # SIoU Loss https://arxiv.org/pdf/2205.12740.pdf
- s_cw = (b2_x1 + b2_x2 - b1_x1 - b1_x2) * 0.5
- s_ch = (b2_y1 + b2_y2 - b1_y1 - b1_y2) * 0.5
- sigma = torch.pow(s_cw ** 2 + s_ch ** 2, 0.5)
- sin_alpha_1 = torch.abs(s_cw) / sigma
- sin_alpha_2 = torch.abs(s_ch) / sigma
- threshold = pow(2, 0.5) / 2
- sin_alpha = torch.where(sin_alpha_1 > threshold, sin_alpha_2, sin_alpha_1)
- # angle_cost = 1 - 2 * torch.pow( torch.sin(torch.arcsin(sin_alpha) - np.pi/4), 2)
- angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - np.pi / 2)
- rho_x = (s_cw / cw) ** 2
- rho_y = (s_ch / ch) ** 2
- gamma = angle_cost - 2
- distance_cost = 2 - torch.exp(gamma * rho_x) - torch.exp(gamma * rho_y)
- omiga_w = torch.abs(w1 - w2) / torch.max(w1, w2)
- omiga_h = torch.abs(h1 - h2) / torch.max(h1, h2)
- shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4)
- return iou - 0.5 * (distance_cost + shape_cost)
- if CIoU or DIoU or EIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
- c2 = cw ** 2 + ch ** 2 + eps # convex diagonal squared
- rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 +
- (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4 # center distance squared
- if DIoU:
- return iou - rho2 / c2 # DIoU
- elif CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
- v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / (h2 + eps)) - torch.atan(w1 / (h1 + eps)), 2)
- with torch.no_grad():
- alpha = v / (v - iou + (1 + eps))
- return iou - (rho2 / c2 + v * alpha) # CIoU
- elif EIoU:
- rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2
- rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2
- cw2 = cw ** 2 + eps
- ch2 = ch ** 2 + eps
- return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2)
- else: # GIoU https://arxiv.org/pdf/1902.09630.pdf
- c_area = cw * ch + eps # convex area
- return iou - (c_area - union) / c_area # GIoU
- else:
- return iou # IoU
在loss.py中改:
原始:
iou = bbox_iou(pbox.T, tbox[i], x1y1x2y2=False, CIoU=True) # iou(prediction, target)
改成(根据你的需求修改):
iou = bbox_iou(pbox.T, tbox[i], x1y1x2y2=False, GIoU=True) # iou(prediction, target)
YOLOv7是目标检测领域的一种深度学习模型,其主要目的是在图像或视频中检测和识别出物体,并定位其位置。在YOLOv7中,进损失函数的设计对模型的训练和性能起着非常关键的作用。
为了让YOLOv7模型能够更准确地检测和识别物体,在设计进损失函数时,需要注意以下几点:
进损失函数的设计首先需要确定匹配算法。在YOLOv7中,常用的匹配算法包括IOU和GIoU等,通过计算预测框和真实框之间的重叠度来评估其匹配程度。需要根据实际问题选择相应的匹配算法,并在进损失函数中合理地使用。
对于YOLOv7模型来说,分类损失是进损失函数中最重要的部分之一。分类损失的目的是为了让模型能够正确分类每个检测框中的物体。在YOLOv7中,常用的分类损失函数包括交叉熵损失、二元交叉熵损失、focal loss等。需要根据实际数据集和任务类型选择合适的分类损失函数,并调整其权重,使其对模型的训练和性能产生适当的影响。
定位损失是进损失函数中另一个重要的组成部分。其主要目的是为了让模型能够更准确地定位每个检测框中物体的位置。在YOLOv7中,常用的定位损失函数包括平方误差损失、绝对误差损失等。需要根据实际数据集和任务类型选择合适的定位损失函数,并调整其权重,使其对模型的训练和性能产生适当的影响。
在设计进损失函数时,还需要考虑正则化项。正则化项可以帮助模型更好地泛化,防止过拟合。在YOLOv7中,常用的正则化项包括L1正则化、L2正则化等。需要根据实际情况选择合适的正则化项,并进行调参,以达到最佳的泛化效果。
在进损失函数的设计中,还需要合理设置权重和参数。权重和参数的设置会直接影响到模型的训练和性能。需要根据实际情况选择合适的权重和参数,并进行调整,以达到最佳的训练效果。
综上所述,YOLOv7的进损失函数设计对模型的训练和性能起着非常关键的作用。在设计进损失函数时,需要注意匹配算法、分类损失、定位损失、正则化项、权重和参数等问题,并根据实际情况进行调整,以获得最佳的训练效果和检测性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。