CNN目標檢測(二):YOLO
↑↑↑↑目錄在這裡↑↑↑↑
縮進YOLO全稱You Only Look Once: Unified, Real-Time Object Detection,是在CVPR2016提出的一種目標檢測演算法,核心思想是將目標檢測轉化為回歸問題求解,並基於一個單獨的end-to-end網路,完成從原始圖像的輸入到物體位置和類別的輸出。YOLO與Faster RCNN有以下區別:
- Faster RCNN將目標檢測分解為分類為題和回歸問題分別求解:首先採用獨立的RPN網路專門求取region proposal,即計算圖1中的 P(objetness);然後對利用bounding box regression對提取的region proposal進行位置修正,即計算圖1中的Box offsets(回歸問題);最後採用softmax進行分類(分類問題)。
- YOLO將物體檢測作為一個回歸問題進行求解:輸入圖像經過一次網路,便能得到圖像中所有物體的位置和其所屬類別及相應的置信概率。
圖1 YOLO與Faster RCNN的區別
縮進可以看出,YOLO將整個檢測問題整合為一個回歸問題,使得網路結構簡單,檢測速度大大加快;由於網路沒有分支,所以訓練也只需要一次即可完成。這種「把檢測轉化為回歸問題」的思路非常有效,之後的很多檢測演算法(包括SSD)都借鑒了此思路。
1. YOLO網路結構圖2 YOLO網路結構
縮進上圖2中展示了YOLO的網路結構。相比Faster RCNN,YOLO結構簡單而,網路中只包含conv,relu,pooling和全連接層,以及最後用來綜合信息的detect層。其中使用了1x1卷積用於多通道信息融合(若不明白1x1卷積請查看上一篇Faster RCNN文章)。
2. YOLO核心思想圖3
YOLO的工作過程分為以下幾個過程:(1) 將原圖劃分為SxS的網格。如果一個目標的中心落入某個格子,這個格子就負責檢測該目標。
(2) 每個網格要預測B個bounding boxes,以及C個類別概率Pr(classi|object)。這裡解釋一下,C是網路分類總數,由訓練時決定。在作者給出的demo中C=20,包含以下類別:
人person
鳥bird、貓cat、牛cow、狗dog、馬horse、羊sheep
飛機aeroplane、自行車bicycle、船boat、巴士bus、汽車car、摩托車motorbike、火車train
瓶子bottle、椅子chair、餐桌dining table、盆景potted plant、沙發sofa、顯示器tv/monitor
在YOLO中,每個格子只有一個C類別,即相當於忽略了B個bounding boxes,每個格子只判斷一次類別,這樣做非常簡單粗暴。
(3) 每個bounding box除了要回歸自身的位置之外,還要附帶預測一個confidence值。這個confidence代表了所預測的box中含有目標的置信度和這個bounding box預測的有多准兩重信息:
如果有目標落中心在格子里Pr(Object)=1;否則Pr(Object)=0。 第二項是預測的bounding box和實際的ground truth之間的IOU。
縮進所以,每個bounding box都包含了5個預測量:(x, y, w, h, confidence),其中(x, y)代表預測box相對於格子的中心,(w, h)為預測box相對於圖片的width和height比例,confidence就是上述置信度。需要說明,這裡的x, y, w和h都是經過歸一化的,之後有解釋。
(4) 由於輸入圖像被分為SxS網格,每個網格包括5個預測量:(x, y, w, h, confidence)和一個C類,所以網路輸出是SxSx(5xB+C)大小
(5) 在檢測目標的時候,每個網格預測的類別條件概率和bounding box預測的confidence信息相乘,就得到每個bounding box的class-specific confidence score:
顯然這個class-specific confidence score既包含了bounding box最終屬於哪個類別的概率,又包含了bounding box位置的準確度。最後設置一個閾值與class-specific confidence score對比,過濾掉score低於閾值的boxes,然後對score高於閾值的boxes進行非極大值抑制(NMS, non-maximum suppression)後得到最終的檢測框體。
3. YOLO中的Bounding Box Normalization縮進YOLO在實現中有一個重要細節,即對bounding box的坐標(x, y, w, h)進行了normalization,以便進行回歸。作者認為這是一個非常重要的細節。在原文2.2 Traing節中有如下一段:
Our final layer predicts both class probabilities and bounding box coordinates.
We normalize the bounding box width and height by the image width and height so that they fall between 0 and 1.
We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1.
縮進接下來分析一下到底如何實現。
圖4 SxS網格與bounding box關係(圖中S=7,row=4且col=1)
縮進如圖4,在YOLO中輸入圖像被分為SxS網格。假設有一個bounding box(如圖4紅框),其中心剛好落在了(row,col)網格中,則這個網格需要負責預測整個紅框中的dog目標。假設圖像的寬為widthimage,高為heightimage;紅框中心在(xc,yc),寬為widthbox,高為heightbox那麼:
(1) 對於bounding box的寬和高做如下normalization,使得輸出寬高介於0~1:
(2) 使用(row, col)網格的offset歸一化bounding box的中心坐標:
經過上述公式得到的normalization的(x, y, w, h),再加之前提到的confidence,共同組成了一個真正在網路中用於回歸的bounding box;而當網路在Test階段(x, y, w, h)經過反向解碼又可得到目標在圖像坐標系的框,解碼代碼在darknet detection_layer.c中的get_detection_boxes()函數,關鍵部分如下:
[cpp] view plain copy※輕鬆學大經 第5集 | 學佛的方向和目標(簡體)
※怎麼寫作更受歡迎?
※浪潮「全球第一」並不是目標,而是用鏡子看到五年後的自己
※思考:改變心態 完美髮揮不是一個願望 它是一個目標。
※目標管理與組織績效