自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

YOLOv8 中的損失函數(shù)解析

開發(fā)
在本文中,我們將詳細介紹YOLOv8中使用的五個損失函數(shù)。請注意,我們將僅討論YOLOv8倉庫中配置的默認損失函數(shù)。

介紹

YOLO長期以來一直是目標檢測任務(wù)的首選模型之一。它既快速又準確。此外,其API簡潔易用。運行訓(xùn)練或推斷作業(yè)所需的代碼行數(shù)有限。在2023年下半年,YOLOv8在框架中引入了姿態(tài)估計后,該框架現(xiàn)在支持最多四個任務(wù),包括分類、目標檢測、實例分割和姿態(tài)估計。

在本文中,我們將詳細介紹YOLOv8中使用的五個損失函數(shù)。請注意,我們將僅討論YOLOv8倉庫中配置的默認損失函數(shù)。此外,我們還將僅關(guān)注代表性參數(shù),跳過一些標量和常數(shù)以進行歸一化或縮放,以便更好地理解。YOLOv8中對應(yīng)的任務(wù)和損失函數(shù)可見于圖1。接下來我們將分別對每一個進行討論。

IoU損失

cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) width
ch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1)  # convex height

if CIoU or DIoU:  # 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 dist ** 2
  
  if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
     v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2)
     with torch.no_grad():
       alpha = v / (v - iou + (1 + eps))
     return iou - (rho2 / c2 + v * alpha)  # CIoU

當考慮評估邊界框準確度的方式時,交并比(IoU)指標可能是大多數(shù)人首先想到的一個指標。IoU度量了預(yù)測的邊界框與實際邊界框之間的重疊程度。它也可以作為一個損失函數(shù),只需將IoU轉(zhuǎn)換為1-IoU。

在YOLOv8中,修訂后的版本,完全IoU(CIoU)1被應(yīng)用于衡量預(yù)測邊界框與實際邊界框之間的差異。CIoU是一個綜合性指標,它考慮了邊界框之間的三個屬性:

  • 重疊比
  • 中心點之間的距離
  • 長寬比 

CIoU的方程可在圖2右側(cè)找到。重疊比、中心點距離和長寬比這三個因素分別由方程中的各項表示。方程中涉及的關(guān)鍵參數(shù)在左側(cè)的圖中進行了說明,其中p和g表示預(yù)測和實際情況,b、w和h分別是相應(yīng)邊界框的中心、寬度和高度。參數(shù)c是包圍邊界框的對角線(灰色虛線矩形)而ρ是歐氏距離。除了分類任務(wù)外,IoU損失在YOLOv8中的所有其他任務(wù)中都會應(yīng)用。

分布焦點損失(DFL)


def _df_loss(pred_dist, target):
    """Return sum of left and right DFL losses."""
    # Distribution Focal Loss (DFL) proposed in Generalized Focal Loss https://ieeexplore.ieee.org/document/9792391
    tl = target.long()  # target left
    tr = tl + 1  # target right
    wl = tr - target  # weight left
    wr = 1 - wl  # weight right
    return (F.cross_entropy(pred_dist, tl.view(-1), reduction='none').view(tl.shape) * wl +
            F.cross_entropy(pred_dist, tr.view(-1), reduction='none').view(tl.shape) * wr).mean(-1, keepdim=True)

另一個與邊界框相關(guān)的損失函數(shù)是分布焦點損失(DFL)2。DFL關(guān)注的是邊界框回歸的分布差異。YOLOv8中的網(wǎng)絡(luò)不是直接預(yù)測邊界框,而是預(yù)測邊界框的概率分布。它旨在解決邊界模糊或部分遮擋的挑戰(zhàn)性對象。

關(guān)鍵點損失

loss[1] += self.keypoint_loss(pred_kpt, gt_kpt, kpt_mask, area)

area:bounding box area

class KeypointLoss(nn.Module):

  def forward(self, pred_kpts, gt_kpts, kpt_mask, area):
        """Calculates keypoint loss factor and Euclidean distance loss for predicted and actual keypoints."""
        d = (pred_kpts[..., 0] - gt_kpts[..., 0]) ** 2 + (pred_kpts[..., 1] - gt_kpts[..., 1]) ** 2
        kpt_loss_factor = (torch.sum(kpt_mask != 0) + torch.sum(kpt_mask == 0)) / (torch.sum(kpt_mask != 0) + 1e-9)
        # e = d / (2 * (area * self.sigmas) ** 2 + 1e-9)  # from formula
        e = d / (2 * self.sigmas) ** 2 / (area + 1e-9) / 2  # from cocoeval
        return kpt_loss_factor * ((1 - torch.exp(-e)) * kpt_mask).mean()

在YOLOv8中,首次將姿態(tài)估計任務(wù)納入到框架中。姿態(tài)由一組關(guān)鍵點的坐標和順序定義。關(guān)鍵點損失監(jiān)控了預(yù)測和實際關(guān)鍵點之間的相似性。兩個對應(yīng)關(guān)鍵點之間的歐幾里得距離是關(guān)鍵點損失的主要組成部分。此外,每個關(guān)鍵點都帶有一個權(quán)重σ,定義了關(guān)鍵點的重要性,默認值為1/關(guān)鍵點數(shù)。例如,如果姿態(tài)有四個關(guān)鍵點,則所有關(guān)鍵點的權(quán)重為1/4 = 0.25。

關(guān)鍵點目標損失

import torch.nn as nn
loss[2] = nn.BCEWithLogitsLoss(pred_kpt[..., 2], kpt_mask.float())

在大多數(shù)姿態(tài)估計訓(xùn)練中,我們可以定義每個關(guān)鍵點的可見性。Python腳本中的參數(shù)kpt_mask攜帶了我們在標簽中定義的可見性(1/0)。關(guān)鍵點目標損失計算關(guān)鍵點存在的距離。在YOLOv8中,距離由預(yù)測值和實際值的二元交叉熵(BCE)測量。

分類損失和掩碼損失

import torch.nn as nn

loss[3] = nn.BCEWithLogitLoss(pred_scores, target_scores.to(dtype)).sum() / target_scores_sum  # BCE

分類損失是涉及到所有任務(wù)的唯一損失函數(shù)。無論我們是在進行分類、目標檢測、分割還是姿態(tài)估計,圖像或特定對象的類別(例如貓、狗、人等)的推斷結(jié)果之間的距離都是通過二元交叉熵(BCE)計算的。

它還適用于實例分割中的掩碼損失。掩碼損失將每個像素視為一個對象,并計算相關(guān)的BCE值。在圖5中計算了一個3x3的預(yù)測掩碼和相應(yīng)的掩碼損失。

總損失

# yolo/cfg/default.yaml
...
box: 7.5  # box loss gain
cls: 0.5  # cls loss gain (scale with pixels)
dfl: 1.5  # dfl loss gain
pose: 12.0  # pose loss gain
kobj: 1.0  # keypoint obj loss gain
...

好了,以上我們已經(jīng)介紹了所有六個損失。在網(wǎng)絡(luò)應(yīng)用反向傳播并更新其參數(shù)之前,將損失與相應(yīng)的權(quán)重相加。權(quán)重在配置文件default.yaml中定義,如上所示。如果您想在訓(xùn)練階段動態(tài)調(diào)整權(quán)重,您可以考慮直接在存儲庫中使用下面提供的代碼片段。

loss[0] *= self.hyp.box  # box gain
loss[1] *= self.hyp.pose / batch_size  # pose gain
loss[2] *= self.hyp.kobj / batch_size  # kobj gain
loss[3] *= self.hyp.cls  # cls gain
loss[4] *= self.hyp.dfl  # dfl gain

return loss.sum() * batch_size, loss.detach()

總結(jié) 

YOLO是一個為目標檢測任務(wù)而知名的框架。除了在效率和準確性方面的表現(xiàn)之外,它還在不斷更新最新的研究成果。這是一個讓計算機視覺從業(yè)者跟蹤和學(xué)習(xí)入選技術(shù)的好框架。損失函數(shù)在模型訓(xùn)練中起著重要作用,并決定了最終的準確性。

責任編輯:趙寧寧 來源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2024-07-22 13:49:38

YOLOv8目標檢測開發(fā)

2025-02-24 09:50:21

2024-01-29 09:29:02

計算機視覺模型

2024-11-28 10:04:14

2024-11-18 17:31:27

2024-10-25 08:30:57

計算機視覺神經(jīng)網(wǎng)絡(luò)YOLOv8模型

2024-07-11 08:25:34

2025-02-07 14:52:11

2023-02-02 09:00:00

2023-06-18 23:00:39

神經(jīng)網(wǎng)絡(luò)損失函數(shù)隨機變量

2025-01-24 07:37:19

計算機視覺熱力圖YOLOv8

2024-10-10 17:05:00

2024-10-16 16:49:44

定向邊界框目標檢測YOLOv8

2024-08-27 12:40:59

2024-09-09 16:35:10

YOLO模型

2023-12-11 10:18:38

YOLOv8檢測器實戰(zhàn)

2025-01-21 11:41:14

2019-10-08 15:39:54

人工智能損失函數(shù)網(wǎng)絡(luò)

2024-07-01 12:55:50

2024-11-05 12:56:06

機器學(xué)習(xí)函數(shù)MSE
點贊
收藏

51CTO技術(shù)棧公眾號