YOLOv1 詳解:單階段目標檢測算法的里程碑

在目標檢測領域,YOLO(You Only Look Once)系列算法憑借其高效性和實用性,成為了行業內的明星算法。其中,YOLOv1 作為 YOLO 系列的開山之作,首次提出了單階段目標檢測的思想,徹底改變了目標檢測算法的發展方向。本文將深入剖析 YOLOv1 的原理、網絡結構、訓練過程以及優缺點,帶你全面了解這一具有里程碑意義的算法。

一、YOLOv1 的核心思想

傳統的目標檢測算法,如 R-CNN 系列,采用兩階段檢測策略:先通過啟發式方法(如選擇性搜索)或神經網絡(如 RPN)生成大量可能包含目標的候選區域,再對每個候選區域進行分類和回歸,判斷是否為目標并確定其位置。這種方法雖然精度較高,但計算量巨大,檢測速度較慢,難以滿足實時性要求較高的應用場景。

YOLOv1 則另辟蹊徑,提出了端到端的單階段目標檢測思路。它將目標檢測視為一個回歸問題,直接將輸入圖像經過卷積神經網絡處理后,輸出目標的類別和位置信息,跳過了生成候選區域這一耗時步驟。具體來說,YOLOv1 將輸入圖像劃分為\(S \times S\)個網格(grid cell),每個網格負責預測落在該網格內的目標。如果目標的中心坐標落入某個網格,那么這個網格就負責檢測該目標。每個網格輸出\(B\)個邊界框(bounding box)及其對應的置信度(confidence score),同時輸出\(C\)個類別概率,最終輸出維度為\(S \times S \times (B \times 5 + C)\)。

這種方法的優勢在于計算效率大幅提升,可以實現實時檢測,同時由于對整個圖像進行全局特征提取,背景誤檢率較低。但也因為每個網格只能預測固定數量的邊界框,對于小目標和密集目標的檢測效果較差。

二、YOLOv1 的網絡結構

YOLOv1 的網絡結構基于 GoogLeNet 和 Network in Network(NIN)進行設計,主要由卷積層和全連接層組成。整體網絡結構如下:

  1. 卷積層
    • 網絡的前 24 層為卷積層,用于提取圖像的特征。卷積層通過不同大小的卷積核(如\(3 \times 3\)和\(1 \times 1\))對圖像進行卷積操作,逐步提取圖像的語義和位置信息。在卷積過程中,使用了批量歸一化(Batch Normalization)技術,加快網絡收斂速度,減少過擬合。
    • 卷積層的最后一層輸出特征圖,其大小和維度取決于輸入圖像大小以及卷積層的參數設置。在 YOLOv1 中,輸入圖像大小為\(448 \times 448\),經過卷積層后得到一個特征圖。
  1. 全連接層
    • 卷積層之后是 2 個全連接層,用于將卷積層提取的特征映射到最終的輸出。全連接層將特征圖展開成一維向量,然后通過一系列的線性變換和激活函數,輸出\(S \times S \times (B \times 5 + C)\)維的結果。其中,\(B\)個邊界框的每個框包含 4 個位置坐標(\(x, y, w, h\),分別表示邊界框中心坐標和寬高)和 1 個置信度,\(C\)為目標類別數。

在實際應用中,YOLOv1 常采用\(S = 7\),\(B = 2\),對于 PASCAL VOC 數據集,\(C = 20\),因此最終輸出維度為\(7 \times 7 \times (2 \times 5 + 20) = 7 \times 7 \times 30\)。

三、YOLOv1 的訓練過程

3.1 數據集處理

YOLOv1 在訓練前需要對數據集進行預處理,將圖像縮放到固定大小(\(448 \times 448\)),并將標注信息(目標類別和邊界框坐標)映射到對應的網格中。對于每個目標,根據其中心坐標確定負責檢測的網格,然后將目標的類別和邊界框信息分配給該網格。

3.2 損失函數設計

YOLOv1 的損失函數采用均方誤差(Mean Squared Error, MSE),但由于不同任務(如坐標預測、類別預測、置信度預測)的重要性不同,因此對損失函數進行了加權處理。損失函數主要由以下幾個部分組成:

  1. 坐標預測損失:用于計算邊界框坐標預測的誤差,對邊界框的中心坐標和寬高分別計算損失。為了平衡大目標和小目標的誤差,對寬高坐標采用開方處理,使得小目標的誤差對損失的貢獻更大。
  1. 置信度預測損失:分為目標存在時的置信度損失和目標不存在時的置信度損失。目標存在時,置信度為預測邊界框與真實邊界框的交并比(IoU);目標不存在時,置信度為 0。由于目標不存在的網格數量較多,為了避免這部分損失主導整個損失函數,對目標不存在時的置信度損失賦予較小的權重。
  1. 類別預測損失:用于計算網格預測的類別概率與真實類別之間的誤差,只對負責檢測目標的網格計算類別預測損失。

具體的損失函數公式如下(假設輸入圖像劃分為\(S \times S\)個網格,每個網格預測\(B\)個邊界框,共有\(C\)個類別):

\(\begin{align*} L_{coord} &= \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] + \\ & \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] \\ L_{conf} &= \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} \left[ (C_i - \hat{C}_i)^2 \right] + \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{noobj} \left[ (C_i - \hat{C}_i)^2 \right] \\ L_{class} &= \sum_{i=0}^{S^2} 1_{i}^{obj} \sum_{c \in classes} \left[ (p_i(c) - \hat{p}_i(c))^2 \right] \\ L_{total} &= L_{coord} + L_{conf} + L_{class} \end{align*}\)

其中,\(1_{ij}^{obj}\)表示第\(i\)個網格的第\(j\)個邊界框負責預測目標,\(1_{ij}^{noobj}\)表示第\(i\)個網格的第\(j\)個邊界框不負責預測目標,\(1_{i}^{obj}\)表示第\(i\)個網格內有目標,\(\lambda_{coord}\)、\(\lambda_{noobj}\)為權重系數,用于調整不同部分損失的重要性。

3.3 訓練策略

YOLOv1 采用多階段訓練策略。首先在 ImageNet 數據集上對網絡的前 20 個卷積層進行預訓練,得到一個特征提取網絡。然后將預訓練的網絡參數遷移到 YOLOv1 的網絡中,并在目標檢測數據集(如 PASCAL VOC)上對整個網絡進行微調,優化網絡的參數,使其適應目標檢測任務。

在訓練過程中,使用隨機梯度下降(SGD)算法進行優化,通過不斷調整網絡參數,最小化損失函數,從而提高網絡的檢測性能。

四、YOLOv1 的預測過程

在預測階段,YOLOv1 將輸入圖像經過網絡前向傳播,得到\(S \times S \times (B \times 5 + C)\)維的輸出。對于每個網格的每個邊界框,計算其置信度與類別概率的乘積,得到每個邊界框屬于不同類別的得分。然后通過非極大值抑制(Non-Maximum Suppression, NMS)算法,去除得分較低且與高得分邊界框重疊度過高的邊界框,保留最終的檢測結果。

具體步驟如下:

  1. 對于每個網格的每個邊界框,計算其置信度與類別概率的乘積,得到\(S \times S \times B \times C\)個得分。
  1. 對每個類別,將所有邊界框的得分按照從高到低排序。
  1. 從得分最高的邊界框開始,保留該邊界框,并計算它與其他邊界框的 IoU,將 IoU 大于閾值(如 0.5)的邊界框刪除。
  1. 重復步驟 3,直到處理完所有邊界框,得到每個類別的最終檢測結果。

五、YOLOv1 的優缺點

5.1 優點

  • 檢測速度快:由于采用單階段檢測策略,跳過了生成候選區域的步驟,YOLOv1 在 GPU 上可以達到 45FPS(Frames Per Second),在 Titan X 上甚至可以達到 155FPS,能夠滿足實時檢測的需求,適用于視頻監控、自動駕駛等對實時性要求較高的場景。
  • 背景誤檢率低:YOLOv1 對整個圖像進行全局特征提取,能夠更好地理解圖像的上下文信息,相比兩階段檢測算法,在檢測過程中對背景區域的誤檢率較低。
  • 端到端訓練:YOLOv1 采用端到端的訓練方式,將目標檢測視為一個回歸問題,訓練過程簡單直接,不需要復雜的多階段訓練和后處理步驟。

5.2 缺點

  • 定位不準確:YOLOv1 每個網格只能預測固定數量的邊界框(\(B = 2\)),且邊界框的初始形狀固定,對于形狀多變的目標,難以準確預測其位置,導致檢測精度尤其是定位精度較低。
  • 小目標檢測效果差:由于 YOLOv1 的特征圖分辨率較低,對小目標的特征提取能力有限,同時每個網格負責預測目標,小目標可能只占一個或少數幾個網格,難以被準確檢測。
  • 密集目標檢測困難:當多個目標的中心坐標落入同一個網格時,該網格只能預測固定數量的邊界框,可能無法準確檢測到所有目標,對于密集目標的檢測效果較差。

六、總結

YOLOv1 作為單階段目標檢測算法的開山之作,以其創新的思想和高效的檢測速度,為目標檢測領域帶來了新的發展方向。盡管 YOLOv1 存在一些缺點,但它的出現極大地推動了目標檢測算法的發展,后續的 YOLO 系列算法(如 YOLOv2、YOLOv3 等)在 YOLOv1 的基礎上不斷改進和優化,進一步提高了檢測精度和速度。深入理解 YOLOv1 的原理和思想,對于學習和研究目標檢測算法具有重要的意義。

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

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

相關文章

免費開源 PDF 閱讀器 自帶虛擬打印機功能 多格式兼容

各位辦公小能手們,今天咱來聊聊一款超厲害的PDF工具——PDFLite! 這PDFLite啊,那可是輕量級、免費又開源的好東西。它能干啥呢?主要就是能讀PDF文件,還能轉換文件格式,做基礎的文檔管理。下面咱就說說它的…

Mac Python 安裝依賴出錯 error: externally-managed-environment

Mac Python 使用 ip3 install -r requirements.txt 出錯 This environment is externally managed ╰─> To install Python packages system-wide, try brew installxyz, where xyz is the package you are trying toinstall.If you wish to install a Python library th…

Windows11+WSL2+Ubuntu22 安裝

1.首先要獲得管理員權限 2.直接在電腦搜索欄搜索 “Turn Windows features on or off”, 勾選下面兩個條目: Virtual Machine Platform 和 Windows Subsystem for Linux 3.重啟電腦 4.電腦搜索欄搜索“Windows PowerShell”,運行下面命令設置WSL2為默…

解決 iTerm2 中 nvm 不生效的問題(Mac 環境)

解決 iTerm2 中 nvm 不生效的問題(Mac 環境) 標題 《為什么 iTerm2 無法使用 nvm?—— 解決 Mac 終端環境變量沖突指南》 問題描述 許多開發者在 Mac 上使用 nvm 管理 Node.js 版本時,發現: 原生終端:n…

React的單向數據綁定

文章目錄 單項數據綁定通過onChange方法,實現雙向數據綁定 單項數據綁定 在 Vue 中,可以通過 v-model 指令來實現雙向數據綁定。但是,在 React 中并沒有指令的概念,而且 React 默認不支持 雙向數據綁定。 React 只支持&#xff…

AWS関連職種向け:日本語面接QA集

1. 自己紹介(じこしょうかい) Q:簡単に自己紹介をお願いします。 A: はい、〇〇と申します。これまで約4年間、主にAWSを基盤としたインフラ設計?構築?運用に従事してまいりました。VPCやEC2、RDS、S3などの基本サービスの設計…

AlphaCore GPU 物理仿真引擎內測邀請

AlphaCore 是 MooreThreads 研發的下一代 GPU 物理仿真引擎,為影視特效,游戲交互,數字孿生等領域,提供超高精度的仿真模擬。 申請試用? 目前我們的Catalyst FX 還處于內部申請測試階段,請發送郵件至 alphacoremthre…

鴻蒙OSUniApp 實現的日期選擇器與時間選擇器組件#三方框架 #Uniapp

UniApp 實現的日期選擇器與時間選擇器組件 在移動應用開發中,日期選擇器和時間選擇器是表單、預約、日程、打卡等場景中不可或缺的基礎組件。一個好用的日期/時間選擇器不僅能提升用戶體驗,還能有效減少輸入錯誤。隨著 HarmonyOS(鴻蒙&#…

嵌入式開發STM32 -- 江協科技筆記

1.背景介紹及基礎認知 8大輸入輸出 斯密特觸發器:高于設定閾值輸出高電平,低于設定閾值輸出低電平 有關上拉輸入、下拉輸入、推挽輸出、開漏輸出、復用開漏輸出、復用推挽輸出以及浮空輸入、模擬輸入的區別 1、上拉輸入:上拉就是把電位拉高…

RISC-V 開發板 MUSE Pi Pro RTSP 串流 CSI ov5647 攝像頭

視頻鏈接:RISC-V 開發板 MUSE Pi Pro RTSP 串流 CSI ov5647 攝像頭_嗶哩嗶哩_bilibili RISC-V 開發板 MUSE Pi Pro RTSP 串流 CSI ov5647 攝像頭 RTSP(Real-Time Streaming Protocol,實時流傳輸協議) 是一種基于文本的應用層協議&…

Python面試1

1. 解釋型語言和編譯型語言的區別 編譯型語言: 將程序編譯成二進制可執行程序(C、C) 解釋型語言: 將程序逐行解釋運行(python) Java不是將源程序直接編譯機器語言,而是編譯成字節碼文件,然后用…

輸入一串字符,統計其中字母的個數

#include <stdio.h> int main() { char ch; int count 0; printf("請輸入一串字符&#xff1a;\n"); while ((ch getchar())! \n) { if ((ch > a && ch < z) || (ch > A && ch < Z)) { count; } } printf("字母的個數為&a…

git基礎語法回顧

1. 初始化與克隆 git init 初始化一個新的本地倉庫。git clone <repo-url> 克隆遠程倉庫到本地&#xff08;如 git clone https://github.com/user/repo.git&#xff09;。 2. 基礎操作 git add <file> 將文件添加到暫存區&#xff08;如 git add main.py&#x…

華為倉頡語言初識:結構體struct和類class的異同

前言 華為倉頡語言是鴻蒙原生應用的一種新的編程語言&#xff0c;采用面向對象的編程思想&#xff0c;為開發者帶來新的開發體驗。不僅可以和 ArkTs 相互調用&#xff0c;更能提升應用程序的性能&#xff0c;更重要的是倉頡語言的特點結合了 java 和 C 的特點。對開發者來說比…

電池預測 | 第28講 基于CNN-GRU的鋰電池剩余壽命預測

電池預測 | 第28講 基于CNN-GRU的鋰電池剩余壽命預測 目錄 電池預測 | 第28講 基于CNN-GRU的鋰電池剩余壽命預測預測效果基本描述程序設計參考資料 預測效果 基本描述 電池預測 | 第28講 基于CNN-GRU的鋰電池剩余壽命預測 運行環境Matlab2023b及以上&#xff0c;鋰電池剩余壽…

在 Ubuntu 24.04 LTS 上 Docker 部署 DB-GPT

一、DB-GPT 簡介 DB-GPT 是一個開源的AI原生數據應用開發框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。目的是構建大模型領域的基礎設施&#xff0c;通過開發多模型管理(SMMF)、Text2SQL效果優化、RAG框架以及…

早停策略和模型權重的保存

知識點回顧&#xff1a; 過擬合的判斷&#xff1a;測試集和訓練集同步打印指標模型的保存和加載 僅保存權重保存權重和模型保存全部信息checkpoint&#xff0c;還包含訓練狀態 早停策略 作業&#xff1a;對信貸數據集訓練后保存權重&#xff0c;加載權重后繼續訓練50輪&#xf…

DeepSpeed-Ulysses:支持極長序列 Transformer 模型訓練的系統優化方法

DeepSpeed-Ulysses&#xff1a;支持極長序列 Transformer 模型訓練的系統優化方法 flyfish 名字 Ulysses “Ulysses” 和 “奧德修斯&#xff08;Odysseus&#xff09;” 指的是同一人物&#xff0c;“Ulysses” 是 “Odysseus” 的拉丁化版本 《尤利西斯》&#xff08;詹姆…

Redis-基礎-總結

一、概述 Remote Dictionary Server(遠程字典服務)是完全開源的&#xff0c;使用ANSIC語言編寫遵守BSD協議&#xff0c;是一個高性能的Key-Value數據庫提供了豐富的數據結構&#xff0c;例如String、Hash、List、Set、sortedset等等。數據是存在內存中的&#xff0c;同時Redis…

尚硅谷redis7 28-32 redis持久化之理論介紹

28redis持久化之理論介紹 redis持久化&#xff1a;redis如何將內存數據寫入磁盤中 為什么需要持久化&#xff1f; 內存數據一斷電就會消失&#xff0c;那么所有的請求都會打到數據庫中。因此讓redis中的數據長期持有&#xff0c;不管是重啟、故障、恢復、宕機&#xff0c;還…