YOLO1 筆記

YOLO論文:You Only Look Once: Unified, Real-Time Object Detection

YOLO的思想是,摒棄R-CNN系列網(wǎng)絡(luò)的多層復(fù)雜結(jié)構(gòu),改為直接采用端到端的網(wǎng)絡(luò)同時預(yù)測目標(biāo)類別和邊界框。

得益于這種網(wǎng)絡(luò)結(jié)構(gòu),YOLO能夠在很快(幾乎可以實(shí)時處理視頻)的時間內(nèi)進(jìn)行前向傳播。此外,YOLO直接以整張圖象作為輸入,這意味著特征提取網(wǎng)絡(luò)能夠隱式地提取圖像全局的上下文信息,從而大幅降低了將背景誤認(rèn)為是目標(biāo)的頻率——與R-CNN系列的、基于區(qū)域建議的網(wǎng)絡(luò)相對比,因?yàn)檫@些網(wǎng)絡(luò)只在乎區(qū)域建議里的圖像內(nèi)容/特征圖像內(nèi)容。據(jù)作者表示,YOLO還有一定的遷移能力:用自然圖像訓(xùn)練的YOLO網(wǎng)絡(luò)能夠較正確地識別繪畫,不過沒說為什么(看到了再補(bǔ)上)。

YOLO的缺點(diǎn)是,在精確度方面仍不及當(dāng)時最先進(jìn)的目標(biāo)檢測網(wǎng)絡(luò)。盡管YOLO能夠快速地區(qū)分圖像中的目標(biāo),卻很難精準(zhǔn)地定位它(尤其是較小的目標(biāo),這與YOLO1的設(shè)計(jì)有關(guān),在后續(xù)的版本中有所改善)。總之這也是網(wǎng)絡(luò)在速度和精度上的一種取舍吧。


數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)


“網(wǎng)格”

YOLO將圖像分為S\times S的網(wǎng)格(在實(shí)現(xiàn)時S7),如果一個目標(biāo)的中心落在某個網(wǎng)格內(nèi),那么這個網(wǎng)格將負(fù)責(zé)預(yù)測這個目標(biāo)。

每一個網(wǎng)格預(yù)測B組邊界框參數(shù)(x,y,w,h)以及這些邊界框的置信分?jǐn)?shù)(在實(shí)現(xiàn)時B2)。(x,y)表示邊界框的中心位置,位置相對于所在網(wǎng)格,對網(wǎng)格大小normalize;(w,h)表示邊界框?qū)捄透撸瑢φ麖垐D像大小normalize。置信分?jǐn)?shù)表示有這個邊界框中是否有目標(biāo),以及這個邊界框和實(shí)際目標(biāo)的邊界框有多吻合,其定義為Pr(Object)*IOU_{pred}^{truth},即如果沒有目標(biāo)則為0,如果有目標(biāo)則為預(yù)測框和實(shí)際框的IOU。

同時,每一個網(wǎng)格還預(yù)測總共C個類別每一個類別的置信度,Pr(Class_{i}|Object)(在實(shí)現(xiàn)時C20),只在邊界框置信分?jǐn)?shù)不為0時有意義。

所以,YOLO網(wǎng)絡(luò)在上述參數(shù)下的實(shí)現(xiàn),其輸出為一個7\times 7\times ((4+1)* 2+20)的三維張量。

上述兩個評價指標(biāo)相乘,定義一個同時涵蓋邊界框預(yù)測置信分?jǐn)?shù)和分類置信度的評價標(biāo)準(zhǔn):

Pr(Class_{i}|Object)*Pr(Object)*IOU_{pred}^truth=Pr(Class_{i})*IOU_{pred}^truth\\


網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)

由于YOLO的端到端設(shè)計(jì)理念,它的網(wǎng)絡(luò)結(jié)構(gòu)十分簡單。就是24個卷積層和2個全連接層(在YOLO的輕量級版本Fast YOLO中,為了提高前向傳播速度,只采用了9個卷積層),接收448×448的輸入圖像。

YOLO的網(wǎng)絡(luò)結(jié)構(gòu)

(這個網(wǎng)絡(luò)結(jié)構(gòu)圖里,方塊圖和下面的卷積層參數(shù)并沒有對齊...所以不要看方塊圖了,只看下面的參數(shù)就好)


訓(xùn)練

在預(yù)訓(xùn)練中,使用了網(wǎng)絡(luò)的前20個卷積層,加上額外的一個平均池化層和一個全連接層。預(yù)訓(xùn)練進(jìn)行了一個星期。

在fintune階段,加上后面的4個卷積層和兩個全連接層,前置的研究表明這樣有助于讓模型有更好的表現(xiàn)。前面20層沒說還訓(xùn)練不訓(xùn)練,應(yīng)該是固定了吧。

除了最后一層,其它層都用了Leaky ReLu作為激活函數(shù):

\phi (x)=\begin{cases}x, &\text{if }x>0\\0.1x, &\text{otherwise}\end{cases}\\

Leaky ReLu可以讓神經(jīng)元在輸出負(fù)值時仍能對網(wǎng)絡(luò)權(quán)重更新有貢獻(xiàn)。(但是為什么主要采用的激活函數(shù)是ReLu而不Leaky ReLu?)

損失函數(shù)

YOLO采用的損失函數(shù),以及解讀:

\begin{aligned} \lambda_{\text {coord }} \sum_{i=0}^{S} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] \\+\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}})^{2}+(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}})^{2}\right] \\+\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\+\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{I}_{i j}^{\text {nootj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\+\sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\text {obj }} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} \end{aligned}\\

第一項(xiàng):對所有包含目標(biāo)的網(wǎng)格而言,其兩個Bounding Box中心坐標(biāo)的預(yù)測誤差;第二項(xiàng):對所有包含目標(biāo)的網(wǎng)格而言,其兩個Bounding Box尺寸的預(yù)測誤差。這兩項(xiàng)一并理解為Bounding Box位姿參數(shù)的預(yù)測誤差,因?yàn)橹挥性诰W(wǎng)格包含目標(biāo)的情況下Bounding Box位姿才是有意義的,所以只在這種情況下累積誤差。這兩項(xiàng)誤差還要乘上一個值\lambda _{coord} > 0,這個主要是因?yàn)樽髡呦MP湍軌蚋玫仡A(yù)測邊框。

第三項(xiàng)、第四項(xiàng):預(yù)測網(wǎng)格是否包含目標(biāo)時的誤差。但如果網(wǎng)格實(shí)際上不包含目標(biāo),則累積的誤差還要乘上一個值\lambda _{noobj} < 0,因?yàn)橐话阍谝环鶊D中,更多的網(wǎng)格不包含目標(biāo),但實(shí)際上我們更看重網(wǎng)絡(luò)預(yù)測出True Positive而不是Ture Negative的能力,所以需要抑制一下不包含目標(biāo)的網(wǎng)絡(luò)貢獻(xiàn)的誤差。

第五項(xiàng):對所有包含目標(biāo)的網(wǎng)絡(luò)而言,其分類誤差。

所以其實(shí)YOLO的整個設(shè)計(jì)都是比較簡單的。

超參數(shù)

訓(xùn)練了135個epoch,batchsize為64,momentum為0.9,decay為0.0005。

學(xué)習(xí)率在最開始的幾個epoch從10^{-3}升到10^{-2},然后再隨著epoch增加而降低至10^{-4}。之所以要先升高一段,是因?yàn)?,其?shí)前面的epochs需要大學(xué)習(xí)率來加速梯度下降,但是一開始就應(yīng)用太大的學(xué)習(xí)率會導(dǎo)致模型發(fā)散。

在第一個全連接層后面加了概率為0.5的dropout。

數(shù)據(jù)增強(qiáng):隨機(jī)平移、尺度縮放、調(diào)節(jié)圖像飽和度。


YOLO1的局限性

首先,由于YOLO的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),每個網(wǎng)格最多預(yù)測一個物體,所以較小且密集的目標(biāo)是預(yù)測不出來的。

其次,YOLO通過網(wǎng)絡(luò)直接預(yù)測Bounding Box,所以很難預(yù)測出一些具有不尋常的的長寬比的Bounding Box。

還有,YOLO在累積誤差的時候并沒有考慮Bounding Box的大小,但是實(shí)際上,對于Bouding Box中心點(diǎn)的預(yù)測而言,一個小的誤差在小Bounding Box上往往比在大的Bouding Box上更嚴(yán)重。所以YOLO1在Bounding Box定位上經(jīng)常有不理想的誤差。

另外,YOLO末尾的全連接層完全是多此一舉。對每個網(wǎng)格輸出一個向量,不如直接通過卷積完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容