YOLO系列專題 YOLOv1理論篇

2021-10-18 03:51:21 字數 3325 閱讀 5843

近期工作上基於yolov3做專案並且需要測試ti開發板對od模型的友好程度,所以想寫個yolo系列的專題,本文就從2023年的v1版本《you only look once: unified, real-time object detection》開始講起。(文章比較老,旨在總結,大牛誤噴)

yolov1理論篇yolov1實踐篇

背景介紹:

yolo的訓練和檢測均在乙個端到端的網路中進行,將物體檢測作為回歸問題求解,輸入影象經過一次inference,便能得到影象中所有物體的位置和其所屬類別及相應置信概率。這種直接選用整圖訓練模型的架構可以更好的區分目標和背景區域,相比於proposal的方法更少把背景區域誤檢為目標。

網路模型:

yolo網路結構由24個卷積層與2個全鏈結層構成,卷積層用來提取影象特徵,全鏈結層用來**影象位置和類別概率,網路結構借鑑了googlenet分類網路,大量使用1×1和3×3卷積層。網路入口為448×448,進入網路之前需要經過resize,網路的輸出的張量維度是:s × s ×(b × 5 + c)。

網路的輸出是乙個7×7×30的tensor,7×7表示特徵圖劃分的網格數,如下圖所示:

(1)每個小格會對應b個邊界框,每個bbox**5個值: x, y, w, h, 置信度。(x, y)是bbox的中心在對應格仔裡的相對位置,範圍[0,1]。(w, h)是bbox相對於全圖的的長寬,範圍[0,1]。x, y, w, h的4個gt值可以算出來。

(2)每個邊界框都有乙個置信度,反映當前bounding box是否包含物體以及物體位置的準確性:

其中,若bounding box包含物體,則p(object)=1,否則p(object)=0。iou為**bounding box與物體真實區域的交集面積。如果格仔內有物體,則pr(object)=1,此時置信度等於iou。如果格仔內沒有物體,則pr(object)=0,此時置信度為0。

(3)每個小格會對應c個概率值,找出條件概率對應的類別p(class|object),表示該單元格存在物體且屬於第i類的概率。

(4)在測試的時候,每個網格**的類別資訊和bounding box**的confidence資訊相乘,就得到每個boundig box的類別置信度,然後根據閾值過濾掉得分低的boxes,再對剩餘的進行nms處理得到最終檢測結果:

注:class資訊是針對每個網格的,confidence資訊是針對每個bounding box的。

損失函式:

yolo使用均方誤差作為損失函式來優化模型引數,即網路輸出的s×s×(b×5+c)維向量與真實影象對應s×s×(b×5+c)維向量的均方和誤差,設計目的就是讓coord,confidence,classification這三個方面達到很好的平衡。

但是粗暴的採用均方和誤差作為優化目標會存在幾點不足:

1. 定位誤差(x,y,w,h)和分類誤差同等重要並不合理,需給定位損失賦予較大的loss weight。

2.置信度誤差針對網格中有object和沒有object同等重要會導致不平衡問題,需給沒有object的置信度損失賦予較小的loss weight。

3.對於大的物體,小的偏差對於小的物體影響較大,為了減少這個影響,所以對bbox的寬高都開根號。

在 yolo中,每個柵格**多個bounding box,但在網路模型的訓練中,希望每乙個物體最後由乙個bounding box predictor來負責**。因此,當前哪乙個predictor**的bounding box與ground truth box的iou最大,這個 predictor就負責 predict object。這會使得每個predictor可以專門的負責特定的物體檢測。隨著訓練的進行,每乙個 predictor對特定的物體尺寸、長寬比的物體的類別的**會越來越好。

**流程:

1. 類別置信度的過濾:根據類別置信度的計算可以得到乙個20*(7*7*2)=20*98的score矩陣,括號裡面是bounding box的數量,20代表類別。將20個類別輪流進行:在某個類別中(即矩陣的某一行),將得分少於閾值(0.2)的設定為0,然後再按得分從高到低排序。

2. 非極大值抑制過濾:用nms演算法去掉重複率較大的bounding box(nms:針對某一類別,選擇得分最大的bounding box,然後計算它和其它bounding box的iou值,如果iou大於0.5,說明重複率較大,該得分設為0,如果不大於0.5,則不改;這樣一輪後,再選擇剩下的score裡面最大的那個bounding box,然後計算該bounding box和其它bounding box的iou,重複以上過程直到最後)。

3. 每個bbox的score過濾:每個bounding box的20個score取最大的score,如果這個score大於0,那麼這個bounding box就是這個socre對應的類別(矩陣的行),如果小於0,說明這個bounding box裡面沒有物體,跳過即可。

模型缺點:

(1)每個網格只能**一類物體且對小物體檢測效果差:當乙個小格**現多於兩個小物體或者乙個小格**現多個不同物體時效果不佳。雖然b表示每個小格**邊界框數,但yolo預設同格仔裡所有邊界框為同類物體,並且最終只選擇iou最高的bounding box作為輸出。

(2)網路最後採用全連線層,不僅參數量大而且限制了的輸入尺寸,在進入網路前需resize為448×448,降低檢測速度。

(3)識別物體位置精準性差,

yolo的每個cell有兩個檢測器,每個檢測器分別**乙個bounding box的xywh和相應的confidence。但分類部分的**是共享的,由於這個原因,同乙個cell是沒辦法**多個目標的。

1. 假設類別**不是共享的,cell中兩個檢測器都有各自的類別**,這樣能否在乙個cell中**兩個目標?

不可以。如果乙個cell要**兩個目標,那麼這兩個檢測器要怎麼分工**?誰負責誰很難確定。所以後續演算法採用anchor機制,根據anchor和ground truth的iou大小來安排anchor負責**哪個物體,解決同個cell不能**多個目標的問題。

2. 既然乙個cell只能**乙個目標,為什麼要**兩個bounding box?

兩個檢測器乙個**,然後網路選擇**的好的哪個檢測器(iou大的)來進行**。換句話說就是找一堆人幹同一件事,最後選個幹的最好的。

YOLOv1解讀筆記

當前最好系統相比,yolo目標區域定位誤差更大,但是背景 的假陽性優於當前最好的方法.注1 bounding box是怎麼來的呢?其實是在檢測每個grid cell時,若檢測到目標,則會將其標出來 圖中的紅色框 這就是bounding box。注2 設定多個anchor boxes幹嘛呢?是這樣的,...

YOLOv1學習筆記

大部分內容 補充 核心思想 rcnn系列核心思想是proposal 建議區域 分類 yolo系列核心思想是直接在輸出層回歸bounding box位置和bounding box的所屬類別 大致流程 resize resize成448 448,分割成7 7網格的cell cnn提取特徵和 卷積負責提取...

目標檢測之YOLOv1

you only look once unified,real time object detection yolo 一體化的,實時的物體檢測 翻譯 詳解 1 2 1 yolov1框架 步驟 1 resize成448 448,分割得到7 7網格 cell 2 cnn提取特徵和 卷積層負責提取特徵。全...