YOLO(You Only Look Once)
參考
YOLO(You Only Look Once)算法詳解
YOLO算法的原理與實現
一、介紹
YOLO算法把物體檢測問題處理成回歸問題,用一個卷積神經網絡結構就可以從輸入圖像直接預測bounding box和類別概率。YOLO具有如下優點:(1)YOLO的運行速度非常快;(2)YOLO是基於圖像的全局信息預測的,因此在誤檢測的錯誤率下降挺多;(3)泛化能力強,準確率高。
二、YOLO算法過程示意圖
三、損失函數分析
Yolo算法采用的是均方差損失函數,但是對不同的部分采用了不同的權重值。因為很多grid cell是不包含物體的 (對應的confidence score為0),如果定位誤差和分類誤差的權重值一樣,則不包含物體的單元格將會蓋過包含物體的單元格對損失函數的影響,容易導致模型不穩定,訓練發散。對於定位誤差,即邊界框坐標預測誤差,采用較大的權重$λ_coord=5$(誤差越大,則促使邊界框的定位更精確
均方誤差同等對待大小不同的邊界框,但是實際上較小的邊界框的坐標誤差應該要比較大的邊界框要更敏感。因此將網絡的邊界框的寬與高預測改為對其平方根的預測,即預測值變為(x,y,w??√,h??√)(x,y,w,h)。
另外由於每個單元格預測多個邊界框。但是其對應類別只有一個。那麽在訓練時,如果該單元格內確實存在目標,那麽只選擇與ground truth的IOU最大的那個邊界框來負責預測該目標,而其它邊界框認為不存在目標。這樣設置的一個結果將會使一個單元格對應的邊界框更加專業化,其可以分別適用不同大小,不同高寬比的目標,從而提升模型性能。如果一個單元格內存在多個目標怎麽辦,其實這時候Yolo算法就只能選擇其中一個來訓練,這也是Yolo算法的缺點之一。
其中第一項是邊界框中心坐標的誤差項,1objij1ijobj指的是第ii個單元格存在目標,且該單元格中的第jj個邊界框負責預測該目標。第二項是邊界框的高與寬的誤差項。第三項是包含目標的邊界框的置信度誤差項。第四項是不包含目標的邊界框的置信度誤差項。而最後一項是包含目標的單元格的分類誤差項,1obji1iobj指的是第ii個單元格存在目標。
四、相關知識點
1、intersection-over-union ( IOU )
在目標檢測的評價體系中,有一個參數叫做 IoU ,簡單來講就是模型產生的目標窗口和原來標記窗口的交疊率。具體我們可以簡單的理解為: 即檢測結果(DetectionResult)與 Ground Truth 的交集比上它們的並集,即為檢測的準確率 IoU :
IOU = \frac{DetectionResult\cap GroundTruth}{DetectionResult\cup GroundTruth}
$$
2、極大值抑制算法(non maximum suppression, NMS)
NMS算法主要解決的是一個目標被多次檢測的問題,如下圖中人臉檢測,可以看到人臉被多次檢測,但是其實我們希望最後僅僅輸出其中一個最好的預測框,比如對於美女,只想要紅色那個檢測結果。那麽可以采用NMS算法來實現這樣的效果:首先從所有的檢測框中找到置信度最大的那個框,然後挨個計算其與剩余框的IOU,如果其值大於一定閾值(重合度過高),那麽就將該剩余框剔除;然後對剩余的未處理檢測框重復上述過程,直到處理完所有的檢測框。
2、均值平均精度(mAP)
參考
什麽是MAP? 理解目標檢測模型中的性能評估
步驟1
在模型對圖像進行檢測之後,我們可以得到一堆檢測框,並利用IoU值是否大於0.5來區分正確或錯誤的檢測。
公式為:給定一張圖像,類別C的Precision = 圖像的正確預測(True Positives)的數量 / 在圖像上這一類的總的目標數量。
步驟2
對於給定的類C,我們能夠為驗證集中的每張圖像計算此值。 假設我們在驗證集中有100個圖像,並且我們知道每個圖像都有其中的所有類,則可以得到100個該類C的的精度值,取平均值後,即為該類的平均精度。
公式為:類C的平均精度=?在驗證集上所有圖像對於類C的精度值的和?/?有類C這個目標的所有圖像的數量。
步驟3
假設整個集合擁有20各個類,分別計算這20個類平均精度,最後再對這20個平均精度取平均之後,即得到均值平均精度(mAP)。
要點
- MAP總是在固定數據集上計算。
- 它不作為量化模型輸出的絕對度量,但它是一個相當好的相對度量。當我們在流行的公共數據集上計算這個度量時,這個度量可以很容易地用來比較不同目標檢測方法。
- 根據訓練數據中類的分布情況,平均精確度值可能會因某些類別(具有良好的訓練數據)而非常高(對於具有較少/較差數據的類別)而言非常低。所以你的MAP可能是適中的,但是你的模型可能對某些類非常好,對某些類非常不好。因此,建議在分析模型結果的同時查看各個類的平均精度。這些值也可以作為我們是不是需要添加更多訓練樣本的一個依據。
五、疑問
Yolo算法將目標檢測看成回歸問題 ?(待理解)
YOLO之前的物體檢測系統使用分類器來完成物體檢測任務。為了檢測一個物體,這些物體檢測系統要在一張測試圖的不同位置和不同尺寸的bounding box上使用該物體的分類器去評估是否有該物體。如DPM系統,要使用一個滑窗(sliding window)在整張圖像上均勻滑動,用分類器評估是否有物體。
在DPM之後提出的其他方法,如R-CNN方法使用region proposal來生成整張圖像中可能包含待檢測物體的potential bounding boxes,然後用分類器來評估這些boxes,接著通過post-processing來改善bounding boxes,消除重復的檢測目標,並基於整個場景中的其他物體重新對boxes進行打分。整個流程執行下來很慢,而且因為這些環節都是分開訓練的,檢測性能很難進行優化。
作者設計了YOLO(you only look once),將物體檢測任務當做回歸問題(regression problem)來處理,直接通過整張圖片的所有像素得到bounding box的坐標、box中包含物體的置信度和class probabilities。通過YOLO,每張圖像只需要看一眼就能得出圖像中都有哪些物體和這些物體的位置。
Anchor box的形狀是固定的嗎?還是從訓練中學習到的?box的邊界可以超過cell的邊界嗎?可以的話,在訓練中是如何實現的?(可能有誤)
形狀不是固定的。在訓練數據中,包含了每一個物體所對應的邊框信息和類別,訓練時模型可以學習到這些邊框信息,從而在預測的時候,自動某一物體進行標註。
box的邊界可以超過cell的邊界。當某一物體的中心點落在某一個cell中時,該cell就專門負責該物體的檢測,即使該物體仍有其他部分位於其他cell中,其他cell也不能負責該物體的檢測。
【個人理解】cell的邊界以及數量與box的邊界無關,當cell的粒度變小時,YOLO模型能夠更好得對小目標進行檢測,但同時也會造成更大的耗時和計算量;反之亦然。
在YOLO中,Anchor box的信息是事先設定的嗎?還有是每個位置都擁有系列相同尺度和大小的anchor box?
主要的疑問是,如果YOLO沒有實現設定Anchor box信息,那麽在訓練初始時,網絡的輸出中,box的4個值會變成奇形怪狀的,基本上構不成一個矩形。(這種情況下,訓練的收斂程度和快慢是否會受到影響?)
另外,如果YOLO的每個cell有用到事先設定好的Anchor box信息,那麽不就和YOLO9000的方法一樣嗎?那麽YOLO9000在這個方面相比於YOLO不就沒有了什麽改進?
為什麽YOLO的localization error和recall變現比較差?
因為YOLO將圖像分為k * k的格子,而格子的劃分較為粗糙(以及bounding boxes的scale和aspect ratio),導致出現了較多的定位誤差。
另外,由於每個cell只負責一個目標的預測,當同一個cell裏出現多個物體(小目標)時,這些物體就不能夠被檢測到。這也就造成了recall率(查全率)的低下。
YOLO(You Only Look Once)