【YOLOv8】損失函數

學習視頻:

yolov8 | 損失函數 之 5、類別損失_嗶哩嗶哩_bilibili

yolov8 | 損失函數 之 6、定位損失 CIoU + DFL_嗶哩嗶哩_bilibili

2.13、yolov8損失函數_嗶哩嗶哩_bilibili


YOLOv8 的損失函數由類別損失和定位損失構成

類別損失:BCE Loss

定位損失:CIoU Loss + DFL(Distribution Focal Loss)

損失函數計算公式如下:

YOLOv8 損失函數?

注意:YOLOv8 只需要計算正樣本的損失值,負樣本不參數損失計算?


目錄

1.類別損失

1.1 YOLOv5

1.2 YOLOv8:

2.定位損失

2.1 CIoU Loss

2.2?Distribution Focal Loss

2.2.1 前言

2.2.2 為什么使用Distribution Focal Loss?

2.2.3 原理

2.2.4 關于reg_max取值的補充


1.類別損失

?YOLOv8 的類別損失使用的依舊是 BCE Loss ,與? YOLOv5 一致,但類別的 one-hot 標簽值的設置有區別,下面會作兩者的對比

BCE Loss 的計算公式如下:

BCE Loss

1.1 YOLOv5

\hat{p}_{i}(c) c 類別在 one-hot 向量中的標簽值,如果未使用標簽平滑技術就是非0即1

p_i(c):正樣本預測框的對于 c 類別的預測概率值應用 Sigmoid 函數后的值

對于\hat{p}_{i}(c),p_i(c)的理解可以看下圖:

YOLOv5類別損失

1.2 YOLOv8:

下面同樣舉的例子是未使用標簽平滑技術

?YOLOv8類別損失

??\hat{p}_{i}(c):看該正樣本預測框匹配到的 gt_box 的真實類別是什么,將其他類別的\hat{p}_{i}(c)置為 0 ,而正確類別的\hat{p}_{i}(c)的計算方法:先計算出該正樣本預測框與匹配到的 gt_box align_metric,然后再對得到的 align_metric 作歸一化,?align_metric 值的計算公式如下:

align_metric計算公式

上式中的?bbox_score 是正樣本預測框對于正確類別的預測概率, CIoU 值即該正樣本預測框與匹配到的 gt_box 計算得到

align_metric 的歸一化方法: YOLOv8 源碼中是取出當前 batch 中所有正樣本預測框中的最大CIoU? max_CIoU 和最大 align_metric max_align_metric ,對上面得到的原始 align_metric 值先乘以 max_CIoU 再除以 max_align_metric 完成歸一化處理

?p_i(c):正樣本預測框的對于 c 類別的預測概率值應用 Sigmoid 函數后的值

2.定位損失

2.1 CIoU Loss

CIoU Loss的計算公式如下:

CIoU Loss = 1 - CIoU

2.2?Distribution Focal Loss

論文名稱:《Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection》, DFL 只是該論文中的其中一個

論文地址:https://arxiv.org/pdf/2006.04388

2.2.1 前言

在以往的目標檢測任務中, bounding box 坐標的網絡預測結果服從狄拉克分布,簡單理解就是網絡針對預測框的坐標值只會輸出一個確定的值,預測出的那個值概率為 1 ,其他值的概率為 0 ,因為只輸出了這一個結果。而在 YOLOv8 中,首次使用 Distribution Focal Loss 參與其損失函數計算,網絡模型針對(l、t、r、b)輸出多個值,這多個值服從一般分布和任意分布,每個值都有它們自己對應的概率,不像狄拉克分布只預測出一個值,概率為 1

2.2.2 為什么使用Distribution Focal Loss?

先看下面兩張圖片。左圖中,滑板被海水給模糊掉了,所以導致滑板邊界模糊不確定;右圖中,第一只大象的身體被嚴重遮擋了,所以導致大象的邊界也不是很清晰

在復雜的場景中,通常會存在邊界模糊和不確定的情況。在這種前提情況下,如果目標檢測模型使用狄拉克分布,即針對預測框的坐標值只輸出一個確定值是非常不靈活和不準確的,沒有考慮真實框邊界的模糊性和不確定性,因此可以使用 Distribution Focal Loss ,這也是 Distribution Focal Loss 提出的原因

2.2.3 原理

作者提出直接回歸一個任意分布,對邊界框的坐標進行建模。后面我們按照 YOLOv8 的源碼實現展開講解

YOLOv8 中,針對每一個預測框的(l,t,r,b) 4 個值,網絡輸出 4 個值對應的長度為reg_max(YOLOv8中默認為16)的向量,下面已?l?舉例:

需要注意的是, 4 個值各自的長度為 16 的向量是做了Softmax處理的, 16 個值的和為 1?

損失函數設計

思路:作者發現對于那些非常清晰明確的邊界,它們的分布會像上圖中的 top、right、bottom 比較尖銳和集中。而對于那些比較模糊不確定的邊界,它們的分布會像上圖中的 left 比較平,而且有時候會出現雙峰的情況。所以作者想要模型來學習像上圖中的 top、right、bottom 比較集中的、尖銳的分布


實現:設計損失函數時,盡可能增加真實值左邊和右邊兩個值的概率,使得網絡快速的聚焦于這個真實值附近的值,這樣就可以把分布給學習成集中的、尖銳的樣子,所以設計 DFL 損失函數時只有標簽值左右兩個值的概率參與計算,其他值的概率不參與計算

DFL損失函數設計

注意:

(1)S_i:標簽值左邊值應用Softmax后的值,S_{i+1}:標簽值右邊值應用Softmax后的值

(2)計算DFL Loss損失函數時?left、top、right、bottom?標簽值需要將其轉換為在 feature map 尺度下的值,并且需要作長度限制,0<?ltrb?< reg_max (YOLOv8中為 reg_max = 16)

YOLOv8 DFL 損失函數的代碼實現在 ultralytics/utils/loss.py Class DFLoss

DFL源碼實現?

#DFL Loss計算
class DFLoss(nn.Module):"""Criterion class for computing DFL losses during training."""def __init__(self, reg_max=16) -> None:"""Initialize the DFL module."""super().__init__()self.reg_max = reg_maxdef __call__(self, pred_dist, target):'''Args:pred_dist: {Tensor:(6448,16)},存放1612個正樣本的 ltrb 4個值對應的16個概率分布值6448 = 1612 x 416 :概率分布target: {Tensor:(1612,4)},存放1612個正樣本對應的真實框的ltrb,其值已縮放到各自的feature map尺度下Returns:out:{Tensor:(1612,1)},存放每個正樣本的DFL損失值'''#對正樣本對應的真實框的ltrb作長度限制處理,限制在0-15target = target.clamp_(0, self.reg_max - 1 - 0.01)tl = target.long()#tl:{Tensor:(1612,4)},標簽值左邊的值tr = tl + 1#tr:{Tensor:(1612,4)},標簽值右邊邊的值wl = tr - target#wl:{Tensor:(1612,4)},左邊值的權重wr = 1 - wl#wr:{Tensor:(1612,4)},右邊值的權重#損失值計算,{Tensor:(1612,4)} -> mean(-1) ->{Tensor:(1612,1)}return (F.cross_entropy(pred_dist, tl.view(-1), reduction="none").view(tl.shape) * wl+ F.cross_entropy(pred_dist, tr.view(-1), reduction="none").view(tl.shape) * wr).mean(-1, keepdim=True)

2.2.4 關于reg_max取值的補充

參考筆記:https://zhuanlan.zhihu.com/p/702085780

由于 Softmax 的取值范圍為 [0,1] ,所以根據上面提到的計算公式可以發現?l,t,r,b?∈[0,reg_max?1] ,如果 reg_max = 16 ,在特征圖上所能預測的最大預測框是?l,t,r,b?都取?15?時,此時預測框的高度和寬度是 w_max = 30,h_max = 30 ,由于特征圖相對于原始 image 的下采樣倍數?stride ∈ [8,16,32],如果取最大下采樣倍數 stride = 32 ,則在原圖上所能預測的最大 bbox 高度和寬度為?w_max,h_max = 30 * 32 = 960 ,那么如果圖像中的原始目標的寬度或者高度過大,則會出現預測框小于原始目標的情況。下面舉個例子理解

目標過大時的YOLOv8的GT框與預測框

圖片中有一個目標其 gt_box 的寬度為 1000 ,但我們實際能預測的最大寬度是 w_max = 960 ,這就會導致預測不精準,此時則需要根據具體情況對 reg_max 作調整

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

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

相關文章

DEMF模型賦能多模態圖像融合,助力肺癌高效分類

目錄 論文創新點 實驗設計 1. 可視化的研究設計 2. 樣本選取和數據處理 3. 集成分類模型 4. 實驗結果 5. 可視化結果 圖表總結 可視化知識圖譜 在肺癌早期篩查中,計算機斷層掃描(CT)和正電子發射斷層掃描(PET)作為兩種關鍵的影像學手段,分別提供了豐富的解剖結構…

小魚深度評測 | 通義靈碼2.0,不僅可跨語言編碼,自動生成單元測試等,更炸裂的是集成DeepSeek模型且免費使用,太炸裂了。

小魚深度評測 通義靈碼2.0 1、引言2、通義靈碼 更新與安裝2.1 IDE插件更新2.1.1 PyCharm 更新2.1.2 VSCode 更新 2.2 官網下載更新 3、 使用體驗3.1生成單元測試3. 2 跨語言編程3.3靈碼2.0 與1.0 對比 4、總結 1、引言 通義靈碼&#xff0c; 我一直使用的編碼協助工具&#xf…

《微軟量子芯片:開啟量子計算新紀元》:此文為AI自動生成

量子計算的神秘面紗 在科技飛速發展的今天,量子計算作為前沿領域,正逐漸走進大眾的視野。它宛如一把神秘的鑰匙,有望開啟未來科技變革的大門,而微軟量子芯片則是這把鑰匙上一顆璀璨的明珠。 量子計算,簡單來說,是一種遵循量子力學規律調控量子信息單元進行計算的新型計算…

深度解讀DeepSeek:從原理到模型

一、大模型模型發展路線退 二、DeepSeek V2-V3/R1技術原理 DeepSeek V2、V3 和 R1 模型架構優化要點&#xff1a; 1、?DeepSeek V2? 混合專家架構&#xff08;DeepSeekMoE&#xff09;?&#xff1a;采用細粒度專家劃分與共享專家機制&#xff0c;總參數規模達236B但僅激活…

easyexcel 2.2.6版本導出excel模板時,標題帶下拉框及其下拉值過多不顯示問題

需求背景&#xff1a;有一個需求要做下拉框的值有100多條&#xff0c;同時這個excel是一個多sheet的導入模板 直接用easyexcel 導出&#xff0c;會出現下拉框的值過多&#xff0c;導致生成出來的excel模板無法正常展示下拉功能 使用的easyexcel版本&#xff1a;<depende…

基于WebRTC與AI大模型接入EasyRTC:打造輕量級、高實時、強互動的嵌入式音視頻解決方案

隨著物聯網和嵌入式技術的快速發展&#xff0c;嵌入式設備對實時音視頻通信的需求日益增長。然而&#xff0c;傳統的音視頻解決方案往往存在體積龐大、實時性差、互動體驗不佳等問題&#xff0c;難以滿足嵌入式設備的資源限制和應用場景需求。 針對以上痛點&#xff0c;本文將介…

AI工作流+專業知識庫+系統API的全流程任務自動化

我有點悲觀&#xff0c;甚至很沮喪&#xff0c;因為AI留給普通人的機會不多了&#xff0c;這既是人類之間權力的斗爭&#xff0c;也是硅基生命和碳基生命的斗爭。AI自動化是無法避免的趨勢&#xff0c;如果人類不能平權&#xff0c;那就只能跪下接受審判。 通過整合AI工作流、專…

Lua | 每日一練 (3)

&#x1f4a2;歡迎來到張胤塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 Lua | 每日一練 (3)題目參考答案減少查找次數預分配表…

二叉樹(中等題)

1、先序&#xff0c;中序遍歷確定二叉樹 105 方法一、 前提 ① 必須不能有重復元素② 只有先序&#xff0b;中序和后序&#xff0b;中序才能實現唯一樹 思考要點&#xff1a; 不要想著用for循環&#xff0c;遞歸一定更好解決輸入是vector&#xff0c;遞歸就得考慮傳入索…

服務器通過 ollama 運行deepseek r1

1、服務器環境簡介 56核 CPU64G 內存無顯卡已安裝 Ollama 2、下載模型與配置 正常可以通過 ollama pull 或 ollama run 命令直接下載&#xff0c;但通常會遇到連接超時、找不到網址等總理。因此&#xff0c;可以使用國內的模型站進行下載&#xff0c;在這里使用魔塔查找模型…

java項目排查線上問題1111

1.磁盤容量不足&#xff1a; 應用拋出的異常信息&#xff1a;java.io.IOException: 磁盤空間不足 1.1 指令獲取磁盤狀態&#xff1a;df -h 1.2 獲取目錄下文件夾大小&#xff1a;du -sh * 1.3 獲取目錄下文件夾大小&#xff1a;ls -lh 可以找到最大的文件&#xff0c;如日…

js中 ES6 新特性詳解

ES6&#xff08;ECMAScript 2015&#xff09;是 JavaScript 的一次重大更新&#xff0c;引入了許多新的特性&#xff0c;使 JavaScript 代碼更加簡潔、可讀和高效。以下是 ES6 的主要新特性及其原理 1. let 和 const 關鍵字 原理解析 1.1 作用域 var 關鍵字的作用域&#xf…

深入理解設計模式之解釋器模式

深入理解設計模式之解釋器模式 在軟件開發的復雜世界中,我們常常會遇到需要處理特定領域語言的情況。比如在開發一個計算器程序時,需要解析和計算數學表達式;在實現正則表達式功能時,要解析用戶輸入的正則表達式來匹配文本。這些場景都涉及到對特定語言的解釋和執行,而解…

巧妙實現右鍵菜單功能,提升用戶操作體驗

在動態交互式圖庫中&#xff0c;右鍵菜單是一項能夠顯著提升用戶操作便捷性的功能。它的設計既要響應用戶點擊位置&#xff0c;又需確保菜單功能與數據操作緊密結合&#xff0c;比如刪除圖片操作。以下將通過一段實際代碼實現&#xff0c;展示從思路到實現的詳細過程。 實現右鍵…

??????????????如何使用函數指針來調用函數

在C和C編程中&#xff0c;函數指針是一種特殊類型的指針&#xff0c;它指向一個函數而不是一個變量。使用函數指針可以動態地調用不同的函數&#xff0c;這在實現回調函數、事件處理、策略模式等場景中非常有用。 以下是如何定義和使用函數指針來調用函數的步驟&#xff1a; 定…

KEGG條形圖繪制

原始數據 setwd("C:\\Users\\HUAWEI\\Desktop\\proteomic_WGCNA\\bacteria\\Eggnog\\KEGGhun") library(ggplot2) library(cols4all) dt <- read.csv("bacteria_KEGG.csv")dt$KEGG_Term <- factor(dt$KEGG_Term, levels rev(dt$KEGG_Term))#基礎富集…

My Metronome for Mac v1.4.2 我的節拍器 支持M、Intel芯片

應用介紹 My Metronome 是一款適用于 macOS 的專業節拍器應用程序&#xff0c;旨在幫助音樂家、作曲家、學生和任何需要精確節奏控制的人進行練習。無論是進行樂器練習、音樂創作還是演出排練&#xff0c;My Metronome 都能為用戶提供精準的節拍支持和靈活的功能&#xff0c;確…

宇樹科技13家核心零部件供應商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;發布最新人形機器人研報&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形機器人100&#xff1a;全球人形機器人產業鏈梳理&#xff09;。 Humanoid 100清單清單中…

Part 3 第十二章 單元測試 Unit Testing

概述 第十二章圍繞單元測試展開&#xff0c;闡述了單元測試的實踐與重要性&#xff0c;通過對比其他測試類型&#xff0c;突出其特點&#xff0c;還介紹了單元測試的最佳實踐、避免的反模式以及與測試替身相關的內容&#xff0c;為編寫高質量單元測試提供指導。 章節概要 1…

【Vite SVG 圖標方案:vite-plugin-svg-icons 指南】

&#x1f31f; Vite SVG 圖標方案&#xff1a;vite-plugin-svg-icons 指南 &#x1f4dc; 背景與痛點 &#x1f30d; 前端圖標演進史 1.0 &#x1f5bc;? 圖片圖標 → 2.0 &#x1f3ad; 字體圖標 → 3.0 &#x1f3a8; SVG 圖標傳統方案存在三大痛點&#xff1a; 字體圖標…