深度學習第四周--第三課目標檢測理論


在這裏插入圖片描述

前言

本文結構:

  • 目標定位
  • 特徵點檢測
  • 目標檢測
  • 滑動窗口的卷積實現
  • bounding box預測
  • 交併比
  • 非極大值抑制
  • anchor boxes
  • yolo算法
  • 候選區域

目標定位

定義:分類+定位
一個cnn網絡可以用softmax輸出檢測的可能的結果,若想定位圖片中某個物體的位置,可以讓神經網絡多輸出幾個單元,即一個邊界框。具體就是讓神經網絡再多輸出4個數字,標記爲bx,by,bh,bwb_x,b_y,b_h,b_w,這四個數字是被檢測對象的邊界框的參數化表示。
目標標籤y的定義如下:在這裏插入圖片描述
這是一個向量,第一個組件pcp_c表示是否含有對象,如果對象屬於前三類(行人,汽車,摩托車),則pcp_c=1,且c1,c2,c3,c4c_1,c_2,c_3,c_4表示該對象屬於1-3類中的哪一類,且輸出被檢測對象的邊框界參數bx,by,bh,bwb_x,b_y,b_h,b_w。如果是背景,則圖片中沒有要檢測的對象,則pcp_c=0,。

特徵點檢測

可以通過輸出圖片上特徵點的(x,y)座標。
舉個例子,假設正在構建一個人臉識別應用,希望算法可以給出眼角的具體位置,眼角座標爲(x,y),可以讓神經網絡的最後一層多輸出兩個數字l1x,l2xl_{1x},l_{2x},作爲眼角的座標值。如果希望算法給出兩隻眼睛的四個眼角的具體位置,那麼從左到右,依次用四個特徵點來表示這四個眼角,對神經網絡稍做修改,輸出第一個特徵點l1x,l1y(l_{1x},l_{1y}),第二個特徵點l2x,l2y(l_{2x},l_{2y}),依此類推,這四個臉部特徵點的位置就可以通過神經網絡輸出。

目標檢測

**內容:**首先用樣本集訓練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是閾值,用來判斷預測的邊界框是否正確。

非極大值抑制

爲了確保你的算法對每個對象只檢測一次。
這個算法這樣做,首先看看每次報告每個檢測結果相關的概率pcp_c,首先看概率最大的那個,這個例子中是0.9,然後就說這是最可靠的檢測,用高亮標記,就說這裏找到了一輛格子,之後,非極大值抑制就會逐一審視剩下的矩形,所有和這個最大的邊框有很高交併比,高度重疊的其他邊界框,輸出就會被抑制。
步驟:
1、剔除pc值小於閾值的所有網格
2、選取pc值最大的網格,利用iou,摒棄與該網格交疊較大的網格
3、對剩下的網格,重複步驟2

anchor boxes

爲了一個格子檢測出多個對象。
在這裏插入圖片描述
假設有這樣一張圖片,行人的中點和汽車的中點幾乎在同一個地方,兩者都落入到同一個格子中,anchor box思路是,預先定義兩個不同形狀的anchor box或者anchor box形狀,預測結果和這兩個anchor box關聯起來,可能會用更多的anchor box,要5個甚至更多。所以要用的向量是重複兩次的:y=[pcbxbybhbwc1c2c3pcbxbybhbwc1c2c3]Ty=[p_c b_x b_y b_h b_w c_1 c_2 c_3 p_c b_x b_y b_h b_w c_1 c_2 c_3]^T

yolo算法

對上訴算法的整合,網格結構如下:
1、對於每個網格,得到2個預測邊界框
2、剔除小概率預測網格
3、對於每個物體,使用非極大值抑制生成最終預測框

例子:訓練一個算法去檢測三種對象,行人、汽車、摩托車,需要顯示指定完整的背景類別,這裏有3個類別標籤,如果要用兩個anchor box,那麼輸出y就是3x3x2x8,其中3x3表示3x3個網絡,2是anchor box數量,8是向量維度,8實際上先是5(pcbxbybhbw)(p_c b_x b_y b_h b_w),再加上類別的數量(c1c2c3)(c_1 c_2 c_3)。要構造訓練集,需要遍歷9個格子,然後構成對應的目標向量y。
在這裏插入圖片描述
遍歷9個格子,遍歷3x3網格的所有位置,得到這樣一個向量,得到一個16維向量,最終輸出尺寸是3x3x2x8。先遍歷9個格子,遍歷3x3網格的所有位置,再對每個類別單獨運行非極大值抑制。

候選區域

purpose:避免對無用區域的掃描。
做法:先對原始圖片進行分割算法處理,然後只對分割後的圖片中的塊進行目標檢測。【候選區域+softmax分類】
如何選出候選區?運行圖像分割算法,分爲了找出可能存在對象的區域,運用分割算法得到一個色塊,選擇這樣的邊界框然後在這個色塊上運行分類器,看看有沒有東西。
在這裏插入圖片描述
R-CNN算法:滑動窗的形式,一次只對單個區域塊進行目標檢測,運算速度慢。
Fast R-CNN算法:利用卷積實現滑動窗算法,得到候選區域,再將候選區域輸入到訓練好的網絡中,得到分類結果。
Faster R-CNN算法:用卷積對圖像進行分割來獲得候選區域色塊,進一步提高運行速度。

注:大多數Faster R-CNN算法實現還是比yolo算法慢很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章