前言
本文結構:
- 目標定位
- 特徵點檢測
- 目標檢測
- 滑動窗口的卷積實現
- bounding box預測
- 交併比
- 非極大值抑制
- anchor boxes
- yolo算法
- 候選區域
目標定位
定義:分類+定位
一個cnn網絡可以用softmax輸出檢測的可能的結果,若想定位圖片中某個物體的位置,可以讓神經網絡多輸出幾個單元,即一個邊界框。具體就是讓神經網絡再多輸出4個數字,標記爲,這四個數字是被檢測對象的邊界框的參數化表示。
目標標籤y的定義如下:
這是一個向量,第一個組件表示是否含有對象,如果對象屬於前三類(行人,汽車,摩托車),則=1,且表示該對象屬於1-3類中的哪一類,且輸出被檢測對象的邊框界參數。如果是背景,則圖片中沒有要檢測的對象,則=0,。
特徵點檢測
可以通過輸出圖片上特徵點的(x,y)座標。
舉個例子,假設正在構建一個人臉識別應用,希望算法可以給出眼角的具體位置,眼角座標爲(x,y),可以讓神經網絡的最後一層多輸出兩個數字,作爲眼角的座標值。如果希望算法給出兩隻眼睛的四個眼角的具體位置,那麼從左到右,依次用四個特徵點來表示這四個眼角,對神經網絡稍做修改,輸出第一個特徵點,第二個特徵點,依此類推,這四個臉部特徵點的位置就可以通過神經網絡輸出。
目標檢測
**內容:**首先用樣本集訓練cnn網絡,再在測試圖片上,選擇大小事宜的窗口,合適的步行長度,從左到右、從上到下滑動。每個窗口區域都送入之前訓練好的cnn進行識別判斷。
舉個例子:構建一個汽車檢測算法,首先是標籤訓練集x和y來訓練cnn網絡,輸出y,0或1表示圖片中有汽車或沒有汽車,然後在測試圖片上選擇大小事宜的窗口,合適的步行長度,從左到右、從上到下滑動,對每個窗口區域送入之前訓練好的cnn來進行識別判斷。以此來實現滑動窗口目標檢測。如下圖所示:
假設這是一張測試圖片,首先選定一個特定大小的窗口,比如圖片下方這個窗口,將這個紅色小方塊輸入卷積神經網絡,卷積網絡開始進行預測,即判斷紅色方框內有沒有汽車。滑動窗口目標檢測算法接下來會繼續處理第二個圖像,即紅色方框稍向右滑動之後的區域,並輸入給卷積網絡,因此輸入給卷積網絡的只有紅色方框內的區域,再次運行卷積網絡,然後處理第三個圖像,依次重複操作,直到這個窗口滑過圖像的每一個角落。
重複上述操作,不過這次選擇一個更大的窗口,截取更大的區域,並輸入給卷積神經網絡處理,你可以根據卷積網絡對輸入大小調整這個區域,然後輸入給卷積網絡,輸出0或1。
再以某個固定步幅滑動窗口,重複以上操作,遍歷整個圖像,輸出結果。
然後第三次重複操作,這次選用更大的窗口。
這種算法就是滑動窗口目標檢測,因爲我們以某個步幅滑動這些方框窗口遍歷整張圖片,對這些方形區域進行分裂,判斷裏面有沒有汽車。
缺點:
1、計算成本大,不靈活:因爲在圖片中剪切出太多小方塊,卷積網絡要一個個地處理。如果選用的步幅很大,顯然會減少輸入卷積網絡的窗口個數,但是粗糙間隔尺寸可能會影響性能,反之,如果採用小粒度或小步幅,傳遞給卷積網絡的小窗口會特別多,這意味着超高的計算成本。
滑動窗口的卷積實現
爲了構建滑動窗口的卷積應用,
步驟:
1、將全連接層轉變爲卷積層;
- 與上層尺寸一致的濾波算子進行卷積運算
2、使用該網絡參數與結構進行運算;
舉個例子:假設卷積網絡經過池化層後得到一個5x5x16的圖像,然後得到400個單元的全連接層,再添加一個全連接層,最後通過softmax單元輸出y。對5x5x16的圖像,用5x5x16的過濾器來進行卷積,輸出1x1x16,假設應用400個這樣的5x5x16的過濾器,則得到1x1x400的輸出。
再添加另外一個卷積層,用的是400個1x1的過濾器,輸出1x1x400,最後經由1x1x4過濾器處理,得到一個softmax激活值,通過卷積網絡,最終得到1x1x4的輸出層。
優點:
不管原始圖片多大,只需要進行一次cnn正向計算,因爲共享了很多重複計算,節約運算成本。
bounding box預測
有時滑動窗口不能完全涵蓋目標,爲了得到更精準的邊界框。
目標標籤y的定義如下:
解決辦法:yolo算法,取兩個對象的中點,然後將這個對象分配給包含對象中點的格子,所以左邊的汽車就分配到這個格子上(編號4),這輛condor中點在這裏,分配給這個格子(編號6)。對於這裏9個格子中任何一個,你都會得到一個8維輸出向量,所以目標輸出尺寸是3x3x8。
yolo算法步驟:
1、首先將原始圖片分割成nxn網格
2、然後利用卷積形式實現滑動窗口算法的思想,對該原始圖片構建cnn網絡
3、如果目標中心座標不在當前網格內,則當前網格pc=0,否則pc=1。
交併比
爲了評價對象檢測算法的準確性。
交併比函數做的是計算兩個邊界框交集和並集之比。
一般約定0.5是閾值,用來判斷預測的邊界框是否正確。
非極大值抑制
爲了確保你的算法對每個對象只檢測一次。
這個算法這樣做,首先看看每次報告每個檢測結果相關的概率,首先看概率最大的那個,這個例子中是0.9,然後就說這是最可靠的檢測,用高亮標記,就說這裏找到了一輛格子,之後,非極大值抑制就會逐一審視剩下的矩形,所有和這個最大的邊框有很高交併比,高度重疊的其他邊界框,輸出就會被抑制。
步驟:
1、剔除pc值小於閾值的所有網格
2、選取pc值最大的網格,利用iou,摒棄與該網格交疊較大的網格
3、對剩下的網格,重複步驟2
anchor boxes
爲了一個格子檢測出多個對象。
假設有這樣一張圖片,行人的中點和汽車的中點幾乎在同一個地方,兩者都落入到同一個格子中,anchor box思路是,預先定義兩個不同形狀的anchor box或者anchor box形狀,預測結果和這兩個anchor box關聯起來,可能會用更多的anchor box,要5個甚至更多。所以要用的向量是重複兩次的:
yolo算法
對上訴算法的整合,網格結構如下:
1、對於每個網格,得到2個預測邊界框
2、剔除小概率預測網格
3、對於每個物體,使用非極大值抑制生成最終預測框
例子:訓練一個算法去檢測三種對象,行人、汽車、摩托車,需要顯示指定完整的背景類別,這裏有3個類別標籤,如果要用兩個anchor box,那麼輸出y就是3x3x2x8,其中3x3表示3x3個網絡,2是anchor box數量,8是向量維度,8實際上先是5,再加上類別的數量。要構造訓練集,需要遍歷9個格子,然後構成對應的目標向量y。
遍歷9個格子,遍歷3x3網格的所有位置,得到這樣一個向量,得到一個16維向量,最終輸出尺寸是3x3x2x8。先遍歷9個格子,遍歷3x3網格的所有位置,再對每個類別單獨運行非極大值抑制。
候選區域
purpose:避免對無用區域的掃描。
做法:先對原始圖片進行分割算法處理,然後只對分割後的圖片中的塊進行目標檢測。【候選區域+softmax分類】
如何選出候選區?運行圖像分割算法,分爲了找出可能存在對象的區域,運用分割算法得到一個色塊,選擇這樣的邊界框然後在這個色塊上運行分類器,看看有沒有東西。
R-CNN算法:滑動窗的形式,一次只對單個區域塊進行目標檢測,運算速度慢。
Fast R-CNN算法:利用卷積實現滑動窗算法,得到候選區域,再將候選區域輸入到訓練好的網絡中,得到分類結果。
Faster R-CNN算法:用卷積對圖像進行分割來獲得候選區域色塊,進一步提高運行速度。
注:大多數Faster R-CNN算法實現還是比yolo算法慢很多。