国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

這篇具有很好參考價(jià)值的文章主要介紹了優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1、IoU

1.1 什么是IOU

?1.2 IOU代碼

2、GIOU

2.1 為什么提出GIOU

2.2 GIoU代碼

3 DIoU?

3.1 為什么提出DIOU

3.2 DIOU代碼

4 CIOU

4.1 為什么提出CIOU

4.2 CIOU代碼

5 EIOU

5.1 為什么提出EIOU?

5.2 EIOU代碼

6?Wise-IoU

7 YOLOv5中添加GIoU、DIoU、CIoU、EIoU、Wise-IoU損失函數(shù)


1、IoU

1.1 什么是IOU

論文鏈接為:UnitBox: An Advanced Object Detection Network

IoU 的全稱為交并比(Intersection over Union),通過這個(gè)名稱我們大概可以猜到 IoU 的計(jì)算方法。IoU 計(jì)算的是 “預(yù)測的邊框” 和 “真實(shí)的邊框” 的交集和并集的比值。計(jì)算過程如下:

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

其中,綠色面積代表預(yù)測框B與真實(shí)框A的交集;則

顯而易見,IOU的值越高也說明預(yù)測框與真實(shí)框重合程度越高,代表模型預(yù)測越準(zhǔn)確,反之,IOU越低模型性能越差。?

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

但是,IOU作為損失函數(shù)會(huì)出現(xiàn)以下問題:

  • 如果兩個(gè)框沒有相交,根據(jù)定義,IoU=0,不能度量IoU為零距離遠(yuǎn)近的程度。同時(shí)因?yàn)閘oss=0,沒有梯度回傳,無法進(jìn)行學(xué)習(xí)訓(xùn)練。
  • IoU無法精確的反映兩者的重合度大小。如下圖所示,三種情況IoU都相等,但看得出來他們的重合度是不一樣的,左邊的圖回歸的效果最好,右邊的最差。

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

?1.2 IOU代碼

import numpy as np
def Iou(box1, box2, wh=False):
    if wh == False:
	    xmin1, ymin1, xmax1, ymax1 = box1
	    xmin2, ymin2, xmax2, ymax2 = box2
    else:
	    xmin1, ymin1 = int(box1[0]-box1[2]/2.0), int(box1[1]-box1[3]/2.0)
	    xmax1, ymax1 = int(box1[0]+box1[2]/2.0), int(box1[1]+box1[3]/2.0)
	    xmin2, ymin2 = int(box2[0]-box2[2]/2.0), int(box2[1]-box2[3]/2.0)
	    xmax2, ymax2 = int(box2[0]+box2[2]/2.0), int(box2[1]+box2[3]/2.0)
    # 獲取矩形框交集對應(yīng)的左上角和右下角的坐標(biāo)(intersection)
    xx1 = np.max([xmin1, xmin2])
    yy1 = np.max([ymin1, ymin2])
    xx2 = np.min([xmax1, xmax2])
    yy2 = np.min([ymax1, ymax2])	
    # 計(jì)算兩個(gè)矩形框面積
    area1 = (xmax1-xmin1) * (ymax1-ymin1) 
    area2 = (xmax2-xmin2) * (ymax2-ymin2)
    inter_area = (np.max([0, xx2-xx1])) * (np.max([0, yy2-yy1])) #計(jì)算交集面積
    iou = inter_area / (area1+area2-inter_area+1e-6)  #計(jì)算交并比

    return iou

2、GIOU

論文鏈接:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression

2.1 為什么提出GIOU

為了解決上面兩個(gè)問題,這篇論文提出了GIOU。由于IoU是比值的概念,對目標(biāo)物體的scale是不敏感的。然而目標(biāo)檢測任務(wù)中的BBox的回歸損失(MSE loss, l1-smooth loss等)優(yōu)化和IoU優(yōu)化不是完全等價(jià)的,而且 Ln 范數(shù)對物體的scale也比較敏感,IoU無法直接優(yōu)化沒有重疊的部分。這篇論文提出可以直接把IoU設(shè)為回歸的loss。

GIOU的計(jì)算很簡單,對于兩個(gè)bounding box A和B。我們可以算出其最小凸集(同時(shí)包含了預(yù)測框和真實(shí)框的最小框的面積)C,有了最小凸集,就可以計(jì)算GIOU,如下所示

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

從公式可以看出,GIOU有幾個(gè)優(yōu)點(diǎn):

  • GIOU是IOU的下界,且取值范圍為(-1, 1]。當(dāng)兩個(gè)框不重合時(shí),IOU始終為0,不論A、B相隔多遠(yuǎn),但是對于GIOU來說,A,B不重合度越高(離的越遠(yuǎn)),GIOU越趨近于-1。
  • GIOU其實(shí)就是在IOU的基礎(chǔ)上減掉了一個(gè)東西,這個(gè)減掉的東西,避免了兩個(gè)bbox不重合時(shí)Loss為0的情況;
  • 可導(dǎo):這一點(diǎn)需要強(qiáng)調(diào)下,由于max,min,分段函數(shù)(比如ReLU)這些都是可導(dǎo)的,所以用1-GIOU作為Loss是可導(dǎo)的。
  • 與IoU只關(guān)注重疊區(qū)域不同,GIoU不僅關(guān)注重疊區(qū)域,還關(guān)注其他的非重合區(qū)域,能更好的反映兩者的重合度。

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

但是GIOU同樣存在一些問題,主要有:

  • 狀態(tài)1、2、3都是預(yù)測框在目標(biāo)框內(nèi)部且預(yù)測框大小一致的情況,這時(shí)預(yù)測框和目標(biāo)框的差集都是相同的,因此這三種狀態(tài)的GIOU值也都是相同的,這時(shí)GIOU退化成了IOU,無法區(qū)分相對位置關(guān)系;
  • GIOU收斂較慢、回歸不夠準(zhǔn)確。

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

2.2 GIoU代碼

import numpy as np

def Giou_np(bbox_p, bbox_g):
    """
    :param bbox_p: predict of bbox(N,4)(x1,y1,x2,y2)
    :param bbox_g: groundtruth of bbox(N,4)(x1,y1,x2,y2)
    :return:
    """
    # for details should go to https://arxiv.org/pdf/1902.09630.pdf
    # ensure predict's bbox form
    x1p = np.minimum(bbox_p[:, 0], bbox_p[:, 2]).reshape(-1,1)
    x2p = np.maximum(bbox_p[:, 0], bbox_p[:, 2]).reshape(-1,1)
    y1p = np.minimum(bbox_p[:, 1], bbox_p[:, 3]).reshape(-1,1)
    y2p = np.maximum(bbox_p[:, 1], bbox_p[:, 3]).reshape(-1,1)

    bbox_p = np.concatenate([x1p, y1p, x2p, y2p], axis=1)
    # calc area of Bg
    area_p = (bbox_p[:, 2] - bbox_p[:, 0]) * (bbox_p[:, 3] - bbox_p[:, 1])
    # calc area of Bp
    area_g = (bbox_g[:, 2] - bbox_g[:, 0]) * (bbox_g[:, 3] - bbox_g[:, 1])

    # cal intersection
    x1I = np.maximum(bbox_p[:, 0], bbox_g[:, 0])
    y1I = np.maximum(bbox_p[:, 1], bbox_g[:, 1])
    x2I = np.minimum(bbox_p[:, 2], bbox_g[:, 2])
    y2I = np.minimum(bbox_p[:, 3], bbox_g[:, 3])
    I = np.maximum((y2I - y1I), 0) * np.maximum((x2I - x1I), 0)

    # find enclosing box
    x1C = np.minimum(bbox_p[:, 0], bbox_g[:, 0])
    y1C = np.minimum(bbox_p[:, 1], bbox_g[:, 1])
    x2C = np.maximum(bbox_p[:, 2], bbox_g[:, 2])
    y2C = np.maximum(bbox_p[:, 3], bbox_g[:, 3])

    # calc area of Bc
    area_c = (x2C - x1C) * (y2C - y1C)
    U = area_p + area_g - I
    iou = 1.0 * I / U

    # Giou
    giou = iou - (area_c - U) / area_c

    # loss_iou = 1 - iou loss_giou = 1 - giou
    loss_iou = 1.0 - iou
    loss_giou = 1.0 - giou
    return giou, loss_iou, loss_giou

# def giou_tf




if __name__ == '__main__':

    p = np.array([[21,45,103,172],
                  [34,283,155,406],
                  [202,174,271,255]])
    g = np.array([[59,106,154,230],
                  [71,272,191,419],
                  [257,244,329,351]])
    Giou_np(p, g)

3 DIoU?

論文連接:Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

3.1 為什么提出DIOU

一個(gè)好的目標(biāo)框回歸函數(shù)應(yīng)該考慮三個(gè)重要幾何因素:重疊面積、中心點(diǎn)距離,長寬比。

針對IOU和GIOU存在的問題,作者從兩個(gè)方面進(jìn)行考慮

  • 如何最小化預(yù)測框和目標(biāo)框之間的歸一化距離?
  • 如何在預(yù)測框和目標(biāo)框重疊時(shí),回歸的更準(zhǔn)確?

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

?針對第一個(gè)問題,提出了DIOU_Loss(Distance_IOU_Loss)

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

DIOU_Loss考慮了重疊面積中心點(diǎn)距離,當(dāng)目標(biāo)框包裹預(yù)測框的時(shí)候,直接度量2個(gè)框的距離,因此DIOU_Loss收斂的更快。DIOU損失的優(yōu)點(diǎn)有:

  • 與GIoU loss類似,DIoU loss在與目標(biāo)框不重疊時(shí),仍然可以為邊界框提供移動(dòng)方向。
  • DIoU loss可以直接最小化兩個(gè)目標(biāo)框的距離,因此比GIoU loss收斂快得多。
  • 對于包含兩個(gè)框在水平方向和垂直方向上這種情況,DIoU損失可以使回歸非常快,而GIoU損失幾乎退化為IoU損失。
  • DIoU還可以替換普通的IoU評價(jià)策略,應(yīng)用于NMS中,使得NMS得到的結(jié)果更加合理和有效。

但DIOU同樣存在缺點(diǎn),那就是沒有考慮到長寬比。比如下面三種情況,目標(biāo)框包裹預(yù)測框,本來DIOU_Loss可以起作用。但預(yù)測框的中心點(diǎn)的位置都是一樣的,因此按照DIOU_Loss的計(jì)算公式,三者的值都是相同的。

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

3.2 DIOU代碼

def Diou(bboxes1, bboxes2):
    rows = bboxes1.shape[0]
    cols = bboxes2.shape[0]
    dious = torch.zeros((rows, cols))
    if rows * cols == 0:#
        return dious
    exchange = False
    if bboxes1.shape[0] > bboxes2.shape[0]:
        bboxes1, bboxes2 = bboxes2, bboxes1
        dious = torch.zeros((cols, rows))
        exchange = True
    # #xmin,ymin,xmax,ymax->[:,0],[:,1],[:,2],[:,3]
    w1 = bboxes1[:, 2] - bboxes1[:, 0]
    h1 = bboxes1[:, 3] - bboxes1[:, 1] 
    w2 = bboxes2[:, 2] - bboxes2[:, 0]
    h2 = bboxes2[:, 3] - bboxes2[:, 1]
    
    area1 = w1 * h1
    area2 = w2 * h2

    center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2 
    center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2 
    center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2
    center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2

    inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:]) 
    inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2]) 
    out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:]) 
    out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2])

    inter = torch.clamp((inter_max_xy - inter_min_xy), min=0)
    inter_area = inter[:, 0] * inter[:, 1]
    inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2
    outer = torch.clamp((out_max_xy - out_min_xy), min=0)
    outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2)
    union = area1+area2-inter_area
    dious = inter_area / union - (inter_diag) / outer_diag
    dious = torch.clamp(dious,min=-1.0,max = 1.0)
    if exchange:
        dious = dious.T
    return dious

4 CIOU

論文鏈接:Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression

4.1 為什么提出CIOU

?CIOU論文考慮到bbox回歸三要素中的長寬比還沒被考慮到計(jì)算中,因此,進(jìn)一步在DIoU的基礎(chǔ)上提出了CIoU。其懲罰項(xiàng)如下面公式:

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

其中是權(quán)重函數(shù),而用來度量長寬比的相似性,定義為

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

?完整的CIOU損失函數(shù)定義:

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

4.2 CIOU代碼

def bbox_overlaps_ciou(bboxes1, bboxes2):
    rows = bboxes1.shape[0]
    cols = bboxes2.shape[0]
    cious = torch.zeros((rows, cols))
    if rows * cols == 0:
        return cious
    exchange = False
    if bboxes1.shape[0] > bboxes2.shape[0]:
        bboxes1, bboxes2 = bboxes2, bboxes1
        cious = torch.zeros((cols, rows))
        exchange = True

    w1 = bboxes1[:, 2] - bboxes1[:, 0]
    h1 = bboxes1[:, 3] - bboxes1[:, 1]
    w2 = bboxes2[:, 2] - bboxes2[:, 0]
    h2 = bboxes2[:, 3] - bboxes2[:, 1]

    area1 = w1 * h1
    area2 = w2 * h2

    center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2
    center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2
    center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2
    center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2

    inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:])
    inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2])
    out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:])
    out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2])

    inter = torch.clamp((inter_max_xy - inter_min_xy), min=0)
    inter_area = inter[:, 0] * inter[:, 1]
    inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2
    outer = torch.clamp((out_max_xy - out_min_xy), min=0)
    outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2)
    union = area1+area2-inter_area
    u = (inter_diag) / outer_diag
    iou = inter_area / union
    with torch.no_grad():
        arctan = torch.atan(w2 / h2) - torch.atan(w1 / h1)
        v = (4 / (math.pi ** 2)) * torch.pow((torch.atan(w2 / h2) - torch.atan(w1 / h1)), 2)
        S = 1 - iou
        alpha = v / (S + v)
        w_temp = 2 * w1
    ar = (8 / (math.pi ** 2)) * arctan * ((w1 - w_temp) * h1)
    cious = iou - (u + alpha * ar)
    cious = torch.clamp(cious,min=-1.0,max = 1.0)
    if exchange:
        cious = cious.T
    return cious

5 EIOU

論文鏈接:Focal and Efficient IOU Loss for Accurate Bounding Box Regression

5.1 為什么提出EIOU?

CIOU Loss雖然考慮了邊界框回歸的重疊面積、中心點(diǎn)距離、縱橫比。但是通過其公式中的v反映的縱橫比的差異,而不是寬高分別與其置信度的真實(shí)差異,所以有時(shí)會(huì)阻礙模型有效的優(yōu)化相似性,于是提出EIOU,它的主要思想是:

  • ?一是認(rèn)為CIoU loss對于長寬比加入loss的設(shè)計(jì)不太合理,于是將CIoU loss中反應(yīng)長寬比一致性的部分替換成了分別對于長和寬的一致性loss,形成了EIoU loss。
  • ? ? ? ? 二是認(rèn)為不太好的回歸樣本對回歸loss產(chǎn)生了比較大的影響,回歸質(zhì)量相對較好的樣本則難以進(jìn)一步優(yōu)化,所以論文提出Focal EIoU loss進(jìn)行回歸質(zhì)量較好和質(zhì)量較差的樣本之間的平衡。

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

EIOU Loss優(yōu)點(diǎn):

  • 1)將縱橫比的損失項(xiàng)拆分成預(yù)測的寬高分別與最小外接框?qū)捀叩牟钪?,加速了收斂提高了回歸精度。
  • 2)引入了Focal Loss優(yōu)化了邊界框回歸任務(wù)中的樣本不平衡問題,即減少與目標(biāo)框重疊較少的大量錨框?qū)Box 回歸的優(yōu)化貢獻(xiàn),使回歸過程專注于高質(zhì)量錨框。

5.2 EIOU代碼

def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False,  EIoU=False, eps=1e-7):
    # Returns the IoU of box1 to box2. box1 is 4, box2 is nx4
    box2 = box2.T

    # Get the coordinates of bounding boxes
    if x1y1x2y2:  # x1, y1, x2, y2 = box1
        b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]
        b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]
    else:  # transform from xywh to xyxy
        b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2
        b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2
        b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2
        b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2

    # Intersection area
    inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
            (torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0)

    # Union Area
    w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps
    w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps
    union = w1 * h1 + w2 * h2 - inter + eps

    iou = inter / union
    if GIoU or DIoU or CIoU or EIoU:
        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 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) - torch.atan(w1 / h1), 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

6?Wise-IoU

論文鏈接:Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism

具體關(guān)于Wise-IoU損失的介紹請參考前期博客

優(yōu)化改進(jìn)YOLOv5算法之Wise-IOU損失函數(shù)_yolov5算法優(yōu)化_AI追隨者的博客-CSDN博客

7 YOLOv5中添加GIoU、DIoU、CIoU、EIoU、Wise-IoU損失函數(shù)

?yolov5-6.1版本中的iou損失函數(shù)是在utils/metrics.py文件定義的,在該文件添加以下關(guān)于GIoU、DIoU、CIoU、EIoU、Wise-IoU函數(shù)的代碼,如下所示

import numpy as np
import torch, math
 
class WIoU_Scale:
    ''' monotonous: {
            None: origin v1
            True: monotonic FM v2
            False: non-monotonic FM v3
        }
        momentum: The momentum of running mean'''
    
    iou_mean = 1.
    monotonous = False
    _momentum = 1 - 0.5 ** (1 / 7000)
    _is_train = True
 
    def __init__(self, iou):
        self.iou = iou
        self._update(self)
    
    @classmethod
    def _update(cls, self):
        if cls._is_train: cls.iou_mean = (1 - cls._momentum) * cls.iou_mean + \
                                         cls._momentum * self.iou.detach().mean().item()
    
    @classmethod
    def _scaled_loss(cls, self, gamma=1.9, delta=3):
        if isinstance(self.monotonous, bool):
            if self.monotonous:
                return (self.iou.detach() / self.iou_mean).sqrt()
            else:
                beta = self.iou.detach() / self.iou_mean
                alpha = delta * torch.pow(gamma, beta - delta)
                return beta / alpha
        return 1
    
 
def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, SIoU=False, EIoU=False, WIoU=False, Focal=False, alpha=1, gamma=0.5, scale=False, eps=1e-7):
    # Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)
 
    # Get the coordinates of bounding boxes
    if xywh:  # transform from xywh to xyxy
        (x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)
        w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2
        b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_
        b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_
    else:  # x1, y1, x2, y2 = box1
        b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, -1)
        b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, -1)
        w1, h1 = b1_x2 - b1_x1, (b1_y2 - b1_y1).clamp(eps)
        w2, h2 = b2_x2 - b2_x1, (b2_y2 - b2_y1).clamp(eps)
 
    # Intersection area
    inter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp(0) * \
            (b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp(0)
 
    # Union Area
    union = w1 * h1 + w2 * h2 - inter + eps
    if scale:
        self = WIoU_Scale(1 - (inter / union))
 
    # IoU
    # iou = inter / union # ori iou
    iou = torch.pow(inter/(union + eps), alpha) # alpha iou
    if CIoU or DIoU or GIoU or EIoU or SIoU or WIoU:
        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 or EIoU or SIoU or WIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
            c2 = (cw ** 2 + ch ** 2) ** alpha + eps  # convex diagonal squared
            rho2 = (((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4) ** alpha  # 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_ciou = v / (v - iou + (1 + eps))
                if Focal:
                    return iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, alpha)), torch.pow(inter/(union + eps), gamma)  # Focal_CIoU
                else:
                    return iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, 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 = torch.pow(cw ** 2 + eps, alpha)
                ch2 = torch.pow(ch ** 2 + eps, alpha)
                if Focal:
                    return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2), torch.pow(inter/(union + eps), gamma) # Focal_EIou
                else:
                    return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2) # EIou
            elif SIoU:
                # SIoU Loss https://arxiv.org/pdf/2205.12740.pdf
                s_cw = (b2_x1 + b2_x2 - b1_x1 - b1_x2) * 0.5 + eps
                s_ch = (b2_y1 + b2_y2 - b1_y1 - b1_y2) * 0.5 + eps
                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 = torch.cos(torch.arcsin(sin_alpha) * 2 - math.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)
                if Focal:
                    return iou - torch.pow(0.5 * (distance_cost + shape_cost) + eps, alpha), torch.pow(inter/(union + eps), gamma) # Focal_SIou
                else:
                    return iou - torch.pow(0.5 * (distance_cost + shape_cost) + eps, alpha) # SIou
            elif WIoU:
                if Focal:
                    raise RuntimeError("WIoU do not support Focal.")
                elif scale:
                    return getattr(WIoU_Scale, '_scaled_loss')(self), (1 - iou) * torch.exp((rho2 / c2)), iou # WIoU https://arxiv.org/abs/2301.10051
                else:
                    return iou, torch.exp((rho2 / c2)) # WIoU v1
            if Focal:
                return iou - rho2 / c2, torch.pow(inter/(union + eps), gamma)  # Focal_DIoU
            else:
                return iou - rho2 / c2  # DIoU
        c_area = cw * ch + eps  # convex area
        if Focal:
            return iou - torch.pow((c_area - union) / c_area + eps, alpha), torch.pow(inter/(union + eps), gamma)  # Focal_GIoU https://arxiv.org/pdf/1902.09630.pdf
        else:
            return iou - torch.pow((c_area - union) / c_area + eps, alpha)  # GIoU https://arxiv.org/pdf/1902.09630.pdf
    if Focal:
        return iou, torch.pow(inter/(union + eps), gamma)  # Focal_IoU
    else:
        return iou  # IoU

然后在utils/loss.py文件中調(diào)用bbox_iou損失函數(shù)時(shí),將對應(yīng)的IOU設(shè)置為True即可。?

優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))

參考文章:【深度學(xué)習(xí)小知識(shí)】目標(biāo)檢測中的IOU、GIOU、DIOU、CIOU、EIOU等理論解析_你好?。海┑牟┛?CSDN博客?深入淺出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基礎(chǔ)知識(shí)完整講解 - 知乎

詳解IoU、GIoU、DIoU、CIoU、EIoU和DIoU-NMS_小Aer的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-443691.html

到了這里,關(guān)于優(yōu)化改進(jìn)YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模塊(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • yolov5使用最新MPDIOU損失函數(shù),有效和準(zhǔn)確的邊界盒回歸的損失,優(yōu)于GIoU/EIoU/CIoU/EIoU(附代碼可用)

    yolov5使用最新MPDIOU損失函數(shù),有效和準(zhǔn)確的邊界盒回歸的損失,優(yōu)于GIoU/EIoU/CIoU/EIoU(附代碼可用)

    MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (一個(gè)有效和準(zhǔn)確的邊界框損失回歸函數(shù)) 論文地址 1.1. 主要目的 當(dāng)預(yù)測框與邊界框具有相同的縱橫比,但寬度和高度值完全不同時(shí),大多數(shù)現(xiàn)有的邊界框回歸損失函數(shù)都無法優(yōu)化。 為了解決上述問題,MPDIoU充分挖掘水平矩形

    2024年02月07日
    瀏覽(25)
  • 《一文搞懂IoU發(fā)展歷程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

    《一文搞懂IoU發(fā)展歷程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU

    IoU出現(xiàn)背景 目標(biāo)檢測任務(wù)的損失函數(shù)一般由 Classificition Loss (分類損失函數(shù))和 Bounding Box Regeression Loss (回歸損失函數(shù))兩部分構(gòu)成。因此,更好的定位有利于模型精度的提高。在 IoU Loss 提出來之前,檢測上有關(guān)候選框的回歸主要是通過坐標(biāo)的回歸損失來優(yōu)化。但 L1 Loss 和

    2023年04月08日
    瀏覽(16)
  • 損失函數(shù):IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU超詳細(xì)精講及Pytorch實(shí)現(xiàn)

    損失函數(shù):IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU超詳細(xì)精講及Pytorch實(shí)現(xiàn)

    ? ? ?損失函數(shù) 是 用來評價(jià)模型的預(yù)測值和真實(shí)值不一樣的程度 ,損失函數(shù)越小,通常模型的性能越好。不同的模型用的損失函數(shù)一般也不一樣。 ? ? ? 損失函數(shù)的使用主要是在模型的訓(xùn)練階段 ,如果我們想讓預(yù)測值無限接近于真實(shí)值,就需要將損失值降到最低, 在這個(gè)

    2024年02月09日
    瀏覽(19)
  • 【目標(biāo)檢測中對IoU的改進(jìn)】GIoU,DIoU,CIoU的詳細(xì)介紹

    【目標(biāo)檢測中對IoU的改進(jìn)】GIoU,DIoU,CIoU的詳細(xì)介紹

    IoU為交并比,即對于pred和Ground Truth:交集/并集 1、IoU可以作為評價(jià)指標(biāo)使用,也可以用于構(gòu)建IoU loss = 1 - IoU 缺點(diǎn): 2、對于pred和GT相交的情況下,IoU loss可以被反向傳播,因?yàn)镮oU不為0,可以計(jì)算梯度。但是二者不相交的話,梯度將會(huì)為0,無法優(yōu)化。 3、pred和GT不相交時(shí),Io

    2024年02月12日
    瀏覽(21)
  • YOLOv5改進(jìn)系列(11)——添加損失函數(shù)之EIoU、AlphaIoU、SIoU、WIoU

    YOLOv5改進(jìn)系列(11)——添加損失函數(shù)之EIoU、AlphaIoU、SIoU、WIoU

    【YOLOv5改進(jìn)系列】前期回顧: YOLOv5改進(jìn)系列(0)——重要性能指標(biāo)與訓(xùn)練結(jié)果評價(jià)及分析 YOLOv5改進(jìn)系列(1)——添加SE注意力機(jī)制

    2024年02月11日
    瀏覽(21)
  • 優(yōu)化改進(jìn)YOLOv5算法之添加SE、CBAM、CA模塊(超詳細(xì))

    優(yōu)化改進(jìn)YOLOv5算法之添加SE、CBAM、CA模塊(超詳細(xì))

    目錄 1 SENet 1.1 SENet原理 1.2?SENet代碼(Pytorch) 1.3?YOLOv5中加入SE模塊? 1.3.1?common.py配置 1.3.2?yolo.py配置 1.3.3 創(chuàng)建添加RepVGG模塊的YOLOv5的yaml配置文件 2 CBAM 2.1 CBAM原理 2.2?CBAM代碼(Pytorch) 2.3?YOLOv5中加入CBAM模塊? 2.3.1?common.py配置 2.3.2?yolo.py配置 2.3.3 創(chuàng)建添加CBAM模塊的YOLOv5的yaml配

    2024年04月17日
    瀏覽(124)
  • 目標(biāo)檢測中的損失函數(shù)IoU、GIoU、DIoU、CIoU、SIoU

    目標(biāo)檢測中的損失函數(shù)IoU、GIoU、DIoU、CIoU、SIoU

    IoU損失是目標(biāo)檢測中最常見的損失函數(shù),表示的就是真實(shí)框和預(yù)測框的交并比,數(shù)學(xué)公式如下: I o U = ∣ A ∩ B ∣ ∣ A ∪ B ∣ IoU =frac{|A cap B|}{|A cup B|} I o U = ∣ A ∪ B ∣ ∣ A ∩ B ∣ ? L o s s I o U = 1 ? I o U Loss_{IoU}=1-IoU L o s s I o U ? = 1 ? I o U IoU損失會(huì)有兩個(gè)主要的缺點(diǎn) 當(dāng)

    2024年02月04日
    瀏覽(21)
  • IoU Loss綜述(IOU,GIOU,CIOU,EIOU,SIOU,WIOU)

    IoU Loss綜述(IOU,GIOU,CIOU,EIOU,SIOU,WIOU)

    ????????邊界框回歸(BBR)的損失函數(shù)對于目標(biāo)檢測至關(guān)重要。它的良好定義將為模型帶來顯著的性能改進(jìn)。大多數(shù)現(xiàn)有的工作假設(shè)訓(xùn)練數(shù)據(jù)中的樣本是高質(zhì)量的,并側(cè)重于增強(qiáng)BBR損失的擬合能力。 ????????最初的基于回歸的BBR損失定義為L2-norm,L2-norm損失主要有兩個(gè)

    2023年04月09日
    瀏覽(22)
  • 【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化

    【Yolov5】Yolov5添加ASFF, 網(wǎng)絡(luò)改進(jìn)優(yōu)化

    ?????? Yolov5添加ASFF ?????? Yolov5是單階段目標(biāo)檢測算法的一種,網(wǎng)上有很多改進(jìn)其性能的方法,添加ASFF模塊就是其中一種,但是ASFF本身是用于Yolov3的,在v5中無法直接應(yīng)用,且網(wǎng)上許多博客都是介紹這個(gè)模塊的原理,沒有直接可以應(yīng)用的代碼程序,我這里提供一種方案

    2023年04月08日
    瀏覽(75)
  • 目標(biāo)檢測算法——YOLOv5/v7/v8改進(jìn)結(jié)合漲點(diǎn)Trick之Wise-IoU(超越CIOU/SIOU)

    目標(biāo)檢測算法——YOLOv5/v7/v8改進(jìn)結(jié)合漲點(diǎn)Trick之Wise-IoU(超越CIOU/SIOU)

    ? 近年來的研究大多假設(shè)訓(xùn)練數(shù)據(jù)中的示例有較高的質(zhì)量,致力于強(qiáng)化邊界框損失的擬合能力。 但注意到目標(biāo)檢測訓(xùn)練集中含有低質(zhì)量示例,如果一味地強(qiáng)化邊界框?qū)Φ唾|(zhì)量示例的回歸,顯然會(huì)危害模型檢測性能的提升。 Focal-EIoU v1 被提出以解決這個(gè)問題,但由于其聚焦機(jī)

    2023年04月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包