YOLOv1的損失函式和關鍵概念詳解

2021-10-08 03:27:35 字數 2880 閱讀 6652

在loss function中,前面兩行表示localization error(即座標誤差),第一行是box中心座標(x,y)的**,第二行為寬和高的**。這裡注意用寬和高的開根號代替原來的寬和高,這樣做主要是因為相同的寬和高誤差對於小的目標精度影響比大的目標要大。舉個例子,原來w=10,h=20,**出來w=8,h=22,跟原來w=3,h=5,**出來w1,h=7相比,其實前者的誤差要比後者小,但是如果不加開根號,那麼損失都是一樣:4+4=8,但是加上根號後,變成0.15和0.7。

三、四行表示bounding box的confidence損失,正樣本(包含object且iou最大)置信度真值ci為1,負樣本置信度真值ci為0。

第五行表示**類別的誤差,注意前面的係數只有在grid cell包含object(物體中心點落入網格中)的時候才為1。

注意:

如果乙個grid cell中有ground truth(物體中心點落入網格中(1obj,i=1)),那麼就用iou最大的那個**框來**。如果該單元格內確實存在目標,那麼只選擇與ground truth的iou最大的那個邊界框來負責**該目標(1obj,ij=1),而其它邊界框不負責或者認為不存在目標(1noobj,ij=1)。(1obj,i,1obj,ij,1noobj,ij表示損失函式中的係數)

yolo中損失函式中關於對於不含object的grid cell**的box是只計算confidence loss,置信度為0是理想情況,實際上網路可能**出的置信度是接近0的數,通過損失函式逐漸減小,由於不含object的珊格一般比較多,所以前面加上乙個係數進行約束。(訓練的時候根據監督資訊去訓這些引數使得**的confidence盡可能接近真實值pr(object)*ioutruth,pred,測試的時候就根據訓好的引數直接得到confidence)

乙個grid cell中是否包含object怎麼界定?

首先要明白grid cell的含義,以文中77為例,這個size其實就是對輸入影象(假設是448448)不斷提取特徵然後sample得到的(縮小了64倍),然後就是把輸入影象劃分成7*7個grid cell,這樣輸入影象中的64個畫素點就對應乙個grid cell。回歸正題,那麼我們有每個object的標註資訊,也就是知道每個object的中心點座標在輸入影象的哪個位置,那麼不就相當於知道了每個object的中心點座標屬於哪個grid cell了嗎,而只要object的中心點座標落在哪個grid cell中,這個object就由哪個grid cell負責**,也就是該grid cell包含這個object。(注意區分該 grid cell 包含這個object【pr(object)=1或者1obj,i=1】與該bounding box 負責**該object【1obj,ij=1】的區別)另外由於乙個grid cell會**兩個bounding box,實際上只有乙個bounding box是用來**屬於該grid cell的object的,那麼這兩個bounding box到底哪個來**呢?答案是:和該object的ground truth的iou值最大的bounding box。

資料集: pascal voc資料集

網路: googlenet inception module用11 + 33 網路代替

啟用函式:除最後一層用線性啟用函式外,其它層都用leaky relu函式

採用drop out和資料增強來防止過擬合

輸入一張包含m個objections的影象,每個objection包含4個座標(x,y,w,h)和1個label。然後通過網路得到7730大小的三維矩陣。每個1*30的向量前5個元素表示第乙個bounding box的4個座標和1個confidence,第6到10元素表示第二個bounding box的4個座標和1個confidence。最後20個表示這個grid cell所屬類別。注意這30個都是**的結果。然後就可以計算損失函式的第

一、二 、五行。至於第二三行,confidence可以根據ground truth和**的bounding box計算出的iou和是否有object的0,1值相乘得到。真實的confidence是0或1值,即有object則為1,沒有object則為0。 這樣就能計算出loss function的值了。

輸入一張影象,跑到網路的末端得到7730的三維矩陣,這裡雖然沒有計算iou,但是由訓練好的權重已經直接計算出了bounding box的confidence。

然後再跟**的類別概率相乘就得到每個bounding box屬於哪一類的概率(confidence scores)。接下來進行nms處理(測試時候才有):每個bounding box的confidence和每個類別的概率相乘,得到每個bounding box屬於哪一類的confidence score。即得到每個bounding box屬於哪一類的confidence score。也就是說最後會得到20*(772)=20*98的score矩陣,括號裡面是bounding box的數量,20代表類別。接下來的操作都是20個類別輪流進行:在某個類別中(即矩陣的某一行),將得分少於閾值(0.2)的設定為0,然後再按得分從高到低排序。最後再用nms演算法去掉重複率較大的bounding box(nms:針對某一類別,選擇得分最大的bounding box,然後計算它和其它bounding box的iou值,如果iou大於0.5,說明重複率較大,該得分設為0,如果不大於0.5,則不改;這樣一輪後,再選擇剩下的score裡面最大的那個bounding box,然後計算該bounding box和其它bounding box的iou,重複以上過程直到最後)。最後每個bounding box的20個score取最大的score,如果這個score大於0,那麼這個bounding box就是這個socre對應的類別(矩陣的行),如果小於0,說明這個bounding box裡面沒有物體,跳過即可。

YOLO v1的詳解與復現

yolov1是乙個快速的one stage目標檢測器,獨樹一幟的用劃分網格的策略實現目標檢測,本文將詳細解釋yolov1演算法,並簡述如何用pytorch復現該演算法。pytorch yolov1 github 本文屬於作者的理解,難免出現錯誤或者瑕疵,還請諒解與指正。簡單回顧一下目標檢測的做法,1...

YOLOv3的正負樣本和損失函式

查了好多資料和程式,其方實現法都不同,解釋一下 中的方法吧 如果某網格的某個邊框負責 該物體 正樣本 其餘不負責 該物體的邊框,且邊框和真實值iou 閾值 背景 負樣本 其餘既不負責 物體,且iou較大的邊框不參與loss計算 loss計算中,負責 目標 即正樣本 和背景 即負樣本 以及不參與計算l...

YOLO v1一些細節上的理解

由imt rain im im trai n 生成target值得注意啊啊啊 loss function裡面的 xi,yix i,y i xi yi 是bboxes的中心座標,是相對於當前grid的左上角點的座標值 仔細看 取值範圍是 0,1 wi,hiw i,h i wi hi 是歸一化的值 取值...