3.5 Bounding Box 预测-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
| 3.4 卷積的滑動窗口實現(xiàn) | 回到目錄 | 3.6 交并比 |
Bounding Box 預測 (Bounding Box Predictions)
在上一個視頻中,你們學到了滑動窗口法的卷積實現(xiàn),這個算法效率更高,但仍然存在問題,不能輸出最精準的邊界框。在這個視頻中,我們看看如何得到更精準的邊界框。
在滑動窗口法中,你取這些離散的位置集合,然后在它們上運行分類器,在這種情況下,這些邊界框沒有一個能完美匹配汽車位置,也許這個框(編號1)是最匹配的了。還有看起來這個真實值,最完美的邊界框甚至不是方形,稍微有點長方形(紅色方框所示),長寬比有點向水平方向延伸,有沒有辦法讓這個算法輸出更精準的邊界框呢?
其中一個能得到更精準邊界框的算法是YOLO算法,YOLO(You only look once)意思是你只看一次,這是由Joseph Redmon,Santosh Divvala,Ross Girshick和Ali Farhadi提出的算法。
是這么做的,比如你的輸入圖像是100×100的,然后在圖像上放一個網格。為了介紹起來簡單一些,我用3×3網格,實際實現(xiàn)時會用更精細的網格,可能是19×19。基本思路是使用圖像分類和定位算法,前幾個視頻介紹過的,然后將算法應用到9個格子上。(基本思路是,采用圖像分類和定位算法,本周第一個視頻中介紹過的,逐一應用在圖像的9個格子中。)更具體一點,你需要這樣定義訓練標簽,所以對于9個格子中的每一個指定一個標簽 yyy , yyy 是8維的,和你之前看到的一樣, y=[pcbxbybhbwc1c2c3]y=\left[\begin{matrix} p_c\\b_x\\b_y\\b_h\\b_w\\c_1\\c_2\\c_3 \end{matrix}\right]y=?????????????pc?bx?by?bh?bw?c1?c2?c3??????????????? , pcp_cpc? 等于0或1取決于這個綠色格子中是否有圖像。然后 bx、by、bhb_x、b_y、b_hbx?、by?、bh? 和 bwb_wbw? 作用就是,如果那個格子里有對象,那么就給出邊界框坐標。然后 c1、c2c_1、c_2c1?、c2? 和 c3c_3c3? 就是你想要識別的三個類別,背景類別不算,所以你嘗試在背景類別中識別行人、汽車和摩托車,那么 c1、c2c_1、c_2c1?、c2? 和 c3c_3c3? 可以是行人、汽車和摩托車類別。這張圖里有9個格子,所以對于每個格子都有這么一個向量。
我們看看左上方格子,這里這個(編號1),里面什么也沒有,所以左上格子的標簽向量 yyy 是 [0???????]\left[\begin{matrix} 0\\?\\?\\?\\?\\?\\?\\? \end{matrix}\right]?????????????0????????????????????? 。然后這個格子(編號2)的輸出標簽 yyy 也是一樣,這個格子(編號3),還有其他什么也沒有的格子都一樣。
現(xiàn)在這個格子呢?講的更具體一點,這張圖有兩個對象,YOLO算法做的就是,取兩個對象的中點,然后將這個對象分配給包含對象中點的格子。所以左邊的汽車就分配到這個格子上(編號4),然后這輛Condor(車型:神鷹)中點在這里,分配給這個格子(編號6)。所以即使中心格子(編號5)同時有兩輛車的一部分,我們就假裝中心格子沒有任何我們感興趣的對象,所以對于中心格子,分類標簽 yyy 和這個向量類似,和這個沒有對象的向量類似,即 y=[0???????]y=\left[\begin{matrix} 0\\?\\?\\?\\?\\?\\?\\? \end{matrix}\right]y=?????????????0????????????????????? 。而對于這個格子,這個用綠色框起來的格子(編號4),目標標簽就是這樣的,這里有一個對象, pc=1p_c=1pc?=1 ,然后你寫出 bx、by、bhb_x、b_y、b_hbx?、by?、bh? 和 bwb_wbw? 來指定邊界框位置,然后還有類別1是行人,那么 c1=0c_1=0c1?=0 ,類別2是汽車,所以 c2=1c_2=1c2?=1 ,類別3是摩托車,則數(shù)值 c3=0c_3=0c3?=0 ,即 y=[1bxbybhbw010]y=\left[\begin{matrix} 1\\b_x\\b_y\\b_h\\b_w\\0\\1\\0 \end{matrix}\right]y=?????????????1bx?by?bh?bw?010?????????????? 。右邊這個格子(編號6)也是類似的,因為這里確實有一個對象,它的向量應該是這個樣子的, y=[1bxbybhbw010]y=\left[\begin{matrix} 1\\b_x\\b_y\\b_h\\b_w\\0\\1\\0 \end{matrix}\right]y=?????????????1bx?by?bh?bw?010?????????????? 作為目標向量對應右邊的格子。
所以對于這里9個格子中任何一個,你都會得到一個8維輸出向量,因為這里是3×3的網格,所以有9個格子,總的輸出尺寸是3×3×8,所以目標輸出是3×3×8。因為這里有3×3格子,然后對于每個格子,你都有一個8維向量 yyy ,所以目標輸出尺寸是3×3×8。
對于這個例子中,左上格子是1×1×8,對應的是9個格子中左上格子的輸出向量。所以對于這3×3中每一個位置而言,對于這9個格子,每個都對應一個8維輸出目標向量 yyy ,其中一些值可以是dont care-s(即?),如果這里沒有對象的話。所以總的目標輸出,這個圖片的輸出標簽尺寸就是3×3×8。
如果你現(xiàn)在要訓練一個輸入為100×100×3的神經網絡,現(xiàn)在這是輸入圖像,然后你有一個普通的卷積網絡,卷積層,最大池化層等等,最后你會有這個,選擇卷積層和最大池化層,這樣最后就映射到一個3×3×8輸出尺寸。所以你要做的是,有一個輸入 xxx ,就是這樣的輸入圖像,然后你有這些3×3×8的目標標簽 yyy 。當你用反向傳播訓練神經網絡時,將任意輸入 xxx 映射到這類輸出向量 yyy 。
所以這個算法的優(yōu)點在于神經網絡可以輸出精確的邊界框,所以測試的時候,你做的是喂入輸入圖像 xxx ,然后跑正向傳播,直到你得到這個輸出 yyy 。然后對于這里3×3位置對應的9個輸出,我們在輸出中展示過的,你就可以讀出1或0(編號1位置),你就知道9個位置之一有個對象。如果那里有個對象,那個對象是什么(編號3位置),還有格子中這個對象的邊界框是什么(編號2位置)。只要每個格子中對象數(shù)目沒有超過1個,這個算法應該是沒問題的。一個格子中存在多個對象的問題,我們稍后再討論。但實踐中,我們這里用的是比較小的3×3網格,實踐中你可能會使用更精細的19×19網格,所以輸出就是19×19×8。這樣的網格精細得多,那么多個對象分配到同一個格子得概率就小得多。
重申一下,把對象分配到一個格子的過程是,你觀察對象的中點,然后將這個對象分配到其中點所在的格子,所以即使對象可以橫跨多個格子,也只會被分配到9個格子其中之一,就是3×3網絡的其中一個格子,或者19×19網絡的其中一個格子。在19×19網格中,兩個對象的中點(圖中藍色點所示)處于同一個格子的概率就會更低。
所以要注意,首先這和圖像分類和定位算法非常像,我們在本周第一節(jié)課講過的,就是它顯式地輸出邊界框坐標,所以這能讓神經網絡輸出邊界框,可以具有任意寬高比,并且能輸出更精確的坐標,不會受到滑動窗口分類器的步長大小限制。其次,這是一個卷積實現(xiàn),你并沒有在3×3網格上跑9次算法,或者,如果你用的是19×19的網格,19平方是361次,所以你不需要讓同一個算法跑361次。相反,這是單次卷積實現(xiàn),但你使用了一個卷積網絡,有很多共享計算步驟,在處理這3×3計算中很多計算步驟是共享的,或者你的19×19的網格,所以這個算法效率很高。
事實上YOLO算法有一個好處,也是它受歡迎的原因,因為這是一個卷積實現(xiàn),實際上它的運行速度非常快,可以達到實時識別。在結束之前我還想給你們分享一個小細節(jié),如何編碼這些邊界框 bx、by、bhb_x、b_y、b_hbx?、by?、bh? 和 bwb_wbw? ,我們在下一張幻燈片上討論。
這里有兩輛車,我們有個3×3網格,我們以右邊的車為例(編號1),紅色格子里有個對象,所以目標標簽 yyy 就是, pc=1p_c=1pc?=1 ,然后 bx、by、bhb_x、b_y、b_hbx?、by?、bh? 和 bwb_wbw? ,然后 c1=0,c2=1,c3=0c_1=0,c_2=1,c_3=0c1?=0,c2?=1,c3?=0 ,即 y=[1bxbybhbw010]y=\left[\begin{matrix} 1\\b_x\\b_y\\b_h\\b_w\\0\\1\\0 \end{matrix}\right]y=?????????????1bx?by?bh?bw?010?????????????? 。你怎么指定這個邊界框呢?
Specify the bounding boxes:
在YOLO算法中,對于這個方框(編號1所示),我們約定左上這個點是( 0,00,00,0 ),然后右下這個點是( 1,11,11,1 ),要指定橙色中點的位置, bxb_xbx? 大概是0.4,因為它的位置大概是水平長度的0.4,然后 byb_yby? 大概是0.3,然后邊界框的高度用格子總體寬度的比例表示,所以這個紅框的寬度可能是藍線(編號2所示的藍線)的90%,所以 bhb_hbh? 是0.9,它的高度也許是格子總體高度的一半,這樣的話 bwb_wbw? 就是0.5。換句話說, bx、by、bhb_x、b_y、b_hbx?、by?、bh? 和 bwb_wbw? 單位是相對于格子尺寸的比例,所以 bxb_xbx? 和 byb_yby? 必須在0和1之間,因為從定義上看,橙色點位于對象分配到格子的范圍內,如果它不在0和1之間,如果它在方塊外,那么這個對象就應該分配到另一個格子上。這個值( bhb_hbh? 和 bwb_wbw? )可能會大于1,特別是如果有一輛汽車的邊界框是這樣的(編號3所示),那么邊界框的寬度和高度有可能大于1。
指定邊界框的方式有很多,但這種約定是比較合理的,如果你去讀YOLO的研究論文,YOLO的研究工作有其他參數(shù)化的方式,可能效果會更好,我這里就只給出了一個合理的約定,用起來應該沒問題。不過還有其他更復雜的參數(shù)化方式,涉及到sigmoid函數(shù),確保這個值( bxb_xbx? 和 byb_yby? )介于0和1之間,然后使用指數(shù)參數(shù)化來確保這些( bhb_hbh? 和 bwb_wbw? )都是非負數(shù),因為0.9和0.5,這個必須大于等于0。還有其他更高級的參數(shù)化方式,可能效果要更好一點,但我這里講的辦法應該是管用的。
這就是YOLO算法,你只看一次算法,在接下來的幾個視頻中,我會告訴你一些其他的思路可以讓這個算法做的更好。在此期間,如果你感興趣,也可以看看YOLO的論文,在前幾張幻燈片底部引用的YOLO論文。
Redmon, Joseph, et al. “You Only Look Once: Unified, Real-Time Object Detection.” (2015):779-788.
不過看這些論文之前,先給你們提個醒,YOLO論文是相對難度較高的論文之一,我記得我第一次讀這篇論文的時候,我真的很難搞清楚到底是怎么實現(xiàn)的,我最后問了一些我認識的研究員,看看他們能不能給我講清楚,即使是他們,也很難理解這篇論文的一些細節(jié)。所以如果你看論文的時候,發(fā)現(xiàn)看不懂,這是沒問題的,我希望這種場合出現(xiàn)的概率要更低才好,但實際上,即使是資深研究員也有讀不懂研究論文的時候,必須去讀源代碼,或者聯(lián)系作者之類的才能弄清楚這些算法的細節(jié)。但你們不要被我嚇到,你們可以自己看看這些論文,如果你們感興趣的話,但這篇論文相對較難。現(xiàn)在你們了解了YOLO算法的基礎,我們繼續(xù)討論別的讓這個算法效果更好的研究。
課程板書
| 3.4 卷積的滑動窗口實現(xiàn) | 回到目錄 | 3.6 交并比 |
總結
以上是生活随笔為你收集整理的3.5 Bounding Box 预测-深度学习第四课《卷积神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.4 滑动窗口的卷积实现-深度学习第四
- 下一篇: 3.6 交并比-深度学习第四课《卷积神经