目標檢測中的損失函數(二) | BIoU RIoU α-IoU

BIoU來自發表在2018年CVPR上的文章:《Improving Object Localization With Fitness NMS and Bounded IoU Loss》

論文針對現有目標檢測方法只關注“足夠好”的定位,而非“最優”的框,提出了一種考慮定位質量的NMS策略和BIoU loss。?

?這里不贅述NMS,只看loss相關的內容。

IoU 是檢測性能的主要指標,但直接優化 IoU 很難(不可導、不光滑),因此通常使用 L1/L2 或 SmoothL1 損失,但它們并不直接優化 IoU。?Bounded IoU Loss(BIoU)?通過對 IoU 上界建模,最大化ROI(Region of Interest)和相關的ground truth邊界框之間的IoU重疊,使得損失與 IoU 更緊密對應,又具備良好的優化特性。

公式:?

??代碼來自MMDetection的實現:

def bounded_iou_loss(pred: Tensor,target: Tensor,beta: float = 0.2,eps: float = 1e-3) -> Tensor:"""BIoULoss.This is an implementation of paper`Improving Object Localization with Fitness NMS and Bounded IoU Loss.<https://arxiv.org/abs/1711.00164>`_.Args:pred (Tensor): Predicted bboxes of format (x1, y1, x2, y2),shape (n, 4).target (Tensor): Corresponding gt bboxes, shape (n, 4).beta (float, optional): Beta parameter in smoothl1.eps (float, optional): Epsilon to avoid NaN values.Return:Tensor: Loss tensor."""pred_ctrx = (pred[:, 0] + pred[:, 2]) * 0.5pred_ctry = (pred[:, 1] + pred[:, 3]) * 0.5pred_w = pred[:, 2] - pred[:, 0]pred_h = pred[:, 3] - pred[:, 1]with torch.no_grad():target_ctrx = (target[:, 0] + target[:, 2]) * 0.5target_ctry = (target[:, 1] + target[:, 3]) * 0.5target_w = target[:, 2] - target[:, 0]target_h = target[:, 3] - target[:, 1]dx = target_ctrx - pred_ctrxdy = target_ctry - pred_ctry# 這里的 “×2” 來自中心差異在邊界框兩側的對稱影響loss_dx = 1 - torch.max((target_w - 2 * dx.abs()) /(target_w + 2 * dx.abs() + eps), torch.zeros_like(dx))loss_dy = 1 - torch.max((target_h - 2 * dy.abs()) /(target_h + 2 * dy.abs() + eps), torch.zeros_like(dy))loss_dw = 1 - torch.min(target_w / (pred_w + eps), pred_w /(target_w + eps))loss_dh = 1 - torch.min(target_h / (pred_h + eps), pred_h /(target_h + eps))# view(..., -1) does not work for empty tensorloss_comb = torch.stack([loss_dx, loss_dy, loss_dw, loss_dh],dim=-1).flatten(1)loss = torch.where(loss_comb < beta, 0.5 * loss_comb * loss_comb / beta,loss_comb - 0.5 * beta)return loss# 輔助說明BIoU Loss
def smooth_l1_loss(pred: Tensor, target: Tensor, beta: float = 1.0) -> Tensor:"""Smooth L1 loss.Args:pred (Tensor): The prediction.target (Tensor): The learning target of the prediction.beta (float, optional): The threshold in the piecewise function.Defaults to 1.0.Returns:Tensor: Calculated loss"""assert beta > 0if target.numel() == 0:return pred.sum() * 0assert pred.size() == target.size()diff = torch.abs(pred - target)loss = torch.where(diff < beta, 0.5 * diff * diff / beta,diff - 0.5 * beta)return loss

RIoU來自發表在2020年ACM上的文章:《Single-Shot Two-Pronged Detector with Rectified IoU Loss》

論文提出了一種基于IoU的自適應定位損失,稱為Rectified IoU(RIoU)損失,用于校正各種樣本的梯度。校正后的IoU損失增加了高IoU樣本的梯度,抑制了低IoU樣本的梯度,提高了模型的整體定位精度。

用于解決單階段目標檢測中樣本不平衡帶來的梯度偏差問題!

但是如果隨著IoU的增加而增加局部損失梯度的權重,那么將面臨另一個問題,即當回歸是完美的(IoU)時,梯度將繼續增加→ 1,?這意味著當兩個bbox完全重疊(IoU=1)時,將得到最大梯度,這是非常不合理的。

公式:?

?實現:

import torch
import torch.nn as nndef riou_loss(iou: torch.Tensor,loss_base: torch.Tensor,alpha: float = 2.0,gamma: float = 2.0,threshold: float = 0.5) -> torch.Tensor:"""Rectified IoU Loss (RIoU) implementation.Args:iou (Tensor): IoU between predicted and target boxes (shape: [N])loss_base (Tensor): Original IoU-based loss value (e.g., GIoU loss) (shape: [N])alpha (float): Scaling factor for high IoU samplesgamma (float): Focusing parameter (similar to focal loss)threshold (float): IoU threshold to apply amplificationReturns:Tensor: Rectified IoU loss (shape: [N])"""# Weight function: amplify high-quality samplesweight = torch.where(iou >= threshold,alpha * (iou ** gamma),iou)# Final loss: element-wise weightedloss = weight * loss_basereturn loss.mean()

α-IoU來自發表在2021年NeurlPS上的文章:《Alpha-IoU: A Family of Power Intersection over Union Losses for Bounding Box Regression》

邊界框回歸的核心任務是學習框的預測與真實框之間的匹配程度,IoU是最常見的評價指標。然而現有 IoU 損失(如 GIoU、DIoU、CIoU)雖然考慮了位置和重疊,但它們在優化目標、梯度平滑性或收斂速度上仍有局限。該工作出現的時候已經存在EIoU和Focal-EIoU了。

α-IoU通過一個參數 α 實現靈活控制誤差加權,從而提升目標檢測精度,并為小數據集和噪聲框提供更多魯棒性。

該論文使用Box-Cox變換將IoU loss變換到α-IoU loss,這是一種統計技術,用于將非正態分布的數據轉換為更接近正態分布的形式。該方法由George Box和David Cox在1964年提出,廣泛應用于數據預處理步驟中,特別是在需要滿足正態性假設的統計分析或機器學習模型構建過程中。

然后推廣到GIoU、DIoU和CIoU上,也就是在之前的公式懲罰項上加入α,詳細地推導與說明請參考該論文:

?α 對不同的模型或數據集不太敏感,在大多數情況下 α = 3 始終表現良好。α-IoU 損失族可以很容易地應用于在干凈和嘈雜的 bbox 設置下改進最先進的檢測器,而無需向這些模型引入額外的參數(對訓練算法進行任何修改),也不增加它們的訓練/推理時間。?

但是應用到自定義數據集上效果如何還是需要結合具體問題具體分析 !

def bbox_alpha_iou(box1, box2, x1y1x2y2=False, GIoU=False, DIoU=False, CIoU=False, alpha=2, eps=1e-9):# Returns tsqrt_he IoU of box1 to box2. box1 is 4, box2 is nx4box2 = box2.T# Get the coordinates of bounding boxesif x1y1x2y2:  # x1, y1, x2, y2 = box1b1_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 xyxyb1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2# Intersection areainter = (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 Areaw1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + epsw2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + epsunion = w1 * h1 + w2 * h2 - inter + eps# change iou into pow(iou+eps)# iou = inter / unioniou = torch.pow(inter/union + eps, alpha)# beta = 2 * alphaif GIoU or DIoU or CIoU:cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1)  # convex (smallest enclosing box) widthch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1)  # convex heightif CIoU or DIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1c2 = (cw ** 2 + ch ** 2) ** alpha + eps  # convex diagonalrho_x = torch.abs(b2_x1 + b2_x2 - b1_x1 - b1_x2)rho_y = torch.abs(b2_y1 + b2_y2 - b1_y1 - b1_y2)rho2 = ((rho_x ** 2 + rho_y ** 2) / 4) ** alpha  # center distanceif DIoU:return iou - rho2 / c2  # DIoUelif CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2)with torch.no_grad():alpha_ciou = v / ((1 + eps) - inter / union + v)# return iou - (rho2 / c2 + v * alpha_ciou)  # CIoUreturn iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, alpha))  # CIoUelse:  # GIoU https://arxiv.org/pdf/1902.09630.pdf# c_area = cw * ch + eps  # convex area# return iou - (c_area - union) / c_area  # GIoUc_area = torch.max(cw * ch + eps, union) # convex areareturn iou - torch.pow((c_area - union) / c_area + eps, alpha)  # GIoUelse:return iou # torch.log(iou+eps) or iou

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

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

相關文章

如何在 Amazon EC2 上部署 Java(Spring Boot 版)

讓我們學習如何將 Java Spring Boot Web 服務器部署到 Amazon EC2。每月只需 3 美元。 使用 Azure&#xff0c;您可能不知道要花費多少錢。 Spring Boot 項目示例 在本教程中&#xff0c;我們將重點介紹如何將 Java Spring Boot 服務器部署到 Amazon EC2&#xff0c;因此我們不…

Git常用命令分類匯總

Git常用命令分類匯總 一、基礎操作 初始化倉庫git init添加文件到暫存區git add file_name # 添加單個文件 git add . # 添加所有修改提交更改git commit -m "提交描述"查看倉庫狀態git status二、分支管理 創建/切換分支git branch branch_name …

mysql——基礎知識

關鍵字大小寫不敏感 查看表結構中的 desc describe 描述 降序中的 desc descend 1. 數據庫的操作 1. 創建數據庫 create database 數據庫名;為防止創建的數據庫重復 CREATE DATABASE IF NOT EXISTS 數據庫名;手動設置數據庫采用的字符集 character set 字符集名;chars…

Redis 哨兵與集群腦裂問題詳解及解決方案

Redis 哨兵與集群腦裂問題詳解及解決方案 本文將深入探討Redis在哨兵模式和集群模式下可能出現的腦裂問題&#xff0c;包括其發生場景、原因以及有效的解決策略。同時&#xff0c;我們還將提供相應的代碼示例和配置方案來幫助讀者理解和實施。 一、腦裂問題概述 腦裂&#x…

國內網絡設備廠商名單(List of Domestic Network Equipment Manufacturers)

國內網絡設備廠商名單 運維工程師必須廣泛熟悉國內外各大廠商的設備&#xff0c;深入掌握其應用場景、功能特點及優勢。這不僅有助于在故障排查時迅速定位問題&#xff0c;還能在系統設計、優化與升級中做出更合理的決策。對設備特性的精準把握&#xff0c;能夠顯著提升運維效…

2、SpringAI接入ChatGPT與微服務整合

2、SpringAI接入ChatGPT與微服務整合 小薛博客AI 大模型資料 1、SpringAI簡介 https://spring.io/projects/spring-ai Spring AI是一個人工智能工程的應用框架。其目標是將Spring生態系統的設計原則&#xff08;如可移植性和模塊化設計&#xff09;應用于人工智能領域&#…

基于ubuntu24.10安裝NACOS2.5.1的簡介

基于ubuntu24.10安裝NACOS2.5.1的簡介 官方網站地址&#xff1a; https://nacos.io 可訪問nacos站點 https://nacos.io/zh-cn/ 2025年04月記錄發布 V2.5.1 版本 一、環境預準備 64 bit JDK 1.8&#xff1b; sudo apt update sudo apt install openjdk-8-jdk sudo apt upda…

神經網絡:從基礎到應用,開啟智能時代的大門

在當今數字化時代&#xff0c;神經網絡已經成為人工智能領域最熱門的技術之一。從語音識別到圖像分類&#xff0c;從自然語言處理到自動駕駛&#xff0c;神經網絡的應用無處不在。它不僅改變了我們的生活方式&#xff0c;還為各個行業帶來了前所未有的變革。本文將帶你深入了解…

[k8s實戰]Containerd 1.7.2 離線安裝與配置全指南(生產級優化)

[k8s實戰]Containerd 1.7.2 離線安裝與配置全指南&#xff08;生產級優化&#xff09; 摘要&#xff1a;本文詳細講解在無外網環境下部署 Containerd 1.7.2 容器運行時的完整流程&#xff0c;涵蓋二進制包安裝、私有鏡像倉庫配置、Systemd服務集成等關鍵步驟&#xff0c;并提供…

【CPU】結合RISC-V CPU架構回答中斷系統的7個問題(個人草稿)

結合RISC-V CPU架構對中斷系統七個關鍵問題的詳細解析&#xff0c;按照由淺入深的結構進行說明&#xff1a; 一、中斷請求機制&#xff08;問題①&#xff09; 硬件基礎&#xff1a; RISC-V通過CLINT&#xff08;Core Local Interrupter&#xff09;和PLIC&#xff08;Platfor…

[密碼學實戰]國密算法面試題解析及應用

以下是密碼學領域常見的面試題及其詳細解析,涵蓋基礎理論、算法實現與應用場景,幫助系統化備戰技術面試 一、基礎概念類 1. 密碼學的主要目標是什么? 答案: 確保數據的機密性(加密防止竊聽)、完整性(哈希校驗防篡改)、認證性(數字簽名驗證身份)和不可否認性(簽名防…

Spring Boot 實現 Excel 導出功能(支持前端下載 + 文件流)

&#x1f9e0; 一、為什么用 EasyExcel&#xff1f; 在 Java 開發中&#xff0c;操作 Excel 的框架主要有&#xff1a; Apache POI&#xff08;經典但慢、內存占用大&#xff09; JXL&#xff08;老舊不維護&#xff09; Alibaba EasyExcel&#xff08;阿里出品&#xff0c;…

【論文速遞】2025年06周 (Robotics/Embodied AI/LLM)

目錄 SMOLLM2&#xff1a;當Smol變得大 - 以數據為中心的小語言模型英文摘要中文摘要 OmniHuman-1&#xff1a;重新考慮一階段的人類動畫模型的擴展英文摘要中文摘要 S1&#xff1a;簡單的測試時間縮放英文摘要中文摘要 直接對齊算法間的差異日漸模糊英文摘要中文摘要 VideoJAM…

學習深度學習是否要先學習機器學習?工程師的路徑選擇策略

深度學習與機器學習的關系&#xff0c;如同摩天大樓與地基——前者是后者的高階延伸&#xff0c;但能否繞過地基直接造樓&#xff1f;本文從技術本質、學習曲線、應用場景三個維度剖析這一關鍵問題。 一、技術血脈的承繼關系 概念體系同源&#xff1a; 損失函數、梯度下降、過擬…

開始放飛之先搞個VSCode

文章目錄 開始放飛之先搞個VSCode重要提醒安裝VSCode下載MinGW-w64回到VSCode中去VSCode原生調試鍵盤問題遺留問題參考文獻 開始放飛之先搞個VSCode 突然發現自己的新臺式機上面連個像樣的編程環境都沒有&#xff0c;全是游戲了&#xff01;&#xff01;&#xff01;&#xff…

【2025“華中杯”大學生數學建模挑戰賽】選題分析 A題 詳細解題思路

目錄 2025“華中杯”大學生數學建模挑戰賽選題分析A題&#xff1a;晶硅片產銷策略優化B題&#xff1a;校園共享單車的調度與維護問題C題&#xff1a;就業狀態分析與預測D題&#xff1a;患者院內轉運不良事件的分析與預測 A 題 晶硅片產銷策略優化問題 1&#xff1a;月利潤計算模…

YOLO11改進,尺度動態損失函數Scale-based Dynamic Loss,減少標簽不準確對損失函數穩定性的影響

在目標檢測領域,標簽噪聲與尺度敏感問題始終是制約模型性能提升的"阿喀琉斯之踵"。2025年CVPR最佳論文提出的尺度動態損失函數(Scale-based Dynamic Loss, SDL),通過構建自適應損失調節機制,不僅實現了對YOLOv11檢測精度的指數級提升,更重新定義了損失函數的設…

緩存 --- 內存緩存 or 分布式緩存

緩存 --- 內存緩存 or 分布式緩存 內存緩存&#xff08;In-Memory Cache&#xff09;分布式緩存&#xff08;Distributed Cache&#xff09;內存緩存 vs 分布式緩存 內存緩存和分布式緩存是兩種常見的緩存策略&#xff0c;它們在存儲位置、訪問速度和適用場景上有所不同。下面分…

Python+CoppeliaSim+ZMQ remote API控制機器人跳舞

這是一個使用Python和CoppeliaSim&#xff08;V-REP&#xff09;控制ASTI人型機器人進行舞蹈動作的演示項目。 項目描述 本項目展示了如何使用Python通過ZeroMQ遠程API與CoppeliaSim仿真環境進行交互&#xff0c;控制ASTI人型機器人執行預定義的舞蹈動作序列。項目包含完整的機…

進程管理,關閉進程

查看Linux系統中的進程信息 語法&#xff1a;ps【-e -f】 一般與管道符與grep配合使用&#xff0c;&#xff0c;去過濾指定的信息 -e&#xff1a;顯示出全部的進程 -f&#xff1a;以完全格式化的形式展示信息&#xff08;展示全部信息&#xff09; 簡單用法&#xff1a;p…