# 吳恩達老師_深度學習_卷積神經網路_第三週_目標偵測 ###### tags: `deep learning` `Andrew Ng` ## 3-1.Object localization ![](https://i.imgur.com/bJR0KAM.png) **課程說明**:了解目標偵測之前先了解目標定位 ### What are localization and detection? ![](https://i.imgur.com/lnSNfR8.png) 對於物體的判斷我們已經了解了,本週學習的是將該物體標識出來,這就是定位分類問題(classification with localization problem)。 定位分類問題通常只有一個大型物件在圖片中,而在目標偵測問題中,可片可以有多個對象。分類可以幫忙定位,定位之後有助於學習偵測。 ### Classification with localization ![](https://i.imgur.com/bE8yKVI.png) 以自動駕駛為例,同時間可能需要分辨是否有路人、交通號識、其它車、或是摩托車,剩下的就是背景對象,所以最後會以softmax輸出。 定位框的作法即是,讓神經網路多輸出幾個單元,輸出一個邊界框(bounding box)。分別是四個點,$b_x$、$b_y$、$b_h$、$b_w$,這四個點是被檢測對象邊界框的參數。 圖片的左上座標是(0,0),右下為(1,1),想確定邊界框的具體位置,需要指定紅色框的中心點($b_x$、$b_y$),高與寬分別為$b_h$、$b_w$。 ### Defining the target label y ![](https://i.imgur.com/DJE470D.png) 自動駕駛案例來看,神經網路輸出(y)的是邊界框的四個數字和一分類標籤。 y的向量首碼為$P_c$,所代表為是否有偵測到物體,若為0則代表為背景,不需做邊界框。若偵測到物體$P_c=1$,則輸出相對應的邊界框參數,並且帶出屬那一類(目前只討論一個物體的偵測) 左圖照片為例,輸入x為一張有汽車的照片,輸出y為$P_c=1$,邊界框四點參數,以及$c_1,c_2,c_3$為$010$(汽車為2,最多只有一個等於1)。 右圖照片為例,是一個沒有對象偵測的照片,所以$P_c=0$,其餘部份就可以不用考慮了。 其成本函數如下(八個元素) $L(\hat{y},y)=$ $if:y_{(1)}=1$ $(\hat{y}_{(1)},y_{(1)})+...(\hat{y}_{(8)},y_{(8)})$ $if:y_{(1)}=0$ $(\hat{y}_{(1)},y_{(1)})$,後面的元素都不用考慮了。 ## 3-2.Landmark detection ![](https://i.imgur.com/KdwkSwp.png) **課程說明**:特徵點檢測 ### Landmark detection ![](https://i.imgur.com/MKLL4Wh.jpg) 以人臉辨識為例,也許會想定位框出人臉的許多細部特徵,那可以在神經網路的輸出中加入相對應的輸出點座標位置。選定特徵點個數,並且生成包括這些特徵點的標籤訓練集,然後利用神經網路輸出臉部特徵點的位置。 具體作法: * 準備一個卷積神經與特徵集 * 人臉圖片輸入卷積神經網路 * 輸出的第一個資料為判斷是否有人臉 * 接續著輸出設定的特徵點座標 ## 3-3.Object Detection ![](https://i.imgur.com/0gsNPk8.png) **課程說明**:目標檢測演算法 ### Car detection example ![](https://i.imgur.com/nwwrt63.png) 以汽車識別為例,我們的訓練資料集會有很多汽車的照片樣本x,以及是否為汽車的(0,1)y,訓練時可以取適當剪裁過的照片,整張圖都幾乎是汽車,讓汽車在中心點,有了這樣的資料集就可以開始紳練卷積神經網路。 ### Sliding windows detection ![](https://i.imgur.com/tGJlgCP.jpg) 滑動偵測: * 選定一個特定大小的方框 * 將方框蓋到的地方輸入卷積神經網路預測 * 向右滑動,再次輸入卷積測試 * 以更大的方框重覆上面流程 這種作法的缺點就是計算成本高,滑動太小計算成本高,太大的話很顯示的會減少輸入卷積預測的資料。 ## 3-4.Convolutional implementation of sliding windows ![](https://i.imgur.com/lRCVwoT.png) **課程說明**:在卷積中實現滑動視窗 ### Turning FC layer into convolutional layers ![](https://i.imgur.com/bNrNoPk.png) 在卷積中實現滑動視窗檢驗之前要先了解如何將Fully connected轉換成convolutional layer。 上例是一個14x14x3的輸入,經過卷積、MAX POOL、兩個FC,最終通過softmax輸出y的卷積神經網路,y為softmax對應四個分類出現的機率。 下例是將全連接層以卷積替的說明,在經過MAX POOL之後的FC層,我們以400個5x5x16的過濾器來實作,單元數量400個,輸入為5x5x16,用5x5的過濾器對它進行卷積,輸出結果為1x1x400,這時候我們不再將它看成一個含有400個節點的集合,而是一個1x1x400的輸出層,數學角度來看是等同於全連接層,因為400個節點中的每個節點都有一個5x5x16的過濾器,每一個值都是上一層經過某任意線性函數的輸岀結果。再經過400個1x1的卷積,輸出為1x1x400,最後再經過1x1的過濾器得到一個softmax輸出1x1x4,上述即為利用卷積替代全連接層的過程。 ### Convolution implementation of sliding windows ![](https://i.imgur.com/U0t0cyv.jpg) 以上節最後所討論的卷積替代全連接層為架構,我們輸入了一張16x16x3的照片,步幅為2,會執行四次的卷積,但其中不少部份為重覆計算。 最終的輸出為2x2x4,左上的藍色區塊是第一次卷積的輸出,右上、左下、右下分別對應第2、3、4次的卷積。即使以更大的圖片來當做輸入,亦是相同的方式。 ### Convolution implementation of sliding windows ![](https://i.imgur.com/stkJbJs.png) 總結滑動視窗的實作過程,在圖片上剪出一個區塊,輸入卷積,繼續下一區塊,以此重覆直到某個區塊識別到汽車。 但我們可以將圖片一次性的全域下去計算,夠幸運的話一次就能得到汽車所在區塊的預測。 ## 3-5.Bounding box predictions ![](https://i.imgur.com/abehJxd.png) **課程說明**:如何取得更精確的Bounding box ### Output accurate bounding boxes ![](https://i.imgur.com/BmCGbtm.png) 實作中,以一個框利用滑動掃描整張圖片,有可能遇到沒有一個能完全框到汽車位置的情況,也許如上圖藍框已經是最佳的部份了,但還是沒有辦法完美的框到汽車。 ### YOLO algorithm ![](https://i.imgur.com/3bLU6w4.png) YOLO的意思是『你只看一次』 輸入照片為100x100,為了說明方便使用3x3的網格(實務上可能使用更精細的Grid),基本觀念是,將影像辨視暨定位逐一應用在九宮格上, * 定義訓練標籤(y) * 對九宮格中的每個格子指定一個y * 本週範例,y有八維向量,pc(有無東西)、bx、by、bh、bw(定位框)、c1、c2、c3(類別) * 每個格子都有一這麼一個向量 * 取兩個對象(汽車)的中心點,將這個對象分配給包含對象中點的格子 * 即使中間的格子也有一部份的汽車,但不予理會 * 總輸出維度為3x3x8 * 3x3->九宮格 * 8->每個y都有八維向量 * 只要一個格子沒有兩個物件,這算法是可行的 * 當應用19x19的格子時,一個格子兩個物件的情況是更低的 * 這種作法不受sliding windows的步長大小限制 * 這是一次卷積的實現,並非在3x3的網格上執行9次的演算 * 因此執行效率高 ### Specify the bounding boxes ![](https://i.imgur.com/4kmUYJz.png) 照片上有兩輛車,使用3x3的網格計算,以右車為例,左色的框中心點取得對象,YOLO演算法將各格左上角定義為(0,0),右下為(1,1),邊界框四點單位是格子尺度的比例。 bw、by會介於0、1之間,因為大於1那這格子是無法定位,而bh、bw有可能超過1,因為照片有可能在兩個格子,而中心點只會在一個格子。 :::info YOLO研究論文上有更複雜的參數化方式,涉及到sigmoid,確額數值介於0、1之間。 ::: ## 3-6.Intersection over union(IoU) ![](https://i.imgur.com/VBRncov.png) **課程說明**:驗證對象檢測演算法 ### Evaluating object localization ![](https://i.imgur.com/yXo3xV3.png) 紅框是汽車所在處,而紫色框是演算法所推算出的框,這效能如何判定?透過IoU計算兩個邊界框交集率,以黃色交集區塊除綠色演算法計算出的區塊,如果IoU大於0.5就檢驗正確。 :::info 一般而言,IoU只要大於0.5即算正確(約定俗成),如果需要更嚴格的,那可以自行定義。 ::: ## 3-7.Non-max suppression ![](https://i.imgur.com/khsEjr5.png) **課程說明**:利用非極大值抑制讓演算法對每個物件只檢測一次 ### Non-max suppression example ![](https://i.imgur.com/3yWbfOn.png) 正常情況下,透過YOLO 19x19的格子來檢測照片是否有相關物件只會對物件中心點所在的格子做分配預測,所以理論上只有一個格子會做出有車的預測,但實務上當我們執行演算法的時候,每一個格子內有物件的都會覺得自己格子內有車。 ### Non-max suppression example ![](https://i.imgur.com/AthDKaL.png) 演算法會在19x19=361個格子上都執行一次圖像檢測與定位演算法,每一個格子都會舉手說我的格子內有車,也因此會對同一台車做出多次的檢測。所以,非極大值抑制就是清理這些多出來的檢測結果,讓每一台車只檢測一次。 首先針對機率最高的格子做highlight,然後抑制其它輸出,得到最後的結果,每一台車只有一個框。 :::info Non-max suppression意味著只取最大機率輸出,但抑制很接近但不是最大的其它預測結果 ::: ### Non-max suppression algorithm ![](https://i.imgur.com/roRgSg5.png) 假設單純的判斷有無車子,輸出的y就僅有$P_c$(有無車的機率)與四個定位框 * 以IoU去掉小於閥值的框 * 選擇機率($P_c$)最高的框 * 輸出成預測結果 * 去除其它邊界框 這是單一物件檢測的作法,如果是多物件的話,最好的作法是各自執行Non-max suppression ## 3-8.Anchor boxes ![](https://i.imgur.com/QElnh1Q.png) **課程說明**:如何讓一個格子檢測出多個物件 ### Overlapping objects ![](https://i.imgur.com/MboAp2Q.png) 上圖來看,人、車在同一個格子中,標準來說只能二選一的預測,而Anchor box的概念就是,預先定義多個不同形狀的Anchor boxes,接著將預測結果和多個Anchor boxes關聯起來(此例有兩個)。也因此,輸出y的向量會有所調整,幾個Anchor box,向量就拉長幾倍,做關聯對應。 ### Anchor box algorithm ![](https://i.imgur.com/oreoBAf.png) 在使用Anchor box之前是下面這樣子的情況: * 每個訓練集的對象根據中心點分配到相對應的格子 * 上小節例子為3x3x8(y的輸出) 使用兩個Anchor box: * 每個訓練集的對象根據中心點分配到相對應的格子 * 分配一個與物件形狀IoU最高的anchor box * 上小節例子變為3x3x16(y的輸出) ### Anchor box example ![](https://i.imgur.com/oNPAmrk.png) 上圖為例,車的形狀相似於box2,人的形狀相似於box1,單格輸出為16個元素的向量,設置Anchor box的用意在於處理單格兩物件的情況,這種情況不多見(當你使用19x19的網格時),另外,Anchor box也能讓演算法更有針對性,對特別的形狀物件更好的偵測。 一般設置上可以設置五個或更多個涵蓋你想要檢測的各種形狀物件,後期YOLO論文中有更好的做法,即是利用k-means將兩個對象形狀聚類。 ## 3-9.Putting it together:YOLO algorithm ![](https://i.imgur.com/IRywMf0.png) **課程說明**:整合在YOLO實現 ### Training ![](https://i.imgur.com/bTeJUWn.png) 上圖為例,要檢測照片上是否有相關目標(人、汽車、機車),利用YOLO(3x3)以及Anchor box(2個),輸出y為3x3x16(8\*2)。 對九個格子預測,直到第八格的時候,檢測到有物件,再利用IoU比對屬於那一個Anchor box(假設為2),最終得到一個3x3x16的向量。 ### Making predictions ![](https://i.imgur.com/oOXreop.png) 神經網路針對九個格子輸出之後,我們希望對有物件的部份能給我們精準的邊界框,最後再執行非最大值抑制。 ### Outputting the non-max supressed outputs ![](https://i.imgur.com/DbHgIek.png) 如果我們使用2個Anchor box,那對9個格子中的任一都會有兩個預測的邊界框(如照片內的小藍框),接著放棄低機率的框,對每個預測類別**單獨**應用non-max supressed outputs。 ## 3-10.Region proposals ![](https://i.imgur.com/7YmXfEB.png) **課程說明**:RPN ### Region proposal:R-CNN ![](https://i.imgur.com/rddfPCJ.jpg) 我們都知道,在執行sliding windows的時候會整個區域掃過一次,然後預測是否有檢測物件,但這是浪費資源的,而R-CNN不再針對每個sliding windows執行檢測,而是只選擇少數區塊,在少數區塊執行CNN。 透過執行圖片分割演算法(右圖),找出可能有對象的區塊,一片橘色內有個小藍區塊,那可能有物件在那,或是上面的一片黃有個小綠。 ### Faster algorithms ![](https://i.imgur.com/pz3a3ym.png) R-CNN * 使用演算法分割圖片 * 對候選區塊執行卷積計算 * output label(有無對象),並且輸出邊界框(bounding box) * 並非採用分割圖片的邊界框,而是本週課程提的四個點 * 缺點是執行速度較慢 Fast R-CNN * 以sliding windows實現 * 取得候選區域的聚類步驟較慢 Faster R-CNN * 以卷積執行分割,而非傳統的分割演算法 只是實作上速度還是會較YOLO慢