<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          DIoU和CIoU:更快更好的邊界框回歸損失

          共 6169字,需瀏覽 13分鐘

           ·

          2022-07-31 19:44

          點(diǎn)藍(lán)色字關(guān)注“機(jī)器學(xué)習(xí)算法工程師

          設(shè)為星標(biāo),干貨直達(dá)!

          邊界框回歸(Bounding Box Regression)是物體檢測(cè)中重要的一項(xiàng)任務(wù),之前大部分的物體檢測(cè)模型是直接對(duì)邊界框的位置(中心點(diǎn))和大小(寬和高)進(jìn)行回歸,采用的損失函數(shù)往往是L1 norm和L2 norm,比如YOLOv1采用平方差損失,F(xiàn)aster RCNN采用smooth L1損失。不過(guò)近來(lái)的工作發(fā)現(xiàn),直接采用IoU損失往往能得到更好的效果,因?yàn)镮oU也是物體檢測(cè)模型mAP的評(píng)測(cè)標(biāo)準(zhǔn)。GIoU損失更近一步地對(duì)IoU損失進(jìn)行了優(yōu)化,解決了預(yù)測(cè)框和目標(biāo)框無(wú)任何重疊時(shí)的場(chǎng)景(此時(shí)IoU loss無(wú)梯度)。DIoU損失是GIoU損失的近一步優(yōu)化,它不僅比GIoU損失的收斂速度更快,也能夠?qū)崿F(xiàn)更好的性能,目前也被廣泛應(yīng)用在物體檢測(cè)模型中,如YOLOv5。

          IoU和GIoU損失

          IoU是物體檢測(cè)模型邊界框定位準(zhǔn)確度的評(píng)價(jià)指標(biāo),它也可以用于邊界框的回歸損失,即IoU損失:

          這里為檢測(cè)模型預(yù)測(cè)的邊界框,而是目標(biāo)框。IoU損失是直接優(yōu)化預(yù)測(cè)框和目標(biāo)框的IoU,要比L1和L2損失更直接一些,另外L1和L2損失對(duì)邊界框的大小敏感,而IoU損失則不會(huì)。由于預(yù)測(cè)框和目標(biāo)框不重疊時(shí)IoU永遠(yuǎn)為0,所以IoU損失在此時(shí)就無(wú)法提供梯度。GIoU損失通過(guò)引入一個(gè)懲罰項(xiàng)來(lái)解決這個(gè)問(wèn)題,其計(jì)算如下:

          這里為包含的最小矩形框,當(dāng)預(yù)測(cè)框和目標(biāo)框不重疊時(shí),雖然IoU是0,但是增加的懲罰項(xiàng)將起作用,此時(shí)依然能夠產(chǎn)生梯度,所以GIoU損失將比IoU損失有更快的收斂速度。

          DIoU損失

          雖然GIoU損失解決了IoU損失在預(yù)測(cè)框和目標(biāo)框不重疊時(shí)梯度為0的問(wèn)題,但DIoU這篇工作發(fā)現(xiàn)GIoU損失依然存在收斂速度慢和回歸不準(zhǔn)確的問(wèn)題。首先,當(dāng)預(yù)測(cè)框和目標(biāo)框不重疊時(shí),GIoU損失先傾向于增加預(yù)測(cè)框的大小以使得預(yù)測(cè)框和目標(biāo)框重疊,之后IoU損失將起主要作用來(lái)最大化兩者的IoU,如下圖所示,這個(gè)優(yōu)化過(guò)程并不是最優(yōu)的,所以收斂速度較慢。

          另外一個(gè)問(wèn)題是,當(dāng)預(yù)測(cè)框和目標(biāo)框存在包含關(guān)系時(shí),此時(shí)GIoU損失完全退化為IoU損失,如下圖所示,此時(shí)預(yù)測(cè)框完全被包含在目標(biāo)框中,GIoU損失的懲罰項(xiàng)為0,GIoU損失和IoU損失相等。此外,三種情況預(yù)測(cè)框的位置不同,但是IoU損失是相同的,所以IoU損失無(wú)法進(jìn)一步區(qū)分它們的差異。

          綜上,GIoU由于優(yōu)化路徑并不是最優(yōu)的以及比較依賴(lài)IoU損失項(xiàng),所以它可能需要較長(zhǎng)的迭代才能收斂。與GIoU不同,DIoU損失(Distance-IoU Loss)引入的懲罰項(xiàng)是直接最小化預(yù)測(cè)框和目標(biāo)框中心點(diǎn)的歸一化距離,計(jì)算如下所示:

          這里是預(yù)測(cè)框和目標(biāo)框的中心點(diǎn),是計(jì)算兩個(gè)中心點(diǎn)之間的歐式距離,是包含預(yù)測(cè)框和目標(biāo)框的最小矩形框的對(duì)角線長(zhǎng)度,下圖為一個(gè)直觀展示:當(dāng)預(yù)測(cè)框和目標(biāo)框不重疊時(shí),此時(shí)DIoU損失的懲罰項(xiàng)起主要作用,使得預(yù)測(cè)框移到和目標(biāo)框重疊的位置,這比GIoU損失更直接,所以收斂速度也越快。當(dāng)預(yù)測(cè)框和目標(biāo)框存在包含關(guān)系時(shí),DIoU損失的懲罰項(xiàng)依然也存在作用,對(duì)于之前的三種情況,雖然IoU損失和GIoU損失都是一樣的,但是DIoU損失是不一樣的,其中預(yù)測(cè)框和目標(biāo)框的中心點(diǎn)重合時(shí)DIoU損失較小,這也是比較合理的。論文中設(shè)計(jì)了一個(gè)仿真實(shí)驗(yàn)來(lái)定量分析,如下圖所示,在(10, 10)位置設(shè)定7個(gè)不同大小和高寬比的目標(biāo)框,然后考慮在以(10, 10)為圓心且半徑為10的圓內(nèi)均勻選擇5000個(gè)位置,每個(gè)位置放置7種不同大小和7種不同高寬比的錨框,所以總共有7x5000x7x7個(gè)回歸實(shí)驗(yàn),考慮了不同情況下的邊界框回歸。右圖為不同的損失函數(shù)的收斂曲線,這里縱坐標(biāo)是所有實(shí)驗(yàn)的回歸誤差(這里統(tǒng)一計(jì)算L1 norm)之和,可以看到GIoU損失的收斂速度比IoU損失要快,而DIoU損失進(jìn)一步加快了收斂速度,200個(gè)迭代下DIoU損失也可以得到更低的誤差。

          image.png

          下圖進(jìn)一步給出了不同位置的迭代到最后的誤差,如果采用IoU損失,只有anchor和目標(biāo)框有重疊時(shí)才有效,所以只有中間的一部分位置上誤差比較低;而GIoU損失可以解決不重疊的情況,所以大部分的位置都可以得到較低的誤差,但是在水平和垂直的一部分邊緣位置上誤差較大,這主要是因?yàn)檫@些位置容易出現(xiàn)目標(biāo)框被包含在預(yù)測(cè)框中,此時(shí)GIoU損失的懲罰項(xiàng)失去作用,從而收斂較慢;對(duì)于DIoU損失,其在所有的位置均能夠得到較小的誤差,這說(shuō)明DIoU損失不僅能解決非重疊問(wèn)題,而且收斂速度更快。目前torchvision庫(kù)已經(jīng)實(shí)現(xiàn)了DIoU損失,其實(shí)現(xiàn)代碼如下所示:

          def _diou_iou_loss(
              boxes1: torch.Tensor,
              boxes2: torch.Tensor,
              eps: float = 1e-7,
          )
           -> Tuple[torch.Tensor, torch.Tensor]:

              
              # 計(jì)算IoU
              intsct, union = _loss_inter_union(boxes1, boxes2)
              iou = intsct / (union + eps)
              # 計(jì)算最小包絡(luò)矩形
              x1, y1, x2, y2 = boxes1.unbind(dim=-1)
              x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1)
              xc1 = torch.min(x1, x1g)
              yc1 = torch.min(y1, y1g)
              xc2 = torch.max(x2, x2g)
              yc2 = torch.max(y2, y2g)
              # 計(jì)算對(duì)角線平方
              diagonal_distance_squared = ((xc2 - xc1) ** 2) + ((yc2 - yc1) ** 2) + eps
              # 中心點(diǎn)
              x_p = (x2 + x1) / 2
              y_p = (y2 + y1) / 2
              x_g = (x1g + x2g) / 2
              y_g = (y1g + y2g) / 2
              # 中心點(diǎn)的歐式距離
              centers_distance_squared = ((x_p - x_g) ** 2) + ((y_p - y_g) ** 2)
              loss = 1 - iou + (centers_distance_squared / diagonal_distance_squared)
              return loss, iou

          CIoU損失

          除了DIoU損失,論文還提出了一個(gè)更全面的回歸損失:CIoU損失Complete IoU Loss),它相比DIoU損失還增加了對(duì)高寬比的約束,其計(jì)算公式如下:

          這里的用于計(jì)算預(yù)測(cè)框和目標(biāo)框的高寬比的一致性,這里是用tan角來(lái)衡量:

          是一個(gè)平衡參數(shù)(這個(gè)系數(shù)不參與梯度計(jì)算),這里根據(jù)IoU值來(lái)賦予優(yōu)先級(jí),當(dāng)預(yù)測(cè)框和目標(biāo)框IoU越大時(shí),系數(shù)越大:

          CIoU損失相比DIoU損失增加了新的懲罰項(xiàng),所以其有更快的收斂速度,從上面的仿真實(shí)驗(yàn)對(duì)比上也可以看出。目前torchvision也已經(jīng)實(shí)現(xiàn)了CIoU損失,實(shí)現(xiàn)代碼如下所示:

          def complete_box_iou_loss(
              boxes1: torch.Tensor,
              boxes2: torch.Tensor,
              eps: float = 1e-7,
          )
          :

              # 計(jì)算DIoU和IoU
              diou_loss, iou = _diou_iou_loss(boxes1, boxes2)

              x1, y1, x2, y2 = boxes1.unbind(dim=-1)
              x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1)

              # 計(jì)算預(yù)測(cè)框和目標(biāo)框的width和height
              w_pred = x2 - x1
              h_pred = y2 - y1
              w_gt = x2g - x1g
              h_gt = y2g - y1g
              v = (4 / (torch.pi**2)) * torch.pow((torch.atan(w_gt / h_gt) - torch.atan(w_pred / h_pred)), 2)
              # 參數(shù)不參與梯度
              with torch.no_grad():
                  alpha = v / (1 - iou + v + eps)

              loss = diou_loss + alpha * v
              return loss

          實(shí)驗(yàn)對(duì)比

          論文共選取了三個(gè)模型來(lái)對(duì)比不同回歸損失的效果,它們分別是YOLOv3,SSD和Faster R-CNN,其中前面兩個(gè)是單階段檢測(cè)模型,實(shí)驗(yàn)數(shù)據(jù)集為VOC數(shù)據(jù)集,而Faster R-CNN時(shí)兩階段檢測(cè)模型,在COCO數(shù)據(jù)集實(shí)驗(yàn)。對(duì)比實(shí)驗(yàn)結(jié)果如下所示,可以看到DIoU損失相比GIoU損失在AP上有提升,而CIoU損失有進(jìn)一步的提升。最后,論文也指出DIoU還可以替換IoU來(lái)優(yōu)化NMS過(guò)程,原來(lái)的NMS是基于IoU來(lái)去除重復(fù)框,這里提出的DIoU- NMS是基于DIoU來(lái)評(píng)價(jià)兩個(gè)預(yù)測(cè)框的重復(fù)度,這意味著不僅考慮重合面積還考慮中心點(diǎn)距離,其判定準(zhǔn)則如下所示:采用DIoU- NMS后,模型的AP值有進(jìn)一步的提升。下圖為NMS和DIoU- NMS的一個(gè)對(duì)比例子,在這種密集場(chǎng)景中,NMS去除了一個(gè)正確的預(yù)測(cè)框?qū)е侣z,而DIoU- NMS則保留了從而降低漏檢。

          參考

          • Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
          • https://giou.stanford.edu/


          推薦閱讀

          深入理解生成模型VAE

          DropBlock的原理和實(shí)現(xiàn)

          SOTA模型Swin Transformer是如何煉成的!

          有碼有顏!你要的生成模型VQ-VAE來(lái)了!

          集成YYDS!讓你的模型更快更準(zhǔn)!

          輔助模塊加速收斂,精度大幅提升!移動(dòng)端實(shí)時(shí)的NanoDet-Plus來(lái)了!

          SimMIM:一種更簡(jiǎn)單的MIM方法

          SSD的torchvision版本實(shí)現(xiàn)詳解


          機(jī)器學(xué)習(xí)算法工程師


                                              一個(gè)用心的公眾號(hào)

          瀏覽 137
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  老太性HD性老太 | 久久美女主播视频 | 久草综合在线视频 | 韩国三级片视频 | 男女草逼视频 |