YOLO v1 論文筆記 01web
前言算法
看過不少的YOLO中文版學習筆記,乾貨比較多,可是,有點幹,對於不少想要入門的童鞋來講,看着很難理解,一些概念晦澀難懂,一些英文表述不知爲什麼意。因此從這一篇博客開始,我儘可能用比較簡單的語言來說述YOLO v1,把我我的的理解分享給你們,但願你們可以學懂YOLO,會用YOLO。微信
我會講的很細,因此一篇博客來講一篇論文,內容有點多,我會分紅兩個博客來說述YOLO論文還會有一部分博客做爲補充,但願你們能認真學習,文中的若是哪裏寫的很差或者有錯誤,還但願你們可以不吝賜教。網絡
一架構
Abstract(歸納)app
這篇文章提出了一個新的物體檢測的方法:You Only Look Once(YOLO),以前的物體檢測方法一般都轉變爲了一個分類問題,如 R-CNN、Fast R-CNN 等等。ide
而這篇文章將檢測變爲一個迴歸問題,YOLO 從輸入的圖像,僅僅通過一個 neural network,直接獲得 bounding boxes 以及每一個 bounding box 所屬類別的機率。正由於整個的檢測過程僅僅有一個網絡,因此它能夠直接進行end-to-end (端對端:指的是輸入原始數據,輸出的是最後結果,應用在特徵學習融入算法,無需單獨處理)的優化。svg
這一段主要說明YOLO相對於其餘神經網絡的優勢,那就是快,特別快(extremely fast),標準版本的YOLO在Titan X 的 GPU 上能達到45 FPS。網絡較小的版本Fast YOLO在保持mAP是以前的其餘實時物體檢測器的兩倍的同時,檢測速度能夠達到155 FPS。函數
相較於其餘的state-of-the-art (先進的物體檢測系統),YOLO在物體定位時更容易出錯,可是在背景上預測出不存在的物體(false positives)的狀況會少一些。並且,YOLO比DPM、R-CNN等物體檢測系統可以學到更加抽象的物體的特徵,這使得YOLO能夠從真實圖像領域遷移到其餘領域,如藝術。post
二
Introduction(介紹)
人們看一眼圖像並當即知道圖像中的物體是什麼,它們在哪裏,以及它們是如何相互做用的。人類視覺系統是快速和準確的,使咱們可以執行復雜的任務,如駕駛與小有意識的想法。快速、準確的目標檢測算法將容許計算機在沒有專用傳感器的狀況下駕駛汽車,使輔助設備可以將實時場景信息傳達給人類用戶,並開啓通用、響應性機器人系統的潛力。
如今的 detection systems(檢測系統) 將物體檢測問題,最後會轉變成一個分類問題。在檢測中,detection systems 採用一個 classifier(分類器) 去評估一張圖像中各個位置必定區域的 window 或 bounding box 內,是否包含一個物體?包含了哪一種物體?
YOLO以前的物體檢測系統使用分類器來完成物體檢測任務。爲了檢測一個物體,這些物體檢測系統要在一張測試圖的不一樣位置和不一樣尺寸的bounding box上使用該物體的分類器去評估是否有該物體。如DPM系統,要使用一個sliding window(滑窗)在整張圖像上均勻滑動,用分類器評估是否有物體。
在DPM以後提出的其餘方法,如R-CNN方法使用region proposal(區域建議)來生成整張圖像中可能包含待檢測物體的可能的 bounding boxes,而後用分類器來評估這些boxes,接着經過post-processing來改善bounding boxes,消除重複的檢測目標,並基於整個場景中的其餘物體從新對boxes進行打分。整個流程執行下來很慢,並且由於這些環節都是分開訓練的,檢測性能很難進行優化。
用YOLO處理圖像分爲三個步驟:
圖示以下:
YOLO 的 idea 十分簡單,如 Figure 1:將圖像輸入單獨的一個 CNN 網絡,就會預測出 bounding boxes(邊界框:找出要找的內容,用一個矩形邊框將其圈出,這個矩形邊框即爲邊界框),以及這些 bounding boxes 所屬類別的機率。YOLO 用一整幅圖像來訓練,同時能夠直接優化 detection performance(性能檢測)。
YOLO 的 idea 十分簡單,如 Figure 1:將圖像輸入單獨的一個 CNN 網絡,就會預測出 bounding boxes(邊界框:找出要找的內容,用一個矩形邊框將其圈出,這個矩形邊框即爲邊界框),以及這些 bounding boxes 所屬類別的機率。YOLO 用一整幅圖像來訓練,同時能夠直接優化 detection performance(性能檢測)。
這種統一模型的優勢:
幾類模型流程對比:
三
Unified Detection(統一檢測)
咱們將對象檢測的分離組件統一爲單個神經網絡。咱們的網絡使用來自整個圖像的特徵來預測每一個 bounding boxes(邊界框)。它還預測全部邊界的全部圖像的包圍盒。這意味着咱們在總體範圍內對整個圖像和圖像中的全部對象進行網絡推理。YOLO設計使端到端的訓練和實時速度成爲可能,同時保持高的平均精度。
YOLO 檢測系統,先將輸入圖像分紅 S * S個 grid(柵格),若是一個物體的中心掉落在一個 grid cell (網格單元)內,那麼這個 grid cell (網格單元)就負責檢測這個物體。
每個 grid cell 預測 B 個 bounding boxes,以及這些 bounding boxes 的得分:score。這個 score 反應了模型對於這個 grid cell 中預測是否含有物體,以及是這個物體的可能性是多少。咱們把confidence(可信度)正式定義爲
若是這個 cell 中不存在一個 object,則 score 應該爲0 ;不然的話,score 則爲 predicted box 與 ground truth 之間的 IoU(intersection over union:一種測量在特定數據集中檢測相應物體準確度的一個標準)。
換句話說:若bounding box包含物體,則P(object) = 1;不然P(object) = 0。IOU(intersection over union)爲預測邊框與物體真實區域的交集面積(以像素爲單位,用真實區域的像素面積歸一化到[0,1]區間)。
每一個邊框由五個預測值組成:x,y,w,h,confidence。座標(x,y) 表明了 bounding box 的中心與 grid cell 邊界的相對值。width、height 則是相對於整幅圖像的預測值(邊框的寬和高)。confidence 就是 IoU 值。
注意:實際訓練過程當中,w和h的值使用圖像的寬度和高度進行歸一化到[0,1]區間內;x,y是邊框中心位置相對於當前格子位置的偏移值,而且被歸一化到[0,1]。
每個柵格還要預測C個 conditional class probability(條件類別機率):Pr(Classi|Object)。即在一個柵格包含一個Object的前提下,它屬於某個類的機率。咱們只爲每一個柵格預測一組(C個)類機率,而不考慮框B的數量。
注意:conditional class probability信息是針對每一個網格的。confidence信息是針對每一個bounding box的。
在測試階段,將每一個柵格的conditional class probabilities與每一個 bounding box的 confidence相乘:
這樣既可獲得每一個bounding box的具體類別的confidence score。這乘積既包含了bounding box中預測的class的 probability信息,也反映了bounding box是否含有Object和bounding box座標的準確度。
將YOLO用於PASCAL VOC數據集時:論文使用的 S=7,即將一張圖像分爲7×7=49個柵格每個柵格預測B=2個boxes(每一個box有 x,y,w,h,confidence,5個預測值),同時C=20(PASCAL數據集中有20個類別)。所以,最後的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor(張量)。
注意:1.因爲輸出層爲全鏈接層,所以在檢測時,YOLO訓練模型只支持與訓練圖像相同的輸入分辨率。2.雖然每一個格子能夠預測B個bounding box,可是最終只選擇只選擇IOU最高的bounding box做爲物體檢測輸出,即每一個格子最多隻預測出一個物體。當物體佔畫面比例較小,如圖像中包含畜羣或鳥羣時,每一個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷。
一、Network Design(網絡設計)
一、舉例
以下圖所示,圖片分紅7x7個網格(grid cell),某個物體的中心落在這個網格中此網格就負責預測這個物體。圖中物體狗的中心點(紅色框)落入第5行、第2列的格子內,因此這個格子負責預測圖像中的物體狗。
二、Training(訓練)
一、訓練
預訓練分類網絡: 在 ImageNet 1000-class competition dataset上預訓練一個分類網絡,這個網絡是Figure3中的前20個卷機網絡+average-pooling layer(平均池化層)+ fully connected layer(全鏈接層) (此時網絡輸入是224*224)。
訓練檢測網絡:轉換模型去執行檢測任務,《Object detection networks on convolutional feature maps》提到說在預訓練網絡中增長卷積和全連接層能夠改善性能。在做者的例子基礎上添加4個卷積層和2個全連接層,隨機初始化權重。檢測要求細粒度的視覺信息,因此把網絡輸入把224*224變成448*448。
咱們的最後一層預測類機率和包圍盒座標。咱們經過圖像寬度和高度對包圍盒寬度和高度進行歸一化,使它們降低到0和1之間。咱們將邊界框x和y座標參數化爲特定網格單元位置的偏移,所以它們也在0和1之間。
咱們使用一個線性激活函數的最終層和全部其餘層使用函數(2)線性激活。
二、損失函數
須要注意的是:咱們在模型輸出中求平方和偏差的優化。咱們使用和平方偏差,由於它是容易優化的,可是它並不徹底符合咱們最大化平均精度的目標。它的定位偏差與分類偏差相等,可能不是理想的。並且,在每一個圖像中,許多網格單元不包含任何對象。這就把這些細胞的「置信度」分數推到零,每每超過了包含對象的細胞的梯度。這可能致使模型不穩定,致使訓練早期發散。
解決方案:增長邊界框座標預測的損失,而且減小了不包含對象的框的置信度預測的損失。咱們使用兩個參數來實現這一點,即
這兩個參數前者g。賦值爲5,後者賦值爲0.5。
下圖爲損失函數設計圖:
損失函數的設計目標就是讓座標(x,y,w,h),confidence,classification 這個三個方面達到很好的平衡。簡單的所有采用了sum-squared error loss來作這件事會有如下不足:
a) 8維的localization error和20維的classification error同等重要顯然是不合理的;
b) 若是一個網格中沒有object(一幅圖中這種網格不少),那麼就會將這些網格中的box的confidence push到0,相比於較少的有object的網格,這種作法是overpowering的,這會致使網絡不穩定甚至發散。
解決方案以下:
更重視8維的座標預測,給這些損失前面賦予更大的loss weight,在pascal VOC訓練中取5。(上圖藍色框)
對沒有object的bbox的confidence loss,賦予小的loss weight,在pascal VOC訓練中取0.5。(上圖橙色框)
有object的bbox的confidence loss (上圖紅色框) 和類別的loss (上圖紫色框)的loss weight正常取1。
對不一樣大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏一點更不能忍受。而sum-square error loss中對一樣的偏移loss是同樣。爲了緩和這個問題,做者用了一個比較取巧的辦法,就是將box的width和height取平方根代替本來的height和width。以下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。
一個網格預測多個bounding box,在訓練時咱們只須要每一個object(ground true box)只有一個bounding box專門負責(一個object 一個bbox)。具體作法是與ground true box(object)的IOU最大的bounding box 負責該ground true box(object)的預測。這種作法稱做bounding box predictor的specialization(專職化)。每一個預測器會對特定(sizes,aspect ratio or classed of object)的ground true box預測的更好,從而提升總體召回率。
爲了不過分擬合,咱們使用dropout和普遍的數據擴充。在第一個鏈接層以後咱們丟棄具備速率=0.5的層,防止層之間的co-adaptation(相互影響)。對於數據加強,咱們引入隨機縮放和最多原始圖像大小的20%的translations。咱們還隨機調整曝光和飽和度的圖像多達1.5倍的HSV顏色空間。
三、Inference(推論)
四、Limitations of YOLO(YOLO的侷限性)
YOLO對相互靠的很近的物體(挨在一塊兒且中點都落在同一個格子上的狀況),還有很小的羣體 檢測效果很差,這是由於一個網格中只預測了兩個框,而且只屬於一類。 測試圖像中,當同一類物體出現的不常見的長寬比和其餘狀況時泛化能力偏弱。 因爲損失函數的問題,定位偏差是影響檢測效果的主要緣由,尤爲是大小物體的處理上,還有待增強。 |
咱們的公衆號
AI與區塊鏈技術
長按二維碼關注
麻煩給個在看哦!
本文分享自微信公衆號 - AI與區塊鏈技術(Math_AI_Blockchain)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。