關於yolo的學習筆記 原理和核心技術的總結

2021-10-06 17:59:44 字數 3669 閱讀 7675

1.yolo v1與fasterrcnn的區別

link.

參考文章

faster-rcnn 中也直接用整張圖作為輸入,但是 faster-rcnn 整體還是採用了 proposal+classifier 兩個分支計算的思想,yolo 的核心思想就是利用整張圖作為網路的輸入,直接在輸出層回歸 bounding box(邊界框) 的位置及其所屬的類別

2.yolo v1的回歸與計算方法

link.

目前,基於深度學習演算法的一系列目標檢測演算法大致可以分為兩大流派:

1.兩步走(two-stage)演算法:先產生候選區域然後再進行cnn分類(rcnn系列),

2.一步走(one-stage)演算法:直接對輸入影象應用演算法並輸出類別和相應的定位(yolo系列)

輸入一幅圖,分成s*s個網格,每個格仔負責檢測『落入』該格仔的物體。若某個物體的中心位置的座標落入到某個格仔,那麼這個格仔就負責檢測出這個物體。處於object中心點的網格負責**這個物體

每個格仔輸出b個bounding box資訊,以及c個物體屬於某種類別的概率資訊。

每個格仔輸出=b個(x,y,w,h,confidence)+c個類別概率

confidence反映當前bounding box是否包含物體以及物體位置的準確性。

若bounding box包含物體,則p(object) = 1;否則p(object) = 0. iou(intersection over union)為**bounding box與物體真實區域的交集面積(以畫素為單位,用真實區域的畫素面積歸一化到[0,1]區間)。

x,y,w,h表示box座標,其中x,y是指當前格仔**得到的物體的bounding box的中心位置的座標。w,h是bounding box的寬度和高度。注意:實際訓練過程中,w和h的值使用影象的寬度和高度進行歸一化到[0,1]區間內;x,y是bounding box中心位置相對於當前格仔位置的偏移值,並且被歸一化到[0,1]。

因此,yolo網路最終的全連線層的輸出維度是 s* s * (b * 5 + c)。yolo**中,作者訓練採用的輸入影象解析度是448x448,s=7(劃分為7x7個網格),b=2(為什麼是2呢?);採用voc 20類標註物體作為訓練資料,c=20(識別的物體類別數)。因此輸出向量為7 * 7 * (20 + 2*5)=1470維。

注意:class 資訊是針對每個網格的(每個網格都有乙個class分類概率),confidence 資訊是針對每個 bounding box 的(只有候選框才會有iou呀)。

3.yolo v1網路結構

缺點1:由於輸出層為全連線層,因此在檢測時,yolo訓練模型只支援與訓練影象相同的輸入解析度。(輸入尺寸必須固定,這是乙個缺點)

在 test 的時候,每個網格**的 class 資訊和 bounding box **的 confidence資訊相乘,就得到每個 bounding box 的 class-specific confidence score:(用類別乘以是否含有目標(0 or 1)乘以iou),因此這個函式包含了class類別資訊也包含了box位置資訊。

也等於類別概率乘以iou(因為如果該格仔不含物體,那麼就沒有class啦,因此只需要考慮含有物體的,含有物體的為1)

左邊第一項,表示該單元格存在物體且屬於第i類的概率。右邊第一項,表示這個box屬於第i類物體的概率。

因此最後對應了,**的哪一類和box資訊(針對每乙個bounding box來說,不是每乙個格仔)

雖然每個格仔可以** b 個 bounding box,但是最終只選擇只選擇 iou 最高的 bounding box 作為物體檢測輸出,即每個格仔最多隻**出乙個物體。(增加b是否可以提高準確度?)

最後一步,得到每個 box 的 class-specific confidence score 以後,設定閾值,濾掉得分低的 boxes,對保留的 boxes 進行 nms 處理,就得到最終的檢測結果。(那麼得到的也應該是s * s * (5 * b+c))的乙個向量。

缺點2:當物體佔畫面比例較小,如影象中包含畜群或鳥群時,每個格仔包含多個物體,但卻只能檢測出其中乙個。這是 yolo 方法的乙個缺陷(不適用物體多且小還密的)

link.

具體計算為下圖;

由於歸一化,那麼所有輸出都是屬於(0,1).

(x,y)是bbox的中心相對於單元格的偏移

(w,h)是bbox相對於整個的比例

4.yolo v1的損失函式

損失函式為座標誤差和iou誤差和class誤差的平方和

但是需要進行權重的修正,因為

1.座標誤差,iou誤差和class誤差比重需要調整,不能1:1:1一樣重要更看重座標誤差,係數取

2.對於小格仔是否是目標的中心點,注意不是包含物體一部分,沒有的box confidence(就是在計算bounding box是否包含物體以及物體位置的準確性那裡,類別概率乘以真是標籤的iou)取0.5,有的取1

3.對於box大小,小的box肯定會因為一點小偏移產生巨大誤差,而box很大的話,因為一點小偏移產生的誤差就很小,因此用根號w和根號h代替以前的w和h,因為根號函式就是在x小的時候變化很快,x大的時候變化越來越小。可以對應,box小的時候一點點誤差影響很大,也就是y軸變化大,box大的時候反之,其實就是斜率和求導。(有文章說這個方法不能完全解決這個問題,沒看懂為什麼link.參考

loss函式計算公式:參考link.

只有當某個網格中有 object 的時候才對 classification error 進行懲罰。

只有當某個 box predictor 對某個 ground truth box 負責的時候,才會對 box 的 coordinate error 進行懲罰,而對哪個 ground truth box 負責就看其**值和 ground truth box 的 iou 是不是在那個 cell 的所有 box 中最大。

5.yolo v1 的缺點

由於進行了多次的下取樣,縮小了大小,因此特徵提取並不精細,會影響檢測結果。

大box 和小box影響沒有完全解決,雖然用了平方根演算法。

由於乙個格仔只能**0和1個物體,因此有小而密的物體**時不準確

出現新的長寬比奇特物體時,檢測效果不好

損失函式上,因更加加強位置定位,特別是大小物體同時出現的時候。

目標檢測YOLO的學習筆記

近幾年來,目標檢測演算法取得了很大的突破。比較流行的演算法可以分為兩類,一類是基於region proposal的r cnn系演算法 r cnn,fast r cnn,faster r cnn 它們是two stage的,需要先使用啟發式方法 selective search 或者cnn網路 rpn...

opencv學習筆記 卷積和核

高度概括地說,卷積是在每乙個影象塊與某個運算元 核 之間進行的運算。核說白了就是乙個固定大小的數值陣列。該陣列帶有乙個 錨點 一般位於陣列 假如你想得到影象的某個特定位置的卷積值,可用下列方法計算 將核的錨點放在該特定位置的畫素上,同時,核內的其他值與該畫素鄰域的各畫素重合 將核內各值與相應畫素值相...

關於yolo配合硬體的小結 個人筆記

這個純屬個人筆記了 完全是怕忘 很久沒有寫部落格,也不太知道想寫什麼,最近玩的東西比較多 esp8266做wifi殺手 配合esp32搭建了個簡易的網路攝像頭,改yolo玩的一陣子,入手幾個紅外模組,現在正在玩 usart hmi。今天用yolo和紅外編碼開啟空調的時候,因為yolo是不停的迴圈呼叫...