前言
- 由于本人水平有限,難免出現(xiàn)錯漏,敬請批評改正。
- 更多精彩內(nèi)容,可點擊進入YOLO系列專欄或我的個人主頁查看
前提條件
- 熟悉Python
相關介紹
- Python是一種跨平臺的計算機程序設計語言。是一個高層次的結(jié)合了解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言。最初被設計用于編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越多被用于獨立的、大型項目的開發(fā)。
- PyTorch 是一個深度學習框架,封裝好了很多網(wǎng)絡和深度學習相關的工具方便我們調(diào)用,而不用我們一個個去單獨寫了。它分為 CPU 和 GPU 版本,其他框架還有 TensorFlow、Caffe 等。PyTorch 是由 Facebook 人工智能研究院(FAIR)基于 Torch 推出的,它是一個基于 Python 的可續(xù)計算包,提供兩個高級功能:1、具有強大的 GPU 加速的張量計算(如 NumPy);2、構(gòu)建深度神經(jīng)網(wǎng)絡時的自動微分機制。
IoU(Intersection over Union)
- 交并比(IoU)是一種用于衡量兩個邊界框之間重疊程度的指標。它是通過計算兩個邊界框的交集面積與并集面積之比來計算的。在目標檢測中,IoU通常用于衡量預測框和真實框之間的重疊程度,以評估目標檢測算法的準確性。如果IoU值越高,則表示預測框和真實框之間的重疊程度越高,因此預測結(jié)果越準確。
![]()
- 優(yōu)點:
- IoU是目標檢測中最常用的指標之一,可以用來評價目標檢測算法的準確性。 IoU可以幫助我們確定正樣本和負樣本。
- IoU可以幫助我們評估輸出框(predict box)和ground truth box之間的重疊程度。
- 缺點:
- IoU只能衡量兩個邊界框之間的重疊程度,不能衡量其他因素,如形狀、顏色等。
- IoU不適用于所有類型的目標檢測任務。
由于 I o U IoU IoU的公式定義,作為損失函數(shù)會出現(xiàn)的問題。比如,
- 當預測框和目標框不相交時,IoU=0,無法反應兩個框距離的遠近,此時損失函數(shù)不可導,IoU無法優(yōu)化兩個框不相交的情況。
- 當IoU也相同時,會出現(xiàn)預測框和目標框相交位置不一樣的情況,IoU無法區(qū)分兩者相交情況的不同。
GIoU(Generalized-IoU)
- 在CVPR2019中,論文《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》
的提出了GIoU的思想。由于IoU是比值的概念,對目標物體的scale是不敏感的。然而檢測任務中的BBox的回歸損失(MSE loss, l1-smooth loss等)優(yōu)化和IoU優(yōu)化不是完全等價的,而且 Ln 范數(shù)對物體的scale也比較敏感,IoU無法直接優(yōu)化沒有重疊的部分。- GIoU是一種用于目標檢測的損失函數(shù),它是IoU的改進版。GIoU的全稱是Generalized Intersection over Union,它是一種度量和損失函數(shù),用于衡量兩個邊界框之間的重疊程度。GIoU的目標是在損失函數(shù)中加入一個ground truth和預測框構(gòu)成的閉包的懲罰,它的懲罰項是閉包減去兩個框的并集后的面積在閉包中的比例越小越好。GIoU中,增加了相交尺度的衡量方式。
- 公式: G I o U = I o U ? ∣ A c ? U ∣ ∣ A c ∣ GIoU=IoU-\frac{|A_c-U|}{|A_c|} GIoU=IoU?∣Ac?∣∣Ac??U∣?
公式的含義:先計算兩個框的最小閉包區(qū)域面積 A c A_c Ac?(即同時包含了預測框和真實框的最小框的面積),再計算出 I o U IoU IoU,再計算閉包區(qū)域中不屬于兩個框的區(qū)域占閉包區(qū)域的比重,最后用 I o U IoU IoU減去這個比重得到 G I o U GIoU GIoU。- 優(yōu)點:
- 它能夠反映檢測效果,即使在沒有重疊區(qū)域的情況下,它也能夠反映檢測效果。
- GIoU損失函數(shù)的目標是在損失函數(shù)中加入一個ground truth和預測框構(gòu)成的閉包的懲罰,它的懲罰項是閉包減去兩個框的并集后的面積在閉包中的比例越小越好。
- 缺點:
- 計算量大,因為它需要計算兩個框之間的交集和并集。此外,GIoU對于小目標和大目標之間的距離不敏感,這可能會導致一些問題.
由于 G I o U GIoU GIoU的公式定義,作為損失函數(shù) L G I o U = 1 ? G I o U L_{GIoU}=1-GIoU LGIoU?=1?GIoU會出現(xiàn)的問題。比如,
- 預測框在目標框內(nèi)部且預測框大小一致的情況,這時預測框和目標框的差集都是相同的,因此這三種狀態(tài)的GIoU值也都是相同的,這時GIoU退化成了IoU,無法區(qū)分相對位置關系。
DIoU(Distance-IoU)
- DIoU是GIoU的改進版,它考慮了目標框和anchor之間的距離、重疊率和尺度,使得目標框回歸變得更加穩(wěn)定,不會像IoU和GIoU一樣出現(xiàn)訓練過程中發(fā)散等問題。
基于IoU和GIoU存在的問題,作者提出了兩個問題:
- 直接最小化anchor框與目標框之間的歸一化距離是否可行,以達到更快的收斂速度?
- 如何使回歸在與目標框有重疊甚至包含時更準確、更快?
- 公式: D I o U = I o U ? ρ 2 ( b , b g t ) c 2 DIoU=IoU-\frac{\rho2(b,b^{gt})}{c^2} DIoU=IoU?c2ρ2(b,bgt)?
![]()
- 其中, b , b g t b,b^{gt} b,bgt 分別代表了預測框和真實框的中心點,且 ρ \rho ρ代表的是計算兩個中心點間的歐式距離, c c c代表的是能夠同時包含預測框和真實框的最小閉包區(qū)域的對角線距離。
- 優(yōu)點:
- 它能夠反映檢測效果,即使在沒有重疊區(qū)域的情況下,它也能夠反映檢測效果。
- DIoU對于小目標和大目標之間的距離更加敏感,這可能會解決GIoU存在的問題。
由于 D I o U DIoU DIoU的公式定義,作為損失函數(shù) L D I o U = 1 ? D I o U L_{DIoU}=1-DIoU LDIoU?=1?DIoU會出現(xiàn)的問題。比如,
- DIoU考慮了重疊面積和中心點距離,當目標框包裹預測框的時候,直接度量2個框的距離,因此DIoU收斂的更快,但并沒有考慮到長寬比。
從上圖可以看到,不同長寬比的預測框, ρ \rho ρ兩個中心點間的歐式距離相同。
CIoU (Complete-IoU)
- CIoU是DIoU的改進版,它在DIoU的基礎上加入了長寬比的計算,使得目標框回歸更加穩(wěn)定,不會像IoU和GIoU一樣出現(xiàn)訓練過程中發(fā)散等問題。
- 公式: C I o U = I o U ? ρ 2 ( b , b g t ) c 2 ? α v CIoU=IoU - \frac{\rho2(b,b^{gt})}{c^2} - \alpha v CIoU=IoU?c2ρ2(b,bgt)??αv
- 其中, b , b g t b,b^{gt} b,bgt分別代表了預測框和真實框的中心點,\rho代表的是計算兩個中心點間的歐式距離, c c c代表的是能夠同時包含預測框和真實框的最小閉包區(qū)域的對角線距離, α \alpha α是權(quán)重函數(shù), v v v分別代表了預測框和真實框的長寬比之間的差異。
- v v v是衡量長寬比一致性的參數(shù),具體地, v v v的計算公式如下
v = 4 π 2 ( arctan ? ( w g t h g t ) ? arctan ? ( w p h p ) ) v = \frac{4}{\pi^2}(\arctan(\frac{w^{gt}}{h^{gt}}) - \arctan(\frac{w_p}{h_p})) v=π24?(arctan(hgtwgt?)?arctan(hp?wp??))
其中, w p w_p wp?和 h p h_p hp?分別代表了預測框的寬和高, w g t w^{gt} wgt和 h g t h^{gt} hgt分別代表了真實框的寬和高。- C I o U CIoU CIoU的損失函數(shù)為 L C I o U = 1 ? C I o U L_{CIoU} = 1 - CIoU LCIoU?=1?CIoU
EIoU(Efficient-IoU)
- CIoU Loss雖然考慮了邊界框回歸的重疊面積、中心點距離、縱橫比。但是通過其公式中的v反映的縱橫比的差異,而不是寬高分別與其置信度的真實差異,所以有時會阻礙模型有效的優(yōu)化相似性。針對這一問題,有學者在CIoU的基礎上將縱橫比拆開,提出了EIoU Loss,并且加入Focal聚焦優(yōu)質(zhì)的錨框,該方法出自于2021年的一篇文章《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》
- 公式: E I o U = I o U ? ρ 2 ( b , b g t ) c 2 ? ρ 2 ( w , w g t ) c w 2 ? ρ 2 ( h , h g t ) c h 2 EIoU=IoU - \frac{\rho2(b,b^{gt})}{c^2} - \frac{\rho2(w,w^{gt})}{c_w^2} - \frac{\rho2(h,h^{gt})}{c_h^2} EIoU=IoU?c2ρ2(b,bgt)??cw2?ρ2(w,wgt)??ch2?ρ2(h,hgt)?
- 其中 C w C_w Cw? 和 C h C_h Ch? 是覆蓋兩個Box的最小外接框的寬度和高度。
- EIoU的懲罰項是在CIoU的懲罰項基礎上將縱橫比的影響因子拆開分別計算目標框和錨框的長和寬,該損失函數(shù)包含三個部分:重疊損失,中心距離損失,寬高損失,前兩部分延續(xù)CIoU中的方法,但是寬高損失直接使目標盒與錨盒的寬度和高度之差最小,使得收斂速度更快。EIoU損失函數(shù)懲罰項公式如下:
L E I o U = 1 ? E I o U = 1 ? I o U + ρ 2 ( b , b g t ) c 2 + ρ 2 ( w , w g t ) c w 2 + ρ 2 ( h , h g t ) c h 2 L_{EIoU}=1-EIoU=1- IoU + \frac{\rho2(b,b^{gt})}{c^2} + \frac{\rho2(w,w^{gt})}{c_w^2} + \frac{\rho2(h,h^{gt})}{c_h^2} LEIoU?=1?EIoU=1?IoU+c2ρ2(b,bgt)?+cw2?ρ2(w,wgt)?+ch2?ρ2(h,hgt)?- 優(yōu)點:
- EIoU在CIoU的基礎上分別計算寬高的差異值取代了縱橫比。
YOLOv5源代碼中加入EIoU
在YOLOv5項目utils\metrics.py代碼中,bbox_iou函數(shù)只包含GIoU, DIoU, CIoU的計算,
def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=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 CIoU or DIoU or GIoU:
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: # 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 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
return iou - rho2 / c2 # DIoU
c_area = cw * ch + eps # convex area
return iou - (c_area - union) / c_area # GIoU https://arxiv.org/pdf/1902.09630.pdf
return iou # IoU
將EIoU計算加入到源代碼中,修改代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-486359.html
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 CIoU or DIoU or GIoU 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 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:
w=(w1-w2)*(w1-w2)
h=(h1-h2)*(h1-h2)
return iou-(rho2/c2+w/(cw**2)+h/(ch**2))#EIoU 2021.12.29
return iou - rho2 / c2 # DIoU
c_area = cw * ch + eps # convex area
return iou - (c_area - union) / c_area # GIoU https://arxiv.org/pdf/1902.09630.pdf
return iou # IoU
小結(jié)
- I o U IoU IoU:主要考慮檢測框和目標框重疊面積。
- G I o U GIoU GIoU:在 I o U IoU IoU的基礎上,解決邊界框不重合(IoU=0)時的問題。
- D I o U DIoU DIoU:在 I o U IoU IoU和 G I o U GIoU GIoU的基礎上,考慮邊界框中心點距離的信息,解決 G I o U GIoU GIoU收斂慢的問題
- C I o U CIoU CIoU:在 D I o U DIoU DIoU的基礎上,考慮邊界框?qū)捀弑鹊某叨刃畔?/strong>,提升回歸精確度。
- E I o U EIoU EIoU:考慮了重疊面積,中心點距離、長寬邊長真實差,基于 C I o U CIoU CIoU解決了縱橫比(寬高比)的模糊。
損失函數(shù) | 優(yōu)點 | 缺點 |
---|---|---|
IoU | 具有尺度不變性,滿足非負性;同一性;對稱性;三角不等性等特點。 | 1.如果兩個框不相交,不能反映兩個框距離遠近。2.無法精確的反映兩個框的重合度大小 |
GIoU | 在基于IoU特性的基礎上引入最小外接框解決檢測框和真實框沒有重疊時loss等于0問題。 | 1.當檢測框和真實框出現(xiàn)包含現(xiàn)象的時候GIoU退化成IoU。2.兩個框相交時,在水平和垂直方向上收斂慢。 |
DIoU | 在基于IoU特性的基礎上考慮到GIoU的缺點,直接回歸兩個框中心點的歐式距離,加速收斂。 | 回歸過程中未考慮Bounding box的縱橫比,精確度上尚有進一步提升的空間。 |
CIoU | CIoU就是在DIoU的基礎上增加了檢測框尺度的loss,增加了長和寬的loss,這樣預測框就會更加的符合真實框。 | CIoU就是在DIoU的基礎上增加了檢測框尺度的loss,增加了長和寬的loss,這樣預測框就會更加的符合真實框。 |
EIoU | EIoU在CIoU的基礎上分別計算寬高的差異值取代了縱橫比,同時引入Focal Loss解決難易樣本不平衡的問題。 | —— |
參考
[1] https://github.com/ultralytics/yolov5
[2] https://arxiv.org/pdf/1902.09630.pdf
[3] https://arxiv.org/pdf/1608.01471.pdf
[4] https://arxiv.org/pdf/1911.08287.pdf
[5] https://arxiv.org/pdf/2101.08158.pdf
[6] https://blog.csdn.net/nan355655600/article/details/106246625
[7] https://zhuanlan.zhihu.com/p/94799295
[8] https://blog.csdn.net/weixin_45751396/article/details/127150065
[9] https://zhuanlan.zhihu.com/p/270663039文章來源地址http://www.zghlxwxcb.cn/news/detail-486359.html
- 由于本人水平有限,難免出現(xiàn)錯漏,敬請批評改正。
- 更多精彩內(nèi)容,可點擊進入YOLO系列專欄或我的個人主頁查看
到了這里,關于YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!