目標檢測中的損失函數(一) | IoU GIoU DIoU CIoU EIoU Focal-EIoU

🚀該系列將會持續整理和更新BBR相關的問題,如有錯誤和不足懇請大家指正,歡迎討論!!!

📦目標檢測的損失函數一般包含三個部分,分別是邊界框損失也可稱為定位損失、置信度損失和分類損失,這一小節主要講解一下邊界框損失!

首先,邊界框損失也就是目標檢測中的邊界框回歸任務(bounding box regression, BBR),之前用的最廣泛的就是n范數損失,目前基本就是關于IoU相關的損失了。n范數損失可以參考一些文獻,比如發表在2015年CVPR會議上的《Fast R-CNN》。

接下來,先回顧一下n范數損失,一般有L1loss、L2loss和L\inftyloss。

L1loss(絕對值損失)?L_{1}=\sum \left | y_{i} - \hat{y_{i} } \right |,其中y_{i}是真值,\hat{y_{i}}是預測值;對于異常較為魯棒,但不處處可導;

L2loss(平方損失)?L_{1}=\sum ( y_{i} - \hat{y_{i} } )^2,其中y_{i}是真值,\hat{y_{i}}是預測值;對于異常比較敏感;

L\inftyloss(最大模損失)?考慮的是預測值與真實值之間差的最大絕對值,適用于最小化最大誤差。

BBR相關的任務可追溯到YOLOv1中,使用平方誤差來計算邊界框的位置損失,即預測框與真實框之間的中心坐標(x, y)和寬高(w, h)的誤差,彌補了尺度敏感性。這種計算兩個bbox相似度有一定的局限性,導致定位不準,所以在2016年,由UIUC和曠視發表的論文引入了IoU損失,就是用1減去IoU取個均值就ok了。《UnitBox: An Advanced Object Detection Network》

?

但是,將IoU作為loss的話,會有一個問題就是預測框和真實框之間不重疊,IoU值為0,兩個框之間的距離無法確定,梯度將為0,無法優化。

在2019年,斯坦福在CVPR上發表了一篇論文,提出了GIoU,取預測框和真實框的最小外接邊界框加入運算。《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》

? ? 具體計算如下:?

GIoU loss通常不能很好地收斂,導致檢測不準確。 2019年,天津大學發表在AAAI上的一篇論文《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》提出了DIoU和CIoU。DIoU考慮了兩個邊界框(預測和真實的)中心點坐標之間的距離,CIoU包含了三個幾何測度,分別是預測和真實邊界框之間的重疊面積、中心點坐標之間的距離和縱橫比。

具體計算如下:?

然而CIoU不能有效地測量目標盒和錨點之間的差異,導致BBR模型優化收斂緩慢,定位不準確。2022年,CASIA在《?Neurocomputing》上發表了一篇論文《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》提出了一種有效的聯合交集(EIOU)損失,它明確地衡量了BBR中三個幾何因素的差異,即重疊區域、中心點和邊長。之后,針對有效的示例挖掘 (EEM) 問題,并提出了一個焦點損失的回歸版本解決樣本不平衡問題,以使回歸過程專注于高質量的錨框。最后,將上述兩個部分組合起來得到一個新的損失函數,即Focal-EIOU損失。 EIoU其實就是將CIoU中的縱橫比修改為了優化框的寬度和高度的差異。

?在ultralytics-main/ultralytics/utils/metrics.py中的實現:

def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, EIoU=False, Focal=False, eps=1e-7):# Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)# Get the coordinates of bounding boxesif 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 / 2b1_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 = box1b1_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 areainter = (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 Areaunion = w1 * h1 + w2 * h2 - inter + eps# IoUiou = inter / unionif CIoU or DIoU or GIoU or EIoU:cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) widthch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1)  # convex heightif CIoU or DIoU or EIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1c2 = cw ** 2 + ch ** 2 + eps  # convex diagonal squaredrho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center dist ** 2if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2)with torch.no_grad():alpha = v / (v - iou + (1 + eps))if EIoU:rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2cw2 = cw**2 + epsch2 = ch**2 + epsif Focal:return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2), torch.pow(inter / (union + eps), 0.5)  # Focal_EIoUelse:return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2) # EIoUreturn iou - (rho2 / c2 + v * alpha)  # CIoUreturn iou - rho2 / c2  # DIoUc_area = cw * ch + eps  # convex areareturn iou - (c_area - union) / c_area  # GIoU https://arxiv.org/pdf/1902.09630.pdfreturn iou  # IoU

在ultralytics-main/ultralytics/utils/loss.py中的調用:?

# iou = bbox_iou(pbox, tbox[i], CIoU=True).squeeze()  # iou(prediction, target)
# lbox += (1.0 - iou).mean()  # iou lossiou = bbox_iou(pbox, tbox[i], EIoU=True, Focal=True).squeeze()  # iou(prediction, target)
if type(iou) is tuple:lbox += (iou[1].detach() * (1.0 - iou[0])).mean()
else:lbox += (1.0 - iou).mean()

?本節的分享就到這里了,后續會繼續分享剩下的損失函數!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78100.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

結構型模式:適配器模式

什么是適配器模式? 適配器模式(Adapter Pattern)是一種常用的結構型設計模式,它的主要作用是將一個類的接口轉換成客戶端期望的另一個接口。就像現實生活中的各種轉接頭一樣,適配器模式使得原本因接口不兼容而無法一起…

AI Agent認知框架(ReAct、函數調用、計劃與執行、自問自答、批判修正、思維鏈、思維樹詳解和對比,最后表格整理總結

以下是主流AI Agent認知框架的詳細說明、對比及表格總結: 1. 各認知框架詳解 (1) ReAct (Reasoning Action) 定義:結合推理(Reasoning)和行動(Action)的循環過程。核心機制: 模型先推理&…

特征存儲的好處:特征存儲在機器學習開發中的優勢

隨著企業尋求提升機器學習生產力和運營能力 (MLOps),特征存儲 (Feature Store) 的普及度正在迅速提升。隨著 MLOps 技術的進步,特征存儲正成為機器學習基礎設施的重要組成部分,幫助企業提升模型的性能和解釋能力,并加速新模型與生產環境的集成。這些存儲充當集中式存儲庫,…

SPRING-AI 官方事例

springAI 關于最近看了很多SpringAi,閱讀很多代碼都感覺特別陌生 SpringAI依賴的springBoot版本都是3.3以上, 以及很多SpringAi都是依賴JDK版本最低17, 并且出現了很多新關鍵字例如 var,record 等寫法, 煙花繚亂得lambda 表達式, 到處都是使用build 構…

Visual Studio Code 使用tab鍵往左和往右縮進內容

使用VSCode寫東西,經常遇到多行內容同時縮進的情況,今天寫文檔的時候就碰到,記錄下來: 往右縮進 選中多行內容,點tab鍵,會整體往右縮進: 往左縮進 選中多行內容,按shifttab&am…

機器學習(7)——K均值聚類

文章目錄 1. K均值(K-means)聚類是什么算法?2. 核心思想2. 數學目標3. 算法步驟3.1. 選擇K個初始質心:3.2.迭代優化3.3. 重復步驟2和步驟3: 4. 關鍵參數5. 優缺點6. 改進變種7. K值選擇方法8. Python示例9. 應用場景10…

爬蟲案例-爬取某企數據

文章目錄 1、準備要爬取企業名稱數據表2、爬取代碼3、查看效果 1、準備要爬取企業名稱數據表 企業名稱紹興市袍江王新國家庭農場紹興市鄭杜糧油專業合作社紹興市越城區興華家庭農場紹興市越城區銳意家庭農場紹興市越城區青甸畈家庭農場紹興市袍江王新國家庭農場紹興市袍江月明…

足球 AI 智能體技術解析:從數據采集到比賽預測的全鏈路架構

一、引言 在足球運動數字化轉型的浪潮中,AI 智能體正成為理解比賽、預測賽果的核心技術引擎。本文從工程實現角度,深度解析足球 AI 的技術架構,涵蓋數據采集、特征工程、模型構建、實時計算到決策支持的全鏈路技術方案,揭示其背后…

怎么配置一個kubectl客戶端訪問多個k8s集群

怎么配置一個kubectl客戶端訪問多個k8s集群 為什么有的客戶端用token也訪問不了k8s集群,因為有的是把~/.kube/config文件,改為了~/.kube/.config文件,文件設置成隱藏文件了。 按照kubectl的尋找配置的邏輯,kubectl找不到要訪問集群…

[QMT量化交易小白入門]-四十六、年化收益率118%的回測參數,如何用貪心算法挑選50個兩兩相關性最小的ETF組合

本專欄主要是介紹QMT的基礎用法,常見函數,寫策略的方法,也會分享一些量化交易的思路,大概會寫100篇左右。 QMT的相關資料較少,在使用過程中不斷的摸索,遇到了一些問題,記錄下來和大家一起溝通,共同進步。 文章目錄 相關閱讀準備工作安裝所需庫導入所需模塊下載所有ETF數…

幾何編碼:啟用矢量模式地理空間機器學習

在 ML 模型中使用點、線和多邊形,將它們編碼為捕捉其空間屬性的向量。 自地理信息系統 (GIS) 誕生之初,“柵格模式”和“矢量模式”之間就存在著顯著的區別。在柵格模式下,數據以值的形式呈現在規則的網格上。這包括任何形式的圖像&#xff0…

Leetcode98、230:二叉搜索樹——遞歸學習

什么是二叉搜索樹:右子樹節點 > 根節點 > 左子樹節點, 二叉搜索樹中的搜索,返回給定值val所在的樹節點 終止條件為傳進來的節點為空、或者節點的值 val值,返回這個節點; 單程遞歸邏輯:定義一個resu…

每天學一個 Linux 命令(30):cut

??可訪問網站查看,視覺品味拉滿: http://www.616vip.cn/30/index.html cut 命令用于從文件或輸入流中提取文本的特定部分(如列、字符或字節位置)。它常用于處理結構化數據(如 CSV、TSV)或按固定格式分割的文本。以下是詳細說明和示例: 命令格式 cut [選項] [文件...]…

Tauri 2.3.1+Leptos 0.7.8開發桌面應用--Sqlite數據庫選中數據的表格輸出

在前期工作的基礎上(Tauri 2.3.1Leptos 0.7.8開發桌面應用--Sqlite數據庫的寫入、展示和選擇刪除_tauri leptos sqlite 選擇刪除-CSDN博客),實現將選中的數據實時用表格展示出來,效果如下: 1. 后臺invoke調用命令 Tau…

使用Tauri 2.3.1+Leptos 0.7.8開發桌面小程序匯總

近期斷斷續續學習了Rust編程,使用Tauri 2.3.1Leptos 0.7.8開發了一個自用的桌面小程序。Win10操作系統,使用VS Code及rust analyzer插件搭建的開發環境,后期開始使用Roo Code綁定DeepSeek API 輔助編程,對我這個初學者編程幫助很大…

考研英一學習筆記

2024 年全國碩士研究生招生考試 英語(一)試題 (科目代碼:201) Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANS…

【技術筆記】Cadence實現Orcad與Allegro軟件交互式布局設置

【技術筆記】Cadence實現Orcad與Allegro軟件交互式布局設置 更多內容見專欄:【硬件設計遇到了不少問題】、【Cadence從原理圖到PCB設計】 在做硬件pcb設計的時候,原理圖選中一個元器件,希望可以再PCB中可以直接選中。 為了達到原理圖和PCB兩兩…

卷積神經網絡(CNN)詳解

文章目錄 引言1.卷積神經網絡(CNN)的誕生背景2.卷積神經網絡(CNN)介紹2.1 什么是卷積神經網絡?2.2 卷積神經網絡(CNN)的基本特征2.2.1 局部感知(Local Connectivity)2.2.…

8051單片機所有Keil C51匯編偽指令和C語言關鍵字大全

8051單片機所有Keil C51匯編偽指令和C語言關鍵字大全 作者將狼才鯨創建日期2025-04-21 CSDN閱讀地址:8051單片機所有Keil匯編偽指令和C語言關鍵字的詳細解釋 8051單片機所有Keil匯編偽指令和C語言關鍵字的詳細解釋,在Keil已安裝文件夾D:\Keil_v5\C51\H…