1、目標定位
這一小節視頻主要介紹了咱們在實現目標定位時標籤該如何定義。算法
<img src="https://ask.qcloudimg.com/draft/1215004/td1bdswjt3.png" style="border:5px solid black;border-radius:15px;">微信
上圖左下角給出了損失函數的計算公式(這裏使用的是平方差)網絡
如圖示,加入咱們須要定位出圖像中是否有pedestrian,car,motorcycles。注意在這裏咱們假設圖像中只肯呢個存在這三者中的一種或者都不存在,因此共有四種可能。機器學習
- $P_c=1$表示有三者中的一種
- $C_1=1$表示有pedestrian,反之沒有
- $C_2=1$表示有car
- $C_3=1$表示有motorcycles
- $b_*$用於標識所識別食物的位置
- $b_x,b_y$:表示識別物體的中心座標
- $b_w,b_h$:表示識別物體的寬和高
<center> <img src="https://ask.qcloudimg.com/draft/1215004/r0op76dxxh.png" style="border:5px solid black;border-radius:15px;"> </center>函數
注意:$P_c=0$表示三者都沒有,因此此時$C_,b_$的值咱們並不在意了。學習
2、特徵點檢測
這一節的內容和上一節感受很相似,全部就沒有記得很詳細了測試
<center> <img src="https://ask.qcloudimg.com/draft/1215004/wjm5rxrciy.png" style="border:5px solid black;border-radius:15px;"> </center>字體
3、目標檢測
<center> <img src="https://ask.qcloudimg.com/draft/1215004/n2jr1yu5af.png" style="border:5px solid black;border-radius:15px;"> </center>spa
目標檢測常使用的是滑動窗口技術檢測,即便用必定大小的窗口按照指定的步長對圖像進行遍歷視頻
<center> <img src="https://ask.qcloudimg.com/draft/1215004/as19p7nyt2.png" style="border:5px solid black;border-radius:15px;width:300px;height:300px"> <b>→</b> <img src="https://ask.qcloudimg.com/draft/1215004/mfl2bwi6a3.png" style="border:5px solid black;border-radius:15px;;width:300px;height:300px"> </center>
由於圖像中車輛的大小咱們是不知道的,因此能夠更改窗口大小,從而識別並定位出車輛的位置。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/efj2bp43sx.png" style="border:5px solid black;border-radius:15px;"> <img src="https://ask.qcloudimg.com/draft/1215004/tfuq0q5bwb.png" style="border:5px solid black;border-radius:15px;"> </center>
4、卷積的滑動窗口實現
注意:該節視頻的例子和上一節同樣,都是識別圖像中是否有pedestrian,car,motorcycles,background,因此最後輸出y是4個節點
1.全鏈接層→卷積層
在介紹卷積滑動窗口以前咱們首先要知道如何把神經網絡的全鏈接層轉化成卷積層,下面是使用了全鏈接層的網絡結構
<center> <img src="https://ask.qcloudimg.com/draft/1215004/6sxw0gezg5.png" style="border:5px solid black;border-radius:15px;"> </center>
那麼如何將全鏈接層轉化成卷積層呢?以下圖示
<center> <img src="https://ask.qcloudimg.com/draft/1215004/bs2zhsecro.png" style="border:5px solid black;border-radius:15px;"> </center> 咱們能夠看到通過Max Pooling以後的數據大小是(5, 5, 16),第一個FC層是400個節點。咱們可使用400個5*5的過濾器進行卷積運算,隨後咱們就獲得了(1, 1, 400)的矩陣。
第二個FC層也是400個節點,由以前的1*1過濾器的特色,咱們可使用400個1*1的過濾器,也能夠獲得(1,1,400)的矩陣。至此,咱們已經成功將全鏈接層轉化成了卷積層。
2.卷積滑動窗口實現
目標檢測一節中介紹了滑動窗口。要實現窗口遍歷,那麼就須要很大的計算量,看起來彷佛可操做性不強。But!這怎麼可能難倒哪些newB的大神們呢,他們天然有辦法。
首先咱們先看下圖,這個就是上面提到的將全鏈接層轉化成卷積層的示意圖,只不過畫的看起來更正規一些了2333,可是有個須要提醒的是吳大大爲了方便只花了平面圖,就沒有畫出3D的效果了。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/8k2cdbnhyu.png" style="border:5px solid black;border-radius:15px;"> </center>
下面,假設咱們的測試圖大小是16*16,並令滑動窗口大小是14*14的(爲了方便理解,下圖用藍色清楚地代表了14*14窗口的大小),步長是2,因此這個測試圖能夠被窗口劃分紅4個部分。隨後和上面執行同樣的操做,最後能夠獲得(2,2,4)的矩陣,此時咱們不難看出測試圖被滑動窗口選取的左上角部分對應的結果也是輸出矩陣的左上角部分,其餘3個部分同理。
因此這說明了什麼?
說明咱們沒有必要用滑動窗口截取一部分,而後帶入卷積網絡運算。相反咱們能夠總體進行運算,這樣速度就快不少了。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/iz64bqzuoa.png" style="border:5px solid black;border-radius:15px;"> </center>
下圖很清楚的展現了卷積滑動窗口的實現。咱們能夠看到圖片被劃分紅了64塊
<center> <img src="https://ask.qcloudimg.com/draft/1215004/wum025byqd.png" style="border:5px solid black;border-radius:15px;"> </center>
<center> <img src="https://ask.qcloudimg.com/draft/1215004/ivaibuabs9.png" style="border:5px solid black;border-radius:15px;"> </center>
5、Bounding Box預測
上面介紹的滑動窗口方法存在一個問題就是不少狀況下滑動窗口並不能很好的切割出車體,以下圖示:
<center> <img src="https://ask.qcloudimg.com/draft/1215004/9n22blyanm.png" style="border:5px solid black;border-radius:15px;"> </center>
爲了解決這個問題,就有了YOLO(you only look once)算法,即只須要計算一次即可肯定須要識別物體的位置的大小。
原理以下:
首先將圖像劃分紅3*3(即9份),每一份最後由一個向量表示,這個向量在本文最前面介紹過,即$y=[P_c,b_x,b_y,b_h,b_w,c_1,c_2,c_3]$
<center> <img src="https://ask.qcloudimg.com/draft/1215004/rwssv5aupd.png" style="border:5px solid black;border-radius:15px;"> </center>
由於有9份,因此最後輸出矩陣大小是(3,3,8),以下圖示:
<center> <img src="https://ask.qcloudimg.com/draft/1215004/ss95y00m4g.png" style="border:5px solid black;border-radius:15px;"> </center>
那麼如何構建卷積網絡呢?
輸入矩陣是(100,100,3),而後是Conv,Maxpool層,……,最後只要確保輸出矩陣大小是(3,3,8)便可。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/za2evuseag.png" style="border:5px solid black;border-radius:15px;"> </center>
下圖是以右邊的車輛做爲示例介紹該車輛所在框的輸出矩陣
- 很顯然$P_c=1$,
- 而後$b_x,b_y$的值是右邊車輛的中心點相對於該框的位置,因此它們的值是必定小於1的,咱們能夠很容易的獲得近似值$b_x=0.4,b_y=0.3$。
- $b_h,b_w$的值同理也是車輛的寬高相對於其所在框的比例,可是要注意的是這兩個值是能夠大於1的,由於有可能部分車身在框外。可是也可使用sigmoid函數將值控制在1之內。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/rd8bzhnw2y.png" style="border:5px solid black;border-radius:15px;"> </center>
6、交併比(Intersection over Union, IoU)
前面說到了實現目標定位時可能存在滑動窗口與真實邊框存在出入,以下圖示: 紅色框是車身邊界,紫色框是滑動窗口,那麼此窗口返回的值是有車仍是無車呢?
<center> <img src="https://ask.qcloudimg.com/draft/1215004/br58bitruq.png" style="border:5px solid black;border-radius:15px;"> </center>
爲了解決上面的問題引入了交併比(IoU),也就是兩個框之間的交集與並集之比,依據這個值能夠評價定位算法是否精準。
示意圖以下,黃色區域表示紫色框和紅色框的交集,綠色區域表示紫色框和紅色框的並集,交併比(IoU)就等於黃色區域大小比上綠色區域大小。
若是$IoU\geq0.5$,則表示紫色框中有車輛,反之沒有。
固然0.5這個閾值是人爲設定的,沒有深刻的科學探究,因此若是但願結果更加精確,也能夠用0.6或0.7設爲閾值,可是不建議用小於0.5的閾值。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/r1qe9cxegg.png" style="border:5px solid black;border-radius:15px;"> </center>
7、非極大值抑制
1.算法大體思路
前面Bounding Box一節中介紹到將圖片劃分紅若干等分,例如3*3,那麼一共就有9塊,以下圖示,咱們能夠很清楚的看到第二行第一塊和第三塊都有車,因此能夠標出一箇中心點座標($b_x,b_y$),這樣咱們就能經過最終的輸出結果知道這兩個框中有車。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/rwssv5aupd.png" style="border:5px solid black;border-radius:15px;"> </center>
可是若是咱們劃分的數量變多以後呢?以下圖示劃分紅了19*19,圖中標出的3個黃框和3個綠框最終結果都會都會返回[$P_x=1,b_x=,b_y=……$],可是最後咱們該信誰的呢?是這三個框真的有車,並且還不是同一輛車?仍是隻是同一輛車?因此就有了非極大值抑制來解決這個問題。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/sbvcjpqzqf.png" style="border:5px solid black;border-radius:15px;"> </center>
其思路大體以下(爲了方便說明和理解,咱們不使用19*19的方框):
- 首先每一個框會對是否有目標返回一個$P_c$的機率值(也能夠是$P_cC_1C_2*C_3$的機率之積),以下圖示:
<center> <img src="https://ask.qcloudimg.com/draft/1215004/rll50qwtcr.png" style="border:5px solid black;border-radius:15px;"> </center>
- 而後找到$P_c$最大的一個框,顯然0.9的框有車的機率最大,因此該邊框顏色高亮
<center> <img src="https://ask.qcloudimg.com/draft/1215004/r7qkwtdrx7.png" style="border:5px solid black;border-radius:15px;"> </center>
- 而後算法遍歷其餘邊框,找出與上一個邊框的交併比大於0.5的邊框,很顯然右邊的剩餘兩個邊框符合條件,因此這兩個邊框變暗
<center> <img src="https://ask.qcloudimg.com/draft/1215004/whf59gksk3.png" style="border:5px solid black;border-radius:15px;"> </center>
左邊的車同理,不加贅述
<center> <img src="https://ask.qcloudimg.com/draft/1215004/0vcus1jzbv.png" style="border:5px solid black;border-radius:15px;"> </center>
下面結合一個例子總結一下非極大值抑制算法的實現步驟:
注:在這裏假設只須要識別定位車輛便可,因此輸出格式爲[$P_c,b_x,b_y,b_h,b_w$]
這個例子中將圖像劃分紅19*19方格,假設每一個方格都已經計算出$P_c$的機率值
1.去掉全部知足$P_c\leq0.6$的方格 (0.6也能夠進行人爲修改)
2.對剩下的方格進行以下循環操做:
- 從剩下的方格中選取$P_c$最大的一個做爲預測值輸出,假設這個方格爲A
- 將與A方格交併比大於0.5的剔除
<center> <img src="https://ask.qcloudimg.com/draft/1215004/ep1t359de1.png" style="border:5px solid black;border-radius:15px;"> </center>
8、Anchor Boxes
前面介紹了那麼多,都只是識別單個物體,若是要同時識別多個物體該怎麼辦呢?並且識別的不一樣物體的中心點在同一個框中又該怎麼呢(以下圖示,人和車的中心都在紅點位置,處於同一個框中)?這時就須要使用Anchor Boxes了。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/wmwz2qbres.png" style="border:5px solid black;border-radius:15px;"> </center>
Anchor Boxes的思路是對於不一樣的物體事先採用不一樣的框,例如人相對於車屬於瘦高的,因此使用下圖中的Anchor Box 1,相反車輛就使用Anchor Box 2.
以前的輸出值的格式都是$y=[P_x,b_x,b_y,b_h,b_w,C_1,C_2,C_3]$,最後輸出的矩陣大小(以該圖爲例)是(3,3,8),可是這樣只能肯定一個物體。
因此爲了同時檢測不一樣物體,很天然的咱們能夠重複輸出這個上面的值便可,即$y=[P_x,b_x,b_y,b_h,b_w,C_1,C_2,C_3,P_x,b_x,b_y,b_h,b_w,C_1,C_2,C_3]$,因此輸出矩陣是(3,3,16),也能夠是(3,3,2,8)。
要注意的是咱們須要提早設定好輸出值前面的值對應Anchor Box 1,後面的對應Anchor Box 2.
例如咱們獲得了圖中人的邊框信息值,而後通過計算髮現其邊框與Anchor Box 1更爲接近,因此最後將人的邊框信息對應在前面,同理車輛邊框信息對應在後面。
<center> <img src="https://ask.qcloudimg.com/draft/1215004/h1kdcusx7r.png" style="border:5px solid black;border-radius:15px;"> </center>
總結起來Anchor Box算法和以前的算法區別以下:
- 以前的算法:
對於訓練集圖像中的每一個對象,都根據那個對象的中點位置分配到對應的格子中,因此在上面的示例中輸出y就是(3,3,8)
- Anchor Boxes算法
如今每一個對象都和以前同樣分配到同一個格子中,即對象中心所在的格子。不一樣的是也須要分配到和對象形狀交併比最高的Anchor Box.
例以下圖中的紅色框不只要分配到其中心所在的圖像上的格子中,並且還須要分配到與其交併比最大的Anchor Box中,即豎條的紫色方格
<center> <img src="https://ask.qcloudimg.com/draft/1215004/x5la9sd9v8.png" style="border:5px solid black;border-radius:15px;"> </center>
回到本小節最開始的例子,最後的輸出值以下圖示:
圖中人的對應Anchor Box 1, 輸出值對應圖中的黃色字體;車輛同理,對應綠色字體
<center> <img src="https://ask.qcloudimg.com/draft/1215004/zne3xo5v5c.png" style="border:5px solid black;border-radius:15px;"> </center>
<footer style="color:white;;background-color:rgb(24,24,24);padding:10px;border-radius:10px;"><br> <h3 style="text-align:center;color:tomato;font-size:16px;" id="autoid-2-0-0"><br> <br> <center> <span>微信公衆號:AutoML機器學習</span><br> <img src="https://ask.qcloudimg.com/draft/1215004/21ra82axnz.jpg" style="width:200px;height:200px"> </center> <b>MARSGGBO</b><b style="color:white;"><span style="font-size:25px;">♥</span>原創</b><br> <span>若有意合做或學術討論歡迎私戳聯繫~<br>郵箱:marsggbo@foxmail.com</span> <b style="color:white;"><br> 2018-1-17<p></p> </b><p><b style="color:white;"></b><br> </p></h3><br> </footer>